aws-cdk 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +276 -0
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +1274 -0
- package/THIRD_PARTY_LICENSES +26821 -0
- package/bin/cdk +6 -0
- package/build-info.json +4 -0
- package/db.json.gz +0 -0
- package/generate.sh +25 -0
- package/images/garbage-collection.png +0 -0
- package/lib/api/aws-auth/account-cache.d.ts +39 -0
- package/lib/api/aws-auth/account-cache.js +102 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +42 -0
- package/lib/api/aws-auth/awscli-compatible.js +264 -0
- package/lib/api/aws-auth/cached.d.ts +11 -0
- package/lib/api/aws-auth/cached.js +26 -0
- package/lib/api/aws-auth/credential-plugins.d.ts +36 -0
- package/lib/api/aws-auth/credential-plugins.js +153 -0
- package/lib/api/aws-auth/index.d.ts +3 -0
- package/lib/api/aws-auth/index.js +20 -0
- package/lib/api/aws-auth/provider-caching.d.ts +13 -0
- package/lib/api/aws-auth/provider-caching.js +24 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +130 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +207 -0
- package/lib/api/aws-auth/sdk-provider.js +359 -0
- package/lib/api/aws-auth/sdk.d.ts +223 -0
- package/lib/api/aws-auth/sdk.js +366 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +61 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +21 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +23 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +33 -0
- package/lib/api/bootstrap/bootstrap-environment.js +322 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/bootstrap-template.yaml +692 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +37 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +143 -0
- package/lib/api/bootstrap/index.d.ts +2 -0
- package/lib/api/bootstrap/index.js +19 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +82 -0
- package/lib/api/cxapp/cloud-assembly.d.ts +150 -0
- package/lib/api/cxapp/cloud-assembly.js +305 -0
- package/lib/api/cxapp/cloud-executable.d.ts +44 -0
- package/lib/api/cxapp/cloud-executable.js +90 -0
- package/lib/api/cxapp/environments.d.ts +9 -0
- package/lib/api/cxapp/environments.js +66 -0
- package/lib/api/cxapp/exec.d.ts +56 -0
- package/lib/api/cxapp/exec.js +275 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +35 -0
- package/lib/api/deployments/asset-publishing.d.ts +77 -0
- package/lib/api/deployments/asset-publishing.js +163 -0
- package/lib/api/deployments/assets.d.ts +10 -0
- package/lib/api/deployments/assets.js +111 -0
- package/lib/api/deployments/checks.d.ts +8 -0
- package/lib/api/deployments/checks.js +73 -0
- package/lib/api/deployments/cloudformation.d.ts +235 -0
- package/lib/api/deployments/cloudformation.js +598 -0
- package/lib/api/deployments/deploy-stack.d.ts +177 -0
- package/lib/api/deployments/deploy-stack.js +484 -0
- package/lib/api/deployments/deployment-method.d.ts +24 -0
- package/lib/api/deployments/deployment-method.js +3 -0
- package/lib/api/deployments/deployment-result.d.ts +21 -0
- package/lib/api/deployments/deployment-result.js +10 -0
- package/lib/api/deployments/deployments.d.ts +340 -0
- package/lib/api/deployments/deployments.js +369 -0
- package/lib/api/deployments/hotswap-deployments.d.ts +14 -0
- package/lib/api/deployments/hotswap-deployments.js +357 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +23 -0
- package/lib/api/deployments/nested-stack-helpers.d.ts +25 -0
- package/lib/api/deployments/nested-stack-helpers.js +88 -0
- package/lib/api/environment-access.d.ts +138 -0
- package/lib/api/environment-access.js +203 -0
- package/lib/api/environment-resources.d.ts +73 -0
- package/lib/api/environment-resources.js +208 -0
- package/lib/api/evaluate-cloudformation-template.d.ts +84 -0
- package/lib/api/evaluate-cloudformation-template.js +443 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +152 -0
- package/lib/api/garbage-collection/garbage-collector.js +607 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +21 -0
- package/lib/api/garbage-collection/progress-printer.js +69 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +44 -0
- package/lib/api/garbage-collection/stack-refresh.js +154 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +157 -0
- package/lib/api/hotswap/code-build-projects.d.ts +3 -0
- package/lib/api/hotswap/code-build-projects.js +55 -0
- package/lib/api/hotswap/common.d.ts +126 -0
- package/lib/api/hotswap/common.js +170 -0
- package/lib/api/hotswap/ecs-services.d.ts +3 -0
- package/lib/api/hotswap/ecs-services.js +140 -0
- package/lib/api/hotswap/lambda-functions.d.ts +3 -0
- package/lib/api/hotswap/lambda-functions.js +309 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +9 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +112 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +42 -0
- package/lib/api/index.d.ts +5 -0
- package/lib/api/index.js +22 -0
- package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
- package/lib/api/logs/find-cloudwatch-logs.js +97 -0
- package/lib/api/logs/logs-monitor.d.ts +53 -0
- package/lib/api/logs/logs-monitor.js +169 -0
- package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
- package/lib/api/plugin/context-provider-plugin.js +7 -0
- package/lib/api/plugin/index.d.ts +3 -0
- package/lib/api/plugin/index.js +20 -0
- package/lib/api/plugin/mode.d.ts +4 -0
- package/lib/api/plugin/mode.js +9 -0
- package/lib/api/plugin/plugin.d.ts +63 -0
- package/lib/api/plugin/plugin.js +106 -0
- package/lib/api/settings.d.ts +29 -0
- package/lib/api/settings.js +141 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-info.d.ts +51 -0
- package/lib/api/toolkit-info.js +156 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +237 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.js +550 -0
- package/lib/api/util/cloudformation/stack-event-poller.d.ts +63 -0
- package/lib/api/util/cloudformation/stack-event-poller.js +129 -0
- package/lib/api/util/cloudformation/stack-status.d.ts +42 -0
- package/lib/api/util/cloudformation/stack-status.js +88 -0
- package/lib/api/util/display.d.ts +13 -0
- package/lib/api/util/display.js +80 -0
- package/lib/api/util/placeholders.d.ts +10 -0
- package/lib/api/util/placeholders.js +24 -0
- package/lib/api/util/rwlock.d.ts +65 -0
- package/lib/api/util/rwlock.js +179 -0
- package/lib/api/util/string-manipulation.d.ts +10 -0
- package/lib/api/util/string-manipulation.js +33 -0
- package/lib/api/util/template-body-parameter.d.ts +21 -0
- package/lib/api/util/template-body-parameter.js +104 -0
- package/lib/cli/cdk-toolkit.d.ts +594 -0
- package/lib/cli/cdk-toolkit.js +1019 -0
- package/lib/cli/cli-config.d.ts +10 -0
- package/lib/cli/cli-config.js +406 -0
- package/lib/cli/cli.d.ts +4 -0
- package/lib/cli/cli.js +538 -0
- package/lib/cli/convert-to-user-input.d.ts +3 -0
- package/lib/cli/convert-to-user-input.js +434 -0
- package/lib/cli/parse-command-line-arguments.d.ts +1 -0
- package/lib/cli/parse-command-line-arguments.js +806 -0
- package/lib/cli/platform-warnings.d.ts +2 -0
- package/lib/cli/platform-warnings.js +45 -0
- package/lib/cli/user-configuration.d.ts +90 -0
- package/lib/cli/user-configuration.js +272 -0
- package/lib/cli/user-input.d.ts +1163 -0
- package/lib/cli/user-input.js +3 -0
- package/lib/cli/util/console-formatters.d.ts +18 -0
- package/lib/cli/util/console-formatters.js +42 -0
- package/lib/cli/util/npm.d.ts +1 -0
- package/lib/cli/util/npm.js +22 -0
- package/lib/cli/util/yargs-helpers.d.ts +22 -0
- package/lib/cli/util/yargs-helpers.js +49 -0
- package/lib/cli/version.d.ts +13 -0
- package/lib/cli/version.js +120 -0
- package/lib/commands/context.d.ts +35 -0
- package/lib/commands/context.js +156 -0
- package/lib/commands/docs.d.ts +13 -0
- package/lib/commands/docs.js +32 -0
- package/lib/commands/doctor.d.ts +1 -0
- package/lib/commands/doctor.js +69 -0
- package/lib/commands/migrate.d.ts +327 -0
- package/lib/commands/migrate.js +804 -0
- package/lib/context-providers/ami.d.ts +11 -0
- package/lib/context-providers/ami.js +50 -0
- package/lib/context-providers/availability-zones.d.ts +11 -0
- package/lib/context-providers/availability-zones.js +27 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +11 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +33 -0
- package/lib/context-providers/hosted-zones.d.ts +10 -0
- package/lib/context-providers/hosted-zones.js +67 -0
- package/lib/context-providers/index.d.ts +30 -0
- package/lib/context-providers/index.js +109 -0
- package/lib/context-providers/keys.d.ts +11 -0
- package/lib/context-providers/keys.js +52 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +159 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +70 -0
- package/lib/context-providers/ssm-parameters.d.ts +23 -0
- package/lib/context-providers/ssm-parameters.js +59 -0
- package/lib/context-providers/vpcs.d.ts +11 -0
- package/lib/context-providers/vpcs.js +288 -0
- package/lib/diff.d.ts +28 -0
- package/lib/diff.js +165 -0
- package/lib/import.d.ts +182 -0
- package/lib/import.js +335 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +348304 -0
- package/lib/index_bg.wasm +0 -0
- package/lib/init-hooks.d.ts +40 -0
- package/lib/init-hooks.js +64 -0
- package/lib/init-templates/.init-version.json +1 -0
- package/lib/init-templates/.no-packagejson-validator +0 -0
- package/lib/init-templates/.recommended-feature-flags.json +68 -0
- package/lib/init-templates/LICENSE +16 -0
- package/lib/init-templates/app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/app/csharp/README.md +14 -0
- package/lib/init-templates/app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +13 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/Program.template.cs +44 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/app/fsharp/README.md +18 -0
- package/lib/init-templates/app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +8 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/go/%name%.template.go +70 -0
- package/lib/init-templates/app/go/%name%_test.template.go +26 -0
- package/lib/init-templates/app/go/.template.gitignore +19 -0
- package/lib/init-templates/app/go/README.md +12 -0
- package/lib/init-templates/app/go/cdk.template.json +13 -0
- package/lib/init-templates/app/go/go.template.mod +9 -0
- package/lib/init-templates/app/info.json +4 -0
- package/lib/init-templates/app/java/.template.gitignore +13 -0
- package/lib/init-templates/app/java/README.md +18 -0
- package/lib/init-templates/app/java/cdk.json +13 -0
- package/lib/init-templates/app/java/pom.xml +60 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +42 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +24 -0
- package/lib/init-templates/app/java/src/test/java/com/myorg/%name.PascalCased%Test.template.java +26 -0
- package/lib/init-templates/app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/app/javascript/README.md +12 -0
- package/lib/init-templates/app/javascript/bin/%name%.template.js +21 -0
- package/lib/init-templates/app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/app/javascript/jest.config.js +3 -0
- package/lib/init-templates/app/javascript/lib/%name%-stack.template.js +23 -0
- package/lib/init-templates/app/javascript/package.json +20 -0
- package/lib/init-templates/app/javascript/test/%name%.test.template.js +17 -0
- package/lib/init-templates/app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +19 -0
- package/lib/init-templates/app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/app/python/.template.gitignore +10 -0
- package/lib/init-templates/app/python/README.template.md +58 -0
- package/lib/init-templates/app/python/app.template.py +28 -0
- package/lib/init-templates/app/python/cdk.template.json +15 -0
- package/lib/init-templates/app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/app/python/requirements.txt +2 -0
- package/lib/init-templates/app/python/source.bat +13 -0
- package/lib/init-templates/app/python/tests/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/test_%name.PythonModule%_stack.template.py +15 -0
- package/lib/init-templates/app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/app/typescript/README.md +14 -0
- package/lib/init-templates/app/typescript/bin/%name%.template.ts +20 -0
- package/lib/init-templates/app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/app/typescript/jest.config.js +8 -0
- package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +16 -0
- package/lib/init-templates/app/typescript/package.json +26 -0
- package/lib/init-templates/app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/app/typescript/tsconfig.json +31 -0
- package/lib/init-templates/lib/info.json +4 -0
- package/lib/init-templates/lib/typescript/.template.gitignore +8 -0
- package/lib/init-templates/lib/typescript/.template.npmignore +6 -0
- package/lib/init-templates/lib/typescript/README.template.md +12 -0
- package/lib/init-templates/lib/typescript/jest.config.js +8 -0
- package/lib/init-templates/lib/typescript/lib/index.template.ts +21 -0
- package/lib/init-templates/lib/typescript/package.json +24 -0
- package/lib/init-templates/lib/typescript/test/%name%.test.template.ts +18 -0
- package/lib/init-templates/lib/typescript/tsconfig.json +31 -0
- package/lib/init-templates/sample-app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/csharp/README.template.md +19 -0
- package/lib/init-templates/sample-app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +24 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/Program.template.cs +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/fsharp/README.template.md +20 -0
- package/lib/init-templates/sample-app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/go/%name%.template.go +73 -0
- package/lib/init-templates/sample-app/go/%name%_test.template.go +25 -0
- package/lib/init-templates/sample-app/go/.template.gitignore +19 -0
- package/lib/init-templates/sample-app/go/README.md +12 -0
- package/lib/init-templates/sample-app/go/cdk.template.json +13 -0
- package/lib/init-templates/sample-app/go/go.template.mod +9 -0
- package/lib/init-templates/sample-app/info.json +4 -0
- package/lib/init-templates/sample-app/java/.template.gitignore +13 -0
- package/lib/init-templates/sample-app/java/README.template.md +19 -0
- package/lib/init-templates/sample-app/java/cdk.json +13 -0
- package/lib/init-templates/sample-app/java/pom.xml +55 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +13 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +29 -0
- package/lib/init-templates/sample-app/java/src/test/java/com/myorg/%name.PascalCased%StackTest.template.java +27 -0
- package/lib/init-templates/sample-app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/sample-app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/sample-app/javascript/README.template.md +13 -0
- package/lib/init-templates/sample-app/javascript/bin/%name%.template.js +6 -0
- package/lib/init-templates/sample-app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/javascript/jest.config.js +3 -0
- package/lib/init-templates/sample-app/javascript/lib/%name%-stack.template.js +25 -0
- package/lib/init-templates/sample-app/javascript/package.json +20 -0
- package/lib/init-templates/sample-app/javascript/test/%name%.test.template.js +16 -0
- package/lib/init-templates/sample-app/javascript/tsconfig.json +34 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +26 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/.template.gitignore +22 -0
- package/lib/init-templates/sample-app/python/README.template.md +65 -0
- package/lib/init-templates/sample-app/python/app.template.py +11 -0
- package/lib/init-templates/sample-app/python/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/sample-app/python/requirements.txt +2 -0
- package/lib/init-templates/sample-app/python/source.bat +13 -0
- package/lib/init-templates/sample-app/python/tests/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/test_%name.PythonModule%_stack.template.py +21 -0
- package/lib/init-templates/sample-app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/sample-app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/sample-app/typescript/README.template.md +15 -0
- package/lib/init-templates/sample-app/typescript/bin/%name%.template.ts +6 -0
- package/lib/init-templates/sample-app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/sample-app/typescript/jest.config.js +8 -0
- package/lib/init-templates/sample-app/typescript/lib/%name%-stack.template.ts +19 -0
- package/lib/init-templates/sample-app/typescript/package.json +26 -0
- package/lib/init-templates/sample-app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/sample-app/typescript/tsconfig.json +31 -0
- package/lib/init.d.ts +52 -0
- package/lib/init.js +430 -0
- package/lib/legacy-exports-source.d.ts +27 -0
- package/lib/legacy-exports-source.js +88 -0
- package/lib/legacy-exports.d.ts +10 -0
- package/lib/legacy-exports.js +28 -0
- package/lib/legacy-logging-source.d.ts +32 -0
- package/lib/legacy-logging-source.js +107 -0
- package/lib/list-stacks.d.ts +22 -0
- package/lib/list-stacks.js +23 -0
- package/lib/logging.d.ts +109 -0
- package/lib/logging.js +159 -0
- package/lib/migrator.d.ts +25 -0
- package/lib/migrator.js +67 -0
- package/lib/notices.d.ts +156 -0
- package/lib/notices.js +373 -0
- package/lib/os.d.ts +7 -0
- package/lib/os.js +92 -0
- package/lib/serialize.d.ts +27 -0
- package/lib/serialize.js +86 -0
- package/lib/toolkit/cli-io-host.d.ts +208 -0
- package/lib/toolkit/cli-io-host.js +282 -0
- package/lib/toolkit/error.d.ts +44 -0
- package/lib/toolkit/error.js +78 -0
- package/lib/tree.d.ts +31 -0
- package/lib/tree.js +40 -0
- package/lib/util/archive.d.ts +1 -0
- package/lib/util/archive.js +86 -0
- package/lib/util/arrays.d.ts +14 -0
- package/lib/util/arrays.js +36 -0
- package/lib/util/bool.d.ts +7 -0
- package/lib/util/bool.js +13 -0
- package/lib/util/bytes.d.ts +8 -0
- package/lib/util/bytes.js +21 -0
- package/lib/util/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +23 -0
- package/lib/util/directories.js +57 -0
- package/lib/util/error.d.ts +9 -0
- package/lib/util/error.js +22 -0
- package/lib/util/index.d.ts +5 -0
- package/lib/util/index.js +22 -0
- package/lib/util/objects.d.ts +52 -0
- package/lib/util/objects.js +183 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +44 -0
- package/lib/util/tables.d.ts +1 -0
- package/lib/util/tables.js +10 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +38 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/validate-notification-arn.d.ts +4 -0
- package/lib/util/validate-notification-arn.js +10 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/work-graph-builder.d.ts +32 -0
- package/lib/util/work-graph-builder.js +167 -0
- package/lib/util/work-graph-types.d.ts +50 -0
- package/lib/util/work-graph-types.js +14 -0
- package/lib/util/work-graph.d.ts +70 -0
- package/lib/util/work-graph.js +344 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +56 -0
- package/package.json +197 -0
- package/scripts/user-input-gen +2 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { PropertyDifference, Resource } from '@aws-cdk/cloudformation-diff';
|
|
2
|
+
import type { SDK } from '../aws-auth';
|
|
3
|
+
export declare const ICON = "\u2728";
|
|
4
|
+
export interface HotswappableChange {
|
|
5
|
+
readonly hotswappable: true;
|
|
6
|
+
readonly resourceType: string;
|
|
7
|
+
readonly propsChanged: Array<string>;
|
|
8
|
+
/**
|
|
9
|
+
* The name of the service being hotswapped.
|
|
10
|
+
* Used to set a custom User-Agent for SDK calls.
|
|
11
|
+
*/
|
|
12
|
+
readonly service: string;
|
|
13
|
+
/**
|
|
14
|
+
* The names of the resources being hotswapped.
|
|
15
|
+
*/
|
|
16
|
+
readonly resourceNames: string[];
|
|
17
|
+
readonly apply: (sdk: SDK) => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface NonHotswappableChange {
|
|
20
|
+
readonly hotswappable: false;
|
|
21
|
+
readonly resourceType: string;
|
|
22
|
+
readonly rejectedChanges: Array<string>;
|
|
23
|
+
readonly logicalId: string;
|
|
24
|
+
/**
|
|
25
|
+
* Tells the user exactly why this change was deemed non-hotswappable and what its logical ID is.
|
|
26
|
+
* If not specified, `reason` will be autofilled to state that the properties listed in `rejectedChanges` are not hotswappable.
|
|
27
|
+
*/
|
|
28
|
+
readonly reason?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Whether or not to show this change when listing non-hotswappable changes in HOTSWAP_ONLY mode. Does not affect
|
|
31
|
+
* listing in FALL_BACK mode.
|
|
32
|
+
*
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
readonly hotswapOnlyVisible?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type ChangeHotswapResult = Array<HotswappableChange | NonHotswappableChange>;
|
|
38
|
+
export interface ClassifiedResourceChanges {
|
|
39
|
+
hotswappableChanges: HotswappableChange[];
|
|
40
|
+
nonHotswappableChanges: NonHotswappableChange[];
|
|
41
|
+
}
|
|
42
|
+
export declare enum HotswapMode {
|
|
43
|
+
/**
|
|
44
|
+
* Will fall back to CloudFormation when a non-hotswappable change is detected
|
|
45
|
+
*/
|
|
46
|
+
FALL_BACK = "fall-back",
|
|
47
|
+
/**
|
|
48
|
+
* Will not fall back to CloudFormation when a non-hotswappable change is detected
|
|
49
|
+
*/
|
|
50
|
+
HOTSWAP_ONLY = "hotswap-only",
|
|
51
|
+
/**
|
|
52
|
+
* Will not attempt to hotswap anything and instead go straight to CloudFormation
|
|
53
|
+
*/
|
|
54
|
+
FULL_DEPLOYMENT = "full-deployment"
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Represents a change that can be hotswapped.
|
|
58
|
+
*/
|
|
59
|
+
export declare class HotswappableChangeCandidate {
|
|
60
|
+
/**
|
|
61
|
+
* The logical ID of the resource which is being changed
|
|
62
|
+
*/
|
|
63
|
+
readonly logicalId: string;
|
|
64
|
+
/**
|
|
65
|
+
* The value the resource is being updated from
|
|
66
|
+
*/
|
|
67
|
+
readonly oldValue: Resource;
|
|
68
|
+
/**
|
|
69
|
+
* The value the resource is being updated to
|
|
70
|
+
*/
|
|
71
|
+
readonly newValue: Resource;
|
|
72
|
+
/**
|
|
73
|
+
* The changes made to the resource properties
|
|
74
|
+
*/
|
|
75
|
+
readonly propertyUpdates: PropDiffs;
|
|
76
|
+
constructor(logicalId: string, oldValue: Resource, newValue: Resource, propertyUpdates: PropDiffs);
|
|
77
|
+
}
|
|
78
|
+
type Exclude = {
|
|
79
|
+
[key: string]: Exclude | true;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Represents configuration property overrides for hotswap deployments
|
|
83
|
+
*/
|
|
84
|
+
export declare class HotswapPropertyOverrides {
|
|
85
|
+
ecsHotswapProperties?: EcsHotswapProperties;
|
|
86
|
+
constructor(ecsHotswapProperties?: EcsHotswapProperties);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Represents configuration properties for ECS hotswap deployments
|
|
90
|
+
*/
|
|
91
|
+
export declare class EcsHotswapProperties {
|
|
92
|
+
readonly minimumHealthyPercent?: number;
|
|
93
|
+
readonly maximumHealthyPercent?: number;
|
|
94
|
+
constructor(minimumHealthyPercent?: number, maximumHealthyPercent?: number);
|
|
95
|
+
/**
|
|
96
|
+
* Check if any hotswap properties are defined
|
|
97
|
+
* @returns true if all properties are undefined, false otherwise
|
|
98
|
+
*/
|
|
99
|
+
isEmpty(): boolean;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* This function transforms all keys (recursively) in the provided `val` object.
|
|
103
|
+
*
|
|
104
|
+
* @param val The object whose keys need to be transformed.
|
|
105
|
+
* @param transform The function that will be applied to each key.
|
|
106
|
+
* @param exclude The keys that will not be transformed and copied to output directly
|
|
107
|
+
* @returns A new object with the same values as `val`, but with all keys transformed according to `transform`.
|
|
108
|
+
*/
|
|
109
|
+
export declare function transformObjectKeys(val: any, transform: (str: string) => string, exclude?: Exclude): any;
|
|
110
|
+
/**
|
|
111
|
+
* This function lower cases the first character of the string provided.
|
|
112
|
+
*/
|
|
113
|
+
export declare function lowerCaseFirstCharacter(str: string): string;
|
|
114
|
+
export type PropDiffs = Record<string, PropertyDifference<any>>;
|
|
115
|
+
export declare class ClassifiedChanges {
|
|
116
|
+
readonly change: HotswappableChangeCandidate;
|
|
117
|
+
readonly hotswappableProps: PropDiffs;
|
|
118
|
+
readonly nonHotswappableProps: PropDiffs;
|
|
119
|
+
constructor(change: HotswappableChangeCandidate, hotswappableProps: PropDiffs, nonHotswappableProps: PropDiffs);
|
|
120
|
+
reportNonHotswappablePropertyChanges(ret: ChangeHotswapResult): void;
|
|
121
|
+
get namesOfHotswappableProps(): string[];
|
|
122
|
+
}
|
|
123
|
+
export declare function classifyChanges(xs: HotswappableChangeCandidate, hotswappablePropNames: string[]): ClassifiedChanges;
|
|
124
|
+
export declare function reportNonHotswappableChange(ret: ChangeHotswapResult, change: HotswappableChangeCandidate, nonHotswappableProps?: PropDiffs, reason?: string, hotswapOnlyVisible?: boolean): void;
|
|
125
|
+
export declare function reportNonHotswappableResource(change: HotswappableChangeCandidate, reason?: string): ChangeHotswapResult;
|
|
126
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClassifiedChanges = exports.EcsHotswapProperties = exports.HotswapPropertyOverrides = exports.HotswappableChangeCandidate = exports.HotswapMode = exports.ICON = void 0;
|
|
4
|
+
exports.transformObjectKeys = transformObjectKeys;
|
|
5
|
+
exports.lowerCaseFirstCharacter = lowerCaseFirstCharacter;
|
|
6
|
+
exports.classifyChanges = classifyChanges;
|
|
7
|
+
exports.reportNonHotswappableChange = reportNonHotswappableChange;
|
|
8
|
+
exports.reportNonHotswappableResource = reportNonHotswappableResource;
|
|
9
|
+
const error_1 = require("../../toolkit/error");
|
|
10
|
+
exports.ICON = '✨';
|
|
11
|
+
var HotswapMode;
|
|
12
|
+
(function (HotswapMode) {
|
|
13
|
+
/**
|
|
14
|
+
* Will fall back to CloudFormation when a non-hotswappable change is detected
|
|
15
|
+
*/
|
|
16
|
+
HotswapMode["FALL_BACK"] = "fall-back";
|
|
17
|
+
/**
|
|
18
|
+
* Will not fall back to CloudFormation when a non-hotswappable change is detected
|
|
19
|
+
*/
|
|
20
|
+
HotswapMode["HOTSWAP_ONLY"] = "hotswap-only";
|
|
21
|
+
/**
|
|
22
|
+
* Will not attempt to hotswap anything and instead go straight to CloudFormation
|
|
23
|
+
*/
|
|
24
|
+
HotswapMode["FULL_DEPLOYMENT"] = "full-deployment";
|
|
25
|
+
})(HotswapMode || (exports.HotswapMode = HotswapMode = {}));
|
|
26
|
+
/**
|
|
27
|
+
* Represents a change that can be hotswapped.
|
|
28
|
+
*/
|
|
29
|
+
class HotswappableChangeCandidate {
|
|
30
|
+
constructor(logicalId, oldValue, newValue, propertyUpdates) {
|
|
31
|
+
this.logicalId = logicalId;
|
|
32
|
+
this.oldValue = oldValue;
|
|
33
|
+
this.newValue = newValue;
|
|
34
|
+
this.propertyUpdates = propertyUpdates;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.HotswappableChangeCandidate = HotswappableChangeCandidate;
|
|
38
|
+
/**
|
|
39
|
+
* Represents configuration property overrides for hotswap deployments
|
|
40
|
+
*/
|
|
41
|
+
class HotswapPropertyOverrides {
|
|
42
|
+
constructor(ecsHotswapProperties) {
|
|
43
|
+
this.ecsHotswapProperties = ecsHotswapProperties;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.HotswapPropertyOverrides = HotswapPropertyOverrides;
|
|
47
|
+
/**
|
|
48
|
+
* Represents configuration properties for ECS hotswap deployments
|
|
49
|
+
*/
|
|
50
|
+
class EcsHotswapProperties {
|
|
51
|
+
constructor(minimumHealthyPercent, maximumHealthyPercent) {
|
|
52
|
+
if (minimumHealthyPercent !== undefined && minimumHealthyPercent < 0) {
|
|
53
|
+
throw new error_1.ToolkitError('hotswap-ecs-minimum-healthy-percent can\'t be a negative number');
|
|
54
|
+
}
|
|
55
|
+
if (maximumHealthyPercent !== undefined && maximumHealthyPercent < 0) {
|
|
56
|
+
throw new error_1.ToolkitError('hotswap-ecs-maximum-healthy-percent can\'t be a negative number');
|
|
57
|
+
}
|
|
58
|
+
// In order to preserve the current behaviour, when minimumHealthyPercent is not defined, it will be set to the currently default value of 0
|
|
59
|
+
if (minimumHealthyPercent == undefined) {
|
|
60
|
+
this.minimumHealthyPercent = 0;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.minimumHealthyPercent = minimumHealthyPercent;
|
|
64
|
+
}
|
|
65
|
+
this.maximumHealthyPercent = maximumHealthyPercent;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if any hotswap properties are defined
|
|
69
|
+
* @returns true if all properties are undefined, false otherwise
|
|
70
|
+
*/
|
|
71
|
+
isEmpty() {
|
|
72
|
+
return this.minimumHealthyPercent === 0 && this.maximumHealthyPercent === undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.EcsHotswapProperties = EcsHotswapProperties;
|
|
76
|
+
/**
|
|
77
|
+
* This function transforms all keys (recursively) in the provided `val` object.
|
|
78
|
+
*
|
|
79
|
+
* @param val The object whose keys need to be transformed.
|
|
80
|
+
* @param transform The function that will be applied to each key.
|
|
81
|
+
* @param exclude The keys that will not be transformed and copied to output directly
|
|
82
|
+
* @returns A new object with the same values as `val`, but with all keys transformed according to `transform`.
|
|
83
|
+
*/
|
|
84
|
+
function transformObjectKeys(val, transform, exclude = {}) {
|
|
85
|
+
if (val == null || typeof val !== 'object') {
|
|
86
|
+
return val;
|
|
87
|
+
}
|
|
88
|
+
if (Array.isArray(val)) {
|
|
89
|
+
// For arrays we just pass parent's exclude object directly
|
|
90
|
+
// since it makes no sense to specify different exclude options for each array element
|
|
91
|
+
return val.map((input) => transformObjectKeys(input, transform, exclude));
|
|
92
|
+
}
|
|
93
|
+
const ret = {};
|
|
94
|
+
for (const [k, v] of Object.entries(val)) {
|
|
95
|
+
const childExclude = exclude[k];
|
|
96
|
+
if (childExclude === true) {
|
|
97
|
+
// we don't transform this object if the key is specified in exclude
|
|
98
|
+
ret[transform(k)] = v;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
ret[transform(k)] = transformObjectKeys(v, transform, childExclude);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return ret;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* This function lower cases the first character of the string provided.
|
|
108
|
+
*/
|
|
109
|
+
function lowerCaseFirstCharacter(str) {
|
|
110
|
+
return str.length > 0 ? `${str[0].toLowerCase()}${str.slice(1)}` : str;
|
|
111
|
+
}
|
|
112
|
+
class ClassifiedChanges {
|
|
113
|
+
constructor(change, hotswappableProps, nonHotswappableProps) {
|
|
114
|
+
this.change = change;
|
|
115
|
+
this.hotswappableProps = hotswappableProps;
|
|
116
|
+
this.nonHotswappableProps = nonHotswappableProps;
|
|
117
|
+
}
|
|
118
|
+
reportNonHotswappablePropertyChanges(ret) {
|
|
119
|
+
const nonHotswappablePropNames = Object.keys(this.nonHotswappableProps);
|
|
120
|
+
if (nonHotswappablePropNames.length > 0) {
|
|
121
|
+
const tagOnlyChange = nonHotswappablePropNames.length === 1 && nonHotswappablePropNames[0] === 'Tags';
|
|
122
|
+
reportNonHotswappableChange(ret, this.change, this.nonHotswappableProps, tagOnlyChange
|
|
123
|
+
? 'Tags are not hotswappable'
|
|
124
|
+
: `resource properties '${nonHotswappablePropNames}' are not hotswappable on this resource type`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
get namesOfHotswappableProps() {
|
|
128
|
+
return Object.keys(this.hotswappableProps);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.ClassifiedChanges = ClassifiedChanges;
|
|
132
|
+
function classifyChanges(xs, hotswappablePropNames) {
|
|
133
|
+
const hotswappableProps = {};
|
|
134
|
+
const nonHotswappableProps = {};
|
|
135
|
+
for (const [name, propDiff] of Object.entries(xs.propertyUpdates)) {
|
|
136
|
+
if (hotswappablePropNames.includes(name)) {
|
|
137
|
+
hotswappableProps[name] = propDiff;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
nonHotswappableProps[name] = propDiff;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return new ClassifiedChanges(xs, hotswappableProps, nonHotswappableProps);
|
|
144
|
+
}
|
|
145
|
+
function reportNonHotswappableChange(ret, change, nonHotswappableProps, reason, hotswapOnlyVisible) {
|
|
146
|
+
let hotswapOnlyVisibility = true;
|
|
147
|
+
if (hotswapOnlyVisible === false) {
|
|
148
|
+
hotswapOnlyVisibility = false;
|
|
149
|
+
}
|
|
150
|
+
ret.push({
|
|
151
|
+
hotswappable: false,
|
|
152
|
+
rejectedChanges: Object.keys(nonHotswappableProps !== null && nonHotswappableProps !== void 0 ? nonHotswappableProps : change.propertyUpdates),
|
|
153
|
+
logicalId: change.logicalId,
|
|
154
|
+
resourceType: change.newValue.Type,
|
|
155
|
+
reason,
|
|
156
|
+
hotswapOnlyVisible: hotswapOnlyVisibility,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function reportNonHotswappableResource(change, reason) {
|
|
160
|
+
return [
|
|
161
|
+
{
|
|
162
|
+
hotswappable: false,
|
|
163
|
+
rejectedChanges: Object.keys(change.propertyUpdates),
|
|
164
|
+
logicalId: change.logicalId,
|
|
165
|
+
resourceType: change.newValue.Type,
|
|
166
|
+
reason,
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJKQSxrREFvQkM7QUFLRCwwREFFQztBQStCRCwwQ0FhQztBQUVELGtFQW1CQztBQUVELHNFQWFDO0FBclFELCtDQUFtRDtBQUd0QyxRQUFBLElBQUksR0FBRyxHQUFHLENBQUM7QUE4Q3hCLElBQVksV0FlWDtBQWZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILHNDQUF1QixDQUFBO0lBRXZCOztPQUVHO0lBQ0gsNENBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCxrREFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBZlcsV0FBVywyQkFBWCxXQUFXLFFBZXRCO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLDJCQUEyQjtJQXFCdEMsWUFBbUIsU0FBaUIsRUFBRSxRQUFrQixFQUFFLFFBQWtCLEVBQUUsZUFBMEI7UUFDdEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBM0JELGtFQTJCQztBQUlEOztHQUVHO0FBQ0gsTUFBYSx3QkFBd0I7SUFJbkMsWUFBb0Isb0JBQTJDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFQRCw0REFPQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFNL0IsWUFBb0IscUJBQThCLEVBQUUscUJBQThCO1FBQ2hGLElBQUkscUJBQXFCLEtBQUssU0FBUyxJQUFJLHFCQUFxQixHQUFHLENBQUMsRUFBRyxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxvQkFBWSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztR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S0FBSyxFQUFFLENBQUM7UUFDakMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1AsWUFBWSxFQUFFLEtBQUs7UUFDbkIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLGFBQXBCLG9CQUFvQixjQUFwQixvQkFBb0IsR0FBSSxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzVFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztRQUMzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1FBQ2xDLE1BQU07UUFDTixrQkFBa0IsRUFBRSxxQkFBcUI7S0FDMUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUMzQyxNQUFtQyxFQUNuQyxNQUFlO0lBRWYsT0FBTztRQUNMO1lBQ0UsWUFBWSxFQUFFLEtBQUs7WUFDbkIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUNwRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUNsQyxNQUFNO1NBQ1A7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHlEaWZmZXJlbmNlLCBSZXNvdXJjZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9lcnJvcic7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcblxuZXhwb3J0IGNvbnN0IElDT04gPSAn4pyoJztcblxuZXhwb3J0IGludGVyZmFjZSBIb3Rzd2FwcGFibGVDaGFuZ2Uge1xuICByZWFkb25seSBob3Rzd2FwcGFibGU6IHRydWU7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSBwcm9wc0NoYW5nZWQ6IEFycmF5PHN0cmluZz47XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBiZWluZyBob3Rzd2FwcGVkLlxuICAgKiBVc2VkIHRvIHNldCBhIGN1c3RvbSBVc2VyLUFnZW50IGZvciBTREsgY2FsbHMuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lcyBvZiB0aGUgcmVzb3VyY2VzIGJlaW5nIGhvdHN3YXBwZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWVzOiBzdHJpbmdbXTtcblxuICByZWFkb25seSBhcHBseTogKHNkazogU0RLKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vbkhvdHN3YXBwYWJsZUNoYW5nZSB7XG4gIHJlYWRvbmx5IGhvdHN3YXBwYWJsZTogZmFsc2U7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSByZWplY3RlZENoYW5nZXM6IEFycmF5PHN0cmluZz47XG4gIHJlYWRvbmx5IGxvZ2ljYWxJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGVsbHMgdGhlIHVzZXIgZXhhY3RseSB3aHkgdGhpcyBjaGFuZ2Ugd2FzIGRlZW1lZCBub24taG90c3dhcHBhYmxlIGFuZCB3aGF0IGl0cyBsb2dpY2FsIElEIGlzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBgcmVhc29uYCB3aWxsIGJlIGF1dG9maWxsZWQgdG8gc3RhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBsaXN0ZWQgaW4gYHJlamVjdGVkQ2hhbmdlc2AgYXJlIG5vdCBob3Rzd2FwcGFibGUuXG4gICAqL1xuICByZWFkb25seSByZWFzb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoaXMgY2hhbmdlIHdoZW4gbGlzdGluZyBub24taG90c3dhcHBhYmxlIGNoYW5nZXMgaW4gSE9UU1dBUF9PTkxZIG1vZGUuIERvZXMgbm90IGFmZmVjdFxuICAgKiBsaXN0aW5nIGluIEZBTExfQkFDSyBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwT25seVZpc2libGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBDaGFuZ2VIb3Rzd2FwUmVzdWx0ID0gQXJyYXk8SG90c3dhcHBhYmxlQ2hhbmdlIHwgTm9uSG90c3dhcHBhYmxlQ2hhbmdlPjtcblxuZXhwb3J0IGludGVyZmFjZSBDbGFzc2lmaWVkUmVzb3VyY2VDaGFuZ2VzIHtcbiAgaG90c3dhcHBhYmxlQ2hhbmdlczogSG90c3dhcHBhYmxlQ2hhbmdlW107XG4gIG5vbkhvdHN3YXBwYWJsZUNoYW5nZXM6IE5vbkhvdHN3YXBwYWJsZUNoYW5nZVtdO1xufVxuXG5leHBvcnQgZW51bSBIb3Rzd2FwTW9kZSB7XG4gIC8qKlxuICAgKiBXaWxsIGZhbGwgYmFjayB0byBDbG91ZEZvcm1hdGlvbiB3aGVuIGEgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2UgaXMgZGV0ZWN0ZWRcbiAgICovXG4gIEZBTExfQkFDSyA9ICdmYWxsLWJhY2snLFxuXG4gIC8qKlxuICAgKiBXaWxsIG5vdCBmYWxsIGJhY2sgdG8gQ2xvdWRGb3JtYXRpb24gd2hlbiBhIG5vbi1ob3Rzd2FwcGFibGUgY2hhbmdlIGlzIGRldGVjdGVkXG4gICAqL1xuICBIT1RTV0FQX09OTFkgPSAnaG90c3dhcC1vbmx5JyxcblxuICAvKipcbiAgICogV2lsbCBub3QgYXR0ZW1wdCB0byBob3Rzd2FwIGFueXRoaW5nIGFuZCBpbnN0ZWFkIGdvIHN0cmFpZ2h0IHRvIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBGVUxMX0RFUExPWU1FTlQgPSAnZnVsbC1kZXBsb3ltZW50Jyxcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hhbmdlIHRoYXQgY2FuIGJlIGhvdHN3YXBwZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUge1xuICAvKipcbiAgICogVGhlIGxvZ2ljYWwgSUQgb2YgdGhlIHJlc291cmNlIHdoaWNoIGlzIGJlaW5nIGNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSByZXNvdXJjZSBpcyBiZWluZyB1cGRhdGVkIGZyb21cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogUmVzb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgcmVzb3VyY2UgaXMgYmVpbmcgdXBkYXRlZCB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ld1ZhbHVlOiBSZXNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnR5VXBkYXRlczogUHJvcERpZmZzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihsb2dpY2FsSWQ6IHN0cmluZywgb2xkVmFsdWU6IFJlc291cmNlLCBuZXdWYWx1ZTogUmVzb3VyY2UsIHByb3BlcnR5VXBkYXRlczogUHJvcERpZmZzKSB7XG4gICAgdGhpcy5sb2dpY2FsSWQgPSBsb2dpY2FsSWQ7XG4gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnByb3BlcnR5VXBkYXRlcyA9IHByb3BlcnR5VXBkYXRlcztcbiAgfVxufVxuXG50eXBlIEV4Y2x1ZGUgPSB7IFtrZXk6IHN0cmluZ106IEV4Y2x1ZGUgfCB0cnVlIH07XG5cbi8qKlxuICogUmVwcmVzZW50cyBjb25maWd1cmF0aW9uIHByb3BlcnR5IG92ZXJyaWRlcyBmb3IgaG90c3dhcCBkZXBsb3ltZW50c1xuICovXG5leHBvcnQgY2xhc3MgSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzIHtcbiAgLy8gRWFjaCBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZSB3aWxsIGhhdmUgaXRzIG93biBwcm9wZXJ0aWVzLiBDdXJyZW50bHkgdGhpcyBpcyBFQ1NcbiAgZWNzSG90c3dhcFByb3BlcnRpZXM/OiBFY3NIb3Rzd2FwUHJvcGVydGllcztcblxuICBwdWJsaWMgY29uc3RydWN0b3IgKGVjc0hvdHN3YXBQcm9wZXJ0aWVzPzogRWNzSG90c3dhcFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmVjc0hvdHN3YXBQcm9wZXJ0aWVzID0gZWNzSG90c3dhcFByb3BlcnRpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgRUNTIGhvdHN3YXAgZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVjc0hvdHN3YXBQcm9wZXJ0aWVzIHtcbiAgLy8gVGhlIGxvd2VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgeW91ciBzZXJ2aWNlJ3MgdGFza3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgUlVOTklORyBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlc2lyZWRDb3VudFxuICByZWFkb25seSBtaW5pbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXI7XG4gIC8vIFRoZSB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHlvdXIgc2VydmljZSdzIHRhc2tzIHRoYXQgYXJlIGFsbG93ZWQgaW4gdGhlIFJVTk5JTkcgb3IgUEVORElORyBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlc2lyZWRDb3VudFxuICByZWFkb25seSBtYXhpbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yIChtaW5pbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXIsIG1heGltdW1IZWFsdGh5UGVyY2VudD86IG51bWJlcikge1xuICAgIGlmIChtaW5pbXVtSGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCAmJiBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgPCAwICkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignaG90c3dhcC1lY3MtbWluaW11bS1oZWFsdGh5LXBlcmNlbnQgY2FuXFwndCBiZSBhIG5lZ2F0aXZlIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAobWF4aW11bUhlYWx0aHlQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgbWF4aW11bUhlYWx0aHlQZXJjZW50IDwgMCApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ2hvdHN3YXAtZWNzLW1heGltdW0taGVhbHRoeS1wZXJjZW50IGNhblxcJ3QgYmUgYSBuZWdhdGl2ZSBudW1iZXInKTtcbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLCB3aGVuIG1pbmltdW1IZWFsdGh5UGVyY2VudCBpcyBub3QgZGVmaW5lZCwgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnRseSBkZWZhdWx0IHZhbHVlIG9mIDBcbiAgICBpZiAobWluaW11bUhlYWx0aHlQZXJjZW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5taW5pbXVtSGVhbHRoeVBlcmNlbnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pbmltdW1IZWFsdGh5UGVyY2VudCA9IG1pbmltdW1IZWFsdGh5UGVyY2VudDtcbiAgICB9XG4gICAgdGhpcy5tYXhpbXVtSGVhbHRoeVBlcmNlbnQgPSBtYXhpbXVtSGVhbHRoeVBlcmNlbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IGhvdHN3YXAgcHJvcGVydGllcyBhcmUgZGVmaW5lZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZVxuICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5taW5pbXVtSGVhbHRoeVBlcmNlbnQgPT09IDAgJiYgdGhpcy5tYXhpbXVtSGVhbHRoeVBlcmNlbnQgPT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyBhbGwga2V5cyAocmVjdXJzaXZlbHkpIGluIHRoZSBwcm92aWRlZCBgdmFsYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHZhbCBUaGUgb2JqZWN0IHdob3NlIGtleXMgbmVlZCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm0gVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2gga2V5LlxuICogQHBhcmFtIGV4Y2x1ZGUgVGhlIGtleXMgdGhhdCB3aWxsIG5vdCBiZSB0cmFuc2Zvcm1lZCBhbmQgY29waWVkIHRvIG91dHB1dCBkaXJlY3RseVxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWVzIGFzIGB2YWxgLCBidXQgd2l0aCBhbGwga2V5cyB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gYHRyYW5zZm9ybWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3RLZXlzKHZhbDogYW55LCB0cmFuc2Zvcm06IChzdHI6IHN0cmluZykgPT4gc3RyaW5nLCBleGNsdWRlOiBFeGNsdWRlID0ge30pOiBhbnkge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAvLyBGb3IgYXJyYXlzIHdlIGp1c3QgcGFzcyBwYXJlbnQncyBleGNsdWRlIG9iamVjdCBkaXJlY3RseVxuICAgIC8vIHNpbmNlIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHNwZWNpZnkgZGlmZmVyZW50IGV4Y2x1ZGUgb3B0aW9ucyBmb3IgZWFjaCBhcnJheSBlbGVtZW50XG4gICAgcmV0dXJuIHZhbC5tYXAoKGlucHV0OiBhbnkpID0+IHRyYW5zZm9ybU9iamVjdEtleXMoaW5wdXQsIHRyYW5zZm9ybSwgZXhjbHVkZSkpO1xuICB9XG4gIGNvbnN0IHJldDogeyBbazogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgIGNvbnN0IGNoaWxkRXhjbHVkZSA9IGV4Y2x1ZGVba107XG4gICAgaWYgKGNoaWxkRXhjbHVkZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gd2UgZG9uJ3QgdHJhbnNmb3JtIHRoaXMgb2JqZWN0IGlmIHRoZSBrZXkgaXMgc3BlY2lmaWVkIGluIGV4Y2x1ZGVcbiAgICAgIHJldFt0cmFuc2Zvcm0oayldID0gdjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0W3RyYW5zZm9ybShrKV0gPSB0cmFuc2Zvcm1PYmplY3RLZXlzKHYsIHRyYW5zZm9ybSwgY2hpbGRFeGNsdWRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGxvd2VyIGNhc2VzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FzZUZpcnN0Q2hhcmFjdGVyKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5sZW5ndGggPiAwID8gYCR7c3RyWzBdLnRvTG93ZXJDYXNlKCl9JHtzdHIuc2xpY2UoMSl9YCA6IHN0cjtcbn1cblxuZXhwb3J0IHR5cGUgUHJvcERpZmZzID0gUmVjb3JkPHN0cmluZywgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4+O1xuXG5leHBvcnQgY2xhc3MgQ2xhc3NpZmllZENoYW5nZXMge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBob3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzLFxuICAgIHB1YmxpYyByZWFkb25seSBub25Ib3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzLFxuICApIHt9XG5cbiAgcHVibGljIHJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQ6IENoYW5nZUhvdHN3YXBSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vbkhvdHN3YXBwYWJsZVByb3BzKTtcbiAgICBpZiAobm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRhZ09ubHlDaGFuZ2UgPSBub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXMubGVuZ3RoID09PSAxICYmIG5vbkhvdHN3YXBwYWJsZVByb3BOYW1lc1swXSA9PT0gJ1RhZ3MnO1xuICAgICAgcmVwb3J0Tm9uSG90c3dhcHBhYmxlQ2hhbmdlKFxuICAgICAgICByZXQsXG4gICAgICAgIHRoaXMuY2hhbmdlLFxuICAgICAgICB0aGlzLm5vbkhvdHN3YXBwYWJsZVByb3BzLFxuICAgICAgICB0YWdPbmx5Q2hhbmdlXG4gICAgICAgICAgPyAnVGFncyBhcmUgbm90IGhvdHN3YXBwYWJsZSdcbiAgICAgICAgICA6IGByZXNvdXJjZSBwcm9wZXJ0aWVzICcke25vbkhvdHN3YXBwYWJsZVByb3BOYW1lc30nIGFyZSBub3QgaG90c3dhcHBhYmxlIG9uIHRoaXMgcmVzb3VyY2UgdHlwZWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZXNPZkhvdHN3YXBwYWJsZVByb3BzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5Q2hhbmdlcyh4czogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLCBob3Rzd2FwcGFibGVQcm9wTmFtZXM6IHN0cmluZ1tdKTogQ2xhc3NpZmllZENoYW5nZXMge1xuICBjb25zdCBob3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzID0ge307XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVByb3BzOiBQcm9wRGlmZnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wRGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMucHJvcGVydHlVcGRhdGVzKSkge1xuICAgIGlmIChob3Rzd2FwcGFibGVQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIGhvdHN3YXBwYWJsZVByb3BzW25hbWVdID0gcHJvcERpZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vbkhvdHN3YXBwYWJsZVByb3BzW25hbWVdID0gcHJvcERpZmY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBDbGFzc2lmaWVkQ2hhbmdlcyh4cywgaG90c3dhcHBhYmxlUHJvcHMsIG5vbkhvdHN3YXBwYWJsZVByb3BzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydE5vbkhvdHN3YXBwYWJsZUNoYW5nZShcbiAgcmV0OiBDaGFuZ2VIb3Rzd2FwUmVzdWx0LFxuICBjaGFuZ2U6IEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSxcbiAgbm9uSG90c3dhcHBhYmxlUHJvcHM/OiBQcm9wRGlmZnMsXG4gIHJlYXNvbj86IHN0cmluZyxcbiAgaG90c3dhcE9ubHlWaXNpYmxlPzogYm9vbGVhbixcbik6IHZvaWQge1xuICBsZXQgaG90c3dhcE9ubHlWaXNpYmlsaXR5ID0gdHJ1ZTtcbiAgaWYgKGhvdHN3YXBPbmx5VmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICBob3Rzd2FwT25seVZpc2liaWxpdHkgPSBmYWxzZTtcbiAgfVxuICByZXQucHVzaCh7XG4gICAgaG90c3dhcHBhYmxlOiBmYWxzZSxcbiAgICByZWplY3RlZENoYW5nZXM6IE9iamVjdC5rZXlzKG5vbkhvdHN3YXBwYWJsZVByb3BzID8/IGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpLFxuICAgIGxvZ2ljYWxJZDogY2hhbmdlLmxvZ2ljYWxJZCxcbiAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgIHJlYXNvbixcbiAgICBob3Rzd2FwT25seVZpc2libGU6IGhvdHN3YXBPbmx5VmlzaWJpbGl0eSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnROb25Ib3Rzd2FwcGFibGVSZXNvdXJjZShcbiAgY2hhbmdlOiBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUsXG4gIHJlYXNvbj86IHN0cmluZyxcbik6IENoYW5nZUhvdHN3YXBSZXN1bHQge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGhvdHN3YXBwYWJsZTogZmFsc2UsXG4gICAgICByZWplY3RlZENoYW5nZXM6IE9iamVjdC5rZXlzKGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpLFxuICAgICAgbG9naWNhbElkOiBjaGFuZ2UubG9naWNhbElkLFxuICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgIHJlYXNvbixcbiAgICB9LFxuICBdO1xufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type ChangeHotswapResult, type HotswappableChangeCandidate, HotswapPropertyOverrides } from './common';
|
|
2
|
+
import type { EvaluateCloudFormationTemplate } from '../evaluate-cloudformation-template';
|
|
3
|
+
export declare function isHotswappableEcsServiceChange(logicalId: string, change: HotswappableChangeCandidate, evaluateCfnTemplate: EvaluateCloudFormationTemplate, hotswapPropertyOverrides: HotswapPropertyOverrides): Promise<ChangeHotswapResult>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHotswappableEcsServiceChange = isHotswappableEcsServiceChange;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
async function isHotswappableEcsServiceChange(logicalId, change, evaluateCfnTemplate, hotswapPropertyOverrides) {
|
|
6
|
+
// the only resource change we can evaluate here is an ECS TaskDefinition
|
|
7
|
+
if (change.newValue.Type !== 'AWS::ECS::TaskDefinition') {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const ret = [];
|
|
11
|
+
// We only allow a change in the ContainerDefinitions of the TaskDefinition for now -
|
|
12
|
+
// it contains the image and environment variables, so seems like a safe bet for now.
|
|
13
|
+
// We might revisit this decision in the future though!
|
|
14
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, ['ContainerDefinitions']);
|
|
15
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
16
|
+
// find all ECS Services that reference the TaskDefinition that changed
|
|
17
|
+
const resourcesReferencingTaskDef = evaluateCfnTemplate.findReferencesTo(logicalId);
|
|
18
|
+
const ecsServiceResourcesReferencingTaskDef = resourcesReferencingTaskDef.filter((r) => r.Type === 'AWS::ECS::Service');
|
|
19
|
+
const ecsServicesReferencingTaskDef = new Array();
|
|
20
|
+
for (const ecsServiceResource of ecsServiceResourcesReferencingTaskDef) {
|
|
21
|
+
const serviceArn = await evaluateCfnTemplate.findPhysicalNameFor(ecsServiceResource.LogicalId);
|
|
22
|
+
if (serviceArn) {
|
|
23
|
+
ecsServicesReferencingTaskDef.push({ serviceArn });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (ecsServicesReferencingTaskDef.length === 0) {
|
|
27
|
+
// if there are no resources referencing the TaskDefinition,
|
|
28
|
+
// hotswap is not possible in FALL_BACK mode
|
|
29
|
+
(0, common_1.reportNonHotswappableChange)(ret, change, undefined, 'No ECS services reference the changed task definition', false);
|
|
30
|
+
}
|
|
31
|
+
if (resourcesReferencingTaskDef.length > ecsServicesReferencingTaskDef.length) {
|
|
32
|
+
// if something besides an ECS Service is referencing the TaskDefinition,
|
|
33
|
+
// hotswap is not possible in FALL_BACK mode
|
|
34
|
+
const nonEcsServiceTaskDefRefs = resourcesReferencingTaskDef.filter((r) => r.Type !== 'AWS::ECS::Service');
|
|
35
|
+
for (const taskRef of nonEcsServiceTaskDefRefs) {
|
|
36
|
+
(0, common_1.reportNonHotswappableChange)(ret, change, undefined, `A resource '${taskRef.LogicalId}' with Type '${taskRef.Type}' that is not an ECS Service was found referencing the changed TaskDefinition '${logicalId}'`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
40
|
+
if (namesOfHotswappableChanges.length > 0) {
|
|
41
|
+
const taskDefinitionResource = await prepareTaskDefinitionChange(evaluateCfnTemplate, logicalId, change);
|
|
42
|
+
ret.push({
|
|
43
|
+
hotswappable: true,
|
|
44
|
+
resourceType: change.newValue.Type,
|
|
45
|
+
propsChanged: namesOfHotswappableChanges,
|
|
46
|
+
service: 'ecs-service',
|
|
47
|
+
resourceNames: [
|
|
48
|
+
`ECS Task Definition '${await taskDefinitionResource.Family}'`,
|
|
49
|
+
...ecsServicesReferencingTaskDef.map((ecsService) => `ECS Service '${ecsService.serviceArn.split('/')[2]}'`),
|
|
50
|
+
],
|
|
51
|
+
apply: async (sdk) => {
|
|
52
|
+
// Step 1 - update the changed TaskDefinition, creating a new TaskDefinition Revision
|
|
53
|
+
// we need to lowercase the evaluated TaskDef from CloudFormation,
|
|
54
|
+
// as the AWS SDK uses lowercase property names for these
|
|
55
|
+
var _a;
|
|
56
|
+
// The SDK requires more properties here than its worth doing explicit typing for
|
|
57
|
+
// instead, just use all the old values in the diff to fill them in implicitly
|
|
58
|
+
const lowercasedTaskDef = (0, common_1.transformObjectKeys)(taskDefinitionResource, common_1.lowerCaseFirstCharacter, {
|
|
59
|
+
// All the properties that take arbitrary string as keys i.e. { "string" : "string" }
|
|
60
|
+
// https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html#API_RegisterTaskDefinition_RequestSyntax
|
|
61
|
+
ContainerDefinitions: {
|
|
62
|
+
DockerLabels: true,
|
|
63
|
+
FirelensConfiguration: {
|
|
64
|
+
Options: true,
|
|
65
|
+
},
|
|
66
|
+
LogConfiguration: {
|
|
67
|
+
Options: true,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
Volumes: {
|
|
71
|
+
DockerVolumeConfiguration: {
|
|
72
|
+
DriverOpts: true,
|
|
73
|
+
Labels: true,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
const registerTaskDefResponse = await sdk.ecs().registerTaskDefinition(lowercasedTaskDef);
|
|
78
|
+
const taskDefRevArn = (_a = registerTaskDefResponse.taskDefinition) === null || _a === void 0 ? void 0 : _a.taskDefinitionArn;
|
|
79
|
+
let ecsHotswapProperties = hotswapPropertyOverrides.ecsHotswapProperties;
|
|
80
|
+
let minimumHealthyPercent = ecsHotswapProperties === null || ecsHotswapProperties === void 0 ? void 0 : ecsHotswapProperties.minimumHealthyPercent;
|
|
81
|
+
let maximumHealthyPercent = ecsHotswapProperties === null || ecsHotswapProperties === void 0 ? void 0 : ecsHotswapProperties.maximumHealthyPercent;
|
|
82
|
+
// Step 2 - update the services using that TaskDefinition to point to the new TaskDefinition Revision
|
|
83
|
+
// Forcing New Deployment and setting Minimum Healthy Percent to 0.
|
|
84
|
+
// As CDK HotSwap is development only, this seems the most efficient way to ensure all tasks are replaced immediately, regardless of original amount
|
|
85
|
+
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
86
|
+
await Promise.all(ecsServicesReferencingTaskDef.map(async (service) => {
|
|
87
|
+
var _a;
|
|
88
|
+
const cluster = service.serviceArn.split('/')[1];
|
|
89
|
+
const update = await sdk.ecs().updateService({
|
|
90
|
+
service: service.serviceArn,
|
|
91
|
+
taskDefinition: taskDefRevArn,
|
|
92
|
+
cluster,
|
|
93
|
+
forceNewDeployment: true,
|
|
94
|
+
deploymentConfiguration: {
|
|
95
|
+
minimumHealthyPercent: minimumHealthyPercent !== undefined ? minimumHealthyPercent : 0,
|
|
96
|
+
maximumPercent: maximumHealthyPercent !== undefined ? maximumHealthyPercent : undefined,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
await sdk.ecs().waitUntilServicesStable({
|
|
100
|
+
cluster: (_a = update.service) === null || _a === void 0 ? void 0 : _a.clusterArn,
|
|
101
|
+
services: [service.serviceArn],
|
|
102
|
+
});
|
|
103
|
+
}));
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return ret;
|
|
108
|
+
}
|
|
109
|
+
async function prepareTaskDefinitionChange(evaluateCfnTemplate, logicalId, change) {
|
|
110
|
+
var _a;
|
|
111
|
+
const taskDefinitionResource = {
|
|
112
|
+
...change.oldValue.Properties,
|
|
113
|
+
ContainerDefinitions: (_a = change.newValue.Properties) === null || _a === void 0 ? void 0 : _a.ContainerDefinitions,
|
|
114
|
+
};
|
|
115
|
+
// first, let's get the name of the family
|
|
116
|
+
const familyNameOrArn = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, taskDefinitionResource === null || taskDefinitionResource === void 0 ? void 0 : taskDefinitionResource.Family);
|
|
117
|
+
if (!familyNameOrArn) {
|
|
118
|
+
// if the Family property has not been provided, and we can't find it in the current Stack,
|
|
119
|
+
// this means hotswapping is not possible
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// the physical name of the Task Definition in CloudFormation includes its current revision number at the end,
|
|
123
|
+
// remove it if needed
|
|
124
|
+
const familyNameOrArnParts = familyNameOrArn.split(':');
|
|
125
|
+
const family = familyNameOrArnParts.length > 1
|
|
126
|
+
? // familyNameOrArn is actually an ARN, of the format 'arn:aws:ecs:region:account:task-definition/<family-name>:<revision-nr>'
|
|
127
|
+
// so, take the 6th element, at index 5, and split it on '/'
|
|
128
|
+
familyNameOrArnParts[5].split('/')[1]
|
|
129
|
+
: // otherwise, familyNameOrArn is just the simple name evaluated from the CloudFormation template
|
|
130
|
+
familyNameOrArn;
|
|
131
|
+
// then, let's evaluate the body of the remainder of the TaskDef (without the Family property)
|
|
132
|
+
return {
|
|
133
|
+
...(await evaluateCfnTemplate.evaluateCfnExpression({
|
|
134
|
+
...(taskDefinitionResource !== null && taskDefinitionResource !== void 0 ? taskDefinitionResource : {}),
|
|
135
|
+
Family: undefined,
|
|
136
|
+
})),
|
|
137
|
+
Family: family,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLXNlcnZpY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWNzLXNlcnZpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esd0VBNEhDO0FBdklELHFDQU9rQjtBQUlYLEtBQUssVUFBVSw4QkFBOEIsQ0FDbEQsU0FBaUIsRUFDakIsTUFBbUMsRUFDbkMsbUJBQW1ELEVBQ25ELHdCQUFrRDtJQUVsRCx5RUFBeUU7SUFDekUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRSxDQUFDO1FBQ3hELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUF3QixFQUFFLENBQUM7SUFFcEMscUZBQXFGO0lBQ3JGLHFGQUFxRjtJQUNyRix1REFBdUQ7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHdCQUFlLEVBQUMsTUFBTSxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQzVFLGlCQUFpQixDQUFDLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVELHVFQUF1RTtJQUN2RSxNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0scUNBQXFDLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUM5RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FDdEMsQ0FBQztJQUNGLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztJQUM5RCxLQUFLLE1BQU0sa0JBQWtCLElBQUkscUNBQXFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLFVBQVUsR0FBRyxNQUFNLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9GLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZiw2QkFBNkIsQ0FBQyxJQUFJLENBQUMs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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDaGFuZ2VIb3Rzd2FwUmVzdWx0LFxuICBjbGFzc2lmeUNoYW5nZXMsXG4gIHR5cGUgSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLFxuICBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsIGxvd2VyQ2FzZUZpcnN0Q2hhcmFjdGVyLFxuICByZXBvcnROb25Ib3Rzd2FwcGFibGVDaGFuZ2UsXG4gIHRyYW5zZm9ybU9iamVjdEtleXMsXG59IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHR5cGUgeyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0hvdHN3YXBwYWJsZUVjc1NlcnZpY2VDaGFuZ2UoXG4gIGxvZ2ljYWxJZDogc3RyaW5nLFxuICBjaGFuZ2U6IEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuICBob3Rzd2FwUHJvcGVydHlPdmVycmlkZXM6IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyxcbik6IFByb21pc2U8Q2hhbmdlSG90c3dhcFJlc3VsdD4ge1xuICAvLyB0aGUgb25seSByZXNvdXJjZSBjaGFuZ2Ugd2UgY2FuIGV2YWx1YXRlIGhlcmUgaXMgYW4gRUNTIFRhc2tEZWZpbml0aW9uXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSAhPT0gJ0FXUzo6RUNTOjpUYXNrRGVmaW5pdGlvbicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IENoYW5nZUhvdHN3YXBSZXN1bHQgPSBbXTtcblxuICAvLyBXZSBvbmx5IGFsbG93IGEgY2hhbmdlIGluIHRoZSBDb250YWluZXJEZWZpbml0aW9ucyBvZiB0aGUgVGFza0RlZmluaXRpb24gZm9yIG5vdyAtXG4gIC8vIGl0IGNvbnRhaW5zIHRoZSBpbWFnZSBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzbyBzZWVtcyBsaWtlIGEgc2FmZSBiZXQgZm9yIG5vdy5cbiAgLy8gV2UgbWlnaHQgcmV2aXNpdCB0aGlzIGRlY2lzaW9uIGluIHRoZSBmdXR1cmUgdGhvdWdoIVxuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFsnQ29udGFpbmVyRGVmaW5pdGlvbnMnXSk7XG4gIGNsYXNzaWZpZWRDaGFuZ2VzLnJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQpO1xuXG4gIC8vIGZpbmQgYWxsIEVDUyBTZXJ2aWNlcyB0aGF0IHJlZmVyZW5jZSB0aGUgVGFza0RlZmluaXRpb24gdGhhdCBjaGFuZ2VkXG4gIGNvbnN0IHJlc291cmNlc1JlZmVyZW5jaW5nVGFza0RlZiA9IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFJlZmVyZW5jZXNUbyhsb2dpY2FsSWQpO1xuICBjb25zdCBlY3NTZXJ2aWNlUmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmID0gcmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmLmZpbHRlcihcbiAgICAocikgPT4gci5UeXBlID09PSAnQVdTOjpFQ1M6OlNlcnZpY2UnLFxuICApO1xuICBjb25zdCBlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZiA9IG5ldyBBcnJheTxFY3NTZXJ2aWNlPigpO1xuICBmb3IgKGNvbnN0IGVjc1NlcnZpY2VSZXNvdXJjZSBvZiBlY3NTZXJ2aWNlUmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmKSB7XG4gICAgY29uc3Qgc2VydmljZUFybiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZmluZFBoeXNpY2FsTmFtZUZvcihlY3NTZXJ2aWNlUmVzb3VyY2UuTG9naWNhbElkKTtcbiAgICBpZiAoc2VydmljZUFybikge1xuICAgICAgZWNzU2VydmljZXNSZWZlcmVuY2luZ1Rhc2tEZWYucHVzaCh7IHNlcnZpY2VBcm4gfSk7XG4gICAgfVxuICB9XG4gIGlmIChlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcmVzb3VyY2VzIHJlZmVyZW5jaW5nIHRoZSBUYXNrRGVmaW5pdGlvbixcbiAgICAvLyBob3Rzd2FwIGlzIG5vdCBwb3NzaWJsZSBpbiBGQUxMX0JBQ0sgbW9kZVxuICAgIHJlcG9ydE5vbkhvdHN3YXBwYWJsZUNoYW5nZShyZXQsIGNoYW5nZSwgdW5kZWZpbmVkLCAnTm8gRUNTIHNlcnZpY2VzIHJlZmVyZW5jZSB0aGUgY2hhbmdlZCB0YXNrIGRlZmluaXRpb24nLCBmYWxzZSk7XG4gIH1cbiAgaWYgKHJlc291cmNlc1JlZmVyZW5jaW5nVGFza0RlZi5sZW5ndGggPiBlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZi5sZW5ndGgpIHtcbiAgICAvLyBpZiBzb21ldGhpbmcgYmVzaWRlcyBhbiBFQ1MgU2VydmljZSBpcyByZWZlcmVuY2luZyB0aGUgVGFza0RlZmluaXRpb24sXG4gICAgLy8gaG90c3dhcCBpcyBub3QgcG9zc2libGUgaW4gRkFMTF9CQUNLIG1vZGVcbiAgICBjb25zdCBub25FY3NTZXJ2aWNlVGFza0RlZlJlZnMgPSByZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYuZmlsdGVyKChyKSA9PiByLlR5cGUgIT09ICdBV1M6OkVDUzo6U2VydmljZScpO1xuICAgIGZvciAoY29uc3QgdGFza1JlZiBvZiBub25FY3NTZXJ2aWNlVGFza0RlZlJlZnMpIHtcbiAgICAgIHJlcG9ydE5vbkhvdHN3YXBwYWJsZUNoYW5nZShcbiAgICAgICAgcmV0LFxuICAgICAgICBjaGFuZ2UsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYEEgcmVzb3VyY2UgJyR7dGFza1JlZi5Mb2dpY2FsSWR9JyB3aXRoIFR5cGUgJyR7dGFza1JlZi5UeXBlfScgdGhhdCBpcyBub3QgYW4gRUNTIFNlcnZpY2Ugd2FzIGZvdW5kIHJlZmVyZW5jaW5nIHRoZSBjaGFuZ2VkIFRhc2tEZWZpbml0aW9uICcke2xvZ2ljYWxJZH0nYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMgPSBPYmplY3Qua2V5cyhjbGFzc2lmaWVkQ2hhbmdlcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIGlmIChuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdGFza0RlZmluaXRpb25SZXNvdXJjZSA9IGF3YWl0IHByZXBhcmVUYXNrRGVmaW5pdGlvbkNoYW5nZShldmFsdWF0ZUNmblRlbXBsYXRlLCBsb2dpY2FsSWQsIGNoYW5nZSk7XG4gICAgcmV0LnB1c2goe1xuICAgICAgaG90c3dhcHBhYmxlOiB0cnVlLFxuICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgIHByb3BzQ2hhbmdlZDogbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMsXG4gICAgICBzZXJ2aWNlOiAnZWNzLXNlcnZpY2UnLFxuICAgICAgcmVzb3VyY2VOYW1lczogW1xuICAgICAgICBgRUNTIFRhc2sgRGVmaW5pdGlvbiAnJHthd2FpdCB0YXNrRGVmaW5pdGlvblJlc291cmNlLkZhbWlseX0nYCxcbiAgICAgICAgLi4uZWNzU2VydmljZXNSZWZlcmVuY2luZ1Rhc2tEZWYubWFwKChlY3NTZXJ2aWNlKSA9PiBgRUNTIFNlcnZpY2UgJyR7ZWNzU2VydmljZS5zZXJ2aWNlQXJuLnNwbGl0KCcvJylbMl19J2ApLFxuICAgICAgXSxcbiAgICAgIGFwcGx5OiBhc3luYyAoc2RrOiBTREspID0+IHtcbiAgICAgICAgLy8gU3RlcCAxIC0gdXBkYXRlIHRoZSBjaGFuZ2VkIFRhc2tEZWZpbml0aW9uLCBjcmVhdGluZyBhIG5ldyBUYXNrRGVmaW5pdGlvbiBSZXZpc2lvblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGxvd2VyY2FzZSB0aGUgZXZhbHVhdGVkIFRhc2tEZWYgZnJvbSBDbG91ZEZvcm1hdGlvbixcbiAgICAgICAgLy8gYXMgdGhlIEFXUyBTREsgdXNlcyBsb3dlcmNhc2UgcHJvcGVydHkgbmFtZXMgZm9yIHRoZXNlXG5cbiAgICAgICAgLy8gVGhlIFNESyByZXF1aXJlcyBtb3JlIHByb3BlcnRpZXMgaGVyZSB0aGFuIGl0cyB3b3J0aCBkb2luZyBleHBsaWNpdCB0eXBpbmcgZm9yXG4gICAgICAgIC8vIGluc3RlYWQsIGp1c3QgdXNlIGFsbCB0aGUgb2xkIHZhbHVlcyBpbiB0aGUgZGlmZiB0byBmaWxsIHRoZW0gaW4gaW1wbGljaXRseVxuICAgICAgICBjb25zdCBsb3dlcmNhc2VkVGFza0RlZiA9IHRyYW5zZm9ybU9iamVjdEtleXModGFza0RlZmluaXRpb25SZXNvdXJjZSwgbG93ZXJDYXNlRmlyc3RDaGFyYWN0ZXIsIHtcbiAgICAgICAgICAvLyBBbGwgdGhlIHByb3BlcnRpZXMgdGhhdCB0YWtlIGFyYml0cmFyeSBzdHJpbmcgYXMga2V5cyBpLmUuIHsgXCJzdHJpbmdcIiA6IFwic3RyaW5nXCIgfVxuICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUmVnaXN0ZXJUYXNrRGVmaW5pdGlvbi5odG1sI0FQSV9SZWdpc3RlclRhc2tEZWZpbml0aW9uX1JlcXVlc3RTeW50YXhcbiAgICAgICAgICBDb250YWluZXJEZWZpbml0aW9uczoge1xuICAgICAgICAgICAgRG9ja2VyTGFiZWxzOiB0cnVlLFxuICAgICAgICAgICAgRmlyZWxlbnNDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgIE9wdGlvbnM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICBPcHRpb25zOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFZvbHVtZXM6IHtcbiAgICAgICAgICAgIERvY2tlclZvbHVtZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgRHJpdmVyT3B0czogdHJ1ZSxcbiAgICAgICAgICAgICAgTGFiZWxzOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJUYXNrRGVmUmVzcG9uc2UgPSBhd2FpdCBzZGsuZWNzKCkucmVnaXN0ZXJUYXNrRGVmaW5pdGlvbihsb3dlcmNhc2VkVGFza0RlZik7XG4gICAgICAgIGNvbnN0IHRhc2tEZWZSZXZBcm4gPSByZWdpc3RlclRhc2tEZWZSZXNwb25zZS50YXNrRGVmaW5pdGlvbj8udGFza0RlZmluaXRpb25Bcm47XG5cbiAgICAgICAgbGV0IGVjc0hvdHN3YXBQcm9wZXJ0aWVzID0gaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzLmVjc0hvdHN3YXBQcm9wZXJ0aWVzO1xuICAgICAgICBsZXQgbWluaW11bUhlYWx0aHlQZXJjZW50ID0gZWNzSG90c3dhcFByb3BlcnRpZXM/Lm1pbmltdW1IZWFsdGh5UGVyY2VudDtcbiAgICAgICAgbGV0IG1heGltdW1IZWFsdGh5UGVyY2VudCA9IGVjc0hvdHN3YXBQcm9wZXJ0aWVzPy5tYXhpbXVtSGVhbHRoeVBlcmNlbnQ7XG5cbiAgICAgICAgLy8gU3RlcCAyIC0gdXBkYXRlIHRoZSBzZXJ2aWNlcyB1c2luZyB0aGF0IFRhc2tEZWZpbml0aW9uIHRvIHBvaW50IHRvIHRoZSBuZXcgVGFza0RlZmluaXRpb24gUmV2aXNpb25cbiAgICAgICAgLy8gRm9yY2luZyBOZXcgRGVwbG95bWVudCBhbmQgc2V0dGluZyBNaW5pbXVtIEhlYWx0aHkgUGVyY2VudCB0byAwLlxuICAgICAgICAvLyBBcyBDREsgSG90U3dhcCBpcyBkZXZlbG9wbWVudCBvbmx5LCB0aGlzIHNlZW1zIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gZW5zdXJlIGFsbCB0YXNrcyBhcmUgcmVwbGFjZWQgaW1tZWRpYXRlbHksIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luYWwgYW1vdW50XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZi5tYXAoYXN5bmMgKHNlcnZpY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBzZXJ2aWNlLnNlcnZpY2VBcm4uc3BsaXQoJy8nKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNkay5lY3MoKS51cGRhdGVTZXJ2aWNlKHtcbiAgICAgICAgICAgICAgc2VydmljZTogc2VydmljZS5zZXJ2aWNlQXJuLFxuICAgICAgICAgICAgICB0YXNrRGVmaW5pdGlvbjogdGFza0RlZlJldkFybixcbiAgICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgICAgZm9yY2VOZXdEZXBsb3ltZW50OiB0cnVlLFxuICAgICAgICAgICAgICBkZXBsb3ltZW50Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIG1pbmltdW1IZWFsdGh5UGVyY2VudDogbWluaW11bUhlYWx0aHlQZXJjZW50ICE9PSB1bmRlZmluZWQgPyBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgOiAwLFxuICAgICAgICAgICAgICAgIG1heGltdW1QZXJjZW50OiBtYXhpbXVtSGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCA/IG1heGltdW1IZWFsdGh5UGVyY2VudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCBzZGsuZWNzKCkud2FpdFVudGlsU2VydmljZXNTdGFibGUoe1xuICAgICAgICAgICAgICBjbHVzdGVyOiB1cGRhdGUuc2VydmljZT8uY2x1c3RlckFybixcbiAgICAgICAgICAgICAgc2VydmljZXM6IFtzZXJ2aWNlLnNlcnZpY2VBcm5dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuaW50ZXJmYWNlIEVjc1NlcnZpY2Uge1xuICByZWFkb25seSBzZXJ2aWNlQXJuOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVUYXNrRGVmaW5pdGlvbkNoYW5nZShcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUsXG4pIHtcbiAgY29uc3QgdGFza0RlZmluaXRpb25SZXNvdXJjZTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgLi4uY2hhbmdlLm9sZFZhbHVlLlByb3BlcnRpZXMsXG4gICAgQ29udGFpbmVyRGVmaW5pdGlvbnM6IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5Db250YWluZXJEZWZpbml0aW9ucyxcbiAgfTtcbiAgLy8gZmlyc3QsIGxldCdzIGdldCB0aGUgbmFtZSBvZiB0aGUgZmFtaWx5XG4gIGNvbnN0IGZhbWlseU5hbWVPckFybiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgbG9naWNhbElkLFxuICAgIHRhc2tEZWZpbml0aW9uUmVzb3VyY2U/LkZhbWlseSxcbiAgKTtcbiAgaWYgKCFmYW1pbHlOYW1lT3JBcm4pIHtcbiAgICAvLyBpZiB0aGUgRmFtaWx5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBwcm92aWRlZCwgYW5kIHdlIGNhbid0IGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgU3RhY2ssXG4gICAgLy8gdGhpcyBtZWFucyBob3Rzd2FwcGluZyBpcyBub3QgcG9zc2libGVcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIFRhc2sgRGVmaW5pdGlvbiBpbiBDbG91ZEZvcm1hdGlvbiBpbmNsdWRlcyBpdHMgY3VycmVudCByZXZpc2lvbiBudW1iZXIgYXQgdGhlIGVuZCxcbiAgLy8gcmVtb3ZlIGl0IGlmIG5lZWRlZFxuICBjb25zdCBmYW1pbHlOYW1lT3JBcm5QYXJ0cyA9IGZhbWlseU5hbWVPckFybi5zcGxpdCgnOicpO1xuICBjb25zdCBmYW1pbHkgPVxuICAgIGZhbWlseU5hbWVPckFyblBhcnRzLmxlbmd0aCA+IDFcbiAgICAgID8gLy8gZmFtaWx5TmFtZU9yQXJuIGlzIGFjdHVhbGx5IGFuIEFSTiwgb2YgdGhlIGZvcm1hdCAnYXJuOmF3czplY3M6cmVnaW9uOmFjY291bnQ6dGFzay1kZWZpbml0aW9uLzxmYW1pbHktbmFtZT46PHJldmlzaW9uLW5yPidcbiAgICAvLyBzbywgdGFrZSB0aGUgNnRoIGVsZW1lbnQsIGF0IGluZGV4IDUsIGFuZCBzcGxpdCBpdCBvbiAnLydcbiAgICAgIGZhbWlseU5hbWVPckFyblBhcnRzWzVdLnNwbGl0KCcvJylbMV1cbiAgICAgIDogLy8gb3RoZXJ3aXNlLCBmYW1pbHlOYW1lT3JBcm4gaXMganVzdCB0aGUgc2ltcGxlIG5hbWUgZXZhbHVhdGVkIGZyb20gdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAgICBmYW1pbHlOYW1lT3JBcm47XG4gIC8vIHRoZW4sIGxldCdzIGV2YWx1YXRlIHRoZSBib2R5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIFRhc2tEZWYgKHdpdGhvdXQgdGhlIEZhbWlseSBwcm9wZXJ0eSlcbiAgcmV0dXJuIHtcbiAgICAuLi4oYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oe1xuICAgICAgLi4uKHRhc2tEZWZpbml0aW9uUmVzb3VyY2UgPz8ge30pLFxuICAgICAgRmFtaWx5OiB1bmRlZmluZWQsXG4gICAgfSkpLFxuICAgIEZhbWlseTogZmFtaWx5LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type ChangeHotswapResult, type HotswappableChangeCandidate } from './common';
|
|
2
|
+
import { type EvaluateCloudFormationTemplate } from '../evaluate-cloudformation-template';
|
|
3
|
+
export declare function isHotswappableLambdaFunctionChange(logicalId: string, change: HotswappableChangeCandidate, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<ChangeHotswapResult>;
|