@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
package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var NestjsConfigIntegrationService_1;
|
|
14
|
+
import { Injectable, Logger, Inject, Optional } from '@nestjs/common';
|
|
15
|
+
import { ConfigModule } from '@nestjs/config';
|
|
16
|
+
import { FactoryRegistrationService } from './factory-registration.service';
|
|
17
|
+
import { NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS } from '../nestjs-config-integration.module';
|
|
18
|
+
/**
|
|
19
|
+
* Service that provides integration utilities for working with @nestjs/config.
|
|
20
|
+
* This service creates ConfigModule configurations that include AWS-sourced factories.
|
|
21
|
+
*/
|
|
22
|
+
let NestjsConfigIntegrationService = NestjsConfigIntegrationService_1 = class NestjsConfigIntegrationService {
|
|
23
|
+
factoryRegistrationService;
|
|
24
|
+
options;
|
|
25
|
+
logger = new Logger(NestjsConfigIntegrationService_1.name);
|
|
26
|
+
constructor(factoryRegistrationService, options = {}) {
|
|
27
|
+
this.factoryRegistrationService = factoryRegistrationService;
|
|
28
|
+
this.options = options;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a ConfigModule configuration with AWS-sourced factories.
|
|
32
|
+
* This method can be used to enhance existing @nestjs/config setups.
|
|
33
|
+
*
|
|
34
|
+
* @param baseOptions - Base ConfigModule options to enhance
|
|
35
|
+
* @returns Promise resolving to enhanced ConfigModule options
|
|
36
|
+
*/
|
|
37
|
+
async createConfigModuleOptions(baseOptions = {}) {
|
|
38
|
+
this.logger.debug('Creating ConfigModule options with AWS integration');
|
|
39
|
+
try {
|
|
40
|
+
// Register AWS configuration factories
|
|
41
|
+
const awsFactories = await this.factoryRegistrationService.registerFactories();
|
|
42
|
+
// Merge AWS factories with existing load array
|
|
43
|
+
const existingLoad = baseOptions.load || [];
|
|
44
|
+
const enhancedLoad = [...existingLoad, ...awsFactories];
|
|
45
|
+
// Create enhanced options
|
|
46
|
+
const enhancedOptions = {
|
|
47
|
+
...baseOptions,
|
|
48
|
+
load: enhancedLoad,
|
|
49
|
+
// Apply integration-specific options with proper precedence
|
|
50
|
+
isGlobal: baseOptions.isGlobal !== undefined ? baseOptions.isGlobal : (this.options.registerGlobally ?? true),
|
|
51
|
+
cache: baseOptions.cache !== undefined ? baseOptions.cache : (this.options.factoryOptions?.cache ?? true),
|
|
52
|
+
expandVariables: baseOptions.expandVariables !== undefined ? baseOptions.expandVariables : (this.options.factoryOptions?.expandVariables ?? true),
|
|
53
|
+
};
|
|
54
|
+
this.logger.log(`Enhanced ConfigModule options with ${awsFactories.length} AWS factories`);
|
|
55
|
+
return enhancedOptions;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const enhancementError = error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
this.logger.error('Failed to create enhanced ConfigModule options:', enhancementError);
|
|
60
|
+
// Handle enhancement failure based on options
|
|
61
|
+
if (this.options.failOnAwsError) {
|
|
62
|
+
throw enhancementError;
|
|
63
|
+
}
|
|
64
|
+
// Return base options if fallback is enabled
|
|
65
|
+
if (this.options.fallbackToLocal) {
|
|
66
|
+
this.logger.warn('Falling back to base ConfigModule options due to AWS error');
|
|
67
|
+
return baseOptions;
|
|
68
|
+
}
|
|
69
|
+
throw enhancementError;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a ConfigModule configuration for async setup.
|
|
74
|
+
* This method works with ConfigModule.forRootAsync() pattern.
|
|
75
|
+
*
|
|
76
|
+
* @param baseOptions - Base async ConfigModule options to enhance
|
|
77
|
+
* @returns Promise resolving to enhanced async ConfigModule options
|
|
78
|
+
*/
|
|
79
|
+
async createAsyncConfigModuleOptions(baseOptions = {}) {
|
|
80
|
+
this.logger.debug('Creating async ConfigModule options with AWS integration');
|
|
81
|
+
try {
|
|
82
|
+
// Create a factory function that includes AWS configuration
|
|
83
|
+
const enhancedUseFactory = async (...args) => {
|
|
84
|
+
// Call original factory if it exists
|
|
85
|
+
let baseConfig = {};
|
|
86
|
+
if (baseOptions.useFactory) {
|
|
87
|
+
baseConfig = await baseOptions.useFactory(...args);
|
|
88
|
+
}
|
|
89
|
+
// Enhance with AWS configuration
|
|
90
|
+
return await this.createConfigModuleOptions(baseConfig);
|
|
91
|
+
};
|
|
92
|
+
// Create enhanced async options
|
|
93
|
+
const enhancedAsyncOptions = {
|
|
94
|
+
...baseOptions,
|
|
95
|
+
useFactory: enhancedUseFactory,
|
|
96
|
+
// Ensure our service is injected
|
|
97
|
+
inject: [...(baseOptions.inject || []), FactoryRegistrationService],
|
|
98
|
+
};
|
|
99
|
+
this.logger.debug('Created enhanced async ConfigModule options');
|
|
100
|
+
return enhancedAsyncOptions;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const asyncError = error instanceof Error ? error : new Error(String(error));
|
|
104
|
+
this.logger.error('Failed to create async ConfigModule options:', asyncError);
|
|
105
|
+
if (this.options.failOnAwsError) {
|
|
106
|
+
throw asyncError;
|
|
107
|
+
}
|
|
108
|
+
// Return base options if fallback is enabled
|
|
109
|
+
if (this.options.fallbackToLocal) {
|
|
110
|
+
this.logger.warn('Falling back to base async ConfigModule options due to AWS error');
|
|
111
|
+
return baseOptions;
|
|
112
|
+
}
|
|
113
|
+
throw asyncError;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create a complete ConfigModule with AWS integration.
|
|
118
|
+
* This method returns a ready-to-use DynamicModule.
|
|
119
|
+
*
|
|
120
|
+
* @param baseOptions - Base ConfigModule options
|
|
121
|
+
* @returns Promise resolving to DynamicModule with AWS integration
|
|
122
|
+
*/
|
|
123
|
+
async createIntegratedConfigModule(baseOptions = {}) {
|
|
124
|
+
this.logger.debug('Creating integrated ConfigModule with AWS support');
|
|
125
|
+
try {
|
|
126
|
+
// Create enhanced options
|
|
127
|
+
const enhancedOptions = await this.createConfigModuleOptions(baseOptions);
|
|
128
|
+
// Create the ConfigModule with enhanced options
|
|
129
|
+
const configModule = await ConfigModule.forRoot(enhancedOptions);
|
|
130
|
+
this.logger.log('Created integrated ConfigModule with AWS support');
|
|
131
|
+
return configModule;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
const moduleError = error instanceof Error ? error : new Error(String(error));
|
|
135
|
+
this.logger.error('Failed to create integrated ConfigModule:', moduleError);
|
|
136
|
+
if (this.options.failOnAwsError) {
|
|
137
|
+
throw moduleError;
|
|
138
|
+
}
|
|
139
|
+
// Return basic ConfigModule if fallback is enabled
|
|
140
|
+
if (this.options.fallbackToLocal) {
|
|
141
|
+
this.logger.warn('Falling back to basic ConfigModule due to AWS error');
|
|
142
|
+
return await ConfigModule.forRoot(baseOptions);
|
|
143
|
+
}
|
|
144
|
+
throw moduleError;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create an async integrated ConfigModule.
|
|
149
|
+
* This method returns a ready-to-use async DynamicModule.
|
|
150
|
+
*
|
|
151
|
+
* @param baseOptions - Base async ConfigModule options
|
|
152
|
+
* @returns Promise resolving to DynamicModule with async AWS integration
|
|
153
|
+
*/
|
|
154
|
+
async createAsyncIntegratedConfigModule(baseOptions = {}) {
|
|
155
|
+
this.logger.debug('Creating async integrated ConfigModule with AWS support');
|
|
156
|
+
try {
|
|
157
|
+
// Create enhanced options with AWS integration
|
|
158
|
+
const enhancedOptions = await this.createConfigModuleOptions(baseOptions);
|
|
159
|
+
// Create the ConfigModule with enhanced options
|
|
160
|
+
const asyncConfigModule = await ConfigModule.forRoot(enhancedOptions);
|
|
161
|
+
this.logger.log('Created async integrated ConfigModule with AWS support');
|
|
162
|
+
return asyncConfigModule;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const asyncModuleError = error instanceof Error ? error : new Error(String(error));
|
|
166
|
+
this.logger.error('Failed to create async integrated ConfigModule:', asyncModuleError);
|
|
167
|
+
if (this.options.failOnAwsError) {
|
|
168
|
+
throw asyncModuleError;
|
|
169
|
+
}
|
|
170
|
+
// Return basic async ConfigModule if fallback is enabled
|
|
171
|
+
if (this.options.fallbackToLocal) {
|
|
172
|
+
this.logger.warn('Falling back to basic async ConfigModule due to AWS error');
|
|
173
|
+
return await ConfigModule.forRoot(baseOptions);
|
|
174
|
+
}
|
|
175
|
+
throw asyncModuleError;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get configuration factories for manual registration.
|
|
180
|
+
* This method allows developers to manually register AWS factories with their own ConfigModule setup.
|
|
181
|
+
*
|
|
182
|
+
* @returns Promise resolving to array of configuration factories
|
|
183
|
+
*/
|
|
184
|
+
async getConfigurationFactories() {
|
|
185
|
+
this.logger.debug('Getting configuration factories for manual registration');
|
|
186
|
+
try {
|
|
187
|
+
const factories = await this.factoryRegistrationService.registerFactories();
|
|
188
|
+
this.logger.debug(`Retrieved ${factories.length} configuration factories`);
|
|
189
|
+
return factories;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
const factoryError = error instanceof Error ? error : new Error(String(error));
|
|
193
|
+
this.logger.error('Failed to get configuration factories:', factoryError);
|
|
194
|
+
if (this.options.failOnAwsError) {
|
|
195
|
+
throw factoryError;
|
|
196
|
+
}
|
|
197
|
+
// Return empty array if fallback is enabled
|
|
198
|
+
if (this.options.fallbackToLocal) {
|
|
199
|
+
this.logger.warn('Returning empty factories array due to AWS error');
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
throw factoryError;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get namespaced configuration factories.
|
|
207
|
+
* This method returns factories for specific namespaces only.
|
|
208
|
+
*
|
|
209
|
+
* @param namespaces - Array of namespace names to get factories for
|
|
210
|
+
* @returns Promise resolving to array of namespaced configuration factories
|
|
211
|
+
*/
|
|
212
|
+
async getNamespacedFactories(namespaces) {
|
|
213
|
+
this.logger.debug(`Getting namespaced factories for: ${namespaces.join(', ')}`);
|
|
214
|
+
try {
|
|
215
|
+
const factories = await this.factoryRegistrationService.registerNamespacedFactories(namespaces);
|
|
216
|
+
this.logger.debug(`Retrieved ${factories.length} namespaced factories`);
|
|
217
|
+
return factories;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const namespacedError = error instanceof Error ? error : new Error(String(error));
|
|
221
|
+
this.logger.error('Failed to get namespaced factories:', namespacedError);
|
|
222
|
+
if (this.options.failOnAwsError) {
|
|
223
|
+
throw namespacedError;
|
|
224
|
+
}
|
|
225
|
+
// Return empty array if fallback is enabled
|
|
226
|
+
if (this.options.fallbackToLocal) {
|
|
227
|
+
this.logger.warn('Returning empty namespaced factories array due to AWS error');
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
throw namespacedError;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Create a configuration factory for immediate use.
|
|
235
|
+
* This method creates a single factory that can be used directly with @nestjs/config.
|
|
236
|
+
*
|
|
237
|
+
* @param namespace - Optional namespace for the factory
|
|
238
|
+
* @param config - Optional configuration data to use
|
|
239
|
+
* @returns Configuration factory
|
|
240
|
+
*/
|
|
241
|
+
createImmediateFactory(namespace, config) {
|
|
242
|
+
this.logger.debug(`Creating immediate factory for namespace: ${namespace || 'default'}`);
|
|
243
|
+
try {
|
|
244
|
+
const factory = this.factoryRegistrationService.createSyncFactory(namespace, config);
|
|
245
|
+
this.logger.debug(`Created immediate factory: ${namespace || 'default'}`);
|
|
246
|
+
return factory;
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
const immediateError = error instanceof Error ? error : new Error(String(error));
|
|
250
|
+
this.logger.error('Failed to create immediate factory:', immediateError);
|
|
251
|
+
if (this.options.failOnAwsError) {
|
|
252
|
+
throw immediateError;
|
|
253
|
+
}
|
|
254
|
+
// Return empty factory if fallback is enabled
|
|
255
|
+
if (this.options.fallbackToLocal) {
|
|
256
|
+
this.logger.warn('Creating empty factory due to error');
|
|
257
|
+
return () => config || {};
|
|
258
|
+
}
|
|
259
|
+
throw immediateError;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Check if AWS integration is available and working.
|
|
264
|
+
* This method can be used to verify the integration status.
|
|
265
|
+
*
|
|
266
|
+
* @returns Promise resolving to integration status
|
|
267
|
+
*/
|
|
268
|
+
async checkIntegrationStatus() {
|
|
269
|
+
this.logger.debug('Checking AWS integration status');
|
|
270
|
+
const status = {
|
|
271
|
+
isAvailable: false,
|
|
272
|
+
factoriesRegistered: 0,
|
|
273
|
+
errors: []
|
|
274
|
+
};
|
|
275
|
+
try {
|
|
276
|
+
// Check if factories are initialized
|
|
277
|
+
const isInitialized = this.factoryRegistrationService.isFactoriesInitialized();
|
|
278
|
+
if (isInitialized) {
|
|
279
|
+
const registeredFactories = this.factoryRegistrationService.getRegisteredFactories();
|
|
280
|
+
status.factoriesRegistered = registeredFactories.size;
|
|
281
|
+
status.isAvailable = true;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// Try to register factories to check availability
|
|
285
|
+
const factories = await this.factoryRegistrationService.registerFactories();
|
|
286
|
+
status.factoriesRegistered = factories.length;
|
|
287
|
+
status.isAvailable = true;
|
|
288
|
+
}
|
|
289
|
+
this.logger.debug(`Integration status: available=${status.isAvailable}, factories=${status.factoriesRegistered}`);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
const statusError = error instanceof Error ? error : new Error(String(error));
|
|
293
|
+
status.errors.push(statusError.message);
|
|
294
|
+
this.logger.error('Integration status check failed:', statusError);
|
|
295
|
+
}
|
|
296
|
+
return status;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Reset the integration state.
|
|
300
|
+
* This method clears all registered factories and resets the integration.
|
|
301
|
+
*/
|
|
302
|
+
resetIntegration() {
|
|
303
|
+
this.logger.debug('Resetting AWS integration state');
|
|
304
|
+
this.factoryRegistrationService.reset();
|
|
305
|
+
this.logger.debug('AWS integration state reset complete');
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
NestjsConfigIntegrationService = NestjsConfigIntegrationService_1 = __decorate([
|
|
309
|
+
Injectable(),
|
|
310
|
+
__param(1, Optional()),
|
|
311
|
+
__param(1, Inject(NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
|
|
312
|
+
__metadata("design:paramtypes", [FactoryRegistrationService, Object])
|
|
313
|
+
], NestjsConfigIntegrationService);
|
|
314
|
+
export { NestjsConfigIntegrationService };
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL25lc3Rqcy1jb25maWctaW50ZWdyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBaUIsWUFBWSxFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBRWxGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTVGOzs7R0FHRztBQUVJLElBQU0sOEJBQThCLHNDQUFwQyxNQUFNLDhCQUE4QjtJQUl0QjtJQUVBO0lBTEYsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLGdDQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTFFLFlBQ21CLDBCQUFzRCxFQUV0RCxVQUE4QixFQUFFO1FBRmhDLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFFdEQsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFDaEQsQ0FBQztJQUVKOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxjQUFtQyxFQUFFO1FBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFFeEUsSUFBSSxDQUFDO1lBQ0gsdUNBQXVDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFL0UsK0NBQStDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lB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QUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5RSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRixDQUFBO0FBNVVZLDhCQUE4QjtJQUQxQyxVQUFVLEVBQUU7SUFNUixXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQUUsV0FBQSxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQTtxQ0FEYiwwQkFBMEI7R0FKOUQsOEJBQThCLENBNFUxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ29uZmlnRmFjdG9yeSwgQ29uZmlnTW9kdWxlLCBDb25maWdNb2R1bGVPcHRpb25zIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSB9IGZyb20gJy4vZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEludGVncmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZWdyYXRpb24tb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBORVNUSlNfQ09ORklHX0FXU19JTlRFR1JBVElPTl9PUFRJT05TIH0gZnJvbSAnLi4vbmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5tb2R1bGUnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgdGhhdCBwcm92aWRlcyBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBAbmVzdGpzL2NvbmZpZy5cclxuICogVGhpcyBzZXJ2aWNlIGNyZWF0ZXMgQ29uZmlnTW9kdWxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5jbHVkZSBBV1Mtc291cmNlZCBmYWN0b3JpZXMuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZXN0anNDb25maWdJbnRlZ3JhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOZXN0anNDb25maWdJbnRlZ3JhdGlvblNlcnZpY2UubmFtZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZTogRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5FU1RKU19DT05GSUdfQVdTX0lOVEVHUkFUSU9OX09QVElPTlMpIFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbnRlZ3JhdGlvbk9wdGlvbnMgPSB7fVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgQ29uZmlnTW9kdWxlIGNvbmZpZ3VyYXRpb24gd2l0aCBBV1Mtc291cmNlZCBmYWN0b3JpZXMuXHJcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZW5oYW5jZSBleGlzdGluZyBAbmVzdGpzL2NvbmZpZyBzZXR1cHMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBDb25maWdNb2R1bGUgb3B0aW9ucyB0byBlbmhhbmNlXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZW5oYW5jZWQgQ29uZmlnTW9kdWxlIG9wdGlvbnNcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPENvbmZpZ01vZHVsZU9wdGlvbnM+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBDb25maWdNb2R1bGUgb3B0aW9ucyB3aXRoIEFXUyBpbnRlZ3JhdGlvbicpO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBSZWdpc3RlciBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICAgICAgY29uc3QgYXdzRmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICBcclxuICAgICAgLy8gTWVyZ2UgQVdTIGZhY3RvcmllcyB3aXRoIGV4aXN0aW5nIGxvYWQgYXJyYXlcclxuICAgICAgY29uc3QgZXhpc3RpbmdMb2FkID0gYmFzZU9wdGlvbnMubG9hZCB8fCBbXTtcclxuICAgICAgY29uc3QgZW5oYW5jZWRMb2FkID0gWy4uLmV4aXN0aW5nTG9hZCwgLi4uYXdzRmFjdG9yaWVzXTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkT3B0aW9uczogQ29uZmlnTW9kdWxlT3B0aW9ucyA9IHtcclxuICAgICAgICAuLi5iYXNlT3B0aW9ucyxcclxuICAgICAgICBsb2FkOiBlbmhhbmNlZExvYWQsXHJcbiAgICAgICAgLy8gQXBwbHkgaW50ZWdyYXRpb24tc3BlY2lmaWMgb3B0aW9ucyB3aXRoIHByb3BlciBwcmVjZWRlbmNlXHJcbiAgICAgICAgaXNHbG9iYWw6IGJhc2VPcHRpb25zLmlzR2xvYmFsICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5pc0dsb2JhbCA6ICh0aGlzLm9wdGlvbnMucmVnaXN0ZXJHbG9iYWxseSA/PyB0cnVlKSxcclxuICAgICAgICBjYWNoZTogYmFzZU9wdGlvbnMuY2FjaGUgIT09IHVuZGVmaW5lZCA/IGJhc2VPcHRpb25zLmNhY2hlIDogKHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uY2FjaGUgPz8gdHJ1ZSksXHJcbiAgICAgICAgZXhwYW5kVmFyaWFibGVzOiBiYXNlT3B0aW9ucy5leHBhbmRWYXJpYWJsZXMgIT09IHVuZGVmaW5lZCA/IGJhc2VPcHRpb25zLmV4cGFuZFZhcmlhYmxlcyA6ICh0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlKSxcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhgRW5oYW5jZWQgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCAke2F3c0ZhY3Rvcmllcy5sZW5ndGh9IEFXUyBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkT3B0aW9ucztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGVuaGFuY2VtZW50RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGVuaGFuY2VkIENvbmZpZ01vZHVsZSBvcHRpb25zOicsIGVuaGFuY2VtZW50RXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gSGFuZGxlIGVuaGFuY2VtZW50IGZhaWx1cmUgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgZW5oYW5jZW1lbnRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGJhc2Ugb3B0aW9ucyBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFsbGluZyBiYWNrIHRvIGJhc2UgQ29uZmlnTW9kdWxlIG9wdGlvbnMgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBiYXNlT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgZW5oYW5jZW1lbnRFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIENvbmZpZ01vZHVsZSBjb25maWd1cmF0aW9uIGZvciBhc3luYyBzZXR1cC5cclxuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyB3aXRoIENvbmZpZ01vZHVsZS5mb3JSb290QXN5bmMoKSBwYXR0ZXJuLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBiYXNlT3B0aW9ucyAtIEJhc2UgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgdG8gZW5oYW5jZVxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGVuaGFuY2VkIGFzeW5jIENvbmZpZ01vZHVsZSBvcHRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlQXN5bmNDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCBBV1MgaW50ZWdyYXRpb24nKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIEFXUyBjb25maWd1cmF0aW9uXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkVXNlRmFjdG9yeSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZmFjdG9yeSBpZiBpdCBleGlzdHNcclxuICAgICAgICBsZXQgYmFzZUNvbmZpZzogQ29uZmlnTW9kdWxlT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIGlmIChiYXNlT3B0aW9ucy51c2VGYWN0b3J5KSB7XHJcbiAgICAgICAgICBiYXNlQ29uZmlnID0gYXdhaXQgYmFzZU9wdGlvbnMudXNlRmFjdG9yeSguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRW5oYW5jZSB3aXRoIEFXUyBjb25maWd1cmF0aW9uXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlnTW9kdWxlT3B0aW9ucyhiYXNlQ29uZmlnKTtcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBhc3luYyBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkQXN5bmNPcHRpb25zID0ge1xyXG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxyXG4gICAgICAgIHVzZUZhY3Rvcnk6IGVuaGFuY2VkVXNlRmFjdG9yeSxcclxuICAgICAgICAvLyBFbnN1cmUgb3VyIHNlcnZpY2UgaXMgaW5qZWN0ZWRcclxuICAgICAgICBpbmplY3Q6IFsuLi4oYmFzZU9wdGlvbnMuaW5qZWN0IHx8IFtdKSwgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2VdLFxyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0ZWQgZW5oYW5jZWQgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMnKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkQXN5bmNPcHRpb25zO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgYXN5bmNFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnM6JywgYXN5bmNFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgYXN5bmNFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGJhc2Ugb3B0aW9ucyBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFsbGluZyBiYWNrIHRvIGJhc2UgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBiYXNlT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgYXN5bmNFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGNvbXBsZXRlIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBpbnRlZ3JhdGlvbi5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVhZHktdG8tdXNlIER5bmFtaWNNb2R1bGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBDb25maWdNb2R1bGUgb3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIER5bmFtaWNNb2R1bGUgd2l0aCBBV1MgaW50ZWdyYXRpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVJbnRlZ3JhdGVkQ29uZmlnTW9kdWxlKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBzdXBwb3J0Jyk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkT3B0aW9ucyA9IGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlnTW9kdWxlT3B0aW9ucyhiYXNlT3B0aW9ucyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgdGhlIENvbmZpZ01vZHVsZSB3aXRoIGVuaGFuY2VkIG9wdGlvbnNcclxuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoZW5oYW5jZWRPcHRpb25zKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZygnQ3JlYXRlZCBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBzdXBwb3J0Jyk7XHJcbiAgICAgIHJldHVybiBjb25maWdNb2R1bGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBtb2R1bGVFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgaW50ZWdyYXRlZCBDb25maWdNb2R1bGU6JywgbW9kdWxlRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG1vZHVsZUVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzaWMgQ29uZmlnTW9kdWxlIGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWxsaW5nIGJhY2sgdG8gYmFzaWMgQ29uZmlnTW9kdWxlIGR1ZSB0byBBV1MgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoYmFzZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBtb2R1bGVFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBhc3luYyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZS5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVhZHktdG8tdXNlIGFzeW5jIER5bmFtaWNNb2R1bGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBhc3luYyBDb25maWdNb2R1bGUgb3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIER5bmFtaWNNb2R1bGUgd2l0aCBhc3luYyBBV1MgaW50ZWdyYXRpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVBc3luY0ludGVncmF0ZWRDb25maWdNb2R1bGUoYmFzZU9wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIGFzeW5jIGludGVncmF0ZWQgQ29uZmlnTW9kdWxlIHdpdGggQVdTIHN1cHBvcnQnKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIGVuaGFuY2VkIG9wdGlvbnMgd2l0aCBBV1MgaW50ZWdyYXRpb25cclxuICAgICAgY29uc3QgZW5oYW5jZWRPcHRpb25zID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zKTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSB0aGUgQ29uZmlnTW9kdWxlIHdpdGggZW5oYW5jZWQgb3B0aW9uc1xyXG4gICAgICBjb25zdCBhc3luY0NvbmZpZ01vZHVsZSA9IGF3YWl0IENvbmZpZ01vZHVsZS5mb3JSb290KGVuaGFuY2VkT3B0aW9ucyk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coJ0NyZWF0ZWQgYXN5bmMgaW50ZWdyYXRlZCBDb25maWdNb2R1bGUgd2l0aCBBV1Mgc3VwcG9ydCcpO1xyXG4gICAgICByZXR1cm4gYXN5bmNDb25maWdNb2R1bGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBhc3luY01vZHVsZUVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZTonLCBhc3luY01vZHVsZUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBhc3luY01vZHVsZUVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzaWMgYXN5bmMgQ29uZmlnTW9kdWxlIGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWxsaW5nIGJhY2sgdG8gYmFzaWMgYXN5bmMgQ29uZmlnTW9kdWxlIGR1ZSB0byBBV1MgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoYmFzZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBhc3luY01vZHVsZUVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzIGZvciBtYW51YWwgcmVnaXN0cmF0aW9uLlxyXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBkZXZlbG9wZXJzIHRvIG1hbnVhbGx5IHJlZ2lzdGVyIEFXUyBmYWN0b3JpZXMgd2l0aCB0aGVpciBvd24gQ29uZmlnTW9kdWxlIHNldHVwLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29uZmlndXJhdGlvbkZhY3RvcmllcygpOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0dldHRpbmcgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgZm9yIG1hbnVhbCByZWdpc3RyYXRpb24nKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmV0cmlldmVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gY29uZmlndXJhdGlvbiBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGZhY3RvcmllcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGZhY3RvcnlFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgY29uZmlndXJhdGlvbiBmYWN0b3JpZXM6JywgZmFjdG9yeUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBhcnJheSBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGVtcHR5IGZhY3RvcmllcyBhcnJheSBkdWUgdG8gQVdTIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllcy5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhY3RvcmllcyBmb3Igc3BlY2lmaWMgbmFtZXNwYWNlcyBvbmx5LlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gQXJyYXkgb2YgbmFtZXNwYWNlIG5hbWVzIHRvIGdldCBmYWN0b3JpZXMgZm9yXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldE5hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlczogc3RyaW5nW10pOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYEdldHRpbmcgbmFtZXNwYWNlZCBmYWN0b3JpZXMgZm9yOiAke25hbWVzcGFjZXMuam9pbignLCAnKX1gKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3Rlck5hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlcyk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZXRyaWV2ZWQgJHtmYWN0b3JpZXMubGVuZ3RofSBuYW1lc3BhY2VkIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gZmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBuYW1lc3BhY2VkIGZhY3RvcmllczonLCBuYW1lc3BhY2VkRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG5hbWVzcGFjZWRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGFycmF5IGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdSZXR1cm5pbmcgZW1wdHkgbmFtZXNwYWNlZCBmYWN0b3JpZXMgYXJyYXkgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgbmFtZXNwYWNlZEVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgY29uZmlndXJhdGlvbiBmYWN0b3J5IGZvciBpbW1lZGlhdGUgdXNlLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaW5nbGUgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdpdGggQG5lc3Rqcy9jb25maWcuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE9wdGlvbmFsIG5hbWVzcGFjZSBmb3IgdGhlIGZhY3RvcnlcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBkYXRhIHRvIHVzZVxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGNyZWF0ZUltbWVkaWF0ZUZhY3RvcnkobmFtZXNwYWNlPzogc3RyaW5nLCBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgaW1tZWRpYXRlIGZhY3RvcnkgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfWApO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5jcmVhdGVTeW5jRmFjdG9yeShuYW1lc3BhY2UsIGNvbmZpZyk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIGltbWVkaWF0ZSBmYWN0b3J5OiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcbiAgICAgIHJldHVybiBmYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgaW1tZWRpYXRlRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGltbWVkaWF0ZSBmYWN0b3J5OicsIGltbWVkaWF0ZUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBpbW1lZGlhdGVFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGZhY3RvcnkgaWYgZmFsbGJhY2sgaXMgZW5hYmxlZFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0NyZWF0aW5nIGVtcHR5IGZhY3RvcnkgZHVlIHRvIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IGNvbmZpZyB8fCB7fTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgaW1tZWRpYXRlRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBBV1MgaW50ZWdyYXRpb24gaXMgYXZhaWxhYmxlIGFuZCB3b3JraW5nLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyYXRpb24gc3RhdHVzLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGludGVncmF0aW9uIHN0YXR1c1xyXG4gICAqL1xyXG4gIGFzeW5jIGNoZWNrSW50ZWdyYXRpb25TdGF0dXMoKTogUHJvbWlzZTx7XHJcbiAgICBpc0F2YWlsYWJsZTogYm9vbGVhbjtcclxuICAgIGZhY3Rvcmllc1JlZ2lzdGVyZWQ6IG51bWJlcjtcclxuICAgIGVycm9yczogc3RyaW5nW107XHJcbiAgfT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NoZWNraW5nIEFXUyBpbnRlZ3JhdGlvbiBzdGF0dXMnKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc3RhdHVzID0ge1xyXG4gICAgICBpc0F2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgIGZhY3Rvcmllc1JlZ2lzdGVyZWQ6IDAsXHJcbiAgICAgIGVycm9yczogW10gYXMgc3RyaW5nW11cclxuICAgIH07XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ2hlY2sgaWYgZmFjdG9yaWVzIGFyZSBpbml0aWFsaXplZFxyXG4gICAgICBjb25zdCBpc0luaXRpYWxpemVkID0gdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5pc0ZhY3Rvcmllc0luaXRpYWxpemVkKCk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGYWN0b3JpZXMgPSB0aGlzLmZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlLmdldFJlZ2lzdGVyZWRGYWN0b3JpZXMoKTtcclxuICAgICAgICBzdGF0dXMuZmFjdG9yaWVzUmVnaXN0ZXJlZCA9IHJlZ2lzdGVyZWRGYWN0b3JpZXMuc2l6ZTtcclxuICAgICAgICBzdGF0dXMuaXNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmYWN0b3JpZXMgdG8gY2hlY2sgYXZhaWxhYmlsaXR5XHJcbiAgICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICAgIHN0YXR1cy5mYWN0b3JpZXNSZWdpc3RlcmVkID0gZmFjdG9yaWVzLmxlbmd0aDtcclxuICAgICAgICBzdGF0dXMuaXNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgSW50ZWdyYXRpb24gc3RhdHVzOiBhdmFpbGFibGU9JHtzdGF0dXMuaXNBdmFpbGFibGV9LCBmYWN0b3JpZXM9JHtzdGF0dXMuZmFjdG9yaWVzUmVnaXN0ZXJlZH1gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1c0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICBzdGF0dXMuZXJyb3JzLnB1c2goc3RhdHVzRXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdJbnRlZ3JhdGlvbiBzdGF0dXMgY2hlY2sgZmFpbGVkOicsIHN0YXR1c0Vycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIGludGVncmF0aW9uIHN0YXRlLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVnaXN0ZXJlZCBmYWN0b3JpZXMgYW5kIHJlc2V0cyB0aGUgaW50ZWdyYXRpb24uXHJcbiAgICovXHJcbiAgcmVzZXRJbnRlZ3JhdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdSZXNldHRpbmcgQVdTIGludGVncmF0aW9uIHN0YXRlJyk7XHJcbiAgICB0aGlzLmZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlLnJlc2V0KCk7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQVdTIGludGVncmF0aW9uIHN0YXRlIHJlc2V0IGNvbXBsZXRlJyk7XHJcbiAgfVxyXG59Il19
|