@aws-cdk/toolkit-lib 0.3.2 → 0.3.4
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/api-extractor.json +3 -0
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/bootstrap/index.d.ts +1 -1
- package/lib/actions/bootstrap/index.js +5 -5
- package/lib/actions/bootstrap/private/helpers.js +3 -3
- package/lib/actions/deploy/index.d.ts +1 -1
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
- package/lib/actions/deploy/private/deploy-options.js +1 -1
- package/lib/actions/deploy/private/helpers.d.ts +3 -2
- package/lib/actions/deploy/private/helpers.js +3 -3
- package/lib/actions/diff/index.d.ts +1 -1
- package/lib/actions/diff/index.js +1 -1
- package/lib/actions/diff/private/helpers.d.ts +5 -9
- package/lib/actions/diff/private/helpers.js +13 -30
- package/lib/actions/refactor/index.d.ts +12 -0
- package/lib/actions/refactor/index.js +1 -1
- package/lib/api/aws-auth/account-cache.d.ts +41 -0
- package/lib/api/aws-auth/account-cache.js +108 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
- package/lib/api/aws-auth/awscli-compatible.js +250 -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 +38 -0
- package/lib/api/aws-auth/credential-plugins.js +154 -0
- package/lib/api/aws-auth/private/index.d.ts +11 -0
- package/lib/api/aws-auth/private/index.js +37 -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/proxy-agent.d.ts +13 -0
- package/lib/api/aws-auth/proxy-agent.js +54 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +128 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
- package/lib/api/aws-auth/sdk-provider.js +373 -0
- package/lib/api/aws-auth/sdk.d.ts +235 -0
- package/lib/api/aws-auth/sdk.js +391 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +60 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +20 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +21 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
- package/lib/api/bootstrap/bootstrap-environment.js +323 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
- package/lib/api/bootstrap/index.d.ts +3 -0
- package/lib/api/bootstrap/index.js +23 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/cloud-assembly/environment.d.ts +43 -0
- package/lib/api/cloud-assembly/environment.js +127 -0
- package/lib/api/cloud-assembly/index.d.ts +1 -1
- package/lib/api/cloud-assembly/index.js +5 -4
- package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
- package/lib/api/cloud-assembly/private/context-aware-source.js +7 -7
- package/lib/api/cloud-assembly/private/exec.js +3 -3
- package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
- package/lib/api/cloud-assembly/private/prepare-source.js +17 -15
- package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
- package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
- package/lib/api/cloud-assembly/private/source-builder.d.ts +10 -8
- package/lib/api/cloud-assembly/private/source-builder.js +43 -24
- package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
- package/lib/api/cloud-assembly/private/stack-assembly.js +16 -15
- package/lib/api/cloud-assembly/source-builder.d.ts +19 -0
- package/lib/api/cloud-assembly/source-builder.js +1 -1
- package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
- package/lib/api/cloud-assembly/stack-assembly.js +139 -0
- package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
- package/lib/api/cloud-assembly/stack-collection.js +112 -0
- package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
- package/lib/api/cloud-assembly/stack-selector.js +62 -5
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
- package/lib/api/cloudformation/index.d.ts +4 -0
- package/lib/api/cloudformation/index.js +21 -0
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
- package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
- package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
- package/lib/api/cloudformation/stack-helpers.js +163 -0
- package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
- package/lib/api/cloudformation/template-body-parameter.js +104 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +84 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +33 -0
- package/lib/api/deployments/asset-publishing.d.ts +60 -0
- package/lib/api/deployments/asset-publishing.js +144 -0
- package/lib/api/deployments/assets.d.ts +11 -0
- package/lib/api/deployments/assets.js +108 -0
- package/lib/api/deployments/cfn-api.d.ts +145 -0
- package/lib/api/deployments/cfn-api.js +444 -0
- package/lib/api/deployments/checks.d.ts +9 -0
- package/lib/api/deployments/checks.js +72 -0
- package/lib/api/deployments/deploy-stack.d.ts +164 -0
- package/lib/api/deployments/deploy-stack.js +490 -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 +289 -0
- package/lib/api/deployments/deployments.js +355 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +27 -0
- package/lib/api/diff/diff-formatter.d.ts +147 -0
- package/lib/api/diff/diff-formatter.js +225 -0
- package/lib/api/diff/index.d.ts +1 -0
- package/lib/api/diff/index.js +18 -0
- package/lib/api/environment/environment-access.d.ts +139 -0
- package/lib/api/environment/environment-access.js +205 -0
- package/lib/api/environment/environment-resources.d.ts +75 -0
- package/lib/api/environment/environment-resources.js +213 -0
- package/lib/api/environment/index.d.ts +3 -0
- package/lib/api/environment/index.js +20 -0
- package/lib/api/environment/placeholders.d.ts +10 -0
- package/lib/api/environment/placeholders.js +23 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
- package/lib/api/garbage-collection/garbage-collector.js +614 -0
- package/lib/api/garbage-collection/index.d.ts +3 -0
- package/lib/api/garbage-collection/index.js +21 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
- package/lib/api/garbage-collection/progress-printer.js +80 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
- package/lib/api/garbage-collection/stack-refresh.js +152 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
- package/lib/api/hotswap/code-build-projects.d.ts +4 -0
- package/lib/api/hotswap/code-build-projects.js +62 -0
- package/lib/api/hotswap/common.d.ts +89 -0
- package/lib/api/hotswap/common.js +137 -0
- package/lib/api/hotswap/ecs-services.d.ts +4 -0
- package/lib/api/hotswap/ecs-services.js +159 -0
- package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
- package/lib/api/hotswap/hotswap-deployments.js +441 -0
- package/lib/api/hotswap/index.d.ts +2 -0
- package/lib/api/hotswap/index.js +19 -0
- package/lib/api/hotswap/lambda-functions.d.ts +4 -0
- package/lib/api/hotswap/lambda-functions.js +297 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
- package/lib/api/index.d.ts +24 -0
- package/lib/api/index.js +41 -0
- package/lib/api/io/index.d.ts +3 -1
- package/lib/api/io/index.js +18 -1
- package/lib/api/io/io-host.d.ts +15 -0
- package/lib/api/io/io-host.js +3 -0
- package/lib/api/io/io-message.d.ts +76 -0
- package/lib/api/io/io-message.js +3 -0
- package/lib/api/io/private/index.d.ts +7 -1
- package/lib/api/io/private/index.js +8 -5
- package/lib/api/io/private/io-default-messages.d.ts +21 -0
- package/lib/api/io/private/io-default-messages.js +59 -0
- package/lib/api/io/private/io-helper.d.ts +32 -0
- package/lib/api/io/private/io-helper.js +51 -0
- package/lib/api/io/private/level-priority.d.ts +11 -0
- package/lib/api/io/private/level-priority.js +33 -0
- package/lib/api/io/private/message-maker.d.ts +89 -0
- package/lib/api/io/private/message-maker.js +60 -0
- package/lib/api/io/private/messages.d.ts +178 -0
- package/lib/api/io/private/messages.js +534 -0
- package/lib/api/io/private/sdk-logger.d.ts +1 -1
- package/lib/api/io/private/sdk-logger.js +6 -6
- package/lib/api/io/private/span.d.ts +93 -0
- package/lib/api/io/private/span.js +87 -0
- package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
- package/lib/api/io/private/testing/fake-io-host.js +41 -0
- package/lib/api/io/private/testing/index.d.ts +2 -0
- package/lib/api/io/private/testing/index.js +19 -0
- package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
- package/lib/api/io/private/testing/test-io-host.js +61 -0
- package/lib/api/io/private/types.d.ts +4 -0
- package/lib/api/io/private/types.js +3 -0
- package/lib/api/io/toolkit-action.d.ts +4 -0
- package/lib/api/io/toolkit-action.js +3 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
- package/lib/api/logs-monitor/index.d.ts +2 -0
- package/lib/api/logs-monitor/index.js +19 -0
- package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
- package/lib/api/logs-monitor/logs-monitor.js +194 -0
- package/lib/api/notices/cached-data-source.d.ts +13 -0
- package/lib/api/notices/cached-data-source.js +77 -0
- package/lib/api/notices/filter.d.ts +59 -0
- package/lib/api/notices/filter.js +189 -0
- package/lib/api/notices/index.d.ts +1 -0
- package/lib/api/notices/index.js +18 -0
- package/lib/api/notices/notices.d.ts +111 -0
- package/lib/api/notices/notices.js +131 -0
- package/lib/api/notices/types.d.ts +37 -0
- package/lib/api/notices/types.js +3 -0
- package/lib/api/notices/web-data-source.d.ts +9 -0
- package/lib/api/notices/web-data-source.js +70 -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 +70 -0
- package/lib/api/plugin/plugin.js +127 -0
- package/lib/api/private.d.ts +1 -0
- package/lib/api/private.js +18 -0
- package/lib/api/refactoring/cloudformation.d.ts +38 -0
- package/lib/api/refactoring/cloudformation.js +56 -0
- package/lib/api/refactoring/digest.d.ts +26 -0
- package/lib/api/refactoring/digest.js +175 -0
- package/lib/api/refactoring/exclude.d.ts +29 -0
- package/lib/api/refactoring/exclude.js +94 -0
- package/lib/api/refactoring/index.d.ts +32 -0
- package/lib/api/refactoring/index.js +191 -0
- package/lib/api/require-approval.d.ts +17 -0
- package/lib/api/require-approval.js +22 -0
- package/lib/api/resource-import/importer.d.ts +216 -0
- package/lib/api/resource-import/importer.js +331 -0
- package/lib/api/resource-import/index.d.ts +2 -0
- package/lib/api/resource-import/index.js +19 -0
- package/lib/api/resource-import/migrator.d.ts +26 -0
- package/lib/api/resource-import/migrator.js +73 -0
- package/lib/api/resource-metadata/index.d.ts +1 -0
- package/lib/api/resource-metadata/index.js +18 -0
- package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
- package/lib/api/resource-metadata/resource-metadata.js +42 -0
- package/lib/api/rwlock.d.ts +60 -0
- package/lib/api/rwlock.js +204 -0
- package/lib/api/settings.d.ts +26 -0
- package/lib/api/settings.js +107 -0
- package/lib/api/shared-private.d.ts +8 -6
- package/lib/api/shared-private.js +31 -12561
- package/lib/api/stack-events/index.d.ts +4 -0
- package/lib/api/stack-events/index.js +23 -0
- package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
- package/lib/api/stack-events/stack-activity-monitor.js +164 -0
- package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
- package/lib/api/stack-events/stack-event-poller.js +130 -0
- package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
- package/lib/api/stack-events/stack-progress-monitor.js +98 -0
- package/lib/api/stack-events/stack-status.d.ts +42 -0
- package/lib/api/stack-events/stack-status.js +90 -0
- package/lib/api/streams.d.ts +7 -0
- package/lib/api/streams.js +24 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-info.d.ts +52 -0
- package/lib/api/toolkit-info.js +157 -0
- package/lib/api/tree.d.ts +31 -0
- package/lib/api/tree.js +37 -0
- package/lib/api/work-graph/index.d.ts +3 -0
- package/lib/api/work-graph/index.js +20 -0
- package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
- package/lib/api/work-graph/work-graph-builder.js +172 -0
- package/lib/api/work-graph/work-graph-types.d.ts +50 -0
- package/lib/api/work-graph/work-graph-types.js +13 -0
- package/lib/api/work-graph/work-graph.d.ts +72 -0
- package/lib/api/work-graph/work-graph.js +349 -0
- package/lib/context-providers/ami.d.ts +13 -0
- package/lib/context-providers/ami.js +52 -0
- package/lib/context-providers/availability-zones.d.ts +13 -0
- package/lib/context-providers/availability-zones.js +29 -0
- package/lib/context-providers/cc-api-provider.d.ts +30 -0
- package/lib/context-providers/cc-api-provider.js +145 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
- package/lib/context-providers/hosted-zones.d.ts +12 -0
- package/lib/context-providers/hosted-zones.js +69 -0
- package/lib/context-providers/index.d.ts +44 -0
- package/lib/context-providers/index.js +128 -0
- package/lib/context-providers/keys.d.ts +13 -0
- package/lib/context-providers/keys.js +54 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +161 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +69 -0
- package/lib/context-providers/ssm-parameters.d.ts +25 -0
- package/lib/context-providers/ssm-parameters.js +61 -0
- package/lib/context-providers/vpcs.d.ts +13 -0
- package/lib/context-providers/vpcs.js +291 -0
- package/lib/index.d.ts +4 -1
- package/lib/index.js +5 -2
- package/lib/index_bg.wasm +0 -0
- package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
- package/lib/payloads/bootstrap-environment-progress.js +3 -0
- package/lib/payloads/context.d.ts +9 -0
- package/lib/payloads/context.js +3 -0
- package/lib/payloads/deploy.d.ts +50 -0
- package/lib/payloads/deploy.js +3 -0
- package/lib/payloads/destroy.d.ts +23 -0
- package/lib/payloads/destroy.js +3 -0
- package/lib/payloads/diff.d.ts +31 -0
- package/lib/payloads/diff.js +22 -0
- package/lib/payloads/hotswap.d.ts +212 -0
- package/lib/payloads/hotswap.js +43 -0
- package/lib/payloads/index.d.ts +17 -0
- package/lib/payloads/index.js +34 -0
- package/lib/payloads/list.d.ts +4 -0
- package/lib/payloads/list.js +3 -0
- package/lib/payloads/logs-monitor.d.ts +33 -0
- package/lib/payloads/logs-monitor.js +3 -0
- package/lib/payloads/progress.d.ts +14 -0
- package/lib/payloads/progress.js +3 -0
- package/lib/payloads/refactor.d.ts +14 -0
- package/lib/payloads/refactor.js +3 -0
- package/lib/payloads/rollback.d.ts +17 -0
- package/lib/payloads/rollback.js +3 -0
- package/lib/payloads/sdk-trace.d.ts +20 -0
- package/lib/payloads/sdk-trace.js +3 -0
- package/lib/payloads/stack-activity.d.ts +53 -0
- package/lib/payloads/stack-activity.js +3 -0
- package/lib/payloads/stack-details.d.ts +17 -0
- package/lib/payloads/stack-details.js +3 -0
- package/lib/payloads/synth.d.ts +7 -0
- package/lib/payloads/synth.js +3 -0
- package/lib/payloads/types.d.ts +95 -0
- package/lib/payloads/types.js +3 -0
- package/lib/payloads/watch.d.ts +27 -0
- package/lib/payloads/watch.js +3 -0
- package/lib/private/activity-printer/base.d.ts +50 -0
- package/lib/private/activity-printer/base.js +120 -0
- package/lib/private/activity-printer/current.d.ts +26 -0
- package/lib/private/activity-printer/current.js +122 -0
- package/lib/private/activity-printer/display.d.ts +13 -0
- package/lib/private/activity-printer/display.js +81 -0
- package/lib/private/activity-printer/history.d.ts +32 -0
- package/lib/private/activity-printer/history.js +109 -0
- package/lib/private/activity-printer/index.d.ts +3 -0
- package/lib/private/activity-printer/index.js +20 -0
- package/lib/private/index.d.ts +1 -0
- package/lib/private/index.js +18 -0
- package/lib/toolkit/non-interactive-io-host.js +5 -4
- package/lib/toolkit/private/index.d.ts +2 -1
- package/lib/toolkit/private/index.js +1 -1
- package/lib/toolkit/toolkit-error.d.ts +86 -0
- package/lib/toolkit/toolkit-error.js +132 -0
- package/lib/toolkit/toolkit.d.ts +2 -2
- package/lib/toolkit/toolkit.js +161 -130
- package/lib/toolkit/types.d.ts +0 -55
- package/lib/toolkit/types.js +1 -1
- 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/cloudformation.d.ts +16 -0
- package/lib/util/cloudformation.js +36 -0
- package/lib/util/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +22 -0
- package/lib/util/directories.js +59 -0
- package/lib/util/format-error.d.ts +9 -0
- package/lib/util/format-error.js +22 -0
- package/lib/util/index.d.ts +19 -0
- package/lib/util/index.js +36 -0
- package/lib/util/json.d.ts +48 -0
- package/lib/util/json.js +68 -0
- package/lib/util/net.d.ts +9 -0
- package/lib/util/net.js +60 -0
- package/lib/util/objects.d.ts +65 -0
- package/lib/util/objects.js +230 -0
- package/lib/util/package-info.d.ts +3 -0
- package/lib/util/package-info.js +22 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +48 -0
- package/lib/util/serialize.d.ts +27 -0
- package/lib/util/serialize.js +86 -0
- package/lib/util/string-manipulation.d.ts +18 -0
- package/lib/util/string-manipulation.js +46 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +39 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +58 -0
- package/package.json +26 -28
- package/tsdoc.json +15 -0
- package/lib/api/shared-private.js.map +0 -7
- package/lib/api/shared-public.d.ts +0 -2159
- package/lib/api/shared-public.js +0 -1110
- package/lib/api/shared-public.js.map +0 -7
- package/lib/private/util.d.ts +0 -1
- package/lib/private/util.js +0 -787
- package/lib/private/util.js.map +0 -7
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./garbage-collector"), exports);
|
|
18
|
+
// testing exports
|
|
19
|
+
__exportStar(require("./progress-printer"), exports);
|
|
20
|
+
__exportStar(require("./stack-refresh"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQW9DO0FBRXBDLGtCQUFrQjtBQUNsQixxREFBbUM7QUFDbkMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nYXJiYWdlLWNvbGxlY3Rvcic7XG5cbi8vIHRlc3RpbmcgZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9wcm9ncmVzcy1wcmludGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stcmVmcmVzaCc7XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { GcAsset as GCAsset } from './garbage-collector';
|
|
2
|
+
import { type IoHelper } from '../io/private';
|
|
3
|
+
export declare class ProgressPrinter {
|
|
4
|
+
private ioHelper;
|
|
5
|
+
private totalAssets;
|
|
6
|
+
private assetsScanned;
|
|
7
|
+
private taggedAsset;
|
|
8
|
+
private taggedAssetsSizeMb;
|
|
9
|
+
private deletedAssets;
|
|
10
|
+
private deletedAssetsSizeMb;
|
|
11
|
+
private interval;
|
|
12
|
+
private setInterval?;
|
|
13
|
+
private isPaused;
|
|
14
|
+
constructor(ioHelper: IoHelper, totalAssets: number, interval?: number);
|
|
15
|
+
reportScannedAsset(amt: number): void;
|
|
16
|
+
reportTaggedAsset(assets: GCAsset[]): void;
|
|
17
|
+
reportDeletedAsset(assets: GCAsset[]): void;
|
|
18
|
+
start(): void;
|
|
19
|
+
pause(): void;
|
|
20
|
+
resume(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
private print;
|
|
23
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProgressPrinter = void 0;
|
|
4
|
+
const chalk = require("chalk");
|
|
5
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
6
|
+
const private_1 = require("../io/private");
|
|
7
|
+
class ProgressPrinter {
|
|
8
|
+
ioHelper;
|
|
9
|
+
totalAssets;
|
|
10
|
+
assetsScanned;
|
|
11
|
+
taggedAsset;
|
|
12
|
+
taggedAssetsSizeMb;
|
|
13
|
+
deletedAssets;
|
|
14
|
+
deletedAssetsSizeMb;
|
|
15
|
+
interval;
|
|
16
|
+
setInterval;
|
|
17
|
+
isPaused;
|
|
18
|
+
constructor(ioHelper, totalAssets, interval) {
|
|
19
|
+
this.ioHelper = ioHelper;
|
|
20
|
+
this.totalAssets = totalAssets;
|
|
21
|
+
this.assetsScanned = 0;
|
|
22
|
+
this.taggedAsset = 0;
|
|
23
|
+
this.taggedAssetsSizeMb = 0;
|
|
24
|
+
this.deletedAssets = 0;
|
|
25
|
+
this.deletedAssetsSizeMb = 0;
|
|
26
|
+
this.interval = interval ?? 10_000;
|
|
27
|
+
this.isPaused = false;
|
|
28
|
+
}
|
|
29
|
+
reportScannedAsset(amt) {
|
|
30
|
+
this.assetsScanned += amt;
|
|
31
|
+
}
|
|
32
|
+
reportTaggedAsset(assets) {
|
|
33
|
+
this.taggedAsset += assets.length;
|
|
34
|
+
const sizeInBytes = assets.reduce((total, asset) => total + asset.size, 0);
|
|
35
|
+
this.taggedAssetsSizeMb += sizeInBytes / 1_048_576;
|
|
36
|
+
}
|
|
37
|
+
reportDeletedAsset(assets) {
|
|
38
|
+
this.deletedAssets += assets.length;
|
|
39
|
+
const sizeInBytes = assets.reduce((total, asset) => total + asset.size, 0);
|
|
40
|
+
this.deletedAssetsSizeMb += sizeInBytes / 1_048_576;
|
|
41
|
+
}
|
|
42
|
+
start() {
|
|
43
|
+
// If there is already a running setInterval, throw an error.
|
|
44
|
+
// This is because if this.setInterval is reassigned to another setInterval,
|
|
45
|
+
// the original setInterval remains and can no longer be cleared.
|
|
46
|
+
if (this.setInterval) {
|
|
47
|
+
throw new toolkit_error_1.ToolkitError('ProgressPrinter is already running. Stop it first using the stop() method before starting it again.');
|
|
48
|
+
}
|
|
49
|
+
this.setInterval = setInterval(() => {
|
|
50
|
+
if (!this.isPaused) {
|
|
51
|
+
this.print();
|
|
52
|
+
}
|
|
53
|
+
}, this.interval);
|
|
54
|
+
}
|
|
55
|
+
pause() {
|
|
56
|
+
this.isPaused = true;
|
|
57
|
+
}
|
|
58
|
+
resume() {
|
|
59
|
+
this.isPaused = false;
|
|
60
|
+
}
|
|
61
|
+
stop() {
|
|
62
|
+
clearInterval(this.setInterval);
|
|
63
|
+
// print one last time if not paused
|
|
64
|
+
if (!this.isPaused) {
|
|
65
|
+
this.print();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
print() {
|
|
69
|
+
const percentage = ((this.assetsScanned / this.totalAssets) * 100).toFixed(2);
|
|
70
|
+
// print in MiB until we hit at least 1 GiB of data tagged/deleted
|
|
71
|
+
if (Math.max(this.taggedAssetsSizeMb, this.deletedAssetsSizeMb) >= 1000) {
|
|
72
|
+
void this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.green(`[${percentage}%] ${this.assetsScanned} files scanned: ${this.taggedAsset} assets (${(this.taggedAssetsSizeMb / 1000).toFixed(2)} GiB) tagged, ${this.deletedAssets} assets (${(this.deletedAssetsSizeMb / 1000).toFixed(2)} GiB) deleted.`)));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
void this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.green(`[${percentage}%] ${this.assetsScanned} files scanned: ${this.taggedAsset} assets (${this.taggedAssetsSizeMb.toFixed(2)} MiB) tagged, ${this.deletedAssets} assets (${this.deletedAssetsSizeMb.toFixed(2)} MiB) deleted.`)));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.ProgressPrinter = ProgressPrinter;
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtcHJpbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByb2dyZXNzLXByaW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLCtEQUEyRDtBQUMzRCwyQ0FBa0Q7QUFFbEQsTUFBYSxlQUFlO0lBQ2xCLFFBQVEsQ0FBVztJQUNuQixXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFTO0lBQ3RCLFdBQVcsQ0FBUztJQUNwQixrQkFBa0IsQ0FBUztJQUMzQixhQUFhLENBQVM7SUFDdEIsbUJBQW1CLENBQVM7SUFDNUIsUUFBUSxDQUFTO0lBQ2pCLFdBQVcsQ0FBaUM7SUFDNUMsUUFBUSxDQUFVO0lBRTFCLFlBQVksUUFBa0IsRUFBRSxXQUFtQixFQUFFLFFBQWlCO1FBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEdBQVc7UUFDbkMsSUFBSSxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWlCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxD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QUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pTLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFoRkQsMENBZ0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBHY0Fzc2V0IGFzIEdDQXNzZXQgfSBmcm9tICcuL2dhcmJhZ2UtY29sbGVjdG9yJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NQcmludGVyIHtcbiAgcHJpdmF0ZSBpb0hlbHBlcjogSW9IZWxwZXI7XG4gIHByaXZhdGUgdG90YWxBc3NldHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBhc3NldHNTY2FubmVkOiBudW1iZXI7XG4gIHByaXZhdGUgdGFnZ2VkQXNzZXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSB0YWdnZWRBc3NldHNTaXplTWI6IG51bWJlcjtcbiAgcHJpdmF0ZSBkZWxldGVkQXNzZXRzOiBudW1iZXI7XG4gIHByaXZhdGUgZGVsZXRlZEFzc2V0c1NpemVNYjogbnVtYmVyO1xuICBwcml2YXRlIGludGVydmFsOiBudW1iZXI7XG4gIHByaXZhdGUgc2V0SW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBpc1BhdXNlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihpb0hlbHBlcjogSW9IZWxwZXIsIHRvdGFsQXNzZXRzOiBudW1iZXIsIGludGVydmFsPzogbnVtYmVyKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICAgIHRoaXMudG90YWxBc3NldHMgPSB0b3RhbEFzc2V0cztcbiAgICB0aGlzLmFzc2V0c1NjYW5uZWQgPSAwO1xuICAgIHRoaXMudGFnZ2VkQXNzZXQgPSAwO1xuICAgIHRoaXMudGFnZ2VkQXNzZXRzU2l6ZU1iID0gMDtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHMgPSAwO1xuICAgIHRoaXMuZGVsZXRlZEFzc2V0c1NpemVNYiA9IDA7XG4gICAgdGhpcy5pbnRlcnZhbCA9IGludGVydmFsID8/IDEwXzAwMDtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U2Nhbm5lZEFzc2V0KGFtdDogbnVtYmVyKSB7XG4gICAgdGhpcy5hc3NldHNTY2FubmVkICs9IGFtdDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRUYWdnZWRBc3NldChhc3NldHM6IEdDQXNzZXRbXSkge1xuICAgIHRoaXMudGFnZ2VkQXNzZXQgKz0gYXNzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaXplSW5CeXRlcyA9IGFzc2V0cy5yZWR1Y2UoKHRvdGFsLCBhc3NldCkgPT4gdG90YWwgKyBhc3NldC5zaXplLCAwKTtcbiAgICB0aGlzLnRhZ2dlZEFzc2V0c1NpemVNYiArPSBzaXplSW5CeXRlcyAvIDFfMDQ4XzU3NjtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnREZWxldGVkQXNzZXQoYXNzZXRzOiBHQ0Fzc2V0W10pIHtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHMgKz0gYXNzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaXplSW5CeXRlcyA9IGFzc2V0cy5yZWR1Y2UoKHRvdGFsLCBhc3NldCkgPT4gdG90YWwgKyBhc3NldC5zaXplLCAwKTtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHNTaXplTWIgKz0gc2l6ZUluQnl0ZXMgLyAxXzA0OF81NzY7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJ1bm5pbmcgc2V0SW50ZXJ2YWwsIHRocm93IGFuIGVycm9yLlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBpZiB0aGlzLnNldEludGVydmFsIGlzIHJlYXNzaWduZWQgdG8gYW5vdGhlciBzZXRJbnRlcnZhbCxcbiAgICAvLyB0aGUgb3JpZ2luYWwgc2V0SW50ZXJ2YWwgcmVtYWlucyBhbmQgY2FuIG5vIGxvbmdlciBiZSBjbGVhcmVkLlxuICAgIGlmICh0aGlzLnNldEludGVydmFsKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdQcm9ncmVzc1ByaW50ZXIgaXMgYWxyZWFkeSBydW5uaW5nLiBTdG9wIGl0IGZpcnN0IHVzaW5nIHRoZSBzdG9wKCkgbWV0aG9kIGJlZm9yZSBzdGFydGluZyBpdCBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmludGVydmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN0b3AoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNldEludGVydmFsKTtcbiAgICAvLyBwcmludCBvbmUgbGFzdCB0aW1lIGlmIG5vdCBwYXVzZWRcbiAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcbiAgICAgIHRoaXMucHJpbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByaW50KCkge1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKHRoaXMuYXNzZXRzU2Nhbm5lZCAvIHRoaXMudG90YWxBc3NldHMpICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIC8vIHByaW50IGluIE1pQiB1bnRpbCB3ZSBoaXQgYXQgbGVhc3QgMSBHaUIgb2YgZGF0YSB0YWdnZWQvZGVsZXRlZFxuICAgIGlmIChNYXRoLm1heCh0aGlzLnRhZ2dlZEFzc2V0c1NpemVNYiwgdGhpcy5kZWxldGVkQXNzZXRzU2l6ZU1iKSA+PSAxMDAwKSB7XG4gICAgICB2b2lkIHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhjaGFsay5ncmVlbihgWyR7cGVyY2VudGFnZX0lXSAke3RoaXMuYXNzZXRzU2Nhbm5lZH0gZmlsZXMgc2Nhbm5lZDogJHt0aGlzLnRhZ2dlZEFzc2V0fSBhc3NldHMgKCR7KHRoaXMudGFnZ2VkQXNzZXRzU2l6ZU1iIC8gMTAwMCkudG9GaXhlZCgyKX0gR2lCKSB0YWdnZWQsICR7dGhpcy5kZWxldGVkQXNzZXRzfSBhc3NldHMgKCR7KHRoaXMuZGVsZXRlZEFzc2V0c1NpemVNYiAvIDEwMDApLnRvRml4ZWQoMil9IEdpQikgZGVsZXRlZC5gKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhjaGFsay5ncmVlbihgWyR7cGVyY2VudGFnZX0lXSAke3RoaXMuYXNzZXRzU2Nhbm5lZH0gZmlsZXMgc2Nhbm5lZDogJHt0aGlzLnRhZ2dlZEFzc2V0fSBhc3NldHMgKCR7dGhpcy50YWdnZWRBc3NldHNTaXplTWIudG9GaXhlZCgyKX0gTWlCKSB0YWdnZWQsICR7dGhpcy5kZWxldGVkQXNzZXRzfSBhc3NldHMgKCR7dGhpcy5kZWxldGVkQXNzZXRzU2l6ZU1iLnRvRml4ZWQoMil9IE1pQikgZGVsZXRlZC5gKSkpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ICloudFormationClient } from '../aws-auth/private';
|
|
2
|
+
import { type IoHelper } from '../io/private';
|
|
3
|
+
export declare class ActiveAssetCache {
|
|
4
|
+
private readonly stacks;
|
|
5
|
+
rememberStack(stackTemplate: string): void;
|
|
6
|
+
contains(asset: string): boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function refreshStacks(cfn: ICloudFormationClient, ioHelper: IoHelper, activeAssets: ActiveAssetCache, qualifier?: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Background Stack Refresh properties
|
|
11
|
+
*/
|
|
12
|
+
export interface BackgroundStackRefreshProps {
|
|
13
|
+
/**
|
|
14
|
+
* The CFN SDK handler
|
|
15
|
+
*/
|
|
16
|
+
readonly cfn: ICloudFormationClient;
|
|
17
|
+
/**
|
|
18
|
+
* Used to send messages.
|
|
19
|
+
*/
|
|
20
|
+
readonly ioHelper: IoHelper;
|
|
21
|
+
/**
|
|
22
|
+
* Active Asset storage
|
|
23
|
+
*/
|
|
24
|
+
readonly activeAssets: ActiveAssetCache;
|
|
25
|
+
/**
|
|
26
|
+
* Stack bootstrap qualifier
|
|
27
|
+
*/
|
|
28
|
+
readonly qualifier?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Class that controls scheduling of the background stack refresh
|
|
32
|
+
*/
|
|
33
|
+
export declare class BackgroundStackRefresh {
|
|
34
|
+
private readonly props;
|
|
35
|
+
private timeout?;
|
|
36
|
+
private lastRefreshTime;
|
|
37
|
+
private queuedPromises;
|
|
38
|
+
constructor(props: BackgroundStackRefreshProps);
|
|
39
|
+
start(): void;
|
|
40
|
+
private refresh;
|
|
41
|
+
private justRefreshedStacks;
|
|
42
|
+
/**
|
|
43
|
+
* Checks if the last successful background refresh happened within the specified time frame.
|
|
44
|
+
* If the last refresh is older than the specified time frame, it returns a Promise that resolves
|
|
45
|
+
* when the next background refresh completes or rejects if the refresh takes too long.
|
|
46
|
+
*/
|
|
47
|
+
noOlderThan(ms: number): Promise<unknown>;
|
|
48
|
+
stop(): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackgroundStackRefresh = exports.ActiveAssetCache = void 0;
|
|
4
|
+
exports.refreshStacks = refreshStacks;
|
|
5
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
6
|
+
const private_1 = require("../io/private");
|
|
7
|
+
class ActiveAssetCache {
|
|
8
|
+
stacks = new Set();
|
|
9
|
+
rememberStack(stackTemplate) {
|
|
10
|
+
this.stacks.add(stackTemplate);
|
|
11
|
+
}
|
|
12
|
+
contains(asset) {
|
|
13
|
+
for (const stack of this.stacks) {
|
|
14
|
+
if (stack.includes(asset)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ActiveAssetCache = ActiveAssetCache;
|
|
22
|
+
async function paginateSdkCall(cb) {
|
|
23
|
+
let finished = false;
|
|
24
|
+
let nextToken;
|
|
25
|
+
while (!finished) {
|
|
26
|
+
nextToken = await cb(nextToken);
|
|
27
|
+
if (nextToken === undefined) {
|
|
28
|
+
finished = true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetches all relevant stack templates from CloudFormation. It ignores the following stacks:
|
|
34
|
+
* - stacks in DELETE_COMPLETE or DELETE_IN_PROGRESS stage
|
|
35
|
+
* - stacks that are using a different bootstrap qualifier
|
|
36
|
+
*/
|
|
37
|
+
async function fetchAllStackTemplates(cfn, ioHelper, qualifier) {
|
|
38
|
+
const stackNames = [];
|
|
39
|
+
await paginateSdkCall(async (nextToken) => {
|
|
40
|
+
const stacks = await cfn.listStacks({ NextToken: nextToken });
|
|
41
|
+
// We ignore stacks with these statuses because their assets are no longer live
|
|
42
|
+
const ignoredStatues = ['CREATE_FAILED', 'DELETE_COMPLETE', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'REVIEW_IN_PROGRESS'];
|
|
43
|
+
stackNames.push(...(stacks.StackSummaries ?? [])
|
|
44
|
+
.filter((s) => !ignoredStatues.includes(s.StackStatus))
|
|
45
|
+
.map((s) => s.StackId ?? s.StackName));
|
|
46
|
+
return stacks.NextToken;
|
|
47
|
+
});
|
|
48
|
+
await ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Parsing through ${stackNames.length} stacks`));
|
|
49
|
+
const templates = [];
|
|
50
|
+
for (const stack of stackNames) {
|
|
51
|
+
let summary;
|
|
52
|
+
summary = await cfn.getTemplateSummary({
|
|
53
|
+
StackName: stack,
|
|
54
|
+
});
|
|
55
|
+
if (bootstrapFilter(summary.Parameters, qualifier)) {
|
|
56
|
+
// This stack is definitely bootstrapped to a different qualifier so we can safely ignore it
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const template = await cfn.getTemplate({
|
|
61
|
+
StackName: stack,
|
|
62
|
+
});
|
|
63
|
+
templates.push((template.TemplateBody ?? '') + JSON.stringify(summary?.Parameters));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg('Done parsing through stacks'));
|
|
67
|
+
return templates;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Filter out stacks that we KNOW are using a different bootstrap qualifier
|
|
71
|
+
* This is mostly necessary for the integration tests that can run the same app (with the same assets)
|
|
72
|
+
* under different qualifiers.
|
|
73
|
+
* This is necessary because a stack under a different bootstrap could coincidentally reference the same hash
|
|
74
|
+
* and cause a false negative (cause an asset to be preserved when its isolated)
|
|
75
|
+
* This is intentionally done in a way where we ONLY filter out stacks that are meant for a different qualifier
|
|
76
|
+
* because we are okay with false positives.
|
|
77
|
+
*/
|
|
78
|
+
function bootstrapFilter(parameters, qualifier) {
|
|
79
|
+
const bootstrapVersion = parameters?.find((p) => p.ParameterKey === 'BootstrapVersion');
|
|
80
|
+
const splitBootstrapVersion = bootstrapVersion?.DefaultValue?.split('/');
|
|
81
|
+
// We find the qualifier in a specific part of the bootstrap version parameter
|
|
82
|
+
return (qualifier &&
|
|
83
|
+
splitBootstrapVersion &&
|
|
84
|
+
splitBootstrapVersion.length == 4 &&
|
|
85
|
+
splitBootstrapVersion[2] != qualifier);
|
|
86
|
+
}
|
|
87
|
+
async function refreshStacks(cfn, ioHelper, activeAssets, qualifier) {
|
|
88
|
+
try {
|
|
89
|
+
const stacks = await fetchAllStackTemplates(cfn, ioHelper, qualifier);
|
|
90
|
+
for (const stack of stacks) {
|
|
91
|
+
activeAssets.rememberStack(stack);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw new toolkit_error_1.ToolkitError(`Error refreshing stacks: ${err}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Class that controls scheduling of the background stack refresh
|
|
100
|
+
*/
|
|
101
|
+
class BackgroundStackRefresh {
|
|
102
|
+
props;
|
|
103
|
+
timeout;
|
|
104
|
+
lastRefreshTime;
|
|
105
|
+
queuedPromises = [];
|
|
106
|
+
constructor(props) {
|
|
107
|
+
this.props = props;
|
|
108
|
+
this.lastRefreshTime = Date.now();
|
|
109
|
+
}
|
|
110
|
+
start() {
|
|
111
|
+
// Since start is going to be called right after the first invocation of refreshStacks,
|
|
112
|
+
// lets wait some time before beginning the background refresh.
|
|
113
|
+
this.timeout = setTimeout(() => this.refresh(), 300_000); // 5 minutes
|
|
114
|
+
}
|
|
115
|
+
async refresh() {
|
|
116
|
+
const startTime = Date.now();
|
|
117
|
+
await refreshStacks(this.props.cfn, this.props.ioHelper, this.props.activeAssets, this.props.qualifier);
|
|
118
|
+
this.justRefreshedStacks();
|
|
119
|
+
// If the last invocation of refreshStacks takes <5 minutes, the next invocation starts 5 minutes after the last one started.
|
|
120
|
+
// If the last invocation of refreshStacks takes >5 minutes, the next invocation starts immediately.
|
|
121
|
+
this.timeout = setTimeout(() => this.refresh(), Math.max(startTime + 300_000 - Date.now(), 0));
|
|
122
|
+
}
|
|
123
|
+
justRefreshedStacks() {
|
|
124
|
+
this.lastRefreshTime = Date.now();
|
|
125
|
+
for (const p of this.queuedPromises.splice(0, this.queuedPromises.length)) {
|
|
126
|
+
p(undefined);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Checks if the last successful background refresh happened within the specified time frame.
|
|
131
|
+
* If the last refresh is older than the specified time frame, it returns a Promise that resolves
|
|
132
|
+
* when the next background refresh completes or rejects if the refresh takes too long.
|
|
133
|
+
*/
|
|
134
|
+
noOlderThan(ms) {
|
|
135
|
+
const horizon = Date.now() - ms;
|
|
136
|
+
// The last refresh happened within the time frame
|
|
137
|
+
if (this.lastRefreshTime >= horizon) {
|
|
138
|
+
return Promise.resolve();
|
|
139
|
+
}
|
|
140
|
+
// The last refresh happened earlier than the time frame
|
|
141
|
+
// We will wait for the latest refresh to land or reject if it takes too long
|
|
142
|
+
return Promise.race([
|
|
143
|
+
new Promise(resolve => this.queuedPromises.push(resolve)),
|
|
144
|
+
new Promise((_, reject) => setTimeout(() => reject(new toolkit_error_1.ToolkitError('refreshStacks took too long; the background thread likely threw an error')), ms)),
|
|
145
|
+
]);
|
|
146
|
+
}
|
|
147
|
+
stop() {
|
|
148
|
+
clearTimeout(this.timeout);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.BackgroundStackRefresh = BackgroundStackRefresh;
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stcmVmcmVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLXJlZnJlc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUdBLHNDQVNDO0FBM0dELCtEQUEyRDtBQUUzRCwyQ0FBa0Q7QUFFbEQsTUFBYSxnQkFBZ0I7SUFDVixNQUFNLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFMUMsYUFBYSxDQUFDLGFBQXFCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYTtRQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBZkQsNENBZUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQXVEO0lBQ3BGLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLFNBQTZCLENBQUM7SUFDbEMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQUMsR0FBMEIsRUFBRSxRQUFrQixFQUFFLFNBQWtCO0lBQ3RHLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFD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Q0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLEVBQVU7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUVoQyxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsNkVBQTZFO1FBQzdFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztZQUNsQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLDRCQUFZLENBQUMsMEVBQTBFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxJQUFJO1FBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUF6REQsd0RBeURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB7IElPLCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVBc3NldENhY2hlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja3M6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIHB1YmxpYyByZW1lbWJlclN0YWNrKHN0YWNrVGVtcGxhdGU6IHN0cmluZykge1xuICAgIHRoaXMuc3RhY2tzLmFkZChzdGFja1RlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb250YWlucyhhc3NldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzdGFjayBvZiB0aGlzLnN0YWNrcykge1xuICAgICAgaWYgKHN0YWNrLmluY2x1ZGVzKGFzc2V0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlU2RrQ2FsbChjYjogKG5leHRUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+KSB7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBuZXh0VG9rZW4gPSBhd2FpdCBjYihuZXh0VG9rZW4pO1xuICAgIGlmIChuZXh0VG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZldGNoZXMgYWxsIHJlbGV2YW50IHN0YWNrIHRlbXBsYXRlcyBmcm9tIENsb3VkRm9ybWF0aW9uLiBJdCBpZ25vcmVzIHRoZSBmb2xsb3dpbmcgc3RhY2tzOlxuICogLSBzdGFja3MgaW4gREVMRVRFX0NPTVBMRVRFIG9yIERFTEVURV9JTl9QUk9HUkVTUyBzdGFnZVxuICogLSBzdGFja3MgdGhhdCBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgYm9vdHN0cmFwIHF1YWxpZmllclxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFsbFN0YWNrVGVtcGxhdGVzKGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50LCBpb0hlbHBlcjogSW9IZWxwZXIsIHF1YWxpZmllcj86IHN0cmluZykge1xuICBjb25zdCBzdGFja05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBhd2FpdCBwYWdpbmF0ZVNka0NhbGwoYXN5bmMgKG5leHRUb2tlbikgPT4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGNmbi5saXN0U3RhY2tzKHsgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSk7XG5cbiAgICAvLyBXZSBpZ25vcmUgc3RhY2tzIHdpdGggdGhlc2Ugc3RhdHVzZXMgYmVjYXVzZSB0aGVpciBhc3NldHMgYXJlIG5vIGxvbmdlciBsaXZlXG4gICAgY29uc3QgaWdub3JlZFN0YXR1ZXMgPSBbJ0NSRUFURV9GQUlMRUQnLCAnREVMRVRFX0NPTVBMRVRFJywgJ0RFTEVURV9JTl9QUk9HUkVTUycsICdERUxFVEVfRkFJTEVEJywgJ1JFVklFV19JTl9QUk9HUkVTUyddO1xuICAgIHN0YWNrTmFtZXMucHVzaChcbiAgICAgIC4uLihzdGFja3MuU3RhY2tTdW1tYXJpZXMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHM6IGFueSkgPT4gIWlnbm9yZWRTdGF0dWVzLmluY2x1ZGVzKHMuU3RhY2tTdGF0dXMpKVxuICAgICAgICAubWFwKChzOiBhbnkpID0+IHMuU3RhY2tJZCA/PyBzLlN0YWNrTmFtZSksXG4gICAgKTtcblxuICAgIHJldHVybiBzdGFja3MuTmV4dFRva2VuO1xuICB9KTtcblxuICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgUGFyc2luZyB0aHJvdWdoICR7c3RhY2tOYW1lcy5sZW5ndGh9IHN0YWNrc2ApKTtcblxuICBjb25zdCB0ZW1wbGF0ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tOYW1lcykge1xuICAgIGxldCBzdW1tYXJ5O1xuICAgIHN1bW1hcnkgPSBhd2FpdCBjZm4uZ2V0VGVtcGxhdGVTdW1tYXJ5KHtcbiAgICAgIFN0YWNrTmFtZTogc3RhY2ssXG4gICAgfSk7XG5cbiAgICBpZiAoYm9vdHN0cmFwRmlsdGVyKHN1bW1hcnkuUGFyYW1ldGVycywgcXVhbGlmaWVyKSkge1xuICAgICAgLy8gVGhpcyBzdGFjayBpcyBkZWZpbml0ZWx5IGJvb3RzdHJhcHBlZCB0byBhIGRpZmZlcmVudCBxdWFsaWZpZXIgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZSh7XG4gICAgICAgIFN0YWNrTmFtZTogc3RhY2ssXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVzLnB1c2goKHRlbXBsYXRlLlRlbXBsYXRlQm9keSA/PyAnJykgKyBKU09OLnN0cmluZ2lmeShzdW1tYXJ5Py5QYXJhbWV0ZXJzKSk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9ERUJVRy5tc2coJ0RvbmUgcGFyc2luZyB0aHJvdWdoIHN0YWNrcycpKTtcblxuICByZXR1cm4gdGVtcGxhdGVzO1xufVxuXG4vKipcbiAqIEZpbHRlciBvdXQgc3RhY2tzIHRoYXQgd2UgS05PVyBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgYm9vdHN0cmFwIHF1YWxpZmllclxuICogVGhpcyBpcyBtb3N0bHkgbmVjZXNzYXJ5IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdHMgdGhhdCBjYW4gcnVuIHRoZSBzYW1lIGFwcCAod2l0aCB0aGUgc2FtZSBhc3NldHMpXG4gKiB1bmRlciBkaWZmZXJlbnQgcXVhbGlmaWVycy5cbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYSBzdGFjayB1bmRlciBhIGRpZmZlcmVudCBib290c3RyYXAgY291bGQgY29pbmNpZGVudGFsbHkgcmVmZXJlbmNlIHRoZSBzYW1lIGhhc2hcbiAqIGFuZCBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIChjYXVzZSBhbiBhc3NldCB0byBiZSBwcmVzZXJ2ZWQgd2hlbiBpdHMgaXNvbGF0ZWQpXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgZG9uZSBpbiBhIHdheSB3aGVyZSB3ZSBPTkxZIGZpbHRlciBvdXQgc3RhY2tzIHRoYXQgYXJlIG1lYW50IGZvciBhIGRpZmZlcmVudCBxdWFsaWZpZXJcbiAqIGJlY2F1c2Ugd2UgYXJlIG9rYXkgd2l0aCBmYWxzZSBwb3NpdGl2ZXMuXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcEZpbHRlcihwYXJhbWV0ZXJzPzogUGFyYW1ldGVyRGVjbGFyYXRpb25bXSwgcXVhbGlmaWVyPzogc3RyaW5nKSB7XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBwYXJhbWV0ZXJzPy5maW5kKChwKSA9PiBwLlBhcmFtZXRlcktleSA9PT0gJ0Jvb3RzdHJhcFZlcnNpb24nKTtcbiAgY29uc3Qgc3BsaXRCb290c3RyYXBWZXJzaW9uID0gYm9vdHN0cmFwVmVyc2lvbj8uRGVmYXVsdFZhbHVlPy5zcGxpdCgnLycpO1xuICAvLyBXZSBmaW5kIHRoZSBxdWFsaWZpZXIgaW4gYSBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBib290c3RyYXAgdmVyc2lvbiBwYXJhbWV0ZXJcbiAgcmV0dXJuIChxdWFsaWZpZXIgJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb24gJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb24ubGVuZ3RoID09IDQgJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb25bMl0gIT0gcXVhbGlmaWVyKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hTdGFja3MoY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQsIGlvSGVscGVyOiBJb0hlbHBlciwgYWN0aXZlQXNzZXRzOiBBY3RpdmVBc3NldENhY2hlLCBxdWFsaWZpZXI/OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBmZXRjaEFsbFN0YWNrVGVtcGxhdGVzKGNmbiwgaW9IZWxwZXIsIHF1YWxpZmllcik7XG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgIGFjdGl2ZUFzc2V0cy5yZW1lbWJlclN0YWNrKHN0YWNrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEVycm9yIHJlZnJlc2hpbmcgc3RhY2tzOiAke2Vycn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhY2tncm91bmQgU3RhY2sgUmVmcmVzaCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2dyb3VuZFN0YWNrUmVmcmVzaFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDRk4gU0RLIGhhbmRsZXJcbiAgICovXG4gIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNlbmQgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIEFjdGl2ZSBBc3NldCBzdG9yYWdlXG4gICAqL1xuICByZWFkb25seSBhY3RpdmVBc3NldHM6IEFjdGl2ZUFzc2V0Q2FjaGU7XG5cbiAgLyoqXG4gICAqIFN0YWNrIGJvb3RzdHJhcCBxdWFsaWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbGFzcyB0aGF0IGNvbnRyb2xzIHNjaGVkdWxpbmcgb2YgdGhlIGJhY2tncm91bmQgc3RhY2sgcmVmcmVzaFxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZFN0YWNrUmVmcmVzaCB7XG4gIHByaXZhdGUgdGltZW91dD86IE5vZGVKUy5UaW1lb3V0O1xuICBwcml2YXRlIGxhc3RSZWZyZXNoVGltZTogbnVtYmVyO1xuICBwcml2YXRlIHF1ZXVlZFByb21pc2VzOiBBcnJheTwodmFsdWU6IHVua25vd24pID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQmFja2dyb3VuZFN0YWNrUmVmcmVzaFByb3BzKSB7XG4gICAgdGhpcy5sYXN0UmVmcmVzaFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCkge1xuICAgIC8vIFNpbmNlIHN0YXJ0IGlzIGdvaW5nIHRvIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiByZWZyZXNoU3RhY2tzLFxuICAgIC8vIGxldHMgd2FpdCBzb21lIHRpbWUgYmVmb3JlIGJlZ2lubmluZyB0aGUgYmFja2dyb3VuZCByZWZyZXNoLlxuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoKCksIDMwMF8wMDApOyAvLyA1IG1pbnV0ZXNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgYXdhaXQgcmVmcmVzaFN0YWNrcyh0aGlzLnByb3BzLmNmbiwgdGhpcy5wcm9wcy5pb0hlbHBlciwgdGhpcy5wcm9wcy5hY3RpdmVBc3NldHMsIHRoaXMucHJvcHMucXVhbGlmaWVyKTtcbiAgICB0aGlzLmp1c3RSZWZyZXNoZWRTdGFja3MoKTtcblxuICAgIC8vIElmIHRoZSBsYXN0IGludm9jYXRpb24gb2YgcmVmcmVzaFN0YWNrcyB0YWtlcyA8NSBtaW51dGVzLCB0aGUgbmV4dCBpbnZvY2F0aW9uIHN0YXJ0cyA1IG1pbnV0ZXMgYWZ0ZXIgdGhlIGxhc3Qgb25lIHN0YXJ0ZWQuXG4gICAgLy8gSWYgdGhlIGxhc3QgaW52b2NhdGlvbiBvZiByZWZyZXNoU3RhY2tzIHRha2VzID41IG1pbnV0ZXMsIHRoZSBuZXh0IGludm9jYXRpb24gc3RhcnRzIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoKCksIE1hdGgubWF4KHN0YXJ0VGltZSArIDMwMF8wMDAgLSBEYXRlLm5vdygpLCAwKSk7XG4gIH1cblxuICBwcml2YXRlIGp1c3RSZWZyZXNoZWRTdGFja3MoKSB7XG4gICAgdGhpcy5sYXN0UmVmcmVzaFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnF1ZXVlZFByb21pc2VzLnNwbGljZSgwLCB0aGlzLnF1ZXVlZFByb21pc2VzLmxlbmd0aCkpIHtcbiAgICAgIHAodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYmFja2dyb3VuZCByZWZyZXNoIGhhcHBlbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXG4gICAqIElmIHRoZSBsYXN0IHJlZnJlc2ggaXMgb2xkZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUsIGl0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAgICogd2hlbiB0aGUgbmV4dCBiYWNrZ3JvdW5kIHJlZnJlc2ggY29tcGxldGVzIG9yIHJlamVjdHMgaWYgdGhlIHJlZnJlc2ggdGFrZXMgdG9vIGxvbmcuXG4gICAqL1xuICBwdWJsaWMgbm9PbGRlclRoYW4obXM6IG51bWJlcikge1xuICAgIGNvbnN0IGhvcml6b24gPSBEYXRlLm5vdygpIC0gbXM7XG5cbiAgICAvLyBUaGUgbGFzdCByZWZyZXNoIGhhcHBlbmVkIHdpdGhpbiB0aGUgdGltZSBmcmFtZVxuICAgIGlmICh0aGlzLmxhc3RSZWZyZXNoVGltZSA+PSBob3Jpem9uKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgcmVmcmVzaCBoYXBwZW5lZCBlYXJsaWVyIHRoYW4gdGhlIHRpbWUgZnJhbWVcbiAgICAvLyBXZSB3aWxsIHdhaXQgZm9yIHRoZSBsYXRlc3QgcmVmcmVzaCB0byBsYW5kIG9yIHJlamVjdCBpZiBpdCB0YWtlcyB0b28gbG9uZ1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLnF1ZXVlZFByb21pc2VzLnB1c2gocmVzb2x2ZSkpLFxuICAgICAgbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IFRvb2xraXRFcnJvcigncmVmcmVzaFN0YWNrcyB0b29rIHRvbyBsb25nOyB0aGUgYmFja2dyb3VuZCB0aHJlYWQgbGlrZWx5IHRocmV3IGFuIGVycm9yJykpLCBtcykpLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHN0b3AoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type HotswapChange } from './common';
|
|
2
|
+
import type { ResourceChange } from '../../payloads/hotswap';
|
|
3
|
+
import type { EvaluateCloudFormationTemplate } from '../cloudformation';
|
|
4
|
+
export declare function isHotswappableAppSyncChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isHotswappableAppSyncChange = isHotswappableAppSyncChange;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
6
|
+
const util_1 = require("../../util");
|
|
7
|
+
async function isHotswappableAppSyncChange(logicalId, change, evaluateCfnTemplate) {
|
|
8
|
+
const isResolver = change.newValue.Type === 'AWS::AppSync::Resolver';
|
|
9
|
+
const isFunction = change.newValue.Type === 'AWS::AppSync::FunctionConfiguration';
|
|
10
|
+
const isGraphQLSchema = change.newValue.Type === 'AWS::AppSync::GraphQLSchema';
|
|
11
|
+
const isAPIKey = change.newValue.Type === 'AWS::AppSync::ApiKey';
|
|
12
|
+
if (!isResolver && !isFunction && !isGraphQLSchema && !isAPIKey) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const ret = [];
|
|
16
|
+
const classifiedChanges = (0, common_1.classifyChanges)(change, [
|
|
17
|
+
'RequestMappingTemplate',
|
|
18
|
+
'RequestMappingTemplateS3Location',
|
|
19
|
+
'ResponseMappingTemplate',
|
|
20
|
+
'ResponseMappingTemplateS3Location',
|
|
21
|
+
'Code',
|
|
22
|
+
'CodeS3Location',
|
|
23
|
+
'Definition',
|
|
24
|
+
'DefinitionS3Location',
|
|
25
|
+
'Expires',
|
|
26
|
+
]);
|
|
27
|
+
classifiedChanges.reportNonHotswappablePropertyChanges(ret);
|
|
28
|
+
const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
|
|
29
|
+
if (namesOfHotswappableChanges.length > 0) {
|
|
30
|
+
let physicalName = undefined;
|
|
31
|
+
const arn = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, isFunction ? change.newValue.Properties?.Name : undefined);
|
|
32
|
+
if (isResolver) {
|
|
33
|
+
const arnParts = arn?.split('/');
|
|
34
|
+
physicalName = arnParts ? `${arnParts[3]}.${arnParts[5]}` : undefined;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
physicalName = arn;
|
|
38
|
+
}
|
|
39
|
+
// nothing do here
|
|
40
|
+
if (!physicalName) {
|
|
41
|
+
return ret;
|
|
42
|
+
}
|
|
43
|
+
ret.push({
|
|
44
|
+
change: {
|
|
45
|
+
cause: change,
|
|
46
|
+
resources: [{
|
|
47
|
+
logicalId,
|
|
48
|
+
resourceType: change.newValue.Type,
|
|
49
|
+
physicalName,
|
|
50
|
+
metadata: evaluateCfnTemplate.metadataFor(logicalId),
|
|
51
|
+
}],
|
|
52
|
+
},
|
|
53
|
+
hotswappable: true,
|
|
54
|
+
service: 'appsync',
|
|
55
|
+
apply: async (sdk) => {
|
|
56
|
+
const sdkProperties = {
|
|
57
|
+
...change.oldValue.Properties,
|
|
58
|
+
Definition: change.newValue.Properties?.Definition,
|
|
59
|
+
DefinitionS3Location: change.newValue.Properties?.DefinitionS3Location,
|
|
60
|
+
requestMappingTemplate: change.newValue.Properties?.RequestMappingTemplate,
|
|
61
|
+
requestMappingTemplateS3Location: change.newValue.Properties?.RequestMappingTemplateS3Location,
|
|
62
|
+
responseMappingTemplate: change.newValue.Properties?.ResponseMappingTemplate,
|
|
63
|
+
responseMappingTemplateS3Location: change.newValue.Properties?.ResponseMappingTemplateS3Location,
|
|
64
|
+
code: change.newValue.Properties?.Code,
|
|
65
|
+
codeS3Location: change.newValue.Properties?.CodeS3Location,
|
|
66
|
+
expires: change.newValue.Properties?.Expires,
|
|
67
|
+
};
|
|
68
|
+
const evaluatedResourceProperties = await evaluateCfnTemplate.evaluateCfnExpression(sdkProperties);
|
|
69
|
+
const sdkRequestObject = (0, util_1.transformObjectKeys)(evaluatedResourceProperties, util_1.lowerCaseFirstCharacter);
|
|
70
|
+
// resolve s3 location files as SDK doesn't take in s3 location but inline code
|
|
71
|
+
if (sdkRequestObject.requestMappingTemplateS3Location) {
|
|
72
|
+
sdkRequestObject.requestMappingTemplate = await fetchFileFromS3(sdkRequestObject.requestMappingTemplateS3Location, sdk);
|
|
73
|
+
delete sdkRequestObject.requestMappingTemplateS3Location;
|
|
74
|
+
}
|
|
75
|
+
if (sdkRequestObject.responseMappingTemplateS3Location) {
|
|
76
|
+
sdkRequestObject.responseMappingTemplate = await fetchFileFromS3(sdkRequestObject.responseMappingTemplateS3Location, sdk);
|
|
77
|
+
delete sdkRequestObject.responseMappingTemplateS3Location;
|
|
78
|
+
}
|
|
79
|
+
if (sdkRequestObject.definitionS3Location) {
|
|
80
|
+
sdkRequestObject.definition = await fetchFileFromS3(sdkRequestObject.definitionS3Location, sdk);
|
|
81
|
+
delete sdkRequestObject.definitionS3Location;
|
|
82
|
+
}
|
|
83
|
+
if (sdkRequestObject.codeS3Location) {
|
|
84
|
+
sdkRequestObject.code = await fetchFileFromS3(sdkRequestObject.codeS3Location, sdk);
|
|
85
|
+
delete sdkRequestObject.codeS3Location;
|
|
86
|
+
}
|
|
87
|
+
if (isResolver) {
|
|
88
|
+
await sdk.appsync().updateResolver(sdkRequestObject);
|
|
89
|
+
}
|
|
90
|
+
else if (isFunction) {
|
|
91
|
+
// Function version is only applicable when using VTL and mapping templates
|
|
92
|
+
// Runtime only applicable when using code (JS mapping templates)
|
|
93
|
+
if (sdkRequestObject.code) {
|
|
94
|
+
delete sdkRequestObject.functionVersion;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
delete sdkRequestObject.runtime;
|
|
98
|
+
}
|
|
99
|
+
const functions = await sdk.appsync().listFunctions({ apiId: sdkRequestObject.apiId });
|
|
100
|
+
const { functionId } = functions.find((fn) => fn.name === physicalName) ?? {};
|
|
101
|
+
// Updating multiple functions at the same time or along with graphql schema results in `ConcurrentModificationException`
|
|
102
|
+
await exponentialBackOffRetry(() => sdk.appsync().updateFunction({
|
|
103
|
+
...sdkRequestObject,
|
|
104
|
+
functionId: functionId,
|
|
105
|
+
}), 6, 1000, 'ConcurrentModificationException');
|
|
106
|
+
}
|
|
107
|
+
else if (isGraphQLSchema) {
|
|
108
|
+
let schemaCreationResponse = await sdk
|
|
109
|
+
.appsync()
|
|
110
|
+
.startSchemaCreation(sdkRequestObject);
|
|
111
|
+
while (schemaCreationResponse.status &&
|
|
112
|
+
['PROCESSING', 'DELETING'].some((status) => status === schemaCreationResponse.status)) {
|
|
113
|
+
await sleep(1000); // poll every second
|
|
114
|
+
const getSchemaCreationStatusRequest = {
|
|
115
|
+
apiId: sdkRequestObject.apiId,
|
|
116
|
+
};
|
|
117
|
+
schemaCreationResponse = await sdk.appsync().getSchemaCreationStatus(getSchemaCreationStatusRequest);
|
|
118
|
+
}
|
|
119
|
+
if (schemaCreationResponse.status === 'FAILED') {
|
|
120
|
+
throw new toolkit_error_1.ToolkitError(schemaCreationResponse.details ?? 'Schema creation has failed.');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// isApiKey
|
|
125
|
+
if (!sdkRequestObject.id) {
|
|
126
|
+
// ApiKeyId is optional in CFN but required in SDK. Grab the KeyId from physicalArn if not available as part of CFN template
|
|
127
|
+
const arnParts = physicalName?.split('/');
|
|
128
|
+
if (arnParts && arnParts.length === 4) {
|
|
129
|
+
sdkRequestObject.id = arnParts[3];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
await sdk.appsync().updateApiKey(sdkRequestObject);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return ret;
|
|
138
|
+
}
|
|
139
|
+
async function fetchFileFromS3(s3Url, sdk) {
|
|
140
|
+
const s3PathParts = s3Url.split('/');
|
|
141
|
+
const s3Bucket = s3PathParts[2]; // first two are "s3:" and "" due to s3://
|
|
142
|
+
const s3Key = s3PathParts.splice(3).join('/'); // after removing first three we reconstruct the key
|
|
143
|
+
return (await sdk.s3().getObject({ Bucket: s3Bucket, Key: s3Key })).Body?.transformToString();
|
|
144
|
+
}
|
|
145
|
+
async function exponentialBackOffRetry(fn, numOfRetries, backOff, errorCodeToRetry) {
|
|
146
|
+
try {
|
|
147
|
+
await fn();
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error && error.name === errorCodeToRetry && numOfRetries > 0) {
|
|
151
|
+
await sleep(backOff); // time to wait doubles everytime function fails, starts at 1 second
|
|
152
|
+
await exponentialBackOffRetry(fn, numOfRetries - 1, backOff * 2, errorCodeToRetry);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function sleep(ms) {
|
|
160
|
+
return new Promise((ok) => setTimeout(ok, ms));
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3luYy1tYXBwaW5nLXRlbXBsYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcHN5bmMtbWFwcGluZy10ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxrRUE0SkM7QUF2S0QscUNBR2tCO0FBRWxCLCtEQUEyRDtBQUMzRCxxQ0FBMEU7QUFLbkUsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQ7SUFFbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUM7SUFDckUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUsscUNBQXFDLENBQUM7SUFDbEYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssNkJBQTZCLENBQUM7SUFDL0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLENBQUM7SUFDakUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7SUFFaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHdCQUFlLEVBQUMsTUFBTSxFQUFFO1FBQ2hELHdCQUF3QjtRQUN4QixrQ0FBa0M7UUFDbEMseUJBQXlCO1FBQ3pCLG1DQUFtQztRQUNuQyxNQUFNO1FBQ04sZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixzQkFBc0I7UUFDdEIsU0FBUztLQUNWLENBQUMsQ0FBQztJQUNILGlCQUFpQixDQUFDLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFB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LEVBQUUsQ0FBQztJQUNiLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0VBQW9FO1lBQzFGLE1BQU0sdUJBQXVCLENBQUMsRUFBRSxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsS0FBSyxDQUFDLEVBQVU7SUFDN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEdldFNjaGVtYUNyZWF0aW9uU3RhdHVzQ29tbWFuZE91dHB1dCxcbiAgR2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNDb21tYW5kSW5wdXQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hcHBzeW5jJztcbmltcG9ydCB7XG4gIHR5cGUgSG90c3dhcENoYW5nZSxcbiAgY2xhc3NpZnlDaGFuZ2VzLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgbG93ZXJDYXNlRmlyc3RDaGFyYWN0ZXIsIHRyYW5zZm9ybU9iamVjdEtleXMgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5cbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNIb3Rzd2FwcGFibGVBcHBTeW5jQ2hhbmdlKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxIb3Rzd2FwQ2hhbmdlW10+IHtcbiAgY29uc3QgaXNSZXNvbHZlciA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpSZXNvbHZlcic7XG4gIGNvbnN0IGlzRnVuY3Rpb24gPSBjaGFuZ2UubmV3VmFsdWUuVHlwZSA9PT0gJ0FXUzo6QXBwU3luYzo6RnVuY3Rpb25Db25maWd1cmF0aW9uJztcbiAgY29uc3QgaXNHcmFwaFFMU2NoZW1hID0gY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkFwcFN5bmM6OkdyYXBoUUxTY2hlbWEnO1xuICBjb25zdCBpc0FQSUtleSA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpBcGlLZXknO1xuICBpZiAoIWlzUmVzb2x2ZXIgJiYgIWlzRnVuY3Rpb24gJiYgIWlzR3JhcGhRTFNjaGVtYSAmJiAhaXNBUElLZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IEhvdHN3YXBDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgW1xuICAgICdSZXF1ZXN0TWFwcGluZ1RlbXBsYXRlJyxcbiAgICAnUmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24nLFxuICAgICdSZXNwb25zZU1hcHBpbmdUZW1wbGF0ZScsXG4gICAgJ1Jlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbicsXG4gICAgJ0NvZGUnLFxuICAgICdDb2RlUzNMb2NhdGlvbicsXG4gICAgJ0RlZmluaXRpb24nLFxuICAgICdEZWZpbml0aW9uUzNMb2NhdGlvbicsXG4gICAgJ0V4cGlyZXMnLFxuICBdKTtcbiAgY2xhc3NpZmllZENoYW5nZXMucmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldCk7XG5cbiAgY29uc3QgbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMgPSBPYmplY3Qua2V5cyhjbGFzc2lmaWVkQ2hhbmdlcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIGlmIChuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgbGV0IHBoeXNpY2FsTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFybiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgICBsb2dpY2FsSWQsXG4gICAgICBpc0Z1bmN0aW9uID8gY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/Lk5hbWUgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBpZiAoaXNSZXNvbHZlcikge1xuICAgICAgY29uc3QgYXJuUGFydHMgPSBhcm4/LnNwbGl0KCcvJyk7XG4gICAgICBwaHlzaWNhbE5hbWUgPSBhcm5QYXJ0cyA/IGAke2FyblBhcnRzWzNdfS4ke2FyblBhcnRzWzVdfWAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBoeXNpY2FsTmFtZSA9IGFybjtcbiAgICB9XG5cbiAgICAvLyBub3RoaW5nIGRvIGhlcmVcbiAgICBpZiAoIXBoeXNpY2FsTmFtZSkge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICByZXQucHVzaCh7XG4gICAgICBjaGFuZ2U6IHtcbiAgICAgICAgY2F1c2U6IGNoYW5nZSxcbiAgICAgICAgcmVzb3VyY2VzOiBbe1xuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgICAgICAgIHBoeXNpY2FsTmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogZXZhbHVhdGVDZm5UZW1wbGF0ZS5tZXRhZGF0YUZvcihsb2dpY2FsSWQpLFxuICAgICAgICB9XSxcbiAgICAgIH0sXG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICBzZXJ2aWNlOiAnYXBwc3luYycsXG4gICAgICBhcHBseTogYXN5bmMgKHNkazogU0RLKSA9PiB7XG4gICAgICAgIGNvbnN0IHNka1Byb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge1xuICAgICAgICAgIC4uLmNoYW5nZS5vbGRWYWx1ZS5Qcm9wZXJ0aWVzLFxuICAgICAgICAgIERlZmluaXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5EZWZpbml0aW9uLFxuICAgICAgICAgIERlZmluaXRpb25TM0xvY2F0aW9uOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uRGVmaW5pdGlvblMzTG9jYXRpb24sXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlcXVlc3RNYXBwaW5nVGVtcGxhdGUsXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5SZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlLFxuICAgICAgICAgIHJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICBjb2RlOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uQ29kZSxcbiAgICAgICAgICBjb2RlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LkNvZGVTM0xvY2F0aW9uLFxuICAgICAgICAgIGV4cGlyZXM6IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5FeHBpcmVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRSZXNvdXJjZVByb3BlcnRpZXMgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihzZGtQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3Qgc2RrUmVxdWVzdE9iamVjdCA9IHRyYW5zZm9ybU9iamVjdEtleXMoZXZhbHVhdGVkUmVzb3VyY2VQcm9wZXJ0aWVzLCBsb3dlckNhc2VGaXJzdENoYXJhY3Rlcik7XG5cbiAgICAgICAgLy8gcmVzb2x2ZSBzMyBsb2NhdGlvbiBmaWxlcyBhcyBTREsgZG9lc24ndCB0YWtlIGluIHMzIGxvY2F0aW9uIGJ1dCBpbmxpbmUgY29kZVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSA9IGF3YWl0IGZldGNoRmlsZUZyb21TMyhcbiAgICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24sXG4gICAgICAgICAgICBzZGssXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24pIHtcbiAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LnJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlID0gYXdhaXQgZmV0Y2hGaWxlRnJvbVMzKFxuICAgICAgICAgICAgc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24sXG4gICAgICAgICAgICBzZGssXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNka1JlcXVlc3RPYmplY3QuZGVmaW5pdGlvblMzTG9jYXRpb24pIHtcbiAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LmRlZmluaXRpb24gPSBhd2FpdCBmZXRjaEZpbGVGcm9tUzMoc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbiwgc2RrKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5jb2RlUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QuY29kZSA9IGF3YWl0IGZldGNoRmlsZUZyb21TMyhzZGtSZXF1ZXN0T2JqZWN0LmNvZGVTM0xvY2F0aW9uLCBzZGspO1xuICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmNvZGVTM0xvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVzb2x2ZXIpIHtcbiAgICAgICAgICBhd2FpdCBzZGsuYXBwc3luYygpLnVwZGF0ZVJlc29sdmVyKHNka1JlcXVlc3RPYmplY3QpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAvLyBGdW5jdGlvbiB2ZXJzaW9uIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIFZUTCBhbmQgbWFwcGluZyB0ZW1wbGF0ZXNcbiAgICAgICAgICAvLyBSdW50aW1lIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIGNvZGUgKEpTIG1hcHBpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgIGlmIChzZGtSZXF1ZXN0T2JqZWN0LmNvZGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmZ1bmN0aW9uVmVyc2lvbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHNka1JlcXVlc3RPYmplY3QucnVudGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSBhd2FpdCBzZGsuYXBwc3luYygpLmxpc3RGdW5jdGlvbnMoeyBhcGlJZDogc2RrUmVxdWVzdE9iamVjdC5hcGlJZCB9KTtcbiAgICAgICAgICBjb25zdCB7IGZ1bmN0aW9uSWQgfSA9IGZ1bmN0aW9ucy5maW5kKChmbikgPT4gZm4ubmFtZSA9PT0gcGh5c2ljYWxOYW1lKSA/PyB7fTtcbiAgICAgICAgICAvLyBVcGRhdGluZyBtdWx0aXBsZSBmdW5jdGlvbnMgYXQgdGhlIHNhbWUgdGltZSBvciBhbG9uZyB3aXRoIGdyYXBocWwgc2NoZW1hIHJlc3VsdHMgaW4gYENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25gXG4gICAgICAgICAgYXdhaXQgZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBzZGsuYXBwc3luYygpLnVwZGF0ZUZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5zZGtSZXF1ZXN0T2JqZWN0LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgNixcbiAgICAgICAgICAgIDEwMDAsXG4gICAgICAgICAgICAnQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0dyYXBoUUxTY2hlbWEpIHtcbiAgICAgICAgICBsZXQgc2NoZW1hQ3JlYXRpb25SZXNwb25zZTogR2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNDb21tYW5kT3V0cHV0ID0gYXdhaXQgc2RrXG4gICAgICAgICAgICAuYXBwc3luYygpXG4gICAgICAgICAgICAuc3RhcnRTY2hlbWFDcmVhdGlvbihzZGtSZXF1ZXN0T2JqZWN0KTtcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBzY2hlbWFDcmVhdGlvblJlc3BvbnNlLnN0YXR1cyAmJlxuICAgICAgICAgICAgWydQUk9DRVNTSU5HJywgJ0RFTEVUSU5HJ10uc29tZSgoc3RhdHVzKSA9PiBzdGF0dXMgPT09IHNjaGVtYUNyZWF0aW9uUmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCk7IC8vIHBvbGwgZXZlcnkgc2Vjb25kXG4gICAgICAgICAgICBjb25zdCBnZXRTY2hlbWFDcmVhdGlvblN0YXR1c1JlcXVlc3Q6IEdldFNjaGVtYUNyZWF0aW9uU3RhdHVzQ29tbWFuZElucHV0ID0ge1xuICAgICAgICAgICAgICBhcGlJZDogc2RrUmVxdWVzdE9iamVjdC5hcGlJZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzY2hlbWFDcmVhdGlvblJlc3BvbnNlID0gYXdhaXQgc2RrLmFwcHN5bmMoKS5nZXRTY2hlbWFDcmVhdGlvblN0YXR1cyhnZXRTY2hlbWFDcmVhdGlvblN0YXR1c1JlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hQ3JlYXRpb25SZXNwb25zZS5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKHNjaGVtYUNyZWF0aW9uUmVzcG9uc2UuZGV0YWlscyA/PyAnU2NoZW1hIGNyZWF0aW9uIGhhcyBmYWlsZWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlzQXBpS2V5XG4gICAgICAgICAgaWYgKCFzZGtSZXF1ZXN0T2JqZWN0LmlkKSB7XG4gICAgICAgICAgICAvLyBBcGlLZXlJZCBpcyBvcHRpb25hbCBpbiBDRk4gYnV0IHJlcXVpcmVkIGluIFNESy4gR3JhYiB0aGUgS2V5SWQgZnJvbSBwaHlzaWNhbEFybiBpZiBub3QgYXZhaWxhYmxlIGFzIHBhcnQgb2YgQ0ZOIHRlbXBsYXRlXG4gICAgICAgICAgICBjb25zdCBhcm5QYXJ0cyA9IHBoeXNpY2FsTmFtZT8uc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGlmIChhcm5QYXJ0cyAmJiBhcm5QYXJ0cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgc2RrUmVxdWVzdE9iamVjdC5pZCA9IGFyblBhcnRzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzZGsuYXBwc3luYygpLnVwZGF0ZUFwaUtleShzZGtSZXF1ZXN0T2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRmlsZUZyb21TMyhzM1VybDogc3RyaW5nLCBzZGs6IFNESykge1xuICBjb25zdCBzM1BhdGhQYXJ0cyA9IHMzVXJsLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHMzQnVja2V0ID0gczNQYXRoUGFydHNbMl07IC8vIGZpcnN0IHR3byBhcmUgXCJzMzpcIiBhbmQgXCJcIiBkdWUgdG8gczM6Ly9cbiAgY29uc3QgczNLZXkgPSBzM1BhdGhQYXJ0cy5zcGxpY2UoMykuam9pbignLycpOyAvLyBhZnRlciByZW1vdmluZyBmaXJzdCB0aHJlZSB3ZSByZWNvbnN0cnVjdCB0aGUga2V5XG4gIHJldHVybiAoYXdhaXQgc2RrLnMzKCkuZ2V0T2JqZWN0KHsgQnVja2V0OiBzM0J1Y2tldCwgS2V5OiBzM0tleSB9KSkuQm9keT8udHJhbnNmb3JtVG9TdHJpbmcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoZm46ICgpID0+IFByb21pc2U8YW55PiwgbnVtT2ZSZXRyaWVzOiBudW1iZXIsIGJhY2tPZmY6IG51bWJlciwgZXJyb3JDb2RlVG9SZXRyeTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvciAmJiBlcnJvci5uYW1lID09PSBlcnJvckNvZGVUb1JldHJ5ICYmIG51bU9mUmV0cmllcyA+IDApIHtcbiAgICAgIGF3YWl0IHNsZWVwKGJhY2tPZmYpOyAvLyB0aW1lIHRvIHdhaXQgZG91YmxlcyBldmVyeXRpbWUgZnVuY3Rpb24gZmFpbHMsIHN0YXJ0cyBhdCAxIHNlY29uZFxuICAgICAgYXdhaXQgZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoZm4sIG51bU9mUmV0cmllcyAtIDEsIGJhY2tPZmYgKiAyLCBlcnJvckNvZGVUb1JldHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChvaykgPT4gc2V0VGltZW91dChvaywgbXMpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type HotswapChange } from './common';
|
|
2
|
+
import type { ResourceChange } from '../../payloads/hotswap';
|
|
3
|
+
import type { EvaluateCloudFormationTemplate } from '../cloudformation';
|
|
4
|
+
export declare function isHotswappableCodeBuildProjectChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;
|