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