From e86602fdf079d3688ea32c556dbffd31b345d12c Mon Sep 17 00:00:00 2001 From: AWS CDK Automation <43080478+aws-cdk-automation@users.noreply.github.com> Date: Tue, 17 Nov 2020 11:16:51 +0100 Subject: [PATCH] chore(release): 1.74.0 (#11508) See CHANGELOG --- .github/workflows/issue-label-assign.yml | 4 + CHANGELOG.md | 37 +- .../ecs-service-extensions/README.md | 4 +- .../lib/extensions/appmesh.ts | 25 +- .../ecs-service-extensions/package.json | 6 +- packages/@aws-cdk/app-delivery/package.json | 2 +- .../lib/scalable-target.ts | 5 + .../aws-applicationautoscaling/package.json | 2 +- packages/@aws-cdk/aws-appmesh/README.md | 25 +- packages/@aws-cdk/aws-appmesh/lib/index.ts | 1 + .../aws-appmesh/lib/shared-interfaces.ts | 38 - .../aws-appmesh/lib/virtual-node-listener.ts | 219 ++ .../@aws-cdk/aws-appmesh/lib/virtual-node.ts | 105 +- packages/@aws-cdk/aws-appmesh/package.json | 7 +- .../@aws-cdk/aws-appmesh/test/integ.mesh.ts | 14 +- .../aws-appmesh/test/test.health-check.ts | 30 +- .../@aws-cdk/aws-appmesh/test/test.mesh.ts | 38 +- .../aws-appmesh/test/test.virtual-node.ts | 228 +- .../aws-appmesh/test/test.virtual-router.ts | 50 +- .../aws-autoscaling-common/package.json | 2 +- .../aws-autoscaling/lib/auto-scaling-group.ts | 28 +- .../test/integ.asg-w-elbv2.expected.json | 2 +- .../aws-autoscaling/test/scaling.test.ts | 50 +- .../package.json | 8 +- .../aws-cloudfront-origins/package.json | 2 +- packages/@aws-cdk/aws-cloudfront/package.json | 2 +- packages/@aws-cdk/aws-cloudtrail/package.json | 2 +- packages/@aws-cdk/aws-codebuild/package.json | 2 +- packages/@aws-cdk/aws-codecommit/package.json | 2 +- .../aws-codepipeline-actions/README.md | 1 + .../lib/ecs/deploy-action.ts | 20 +- .../test/ecs/test.ecs-deploy-action.ts | 50 + .../integ.pipeline-ecs-deploy.expected.json | 3 +- .../test/integ.pipeline-ecs-deploy.ts | 1 + .../aws-global-table-coordinator/package.json | 6 +- packages/@aws-cdk/aws-dynamodb/package.json | 2 +- packages/@aws-cdk/aws-ec2/lib/vpc.ts | 7 + packages/@aws-cdk/aws-ecr-assets/NOTICE | 68 + packages/@aws-cdk/aws-ecr-assets/package.json | 2 - packages/@aws-cdk/aws-ecr/lib/repository.ts | 34 +- packages/@aws-cdk/aws-ecr/package.json | 2 - .../test/integ.imagescan.expected.json | 202 +- .../@aws-cdk/aws-ecr/test/test.repository.ts | 8 +- packages/@aws-cdk/aws-ecs/README.md | 2 +- .../aws-ecs/lib/base/task-definition.ts | 13 + .../aws-ecs/lib/container-definition.ts | 13 +- .../aws-ecs/lib/fargate/fargate-service.ts | 13 + .../test/fargate/integ.secret.expected.json | 16 +- .../aws-ecs/test/fargate/integ.secret.ts | 1 + .../test/fargate/test.fargate-service.ts | 26 + .../aws-ecs/test/test.container-definition.ts | 32 +- packages/@aws-cdk/aws-efs/README.md | 19 + packages/@aws-cdk/aws-efs/lib/access-point.ts | 123 +- .../@aws-cdk/aws-efs/lib/efs-file-system.ts | 53 +- .../aws-efs/test/access-point.test.ts | 85 +- packages/@aws-cdk/aws-eks/package.json | 2 +- .../@aws-cdk/aws-events-targets/package.json | 2 +- packages/@aws-cdk/aws-iam/README.md | 10 +- packages/@aws-cdk/aws-iam/lib/policy.ts | 13 + packages/@aws-cdk/aws-iam/test/policy.test.ts | 38 +- .../@aws-cdk/aws-iotsitewise/.eslintrc.js | 3 + packages/@aws-cdk/aws-iotsitewise/.gitignore | 19 + packages/@aws-cdk/aws-iotsitewise/.npmignore | 28 + packages/@aws-cdk/aws-iotsitewise/LICENSE | 201 ++ packages/@aws-cdk/aws-iotsitewise/NOTICE | 2 + packages/@aws-cdk/aws-iotsitewise/README.md | 16 + .../@aws-cdk/aws-iotsitewise/jest.config.js | 2 + .../@aws-cdk/aws-iotsitewise/lib/index.ts | 2 + .../@aws-cdk/aws-iotsitewise/package.json | 96 + .../aws-iotsitewise/test/iotsitewise.test.ts | 6 + packages/@aws-cdk/aws-ivs/.eslintrc.js | 3 + packages/@aws-cdk/aws-ivs/.gitignore | 19 + packages/@aws-cdk/aws-ivs/.npmignore | 28 + packages/@aws-cdk/aws-ivs/LICENSE | 201 ++ packages/@aws-cdk/aws-ivs/NOTICE | 2 + packages/@aws-cdk/aws-ivs/README.md | 16 + packages/@aws-cdk/aws-ivs/jest.config.js | 2 + packages/@aws-cdk/aws-ivs/lib/index.ts | 2 + packages/@aws-cdk/aws-ivs/package.json | 96 + packages/@aws-cdk/aws-ivs/test/ivs.test.ts | 6 + .../aws-lambda-event-sources/README.md | 2 +- .../@aws-cdk/aws-lambda-nodejs/package.json | 2 +- .../@aws-cdk/aws-lambda/lib/filesystem.ts | 2 +- .../@aws-cdk/aws-lambda/lib/function-base.ts | 20 +- packages/@aws-cdk/aws-lambda/lib/function.ts | 2 +- .../@aws-cdk/aws-lambda/test/function.test.ts | 32 +- .../integ.lambda.filesystem.expected.json | 258 +- .../test/integ.lambda.filesystem.ts | 42 +- packages/@aws-cdk/aws-logs/README.md | 27 +- packages/@aws-cdk/aws-logs/lib/log-group.ts | 9 + packages/@aws-cdk/aws-logs/package.json | 4 +- .../@aws-cdk/aws-logs/test/test.loggroup.ts | 22 +- .../@aws-cdk/aws-mediapackage/.eslintrc.js | 3 + packages/@aws-cdk/aws-mediapackage/.gitignore | 19 + packages/@aws-cdk/aws-mediapackage/.npmignore | 28 + packages/@aws-cdk/aws-mediapackage/LICENSE | 201 ++ packages/@aws-cdk/aws-mediapackage/NOTICE | 2 + packages/@aws-cdk/aws-mediapackage/README.md | 16 + .../@aws-cdk/aws-mediapackage/jest.config.js | 2 + .../@aws-cdk/aws-mediapackage/lib/index.ts | 2 + .../@aws-cdk/aws-mediapackage/package.json | 96 + .../test/mediapackage.test.ts | 6 + packages/@aws-cdk/aws-route53/package.json | 2 +- packages/@aws-cdk/aws-sqs/package.json | 2 +- .../lib/athena/start-query-execution.ts | 23 +- .../integ.get-query-execution.expected.json | 4 +- .../integ.get-query-results.expected.json | 4 +- .../integ.start-query-execution.expected.json | 4 +- .../integ.stop-query-execution.expected.json | 4 +- .../test/athena/start-query-execution.test.ts | 52 + packages/@aws-cdk/cfnspec/CHANGELOG.md | 192 ++ .../build-tools/create-missing-libraries.ts | 28 +- packages/@aws-cdk/cfnspec/cfn.version | 2 +- ...0_CloudFormationResourceSpecification.json | 2796 ++++++++++++++++- ...aPackage_PackagingConfiguration_patch.json | 29 + ...80_AutoScaling_AutoScalingGroup_patch.json | 31 + .../680_MediaPackage_Channel_patch.json | 15 + ...figuration_Tags_CorrectItemType_patch.json | 21 + .../@aws-cdk/cloudformation-diff/package.json | 2 +- .../cloudformation-include/package.json | 8 +- packages/@aws-cdk/core/NOTICE | 142 + packages/@aws-cdk/core/lib/cfn-output.ts | 39 +- packages/@aws-cdk/core/package.json | 2 +- packages/@aws-cdk/core/test/output.test.ts | 77 +- packages/@aws-cdk/core/test/stage.test.ts | 35 + .../@aws-cdk/custom-resources/package.json | 2 +- .../@aws-cdk/cx-api/lib/cloud-assembly.ts | 12 + .../test/cloud-assembly-builder.test.ts | 22 + .../lib/actions/deploy-cdk-stack-action.ts | 5 +- packages/@aws-cdk/pipelines/lib/private/fs.ts | 14 + .../lib/synths/simple-synth-action.ts | 5 +- packages/@aws-cdk/pipelines/test/fs.test.ts | 11 + packages/aws-cdk-lib/NOTICE | 142 + packages/aws-cdk-lib/package.json | 5 +- packages/aws-cdk/package.json | 4 +- packages/awslint/package.json | 2 +- packages/cdk-assets/package.json | 4 +- packages/decdk/package.json | 5 +- packages/monocdk/NOTICE | 142 + packages/monocdk/package.json | 5 +- scripts/script-tests/package.json | 2 +- tools/cdk-build-tools/package.json | 8 +- tools/cdk-integ-tools/package.json | 2 +- tools/cfn2ts/package.json | 2 +- tools/eslint-plugin-cdk/package.json | 6 +- tools/pkglint/lib/packagejson.ts | 9 +- tools/pkglint/lib/rules.ts | 55 +- tools/pkglint/package.json | 3 +- tools/pkglint/test/fake-module.ts | 36 +- tools/pkglint/test/rules.test.ts | 220 +- tools/pkgtools/package.json | 2 +- version.v1.json | 2 +- yarn.lock | 1086 +++---- 153 files changed, 7241 insertions(+), 1440 deletions(-) create mode 100644 packages/@aws-cdk/aws-appmesh/lib/virtual-node-listener.ts create mode 100644 packages/@aws-cdk/aws-iotsitewise/.eslintrc.js create mode 100644 packages/@aws-cdk/aws-iotsitewise/.gitignore create mode 100644 packages/@aws-cdk/aws-iotsitewise/.npmignore create mode 100644 packages/@aws-cdk/aws-iotsitewise/LICENSE create mode 100644 packages/@aws-cdk/aws-iotsitewise/NOTICE create mode 100644 packages/@aws-cdk/aws-iotsitewise/README.md create mode 100644 packages/@aws-cdk/aws-iotsitewise/jest.config.js create mode 100644 packages/@aws-cdk/aws-iotsitewise/lib/index.ts create mode 100644 packages/@aws-cdk/aws-iotsitewise/package.json create mode 100644 packages/@aws-cdk/aws-iotsitewise/test/iotsitewise.test.ts create mode 100644 packages/@aws-cdk/aws-ivs/.eslintrc.js create mode 100644 packages/@aws-cdk/aws-ivs/.gitignore create mode 100644 packages/@aws-cdk/aws-ivs/.npmignore create mode 100644 packages/@aws-cdk/aws-ivs/LICENSE create mode 100644 packages/@aws-cdk/aws-ivs/NOTICE create mode 100644 packages/@aws-cdk/aws-ivs/README.md create mode 100644 packages/@aws-cdk/aws-ivs/jest.config.js create mode 100644 packages/@aws-cdk/aws-ivs/lib/index.ts create mode 100644 packages/@aws-cdk/aws-ivs/package.json create mode 100644 packages/@aws-cdk/aws-ivs/test/ivs.test.ts create mode 100644 packages/@aws-cdk/aws-mediapackage/.eslintrc.js create mode 100644 packages/@aws-cdk/aws-mediapackage/.gitignore create mode 100644 packages/@aws-cdk/aws-mediapackage/.npmignore create mode 100644 packages/@aws-cdk/aws-mediapackage/LICENSE create mode 100644 packages/@aws-cdk/aws-mediapackage/NOTICE create mode 100644 packages/@aws-cdk/aws-mediapackage/README.md create mode 100644 packages/@aws-cdk/aws-mediapackage/jest.config.js create mode 100644 packages/@aws-cdk/aws-mediapackage/lib/index.ts create mode 100644 packages/@aws-cdk/aws-mediapackage/package.json create mode 100644 packages/@aws-cdk/aws-mediapackage/test/mediapackage.test.ts create mode 100644 packages/@aws-cdk/cfnspec/spec-source/670_MediaPackage_PackagingConfiguration_patch.json create mode 100644 packages/@aws-cdk/cfnspec/spec-source/680_AutoScaling_AutoScalingGroup_patch.json create mode 100644 packages/@aws-cdk/cfnspec/spec-source/680_MediaPackage_Channel_patch.json create mode 100644 packages/@aws-cdk/cfnspec/spec-source/690_IoT_DomainConfiguration_Tags_CorrectItemType_patch.json create mode 100644 packages/@aws-cdk/pipelines/lib/private/fs.ts create mode 100644 packages/@aws-cdk/pipelines/test/fs.test.ts diff --git a/.github/workflows/issue-label-assign.yml b/.github/workflows/issue-label-assign.yml index 397709328e83e..6184e7c0580f5 100644 --- a/.github/workflows/issue-label-assign.yml +++ b/.github/workflows/issue-label-assign.yml @@ -24,6 +24,7 @@ jobs: {"keywords":["[@aws-cdk/aws-amplify]","[aws-amplify]","[amplify]"],"labels":["@aws-cdk/aws-amplify"],"assignees":["MrArnoldPalmer"]}, {"keywords":["[@aws-cdk/aws-apigateway]","[aws-apigateway]","[apigateway]","[api gateway]","[api-gateway]"],"labels":["@aws-cdk/aws-apigateway"],"assignees":["nija-at"]}, {"keywords":["[@aws-cdk/aws-apigatewayv2]","[aws-apigatewayv2]","[apigatewayv2]","[apigateway v2]","[api-gateway-v2]"],"labels":["@aws-cdk/aws-apigatewayv2"],"assignees":["nija-at"]}, + {"keywords":["[@aws-cdk/aws-apigatewayv2-integrations]","[aws-apigatewayv2-integrations]","[apigatewayv2-integrations]","[apigateway v2 integrations]","[api-gateway-v2-integrations]"],"labels":["@aws-cdk/aws-apigatewayv2-integrations"],"assignees":["nija-at"]}, {"keywords":["[@aws-cdk/aws-appconfig]","[aws-appconfig]","[appconfig]","[app config]","[app-config]"],"labels":["@aws-cdk/aws-appconfig"],"assignees":["MrArnoldPalmer"]}, {"keywords":["[@aws-cdk/aws-appflow]","[aws-appflow]","[appflow]","[app flow]","[app-flow]"],"labels":["@aws-cdk/aws-appflow"],"assignees":["skinny85"]}, {"keywords":["[@aws-cdk/aws-applicationautoscaling]","[aws-applicationautoscaling]","[applicationautoscaling]","[application autoscaling]","[application-autoscaling]"],"labels":["@aws-cdk/aws-applicationautoscaling"],"assignees":["NetaNir"]}, @@ -102,7 +103,9 @@ jobs: {"keywords":["[@aws-cdk/aws-iot1click]","[aws-iot1click]","[iot1click]","[iot 1click]"],"labels":["@aws-cdk/aws-iot1click"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-iotanalytics]","[aws-iotanalytics]","[iotanalytics]","[iot analytics]","[iot-analytics]"],"labels":["@aws-cdk/aws-iotanalytics"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-iotevents]","[aws-iotevents]","[iotevents]","[iot events]","[iot-events]"],"labels":["@aws-cdk/aws-iotevents"],"assignees":["shivlaks"]}, + {"keywords":["[@aws-cdk/aws-iotsitewise]","[aws-iotsitewise]","[iotsitewise]","[iot sitewise]","[iot-sitewise]","[iot-site-wise]","[iot site wise]"],"labels":["@aws-cdk/aws-iotsitewise"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-iotthingsgraph]","[aws-iotthingsgraph]","[iotthingsgraph]","[iot things graph]","[iot-things-graph]"],"labels":["@aws-cdk/aws-iotthingsgraph"],"assignees":["shivlaks"]}, + {"keywords":["[@aws-cdk/aws-ivs]","[aws-ivs]","[Interactive Video Service]","[ivs]"],"labels":["@aws-cdk/aws-ivs"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-kendra]","[aws-kendra]","[kendra]"],"labels":["@aws-cdk/aws-kendra"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-kinesis]","[aws-kinesis]","[kinesis]"],"labels":["@aws-cdk/aws-kinesis"],"assignees":["iliapolo"]}, {"keywords":["[@aws-cdk/aws-kinesisanalytics]","[aws-kinesisanalytics]","[kinesisanalytics]","[kinesis analytics]","[kinesis-analytics]"],"labels":["@aws-cdk/aws-kinesisanalytics"],"assignees":["iliapolo"]}, @@ -120,6 +123,7 @@ jobs: {"keywords":["[@aws-cdk/aws-mediaconvert]","[aws-mediaconvert]","[mediaconvert]","[media convert]","[media-convert]"],"labels":["@aws-cdk/aws-mediaconvert"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-medialive]","[aws-medialive]","[medialive]","[media live]","[media-live]"],"labels":["@aws-cdk/aws-medialive"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-mediastore]","[aws-mediastore]","[mediastore]","[media store]","[media-store]"],"labels":["@aws-cdk/aws-mediastore"],"assignees":["shivlaks"]}, + {"keywords":["[@aws-cdk/aws-mediapackage]","[aws-mediapackage]","[mediapackage]","[media package]","[media-package]"],"labels":["@aws-cdk/aws-mediapackage"],"assignees":["shivlaks"]}, {"keywords":["[@aws-cdk/aws-msk]","[aws-msk]","[msk]"],"labels":["@aws-cdk/aws-msk"],"assignees":["iliapolo"]}, {"keywords":["[@aws-cdk/aws-neptune]","[aws-neptune]","[neptune]"],"labels":["@aws-cdk/aws-neptune"],"assignees":["njlynch"]}, {"keywords":["[@aws-cdk/aws-networkmanager]","[aws-networkmanager]","[networkmanager]","[network manager]","[network-manager]"],"labels":["@aws-cdk/aws-networkmanager"],"assignees":["shivlaks"]}, diff --git a/CHANGELOG.md b/CHANGELOG.md index 941f81402e7d2..c1423ba20377a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,48 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [1.74.0](https://github.com/aws/aws-cdk/compare/v1.73.0...v1.74.0) (2020-11-17) + + +### ⚠ BREAKING CHANGES TO EXPERIMENTAL FEATURES + +* **appmesh:** `IVirtualNode` no longer has the `addBackends()` method. A backend can be added to `VirtualNode` using the `addBackend()` method which accepts a single `IVirtualService` +* **appmesh**: `IVirtualNode` no longer has the `addListeners()` method. A listener can be added to `VirtualNode` using the `addListener()` method which accepts a single `VirtualNodeListener` +* **appmesh**: `VirtualNode` no longer has a default listener. It is valid to have a `VirtualNode` without any listeners +* **appmesh**: the construction property `listener` of `VirtualNode` has been renamed to `listeners`, and its type changed to an array of listeners +* **appmesh**: the struct `VirtualNodeListener` has been removed. To create Virtual Node listeners, use the static factory methods of the `VirtualNodeListener` class + +### Features + +* **applicationautoscaling:** Add KAFKA to ServiceNamespace ([#11394](https://github.com/aws/aws-cdk/issues/11394)) ([b5c3f84](https://github.com/aws/aws-cdk/commit/b5c3f84c8be855107d3ea6738bbf8511f2ecdb8e)) +* **appmesh:** add listener timeout to Virtual Nodes ([#10793](https://github.com/aws/aws-cdk/issues/10793)) ([62baa7b](https://github.com/aws/aws-cdk/commit/62baa7b51b49c1a669c7144e5883375fe9ab5d35)) +* **cfnspec:** cloudformation spec v20.0.0 ([#11319](https://github.com/aws/aws-cdk/issues/11319)) ([8c17a35](https://github.com/aws/aws-cdk/commit/8c17a35746271d38289f6e200aea35b201b8a93d)) +* **cfnspec:** cloudformation spec v20.2.0 ([#11429](https://github.com/aws/aws-cdk/issues/11429)) ([025992b](https://github.com/aws/aws-cdk/commit/025992b0014aca493a669be518f4f423d3f39a57)) +* **codepipeline-actions:** Add deployment timeout to EcsDeployAction ([#11407](https://github.com/aws/aws-cdk/issues/11407)) ([7d9d575](https://github.com/aws/aws-cdk/commit/7d9d5757db2acedb507da8bb84c65cc06d018b91)) +* **core:** add easy importValue to CfnOutput ([#11368](https://github.com/aws/aws-cdk/issues/11368)) ([c71a4e9](https://github.com/aws/aws-cdk/commit/c71a4e9644fdd64fa00a6d804c921b32bd1816d1)), closes [#11360](https://github.com/aws/aws-cdk/issues/11360) +* **ecs:** secret JSON field for Fargate tasks ([#11348](https://github.com/aws/aws-cdk/issues/11348)) ([03e7cd5](https://github.com/aws/aws-cdk/commit/03e7cd5ebaf07be22f8fff8edacbc384989ebf7c)), closes [/github.com/aws/containers-roadmap/issues/385#issuecomment-722696672](https://github.com/aws//github.com/aws/containers-roadmap/issues/385/issues/issuecomment-722696672) [#11341](https://github.com/aws/aws-cdk/issues/11341) +* **efs:** import access point - `fromAccessPointAttributes()` ([#10712](https://github.com/aws/aws-cdk/issues/10712)) ([ec72c85](https://github.com/aws/aws-cdk/commit/ec72c859c31a069406994433fe430f56ff0e5ff3)) +* **iam:** specify initial PolicyDocument for inline Policy ([#11430](https://github.com/aws/aws-cdk/issues/11430)) ([a8c4f17](https://github.com/aws/aws-cdk/commit/a8c4f178e08cef4f306f54976076c21de2252a55)), closes [#11236](https://github.com/aws/aws-cdk/issues/11236) +* **logs:** Add KMS key support to LogGroup ([#11363](https://github.com/aws/aws-cdk/issues/11363)) ([21ccfce](https://github.com/aws/aws-cdk/commit/21ccfce514e10cfcdde36148b45f085d3494c540)), closes [#11211](https://github.com/aws/aws-cdk/issues/11211) +* **stepfunctions-tasks:** support overriding all properties of CodeBuild StartBuild integration ([#10356](https://github.com/aws/aws-cdk/issues/10356)) ([58efbad](https://github.com/aws/aws-cdk/commit/58efbad743464439ce8eb97a6c6c3e07b531d93c)), closes [#10302](https://github.com/aws/aws-cdk/issues/10302) + + +### Bug Fixes + +* **autoscaling:** `targetRequestsPerSecond` is actually requests per minute ([#11457](https://github.com/aws/aws-cdk/issues/11457)) ([39e277f](https://github.com/aws/aws-cdk/commit/39e277f65666e96fe1ad662254327967f666dbad)), closes [#11446](https://github.com/aws/aws-cdk/issues/11446) +* **core:** missing context in Stages is not filled by CLI ([#11461](https://github.com/aws/aws-cdk/issues/11461)) ([a4a555a](https://github.com/aws/aws-cdk/commit/a4a555a9f5e8844a377d8de5041219346d0eb65c)), closes [#9226](https://github.com/aws/aws-cdk/issues/9226) +* **lambda:** failed to add permission to an imported lambda from another account ([#11369](https://github.com/aws/aws-cdk/issues/11369)) ([715a030](https://github.com/aws/aws-cdk/commit/715a0300ea44c7cfcb6ae9973bd4ca16585c8fa5)), closes [#11278](https://github.com/aws/aws-cdk/issues/11278) [#11141](https://github.com/aws/aws-cdk/issues/11141) [#11141](https://github.com/aws/aws-cdk/issues/11141) +* **pipelines:** synthesizes incorrect paths on Windows ([#11464](https://github.com/aws/aws-cdk/issues/11464)) ([2ca31a8](https://github.com/aws/aws-cdk/commit/2ca31a87a8cbf0c5267b3d3b39c8dc75b142488e)), closes [#11359](https://github.com/aws/aws-cdk/issues/11359) [#11405](https://github.com/aws/aws-cdk/issues/11405) [#11424](https://github.com/aws/aws-cdk/issues/11424) +* **stepfunctions-tasks:** encryption is required for AthenaStartQueryExecution ([#11355](https://github.com/aws/aws-cdk/issues/11355)) ([f26a592](https://github.com/aws/aws-cdk/commit/f26a592e609674d528990aad14fb8884112ad64d)) +* **stepfunctions-tasks:** incorrect policy for Athena prevents database deletions ([#11427](https://github.com/aws/aws-cdk/issues/11427)) ([58e6576](https://github.com/aws/aws-cdk/commit/58e6576a90f722929495b7cd9f1d67f93bf9c31e)), closes [#11357](https://github.com/aws/aws-cdk/issues/11357) + ## [1.73.0](https://github.com/aws/aws-cdk/compare/v1.72.0...v1.73.0) (2020-11-11) ### ⚠ BREAKING CHANGES TO EXPERIMENTAL FEATURES * **apigatewayv2:** `LambdaProxyIntegration` and `HttpProxyIntegration` -classes have moved to the `@aws-cdk/aws-apigatewayv2-integration` module. +classes have moved to the `@aws-cdk/aws-apigatewayv2-integrations` module. * **appmesh:** VirtualRouter's Listeners are no longer a struct; use the static factory methods of the `VirtualNodeListener` class to obtain instances of them * **appmesh:** VirtualRouter accepts a list of listeners instead of a single listener * **appmesh:** all `fromResourceName()` methods in the AppMesh module have been replaced with `fromResourceAttributes()` diff --git a/packages/@aws-cdk-containers/ecs-service-extensions/README.md b/packages/@aws-cdk-containers/ecs-service-extensions/README.md index 9302b90e5d9a3..cbca327f0ee12 100644 --- a/packages/@aws-cdk-containers/ecs-service-extensions/README.md +++ b/packages/@aws-cdk-containers/ecs-service-extensions/README.md @@ -2,9 +2,7 @@ --- -![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge) - -> The APIs of higher level constructs in this module are experimental and under active development. They are subject to non-backward compatible changes or removal in any future version. These are not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be announced in the release notes. This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package. +![cdk-constructs: Stable](https://img.shields.io/badge/cdk--constructs-stable-success.svg?style=for-the-badge) --- diff --git a/packages/@aws-cdk-containers/ecs-service-extensions/lib/extensions/appmesh.ts b/packages/@aws-cdk-containers/ecs-service-extensions/lib/extensions/appmesh.ts index 583ca06435c09..614a1eeea2312 100644 --- a/packages/@aws-cdk-containers/ecs-service-extensions/lib/extensions/appmesh.ts +++ b/packages/@aws-cdk-containers/ecs-service-extensions/lib/extensions/appmesh.ts @@ -259,17 +259,28 @@ export class AppMeshExtension extends ServiceExtension { throw new Error('You must add a CloudMap namespace to the ECS cluster in order to use the AppMesh extension'); } + function addListener(protocol: appmesh.Protocol, port: number): appmesh.VirtualNodeListener { + switch (protocol) { + case appmesh.Protocol.HTTP : + return appmesh.VirtualNodeListener.http({ port }); + + case appmesh.Protocol.HTTP2 : + return appmesh.VirtualNodeListener.http2({ port }); + + case appmesh.Protocol.GRPC : + return appmesh.VirtualNodeListener.grpc({ port }); + + case appmesh.Protocol.TCP : + return appmesh.VirtualNodeListener.tcp({ port }); + } + } + // Create a virtual node for the name service this.virtualNode = new appmesh.VirtualNode(this.scope, `${this.parentService.id}-virtual-node`, { mesh: this.mesh, virtualNodeName: this.parentService.id, cloudMapService: service.cloudMapService, - listener: { - portMapping: { - port: containerextension.trafficPort, - protocol: this.protocol, - }, - }, + listeners: [addListener(this.protocol, containerextension.trafficPort)], }); // Create a virtual router for this service. This allows for retries @@ -326,7 +337,7 @@ export class AppMeshExtension extends ServiceExtension { // Next update the app mesh config so that the local Envoy // proxy on this service knows how to route traffic to // nodes from the other service. - this.virtualNode.addBackends(otherAppMesh.virtualService); + this.virtualNode.addBackend(otherAppMesh.virtualService); } private virtualRouterListener(port: number): appmesh.VirtualRouterListener { diff --git a/packages/@aws-cdk-containers/ecs-service-extensions/package.json b/packages/@aws-cdk-containers/ecs-service-extensions/package.json index 4b1da71dd86fe..e33dc561b65b8 100644 --- a/packages/@aws-cdk-containers/ecs-service-extensions/package.json +++ b/packages/@aws-cdk-containers/ecs-service-extensions/package.json @@ -99,6 +99,6 @@ "awscdkio": { "announce": false }, - "maturity": "experimental", - "stability": "experimental" -} + "maturity": "stable", + "stability": "stable" +} \ No newline at end of file diff --git a/packages/@aws-cdk/app-delivery/package.json b/packages/@aws-cdk/app-delivery/package.json index e0a95c03879eb..d860fe435fd24 100644 --- a/packages/@aws-cdk/app-delivery/package.json +++ b/packages/@aws-cdk/app-delivery/package.json @@ -63,7 +63,7 @@ "@types/nodeunit": "^0.0.31", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", - "fast-check": "^2.6.1", + "fast-check": "^2.7.0", "nodeunit": "^0.11.3", "pkglint": "0.0.0" }, diff --git a/packages/@aws-cdk/aws-applicationautoscaling/lib/scalable-target.ts b/packages/@aws-cdk/aws-applicationautoscaling/lib/scalable-target.ts index 14bf3f4913b34..9549ff5c6598c 100644 --- a/packages/@aws-cdk/aws-applicationautoscaling/lib/scalable-target.ts +++ b/packages/@aws-cdk/aws-applicationautoscaling/lib/scalable-target.ts @@ -274,4 +274,9 @@ export enum ServiceNamespace { * Comprehend */ COMPREHEND = 'comprehend', + + /** + * Kafka + */ + KAFKA = 'kafka', } diff --git a/packages/@aws-cdk/aws-applicationautoscaling/package.json b/packages/@aws-cdk/aws-applicationautoscaling/package.json index 3072fda41400d..39693f2db0d30 100644 --- a/packages/@aws-cdk/aws-applicationautoscaling/package.json +++ b/packages/@aws-cdk/aws-applicationautoscaling/package.json @@ -75,7 +75,7 @@ "@types/nodeunit": "^0.0.31", "cdk-build-tools": "0.0.0", "cfn2ts": "0.0.0", - "fast-check": "^2.6.1", + "fast-check": "^2.7.0", "nodeunit": "^0.11.3", "pkglint": "0.0.0" }, diff --git a/packages/@aws-cdk/aws-appmesh/README.md b/packages/@aws-cdk/aws-appmesh/README.md index 9c0a4b7f1da2e..dff8a6808c701 100644 --- a/packages/@aws-cdk/aws-appmesh/README.md +++ b/packages/@aws-cdk/aws-appmesh/README.md @@ -139,11 +139,8 @@ const service = namespace.createService('Svc'); const node = mesh.addVirtualNode('virtual-node', { cloudMapService: service, - listener: { - portMapping: { - port: 8081, - protocol: Protocol.HTTP, - }, + listeners: [appmesh.VirtualNodeListener.httpNodeListener({ + port: 8081, healthCheck: { healthyThreshold: 3, interval: Duration.seconds(5), // minimum @@ -153,9 +150,9 @@ const node = mesh.addVirtualNode('virtual-node', { timeout: Duration.seconds(2), // minimum unhealthyThreshold: 2, }, - }, + })], accessLog: appmesh.AccessLog.fromFilePath('/dev/stdout'), -}) +}); ``` Create a `VirtualNode` with the the constructor and add tags. @@ -164,11 +161,8 @@ Create a `VirtualNode` with the the constructor and add tags. const node = new VirtualNode(this, 'node', { mesh, cloudMapService: service, - listener: { - portMapping: { - port: 8080, - protocol: Protocol.HTTP, - }, + listeners: [appmesh.VirtualNodeListener.httpNodeListener({ + port: 8080, healthCheck: { healthyThreshold: 3, interval: Duration.seconds(5), // min @@ -177,15 +171,18 @@ const node = new VirtualNode(this, 'node', { protocol: Protocol.HTTP, timeout: Duration.seconds(2), // min unhealthyThreshold: 2, + }, + timeout: { + idle: cdk.Duration.seconds(5), }, - }, + })], accessLog: appmesh.AccessLog.fromFilePath('/dev/stdout'), }); cdk.Tag.add(node, 'Environment', 'Dev'); ``` -The listeners property can be left blank and added later with the `node.addListeners()` method. The `healthcheck` property is optional but if specifying a listener, the `portMappings` must contain at least one property. +The `listeners` property can be left blank and added later with the `node.addListener()` method. The `healthcheck` and `timeout` properties are optional but if specifying a listener, the `port` must be added. ## Adding a Route diff --git a/packages/@aws-cdk/aws-appmesh/lib/index.ts b/packages/@aws-cdk/aws-appmesh/lib/index.ts index d95c017c2071e..4c09b13ba730c 100644 --- a/packages/@aws-cdk/aws-appmesh/lib/index.ts +++ b/packages/@aws-cdk/aws-appmesh/lib/index.ts @@ -7,6 +7,7 @@ export * from './virtual-node'; export * from './virtual-router'; export * from './virtual-router-listener'; export * from './virtual-service'; +export * from './virtual-node-listener'; export * from './virtual-gateway'; export * from './virtual-gateway-listener'; export * from './gateway-route'; diff --git a/packages/@aws-cdk/aws-appmesh/lib/shared-interfaces.ts b/packages/@aws-cdk/aws-appmesh/lib/shared-interfaces.ts index 39111389b0a03..21ab96b6ce56a 100644 --- a/packages/@aws-cdk/aws-appmesh/lib/shared-interfaces.ts +++ b/packages/@aws-cdk/aws-appmesh/lib/shared-interfaces.ts @@ -68,44 +68,6 @@ export interface HealthCheck { readonly unhealthyThreshold?: number; } -/** - * Port mappings for resources that require these attributes, such as VirtualNodes and Routes - */ -export interface PortMapping { - /** - * Port mapped to the VirtualNode / Route - * - * @default 8080 - */ - readonly port: number; - - /** - * Protocol for the VirtualNode / Route, only GRPC, HTTP, HTTP2, or TCP is supported - * - * @default HTTP - */ - readonly protocol: Protocol; -} - -/** - * Represents the properties needed to define healthy and active listeners for nodes - */ -export interface VirtualNodeListener { - /** - * Array of PortMappingProps for the listener - * - * @default - HTTP port 8080 - */ - readonly portMapping?: PortMapping; - - /** - * Health checking strategy upstream nodes should use when communicating with the listener - * - * @default - no healthcheck - */ - readonly healthCheck?: HealthCheck; -} - /** * All Properties for Envoy Access logs for mesh endpoints */ diff --git a/packages/@aws-cdk/aws-appmesh/lib/virtual-node-listener.ts b/packages/@aws-cdk/aws-appmesh/lib/virtual-node-listener.ts new file mode 100644 index 0000000000000..e3e433d8e25d8 --- /dev/null +++ b/packages/@aws-cdk/aws-appmesh/lib/virtual-node-listener.ts @@ -0,0 +1,219 @@ +import * as cdk from '@aws-cdk/core'; +import { CfnVirtualNode } from './appmesh.generated'; +import { validateHealthChecks } from './private/utils'; +import { HealthCheck, Protocol } from './shared-interfaces'; + +/** + * Properties for a VirtualNode listener + */ +export interface VirtualNodeListenerConfig { + /** + * Single listener config for a VirtualNode + */ + readonly listener: CfnVirtualNode.ListenerProperty, +} + +/** + * Represents the properties needed to define a Listeners for a VirtualNode + */ +interface VirtualNodeListenerCommonOptions { + /** + * Port to listen for connections on + * + * @default - 8080 + */ + readonly port?: number + + /** + * The health check information for the listener + * + * @default - no healthcheck + */ + readonly healthCheck?: HealthCheck; +} + +/** + * Represent the HTTP Node Listener prorperty + */ +export interface HttpVirtualNodeListenerOptions extends VirtualNodeListenerCommonOptions { + /** + * Timeout for HTTP protocol + * + * @default - None + */ + readonly timeout?: HttpTimeout; +} + +/** + * Represent the GRPC Node Listener prorperty + */ +export interface GrpcVirtualNodeListenerOptions extends VirtualNodeListenerCommonOptions { + /** + * Timeout for GRPC protocol + * + * @default - None + */ + readonly timeout?: GrpcTimeout; +} + +/** + * Represent the TCP Node Listener prorperty + */ +export interface TcpVirtualNodeListenerOptions extends VirtualNodeListenerCommonOptions { + /** + * Timeout for TCP protocol + * + * @default - None + */ + readonly timeout?: TcpTimeout; +} + +/** + * Represents timeouts for HTTP protocols. + */ +export interface HttpTimeout { + /** + * Represents an idle timeout. The amount of time that a connection may be idle. + * + * @default - none + */ + readonly idle?: cdk.Duration; + + /** + * Represents per request timeout. + * + * @default - 15 s + */ + readonly perRequest?: cdk.Duration; +} + +/** + * Represents timeouts for GRPC protocols. + */ +export interface GrpcTimeout { + /** + * Represents an idle timeout. The amount of time that a connection may be idle. + * + * @default - none + */ + readonly idle?: cdk.Duration; + + /** + * Represents per request timeout. + * + * @default - 15 s + */ + readonly perRequest?: cdk.Duration; +} + +/** + * Represents timeouts for TCP protocols. + */ +export interface TcpTimeout { + /** + * Represents an idle timeout. The amount of time that a connection may be idle. + * + * @default - none + */ + readonly idle?: cdk.Duration; +} + +/** + * Defines listener for a VirtualNode + */ +export abstract class VirtualNodeListener { + /** + * Returns an HTTP Listener for a VirtualNode + */ + public static http(props: HttpVirtualNodeListenerOptions = {}): VirtualNodeListener { + return new VirtualNodeListenerImpl(Protocol.HTTP, props.healthCheck, props.timeout, props.port); + } + + /** + * Returns an HTTP2 Listener for a VirtualNode + */ + public static http2(props: HttpVirtualNodeListenerOptions = {}): VirtualNodeListener { + return new VirtualNodeListenerImpl(Protocol.HTTP2, props.healthCheck, props.timeout, props.port); + } + + /** + * Returns an GRPC Listener for a VirtualNode + */ + public static grpc(props: GrpcVirtualNodeListenerOptions = {}): VirtualNodeListener { + return new VirtualNodeListenerImpl(Protocol.GRPC, props.healthCheck, props.timeout, props.port); + } + + /** + * Returns an TCP Listener for a VirtualNode + */ + public static tcp(props: TcpVirtualNodeListenerOptions = {}): VirtualNodeListener { + return new VirtualNodeListenerImpl(Protocol.TCP, props.healthCheck, props.timeout, props.port); + } + + /** + * Binds the current object when adding Listener to a VirtualNode + */ + public abstract bind(scope: cdk.Construct): VirtualNodeListenerConfig; + +} + +class VirtualNodeListenerImpl extends VirtualNodeListener { + constructor(private readonly protocol: Protocol, + private readonly healthCheck: HealthCheck | undefined, + private readonly timeout: HttpTimeout | undefined, + private readonly port: number = 8080) { super(); } + + public bind(_scope: cdk.Construct): VirtualNodeListenerConfig { + return { + listener: { + portMapping: { + port: this.port, + protocol: this.protocol, + }, + healthCheck: this.healthCheck ? this.renderHealthCheck(this.healthCheck) : undefined, + timeout: this.timeout ? this.renderTimeout(this.timeout) : undefined, + }, + }; + } + + private renderHealthCheck(hc: HealthCheck): CfnVirtualNode.HealthCheckProperty | undefined { + if (hc === undefined) { return undefined; } + + if (hc.protocol === Protocol.TCP && hc.path) { + throw new Error('The path property cannot be set with Protocol.TCP'); + } + + if (hc.protocol === Protocol.GRPC && hc.path) { + throw new Error('The path property cannot be set with Protocol.GRPC'); + } + + const healthCheck: CfnVirtualNode.HealthCheckProperty = { + healthyThreshold: hc.healthyThreshold || 2, + intervalMillis: (hc.interval || cdk.Duration.seconds(5)).toMilliseconds(), // min + path: hc.path || (hc.protocol === Protocol.HTTP ? '/' : undefined), + port: hc.port || this.port, + protocol: hc.protocol || this.protocol, + timeoutMillis: (hc.timeout || cdk.Duration.seconds(2)).toMilliseconds(), + unhealthyThreshold: hc.unhealthyThreshold || 2, + }; + + validateHealthChecks(healthCheck); + + return healthCheck; + } + + private renderTimeout(timeout: HttpTimeout): CfnVirtualNode.ListenerTimeoutProperty { + return ({ + [this.protocol]: { + idle: timeout?.idle !== undefined ? { + unit: 'ms', + value: timeout?.idle.toMilliseconds(), + } : undefined, + perRequest: timeout?.perRequest !== undefined ? { + unit: 'ms', + value: timeout?.perRequest.toMilliseconds(), + } : undefined, + }, + }); + } +} diff --git a/packages/@aws-cdk/aws-appmesh/lib/virtual-node.ts b/packages/@aws-cdk/aws-appmesh/lib/virtual-node.ts index b8b9da2026715..fd8b2cadc87db 100644 --- a/packages/@aws-cdk/aws-appmesh/lib/virtual-node.ts +++ b/packages/@aws-cdk/aws-appmesh/lib/virtual-node.ts @@ -3,8 +3,8 @@ import * as cdk from '@aws-cdk/core'; import { Construct } from 'constructs'; import { CfnVirtualNode } from './appmesh.generated'; import { IMesh, Mesh } from './mesh'; -import { validateHealthChecks } from './private/utils'; -import { AccessLog, HealthCheck, PortMapping, Protocol, VirtualNodeListener } from './shared-interfaces'; +import { AccessLog } from './shared-interfaces'; +import { VirtualNodeListener, VirtualNodeListenerConfig } from './virtual-node-listener'; import { IVirtualService } from './virtual-service'; /** @@ -34,15 +34,6 @@ export interface IVirtualNode extends cdk.IResource { */ readonly mesh: IMesh; - /** - * Utility method to add backends for existing or new VirtualNodes - */ - addBackends(...props: IVirtualService[]): void; - - /** - * Utility method to add Node Listeners for new or existing VirtualNodes - */ - addListeners(...listeners: VirtualNodeListener[]): void; } /** @@ -95,7 +86,7 @@ export interface VirtualNodeBaseProps { * * @default - No listeners */ - readonly listener?: VirtualNodeListener; + readonly listeners?: VirtualNodeListener[]; /** * Access Logging Configuration for the virtual node @@ -130,71 +121,10 @@ abstract class VirtualNodeBase extends cdk.Resource implements IVirtualNode { * The Mesh which the VirtualNode belongs to */ public abstract readonly mesh: IMesh; - - protected readonly backends = new Array(); - protected readonly listeners = new Array(); - - /** - * Add a VirtualServices that this node is expected to send outbound traffic to - */ - public addBackends(...props: IVirtualService[]) { - for (const s of props) { - this.backends.push({ - virtualService: { - virtualServiceName: s.virtualServiceName, - }, - }); - } - } - - /** - * Utility method to add an inbound listener for this virtual node - */ - public addListeners(...listeners: VirtualNodeListener[]) { - if (this.listeners.length + listeners.length > 1) { - throw new Error('VirtualNode may have at most one listener'); - } - - for (const listener of listeners) { - const portMapping = listener.portMapping || { port: 8080, protocol: Protocol.HTTP }; - this.listeners.push({ - portMapping, - healthCheck: renderHealthCheck(listener.healthCheck, portMapping), - }); - } - } -} - -function renderHealthCheck(hc: HealthCheck | undefined, pm: PortMapping): CfnVirtualNode.HealthCheckProperty | undefined { - if (hc === undefined) { return undefined; } - - if (hc.protocol === Protocol.TCP && hc.path) { - throw new Error('The path property cannot be set with Protocol.TCP'); - } - - if (hc.protocol === Protocol.GRPC && hc.path) { - throw new Error('The path property cannot be set with Protocol.GRPC'); - } - - const protocol = hc.protocol ?? pm.protocol; - - const healthCheck: CfnVirtualNode.HealthCheckProperty = { - healthyThreshold: hc.healthyThreshold || 2, - intervalMillis: (hc.interval || cdk.Duration.seconds(5)).toMilliseconds(), // min - path: hc.path || (protocol === Protocol.HTTP ? '/' : undefined), - port: hc.port || pm.port, - protocol: hc.protocol || pm.protocol, - timeoutMillis: (hc.timeout || cdk.Duration.seconds(2)).toMilliseconds(), - unhealthyThreshold: hc.unhealthyThreshold || 2, - }; - - validateHealthChecks(healthCheck); - - return healthCheck; } /** - * VirtualNode represents a newly defined App Mesh VirtualNode + * VirtualNode represents a newly defined AppMesh VirtualNode * * Any inbound traffic that your virtual node expects should be specified as a * listener. Any outbound traffic that your virtual node expects to reach @@ -245,6 +175,9 @@ export class VirtualNode extends VirtualNodeBase { */ public readonly mesh: IMesh; + private readonly backends = new Array(); + private readonly listeners = new Array(); + constructor(scope: Construct, id: string, props: VirtualNodeProps) { super(scope, id, { physicalName: props.virtualNodeName || cdk.Lazy.stringValue({ produce: () => cdk.Names.uniqueId(this) }), @@ -252,8 +185,8 @@ export class VirtualNode extends VirtualNodeBase { this.mesh = props.mesh; - this.addBackends(...props.backends || []); - this.addListeners(...props.listener ? [props.listener] : []); + props.backends?.forEach(backend => this.addBackend(backend)); + props.listeners?.forEach(listener => this.addListener(listener)); const accessLogging = props.accessLog?.bind(this); const node = new CfnVirtualNode(this, 'Resource', { @@ -261,7 +194,7 @@ export class VirtualNode extends VirtualNodeBase { meshName: this.mesh.meshName, spec: { backends: cdk.Lazy.anyValue({ produce: () => this.backends }, { omitEmptyArray: true }), - listeners: cdk.Lazy.anyValue({ produce: () => this.listeners }, { omitEmptyArray: true }), + listeners: cdk.Lazy.anyValue({ produce: () => this.listeners.map(listener => listener.listener) }, { omitEmptyArray: true }), serviceDiscovery: { dns: props.dnsHostName !== undefined ? { hostname: props.dnsHostName } : undefined, awsCloudMap: props.cloudMapService !== undefined ? { @@ -283,6 +216,24 @@ export class VirtualNode extends VirtualNodeBase { resourceName: this.physicalName, }); } + + /** + * Utility method to add an inbound listener for this VirtualNode + */ + public addListener(listener: VirtualNodeListener) { + this.listeners.push(listener.bind(this)); + } + + /** + * Add a Virtual Services that this node is expected to send outbound traffic to + */ + public addBackend(virtualService: IVirtualService) { + this.backends.push({ + virtualService: { + virtualServiceName: virtualService.virtualServiceName, + }, + }); + } } function renderAttributes(attrs?: {[key: string]: string}) { diff --git a/packages/@aws-cdk/aws-appmesh/package.json b/packages/@aws-cdk/aws-appmesh/package.json index 2789d9085284c..6b58c9981965a 100644 --- a/packages/@aws-cdk/aws-appmesh/package.json +++ b/packages/@aws-cdk/aws-appmesh/package.json @@ -153,6 +153,7 @@ "resource-attribute:@aws-cdk/aws-appmesh.VirtualGateway.virtualGatewayResourceOwner", "resource-attribute:@aws-cdk/aws-appmesh.VirtualGateway.virtualGatewayUid", "resource-attribute:@aws-cdk/aws-appmesh.VirtualNode.virtualNodeMeshName", + "duration-prop-type:@aws-cdk/aws-appmesh.VirtualNodeListener.timeout", "resource-attribute:@aws-cdk/aws-appmesh.VirtualNode.virtualNodeMeshOwner", "resource-attribute:@aws-cdk/aws-appmesh.VirtualNode.virtualNodeResourceOwner", "resource-attribute:@aws-cdk/aws-appmesh.VirtualNode.virtualNodeUid", @@ -172,7 +173,11 @@ "props-default-doc:@aws-cdk/aws-appmesh.VirtualRouterAttributes.virtualRouterName", "docs-public-apis:@aws-cdk/aws-appmesh.Protocol.HTTP", "docs-public-apis:@aws-cdk/aws-appmesh.Protocol.HTTP2", - "docs-public-apis:@aws-cdk/aws-appmesh.Protocol.GRPC" + "docs-public-apis:@aws-cdk/aws-appmesh.Protocol.GRPC", + "duration-prop-type:@aws-cdk/aws-appmesh.GrpcVirtualNodeListenerOptions.timeout", + "duration-prop-type:@aws-cdk/aws-appmesh.HttpVirtualNodeListenerOptions.timeout", + "duration-prop-type:@aws-cdk/aws-appmesh.Http2VirtualNodeListenerOptions.timeout", + "duration-prop-type:@aws-cdk/aws-appmesh.TcpVirtualNodeListenerOptions.timeout" ] }, "stability": "experimental", diff --git a/packages/@aws-cdk/aws-appmesh/test/integ.mesh.ts b/packages/@aws-cdk/aws-appmesh/test/integ.mesh.ts index 3de6eb20c77d2..8bad51d706a32 100644 --- a/packages/@aws-cdk/aws-appmesh/test/integ.mesh.ts +++ b/packages/@aws-cdk/aws-appmesh/test/integ.mesh.ts @@ -31,18 +31,18 @@ const virtualService = mesh.addVirtualService('service', { const node = mesh.addVirtualNode('node', { dnsHostName: `node1.${namespace.namespaceName}`, - listener: { + listeners: [appmesh.VirtualNodeListener.http({ healthCheck: { healthyThreshold: 3, path: '/check-path', }, - }, + })], backends: [ virtualService, ], }); -node.addBackends(new appmesh.VirtualService(stack, 'service-2', { +node.addBackend(new appmesh.VirtualService(stack, 'service-2', { virtualServiceName: 'service2.domain.local', mesh, }), @@ -60,7 +60,7 @@ router.addRoute('route-1', { const node2 = mesh.addVirtualNode('node2', { dnsHostName: `node2.${namespace.namespaceName}`, - listener: { + listeners: [appmesh.VirtualNodeListener.http({ healthCheck: { healthyThreshold: 3, interval: cdk.Duration.seconds(5), @@ -70,7 +70,7 @@ const node2 = mesh.addVirtualNode('node2', { timeout: cdk.Duration.seconds(2), unhealthyThreshold: 2, }, - }, + })], backends: [ new appmesh.VirtualService(stack, 'service-3', { virtualServiceName: 'service3.domain.local', @@ -81,7 +81,7 @@ const node2 = mesh.addVirtualNode('node2', { const node3 = mesh.addVirtualNode('node3', { dnsHostName: `node3.${namespace.namespaceName}`, - listener: { + listeners: [appmesh.VirtualNodeListener.http({ healthCheck: { healthyThreshold: 3, interval: cdk.Duration.seconds(5), @@ -91,7 +91,7 @@ const node3 = mesh.addVirtualNode('node3', { timeout: cdk.Duration.seconds(2), unhealthyThreshold: 2, }, - }, + })], accessLog: appmesh.AccessLog.fromFilePath('/dev/stdout'), }); diff --git a/packages/@aws-cdk/aws-appmesh/test/test.health-check.ts b/packages/@aws-cdk/aws-appmesh/test/test.health-check.ts index 6f33658598efa..d65177a124b70 100644 --- a/packages/@aws-cdk/aws-appmesh/test/test.health-check.ts +++ b/packages/@aws-cdk/aws-appmesh/test/test.health-check.ts @@ -21,9 +21,9 @@ export = { const [min, max] = [5000, 300000]; // WHEN - const toThrow = (millis: number) => getNode(stack).addListeners({ + const toThrow = (millis: number) => getNode(stack).addListener(appmesh.VirtualNodeListener.http2({ healthCheck: { interval: cdk.Duration.millis(millis) }, - }); + })); // THEN test.doesNotThrow(() => toThrow(min)); @@ -40,9 +40,9 @@ export = { const [min, max] = [2000, 60000]; // WHEN - const toThrow = (millis: number) => getNode(stack).addListeners({ + const toThrow = (millis: number) => getNode(stack).addListener(appmesh.VirtualNodeListener.http2({ healthCheck: { timeout: cdk.Duration.millis(millis) }, - }); + })); // THEN test.doesNotThrow(() => toThrow(min)); @@ -59,9 +59,9 @@ export = { const [min, max] = [1, 65535]; // WHEN - const toThrow = (port: number) => getNode(stack).addListeners({ + const toThrow = (port: number) => getNode(stack).addListener(appmesh.VirtualNodeListener.http({ healthCheck: { port }, - }); + })); // THEN test.doesNotThrow(() => toThrow(min)); @@ -79,9 +79,9 @@ export = { const [min, max] = [2, 10]; // WHEN - const toThrow = (healthyThreshold: number) => getNode(stack).addListeners({ + const toThrow = (healthyThreshold: number) => getNode(stack).addListener(appmesh.VirtualNodeListener.http({ healthCheck: { healthyThreshold }, - }); + })); // THEN test.doesNotThrow(() => toThrow(min)); @@ -98,9 +98,9 @@ export = { const [min, max] = [2, 10]; // WHEN - const toThrow = (unhealthyThreshold: number) => getNode(stack).addListeners({ + const toThrow = (unhealthyThreshold: number) => getNode(stack).addListener(appmesh.VirtualNodeListener.http({ healthCheck: { unhealthyThreshold }, - }); + })); // THEN test.doesNotThrow(() => toThrow(min)); @@ -115,12 +115,12 @@ export = { const stack = new cdk.Stack(); // WHEN - const toThrow = (protocol: appmesh.Protocol) => getNode(stack).addListeners({ + const toThrow = (protocol: appmesh.Protocol) => getNode(stack).addListener(appmesh.VirtualNodeListener.http({ healthCheck: { protocol, path: '/', }, - }); + })); // THEN test.doesNotThrow(() => toThrow(appmesh.Protocol.HTTP)); @@ -134,12 +134,12 @@ export = { const stack = new cdk.Stack(); // WHEN - const toThrow = (protocol: appmesh.Protocol) => getNode(stack).addListeners({ + const toThrow = (protocol: appmesh.Protocol) => getNode(stack).addListener(appmesh.VirtualNodeListener.http({ healthCheck: { protocol, path: '/', }, - }); + })); // THEN test.doesNotThrow(() => toThrow(appmesh.Protocol.HTTP)); @@ -148,4 +148,4 @@ export = { test.done(); }, -}; +}; \ No newline at end of file diff --git a/packages/@aws-cdk/aws-appmesh/test/test.mesh.ts b/packages/@aws-cdk/aws-appmesh/test/test.mesh.ts index 690dce4a08ddc..1f67c708e561a 100644 --- a/packages/@aws-cdk/aws-appmesh/test/test.mesh.ts +++ b/packages/@aws-cdk/aws-appmesh/test/test.mesh.ts @@ -57,7 +57,7 @@ export = { 'When adding a Virtual Router to existing mesh': { 'with at least one complete port mappings': { - 'shoulld create proper router'(test: Test) { + 'should create proper router'(test: Test) { // GIVEN const stack = new cdk.Stack(); @@ -208,12 +208,9 @@ export = { const node = mesh.addVirtualNode('test-node', { dnsHostName: 'test.domain.local', - listener: { - portMapping: { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], }); mesh.addVirtualService('service2', { @@ -287,12 +284,9 @@ export = { mesh.addVirtualNode('test-node', { dnsHostName: 'test.domain.local', - listener: { - portMapping: { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], }); // THEN @@ -329,11 +323,8 @@ export = { mesh.addVirtualNode('test-node', { dnsHostName: 'test.domain.local', - listener: { - portMapping: { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, healthCheck: { healthyThreshold: 3, path: '/', @@ -341,7 +332,7 @@ export = { timeout: cdk.Duration.seconds(2), // min unhealthyThreshold: 2, }, - }, + })], }); // THEN @@ -388,12 +379,9 @@ export = { mesh.addVirtualNode('test-node', { dnsHostName: 'test.domain.local', - listener: { - portMapping: { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [ service1, ], diff --git a/packages/@aws-cdk/aws-appmesh/test/test.virtual-node.ts b/packages/@aws-cdk/aws-appmesh/test/test.virtual-node.ts index 06928a4a25351..75c7d0579e71b 100644 --- a/packages/@aws-cdk/aws-appmesh/test/test.virtual-node.ts +++ b/packages/@aws-cdk/aws-appmesh/test/test.virtual-node.ts @@ -28,41 +28,39 @@ export = { const node = new appmesh.VirtualNode(stack, 'test-node', { mesh, dnsHostName: 'test', - listener: {}, backends: [service1], }); - node.addBackends(service2); + node.addBackend(service2); // THEN - expect(stack).to( - haveResourceLike('AWS::AppMesh::VirtualNode', { - Spec: { - Backends: [ - { - VirtualService: { - VirtualServiceName: { - 'Fn::GetAtt': ['service1A48078CF', 'VirtualServiceName'], - }, + expect(stack).to(haveResourceLike('AWS::AppMesh::VirtualNode', { + Spec: { + Backends: [ + { + VirtualService: { + VirtualServiceName: { + 'Fn::GetAtt': ['service1A48078CF', 'VirtualServiceName'], }, }, - { - VirtualService: { - VirtualServiceName: { - 'Fn::GetAtt': ['service27C65CF7D', 'VirtualServiceName'], - }, + }, + { + VirtualService: { + VirtualServiceName: { + 'Fn::GetAtt': ['service27C65CF7D', 'VirtualServiceName'], }, }, - ], - }, - }), - ); + }, + ], + }, + })); test.done(); }, }, + 'when a single portmapping is added': { - 'should add the portmapping to the resoource'(test: Test) { + 'should add the portmapping to the resource'(test: Test) { // GIVEN const stack = new cdk.Stack(); @@ -75,28 +73,184 @@ export = { dnsHostName: 'test', }); - node.addListeners({ - portMapping: { - port: 8081, - protocol: appmesh.Protocol.TCP, + node.addListener(appmesh.VirtualNodeListener.tcp({ + port: 8081, + })); + + // THEN + expect(stack).to(haveResourceLike('AWS::AppMesh::VirtualNode', { + Spec: { + Listeners: [ + { + PortMapping: { + Port: 8081, + Protocol: 'tcp', + }, + }, + ], }, + })); + + test.done(); + }, + }, + + 'when a listener is added with timeout': { + 'should add the listener timeout to the resource'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + + // WHEN + const mesh = new appmesh.Mesh(stack, 'mesh', { + meshName: 'test-mesh', + }); + + new appmesh.VirtualNode(stack, 'test-node', { + mesh, + dnsHostName: 'test', + listeners: [appmesh.VirtualNodeListener.grpc({ + port: 80, + timeout: { + idle: cdk.Duration.seconds(10), + perRequest: cdk.Duration.seconds(10), + }, + })], }); // THEN - expect(stack).to( - haveResourceLike('AWS::AppMesh::VirtualNode', { - Spec: { - Listeners: [ - { - PortMapping: { - Port: 8081, - Protocol: 'tcp', + expect(stack).to(haveResourceLike('AWS::AppMesh::VirtualNode', { + Spec: { + Listeners: [ + { + PortMapping: { + Port: 80, + Protocol: 'grpc', + }, + Timeout: { + GRPC: { + Idle: { + Unit: 'ms', + Value: 10000, + }, + PerRequest: { + Unit: 'ms', + Value: 10000, + }, }, }, - ], - }, - }), - ); + }, + ], + }, + })); + + test.done(); + }, + }, + + 'when a listener is added with healthcheck ': { + 'should add a default listener healthcheck to the resource'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + + // WHEN + const mesh = new appmesh.Mesh(stack, 'mesh', { + meshName: 'test-mesh', + }); + + new appmesh.VirtualNode(stack, 'test-node', { + mesh, + dnsHostName: 'test', + listeners: [appmesh.VirtualNodeListener.http2({ + port: 80, + healthCheck: {}, + timeout: { idle: cdk.Duration.seconds(10) }, + })], + }); + + // THEN + expect(stack).to(haveResourceLike('AWS::AppMesh::VirtualNode', { + Spec: { + Listeners: [ + { + HealthCheck: { + HealthyThreshold: 2, + IntervalMillis: 5000, + Port: 80, + Protocol: 'http2', + TimeoutMillis: 2000, + UnhealthyThreshold: 2, + }, + PortMapping: { + Port: 80, + Protocol: 'http2', + }, + Timeout: { + HTTP2: { + Idle: { + Unit: 'ms', + Value: 10000, + }, + }, + }, + }, + ], + }, + })); + + test.done(); + }, + }, + + 'when a listener is added with healthcheck with user defined props': { + 'should add a listener healthcheck to the resource'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + + // WHEN + const mesh = new appmesh.Mesh(stack, 'mesh', { + meshName: 'test-mesh', + }); + + const node = new appmesh.VirtualNode(stack, 'test-node', { + mesh, + dnsHostName: 'test', + }); + + node.addListener(appmesh.VirtualNodeListener.tcp({ + port: 80, + healthCheck: { timeout: cdk.Duration.seconds(3) }, + timeout: { idle: cdk.Duration.seconds(10) }, + })); + + // THEN + expect(stack).to(haveResourceLike('AWS::AppMesh::VirtualNode', { + Spec: { + Listeners: [ + { + HealthCheck: { + HealthyThreshold: 2, + IntervalMillis: 5000, + Port: 80, + Protocol: 'tcp', + TimeoutMillis: 3000, + UnhealthyThreshold: 2, + }, + PortMapping: { + Port: 80, + Protocol: 'tcp', + }, + Timeout: { + TCP: { + Idle: { + Unit: 'ms', + Value: 10000, + }, + }, + }, + }, + ], + }, + })); test.done(); }, diff --git a/packages/@aws-cdk/aws-appmesh/test/test.virtual-router.ts b/packages/@aws-cdk/aws-appmesh/test/test.virtual-router.ts index 72510c83c4de2..56960564d6981 100644 --- a/packages/@aws-cdk/aws-appmesh/test/test.virtual-router.ts +++ b/packages/@aws-cdk/aws-appmesh/test/test.virtual-router.ts @@ -106,13 +106,9 @@ export = { const node = mesh.addVirtualNode('test-node', { dnsHostName: 'test', - listener: { - portMapping: - { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [service1], }); @@ -179,39 +175,27 @@ export = { const node = mesh.addVirtualNode('test-node', { dnsHostName: 'test', - listener: { - portMapping: - { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [ service1, ], }); const node2 = mesh.addVirtualNode('test-node2', { dnsHostName: 'test', - listener: { - portMapping: - { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [ service2, ], }); const node3 = mesh.addVirtualNode('test-node3', { dnsHostName: 'test', - listener: { - portMapping: - { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [ service1, ], @@ -337,13 +321,9 @@ export = { const node = mesh.addVirtualNode('test-node', { dnsHostName: 'test', - listener: { - portMapping: - { - port: 8080, - protocol: appmesh.Protocol.HTTP, - }, - }, + listeners: [appmesh.VirtualNodeListener.http({ + port: 8080, + })], backends: [ service1, ], diff --git a/packages/@aws-cdk/aws-autoscaling-common/package.json b/packages/@aws-cdk/aws-autoscaling-common/package.json index 805460b6ef2ba..aa66b53be704c 100644 --- a/packages/@aws-cdk/aws-autoscaling-common/package.json +++ b/packages/@aws-cdk/aws-autoscaling-common/package.json @@ -67,7 +67,7 @@ "@types/nodeunit": "^0.0.31", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", - "fast-check": "^2.6.1", + "fast-check": "^2.7.0", "nodeunit": "^0.11.3", "pkglint": "0.0.0" }, diff --git a/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts b/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts index 3b6ade93606be..cf5f6acbcbf71 100644 --- a/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts +++ b/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts @@ -10,6 +10,7 @@ import { Aws, CfnAutoScalingRollingUpdate, CfnCreationPolicy, CfnUpdatePolicy, Duration, Fn, IResource, Lazy, PhysicalName, Resource, Stack, Tags, + Token, Tokenization, withResolved, } from '@aws-cdk/core'; import { Construct } from 'constructs'; @@ -765,10 +766,24 @@ abstract class AutoScalingGroupBase extends Resource implements IAutoScalingGrou const resourceLabel = `${this.albTargetGroup.firstLoadBalancerFullName}/${this.albTargetGroup.targetGroupFullName}`; + if ((props.targetRequestsPerMinute === undefined) === (props.targetRequestsPerSecond === undefined)) { + throw new Error('Specify exactly one of \'targetRequestsPerMinute\' or \'targetRequestsPerSecond\''); + } + + let rpm: number; + if (props.targetRequestsPerSecond !== undefined) { + if (Token.isUnresolved(props.targetRequestsPerSecond)) { + throw new Error('\'targetRequestsPerSecond\' cannot be an unresolved value; use \'targetRequestsPerMinute\' instead.'); + } + rpm = props.targetRequestsPerSecond * 60; + } else { + rpm = props.targetRequestsPerMinute!; + } + const policy = new TargetTrackingScalingPolicy(this, `ScalingPolicy${id}`, { autoScalingGroup: this, predefinedMetric: PredefinedMetric.ALB_REQUEST_COUNT_PER_TARGET, - targetValue: props.targetRequestsPerSecond, + targetValue: rpm, resourceLabel, ...props, }); @@ -1603,8 +1618,17 @@ export interface NetworkUtilizationScalingProps extends BaseTargetTrackingProps export interface RequestCountScalingProps extends BaseTargetTrackingProps { /** * Target average requests/seconds on each instance + * + * @deprecated Use 'targetRequestsPerMinute' instead + * @default - Specify exactly one of 'targetRequestsPerSecond' and 'targetRequestsPerSecond' + */ + readonly targetRequestsPerSecond?: number; + + /** + * Target average requests/minute on each instance + * @default - Specify exactly one of 'targetRequestsPerSecond' and 'targetRequestsPerSecond' */ - readonly targetRequestsPerSecond: number; + readonly targetRequestsPerMinute?: number; } /** diff --git a/packages/@aws-cdk/aws-autoscaling/test/integ.asg-w-elbv2.expected.json b/packages/@aws-cdk/aws-autoscaling/test/integ.asg-w-elbv2.expected.json index e6dde4e4c0d4e..34f240a76559d 100644 --- a/packages/@aws-cdk/aws-autoscaling/test/integ.asg-w-elbv2.expected.json +++ b/packages/@aws-cdk/aws-autoscaling/test/integ.asg-w-elbv2.expected.json @@ -568,7 +568,7 @@ ] } }, - "TargetValue": 1 + "TargetValue": 60 } }, "DependsOn": [ diff --git a/packages/@aws-cdk/aws-autoscaling/test/scaling.test.ts b/packages/@aws-cdk/aws-autoscaling/test/scaling.test.ts index 10687702a56b1..86604a52d3404 100644 --- a/packages/@aws-cdk/aws-autoscaling/test/scaling.test.ts +++ b/packages/@aws-cdk/aws-autoscaling/test/scaling.test.ts @@ -75,7 +75,7 @@ nodeunitShim({ test.done(); }, - 'request count'(test: Test) { + 'request count per second'(test: Test) { // GIVEN const stack = new cdk.Stack(); const fixture = new ASGFixture(stack, 'Fixture'); @@ -99,6 +99,54 @@ nodeunitShim({ ], }; + expect(stack).to(haveResource('AWS::AutoScaling::ScalingPolicy', { + PolicyType: 'TargetTrackingScaling', + TargetTrackingConfiguration: { + TargetValue: 600, + PredefinedMetricSpecification: { + PredefinedMetricType: 'ALBRequestCountPerTarget', + ResourceLabel: { + 'Fn::Join': ['', [ + { 'Fn::Select': [1, arnParts] }, + '/', + { 'Fn::Select': [2, arnParts] }, + '/', + { 'Fn::Select': [3, arnParts] }, + '/', + { 'Fn::GetAtt': ['ALBListenerTargetsGroup01D7716A', 'TargetGroupFullName'] }, + ]], + }, + }, + }, + })); + + test.done(); + }, + + 'request count per minute'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const fixture = new ASGFixture(stack, 'Fixture'); + const alb = new elbv2.ApplicationLoadBalancer(stack, 'ALB', { vpc: fixture.vpc }); + const listener = alb.addListener('Listener', { port: 80 }); + listener.addTargets('Targets', { + port: 80, + targets: [fixture.asg], + }); + + // WHEN + fixture.asg.scaleOnRequestCount('ScaleRequest', { + targetRequestsPerMinute: 10, + }); + + // THEN + const arnParts = { + 'Fn::Split': [ + '/', + { Ref: 'ALBListener3B99FF85' }, + ], + }; + expect(stack).to(haveResource('AWS::AutoScaling::ScalingPolicy', { PolicyType: 'TargetTrackingScaling', TargetTrackingConfiguration: { diff --git a/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package.json b/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package.json index 9f25bfc9d6683..85da591914c1d 100644 --- a/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package.json +++ b/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package.json @@ -29,15 +29,15 @@ "devDependencies": { "aws-sdk": "^2.596.0", "aws-sdk-mock": "^5.1.0", - "eslint": "^7.12.1", + "eslint": "^7.13.0", "eslint-config-standard": "^14.1.1", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.2", + "eslint-plugin-standard": "^4.1.0", "jest": "^26.6.3", "lambda-tester": "^3.6.0", - "nock": "^13.0.4", - "ts-jest": "^26.4.3" + "nock": "^13.0.5", + "ts-jest": "^26.4.4" } } diff --git a/packages/@aws-cdk/aws-cloudfront-origins/package.json b/packages/@aws-cdk/aws-cloudfront-origins/package.json index 06e954237cdf8..8d8b0c2b4d64f 100644 --- a/packages/@aws-cdk/aws-cloudfront-origins/package.json +++ b/packages/@aws-cdk/aws-cloudfront-origins/package.json @@ -72,7 +72,7 @@ "devDependencies": { "@aws-cdk/assert": "0.0.0", "@aws-cdk/aws-ec2": "0.0.0", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "pkglint": "0.0.0" diff --git a/packages/@aws-cdk/aws-cloudfront/package.json b/packages/@aws-cdk/aws-cloudfront/package.json index 587776d1d4edb..7a1649e201239 100644 --- a/packages/@aws-cdk/aws-cloudfront/package.json +++ b/packages/@aws-cdk/aws-cloudfront/package.json @@ -73,7 +73,7 @@ "license": "Apache-2.0", "devDependencies": { "@aws-cdk/assert": "0.0.0", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-cloudtrail/package.json b/packages/@aws-cdk/aws-cloudtrail/package.json index 3146f7f682988..462a90b482570 100644 --- a/packages/@aws-cdk/aws-cloudtrail/package.json +++ b/packages/@aws-cdk/aws-cloudtrail/package.json @@ -73,7 +73,7 @@ "license": "Apache-2.0", "devDependencies": { "@aws-cdk/assert": "0.0.0", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-codebuild/package.json b/packages/@aws-cdk/aws-codebuild/package.json index 001cec43f99fd..93ac42962e90c 100644 --- a/packages/@aws-cdk/aws-codebuild/package.json +++ b/packages/@aws-cdk/aws-codebuild/package.json @@ -79,7 +79,7 @@ "@aws-cdk/aws-sns": "0.0.0", "@aws-cdk/aws-sqs": "0.0.0", "@types/nodeunit": "^0.0.31", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-codecommit/package.json b/packages/@aws-cdk/aws-codecommit/package.json index 53beb4f72810b..aa76ed05a103f 100644 --- a/packages/@aws-cdk/aws-codecommit/package.json +++ b/packages/@aws-cdk/aws-codecommit/package.json @@ -79,7 +79,7 @@ "@aws-cdk/assert": "0.0.0", "@aws-cdk/aws-sns": "0.0.0", "@types/nodeunit": "^0.0.31", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-codepipeline-actions/README.md b/packages/@aws-cdk/aws-codepipeline-actions/README.md index 6578110867b33..12e2bfa5437cf 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/README.md +++ b/packages/@aws-cdk/aws-codepipeline-actions/README.md @@ -646,6 +646,7 @@ const deployStage = pipeline.addStage({ // use the `imageFile` property, // and leave out the `input` property imageFile: buildOutput.atPath('imageDef.json'), + deploymentTimeout: cdk.Duration.minutes(60), // optional, default is 60 minutes }), ], }); diff --git a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts index eb2bd88a72100..ec5dfb7ad2999 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts @@ -1,7 +1,7 @@ import * as codepipeline from '@aws-cdk/aws-codepipeline'; import * as ecs from '@aws-cdk/aws-ecs'; import * as iam from '@aws-cdk/aws-iam'; -import { Construct } from '@aws-cdk/core'; +import { Construct, Duration } from '@aws-cdk/core'; import { Action } from '../action'; import { deployArtifactBounds } from '../common'; @@ -40,6 +40,14 @@ export interface EcsDeployActionProps extends codepipeline.CommonAwsActionProps * The ECS Service to deploy. */ readonly service: ecs.IBaseService; + + /** + * Timeout for the ECS deployment in minutes. Value must be between 1-60. + * + * @default - 60 minutes + * @see https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-ECS.html + */ + readonly deploymentTimeout?: Duration; } /** @@ -47,6 +55,7 @@ export interface EcsDeployActionProps extends codepipeline.CommonAwsActionProps */ export class EcsDeployAction extends Action { private readonly props: EcsDeployActionProps; + private readonly deploymentTimeout?: number constructor(props: EcsDeployActionProps) { super({ @@ -58,7 +67,13 @@ export class EcsDeployAction extends Action { resource: props.service, }); + const deploymentTimeout = props.deploymentTimeout?.toMinutes({ integral: true }); + if (deploymentTimeout !== undefined && (deploymentTimeout < 1 || deploymentTimeout > 60)) { + throw new Error(`Deployment timeout must be between 1 and 60 minutes, got: ${deploymentTimeout}`); + } + this.props = props; + this.deploymentTimeout = deploymentTimeout; } protected bound(_scope: Construct, _stage: codepipeline.IStage, options: codepipeline.ActionBindOptions): @@ -96,7 +111,8 @@ export class EcsDeployAction extends Action { configuration: { ClusterName: this.props.service.cluster.clusterName, ServiceName: this.props.service.serviceName, - FileName: this.props.imageFile && this.props.imageFile.fileName, + FileName: this.props.imageFile?.fileName, + DeploymentTimeout: this.deploymentTimeout, }, }; } diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/ecs/test.ecs-deploy-action.ts b/packages/@aws-cdk/aws-codepipeline-actions/test/ecs/test.ecs-deploy-action.ts index 8bc27b3a4a12e..1343850871206 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/ecs/test.ecs-deploy-action.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/ecs/test.ecs-deploy-action.ts @@ -68,6 +68,56 @@ export = { test.done(); }, + 'can be created with deploymentTimeout between 1-60 minutes'(test: Test) { + const service = anyEcsService(); + const artifact = new codepipeline.Artifact('Artifact'); + + test.doesNotThrow(() => { + new cpactions.EcsDeployAction({ + actionName: 'ECS', + service, + input: artifact, + deploymentTimeout: cdk.Duration.minutes(30), + }); + }); + + test.done(); + }, + + 'throws an exception if deploymentTimeout is out of bounds'(test: Test) { + const service = anyEcsService(); + const artifact = new codepipeline.Artifact('Artifact'); + + test.throws(() => { + new cpactions.EcsDeployAction({ + actionName: 'ECS', + service, + input: artifact, + deploymentTimeout: cdk.Duration.minutes(61), + }); + }, /timeout must be between 1 and 60 minutes/); + + test.throws(() => { + new cpactions.EcsDeployAction({ + actionName: 'ECS', + service, + input: artifact, + deploymentTimeout: cdk.Duration.minutes(0), + }); + }, /timeout must be between 1 and 60 minutes/); + + test.throws(() => { + new cpactions.EcsDeployAction({ + actionName: 'ECS', + service, + input: artifact, + deploymentTimeout: cdk.Duration.seconds(30), + }); + }, /cannot be converted into a whole number/); + + test.done(); + }, + "sets the target service as the action's backing resource"(test: Test) { const service = anyEcsService(); const artifact = new codepipeline.Artifact('Artifact'); diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.expected.json b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.expected.json index 2d6b137036065..1114a3dc28356 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.expected.json +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.expected.json @@ -737,7 +737,8 @@ "FargateServiceAC2B3B85", "Name" ] - } + }, + "DeploymentTimeout": 60 }, "InputArtifacts": [ { diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.ts b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.ts index e969e350482dc..08c5b970112b1 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecs-deploy.ts @@ -102,6 +102,7 @@ new codepipeline.Pipeline(stack, 'MyPipeline', { actionName: 'DeployAction', input: buildOutput, service, + deploymentTimeout: cdk.Duration.minutes(60), }), ], }, diff --git a/packages/@aws-cdk/aws-dynamodb-global/lambda-packages/aws-global-table-coordinator/package.json b/packages/@aws-cdk/aws-dynamodb-global/lambda-packages/aws-global-table-coordinator/package.json index e19b1fe502b2d..2dc031452ab61 100644 --- a/packages/@aws-cdk/aws-dynamodb-global/lambda-packages/aws-global-table-coordinator/package.json +++ b/packages/@aws-cdk/aws-dynamodb-global/lambda-packages/aws-global-table-coordinator/package.json @@ -29,14 +29,14 @@ "devDependencies": { "aws-sdk": "^2.596.0", "aws-sdk-mock": "^5.1.0", - "eslint": "^7.12.1", + "eslint": "^7.13.0", "eslint-config-standard": "^14.1.1", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.2", + "eslint-plugin-standard": "^4.1.0", "jest": "^26.6.3", "lambda-tester": "^3.6.0", - "nock": "^13.0.4" + "nock": "^13.0.5" } } diff --git a/packages/@aws-cdk/aws-dynamodb/package.json b/packages/@aws-cdk/aws-dynamodb/package.json index d4de8e8e1d2a0..6df9c614e864d 100644 --- a/packages/@aws-cdk/aws-dynamodb/package.json +++ b/packages/@aws-cdk/aws-dynamodb/package.json @@ -74,7 +74,7 @@ "devDependencies": { "@aws-cdk/assert": "0.0.0", "@types/jest": "^26.0.15", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "aws-sdk-mock": "^5.1.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", diff --git a/packages/@aws-cdk/aws-ec2/lib/vpc.ts b/packages/@aws-cdk/aws-ec2/lib/vpc.ts index f73a3b4c08c2a..e46113b14c89a 100644 --- a/packages/@aws-cdk/aws-ec2/lib/vpc.ts +++ b/packages/@aws-cdk/aws-ec2/lib/vpc.ts @@ -1485,6 +1485,12 @@ export class Subnet extends Resource implements ISubnet { */ public readonly subnetIpv6CidrBlocks: string[]; + /** + * The Amazon Resource Name (ARN) of the Outpost for this subnet (if one exists). + * @attribute + */ + public readonly subnetOutpostArn: string; + /** * @attribute */ @@ -1525,6 +1531,7 @@ export class Subnet extends Resource implements ISubnet { this.subnetVpcId = subnet.attrVpcId; this.subnetAvailabilityZone = subnet.attrAvailabilityZone; this.subnetIpv6CidrBlocks = subnet.attrIpv6CidrBlocks; + this.subnetOutpostArn = subnet.attrOutpostArn; // subnet.attrNetworkAclAssociationId is the default ACL after the subnet // was just created. However, the ACL can be replaced at a later time. diff --git a/packages/@aws-cdk/aws-ecr-assets/NOTICE b/packages/@aws-cdk/aws-ecr-assets/NOTICE index c760ec779c75e..3441c3b03a3fd 100644 --- a/packages/@aws-cdk/aws-ecr-assets/NOTICE +++ b/packages/@aws-cdk/aws-ecr-assets/NOTICE @@ -21,3 +21,71 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------- + +** brace-expansion - https://www.npmjs.com/package/brace-expansion +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** balanced-match - https://www.npmjs.com/package/balanced-match +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** concat-map - https://www.npmjs.com/package/concat-map + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- \ No newline at end of file diff --git a/packages/@aws-cdk/aws-ecr-assets/package.json b/packages/@aws-cdk/aws-ecr-assets/package.json index fcf7739ca7254..093fecd65c662 100644 --- a/packages/@aws-cdk/aws-ecr-assets/package.json +++ b/packages/@aws-cdk/aws-ecr-assets/package.json @@ -77,7 +77,6 @@ "dependencies": { "@aws-cdk/aws-ecr": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/aws-lambda": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", "@aws-cdk/core": "0.0.0", "@aws-cdk/assets": "0.0.0", @@ -90,7 +89,6 @@ "@aws-cdk/aws-ecr": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", "@aws-cdk/assets": "0.0.0", - "@aws-cdk/aws-lambda": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", "@aws-cdk/core": "0.0.0", "@aws-cdk/cx-api": "0.0.0", diff --git a/packages/@aws-cdk/aws-ecr/lib/repository.ts b/packages/@aws-cdk/aws-ecr/lib/repository.ts index de4034df584e1..53990d1e07934 100644 --- a/packages/@aws-cdk/aws-ecr/lib/repository.ts +++ b/packages/@aws-cdk/aws-ecr/lib/repository.ts @@ -1,7 +1,6 @@ import * as events from '@aws-cdk/aws-events'; import * as iam from '@aws-cdk/aws-iam'; import { IResource, Lazy, RemovalPolicy, Resource, Stack, Token } from '@aws-cdk/core'; -import * as cr from '@aws-cdk/custom-resources'; import { IConstruct, Construct } from 'constructs'; import { CfnRepository } from './ecr.generated'; import { LifecycleRule, TagStatus } from './lifecycle'; @@ -420,6 +419,9 @@ export class Repository extends RepositoryBase { // It says "Text", but they actually mean "Object". repositoryPolicyText: Lazy.anyValue({ produce: () => this.policyDocument }), lifecyclePolicy: Lazy.anyValue({ produce: () => this.renderLifecyclePolicy() }), + imageScanningConfiguration: !props.imageScanOnPush ? undefined : { + scanOnPush: true, + }, }); resource.applyRemovalPolicy(props.removalPolicy); @@ -435,36 +437,6 @@ export class Repository extends RepositoryBase { resource: 'repository', resourceName: this.physicalName, }); - - // image scanOnPush - if (props.imageScanOnPush) { - new cr.AwsCustomResource(this, 'ImageScanOnPush', { - resourceType: 'Custom::ECRImageScanOnPush', - onUpdate: { - service: 'ECR', - action: 'putImageScanningConfiguration', - parameters: { - repositoryName: this.repositoryName, - imageScanningConfiguration: { - scanOnPush: props.imageScanOnPush, - }, - }, - physicalResourceId: cr.PhysicalResourceId.of(this.repositoryArn), - }, - onDelete: { - service: 'ECR', - action: 'putImageScanningConfiguration', - parameters: { - repositoryName: this.repositoryName, - imageScanningConfiguration: { - scanOnPush: false, - }, - }, - physicalResourceId: cr.PhysicalResourceId.of(this.repositoryArn), - }, - policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: [this.repositoryArn] }), - }); - } } public addToResourcePolicy(statement: iam.PolicyStatement): iam.AddToResourcePolicyResult { diff --git a/packages/@aws-cdk/aws-ecr/package.json b/packages/@aws-cdk/aws-ecr/package.json index a7b56a5a00298..76833c3af96af 100644 --- a/packages/@aws-cdk/aws-ecr/package.json +++ b/packages/@aws-cdk/aws-ecr/package.json @@ -86,7 +86,6 @@ "dependencies": { "@aws-cdk/aws-events": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/custom-resources": "0.0.0", "@aws-cdk/core": "0.0.0", "constructs": "^3.2.0" }, @@ -94,7 +93,6 @@ "peerDependencies": { "@aws-cdk/aws-events": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", - "@aws-cdk/custom-resources": "0.0.0", "@aws-cdk/core": "0.0.0", "constructs": "^3.2.0" }, diff --git a/packages/@aws-cdk/aws-ecr/test/integ.imagescan.expected.json b/packages/@aws-cdk/aws-ecr/test/integ.imagescan.expected.json index 76cd5933128c1..5367d722f62c9 100644 --- a/packages/@aws-cdk/aws-ecr/test/integ.imagescan.expected.json +++ b/packages/@aws-cdk/aws-ecr/test/integ.imagescan.expected.json @@ -2,107 +2,13 @@ "Resources": { "Repo02AC86CF": { "Type": "AWS::ECR::Repository", - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "RepoImageScanOnPush94CFD98F": { - "Type": "Custom::ECRImageScanOnPush", "Properties": { - "ServiceToken": { - "Fn::GetAtt": [ - "AWS679f53fac002430cb0da5b7982bd22872D164C4C", - "Arn" - ] - }, - "Create": { - "service": "ECR", - "action": "putImageScanningConfiguration", - "parameters": { - "repositoryName": { - "Ref": "Repo02AC86CF" - }, - "imageScanningConfiguration": { - "scanOnPush": "TRUE:BOOLEAN" - } - }, - "physicalResourceId": { - "id": { - "Fn::GetAtt": [ - "Repo02AC86CF", - "Arn" - ] - } - } - }, - "Update": { - "service": "ECR", - "action": "putImageScanningConfiguration", - "parameters": { - "repositoryName": { - "Ref": "Repo02AC86CF" - }, - "imageScanningConfiguration": { - "scanOnPush": "TRUE:BOOLEAN" - } - }, - "physicalResourceId": { - "id": { - "Fn::GetAtt": [ - "Repo02AC86CF", - "Arn" - ] - } - } - }, - "Delete": { - "service": "ECR", - "action": "putImageScanningConfiguration", - "parameters": { - "repositoryName": { - "Ref": "Repo02AC86CF" - }, - "imageScanningConfiguration": { - "scanOnPush": "FALSE:BOOLEAN" - } - }, - "physicalResourceId": { - "id": { - "Fn::GetAtt": [ - "Repo02AC86CF", - "Arn" - ] - } - } - }, - "InstallLatestAwsSdk": true + "ImageScanningConfiguration": { + "scanOnPush": true + } }, "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", - "DependsOn": [ - "RepoImageScanOnPushCustomResourcePolicy556E941E" - ] - }, - "RepoImageScanOnPushCustomResourcePolicy556E941E": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action":"ecr:PutImageScanningConfiguration", - "Effect":"Allow", - "Resource": { - "Fn::GetAtt": [ - "Repo02AC86CF", - "Arn" - ] - } - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "RepoImageScanOnPushCustomResourcePolicy556E941E", - "Roles": [{"Ref":"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2"}] - } + "DeletionPolicy": "Delete" }, "RepoImageScanComplete7BC71935": { "Type": "AWS::Events::Rule", @@ -127,106 +33,6 @@ }, "State": "ENABLED" } - }, - "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "ManagedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" - ] - ] - } - ] - } - }, - "AWS679f53fac002430cb0da5b7982bd22872D164C4C": { - "Type": "AWS::Lambda::Function", - "Properties": { - "Code": { - "S3Bucket": { - "Ref": "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557S3BucketA250C084" - }, - "S3Key": { - "Fn::Join": [ - "", - [ - { - "Fn::Select": [ - 0, - { - "Fn::Split": [ - "||", - { - "Ref": "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557S3VersionKeyDC4F0CD7" - } - ] - } - ] - }, - { - "Fn::Select": [ - 1, - { - "Fn::Split": [ - "||", - { - "Ref": "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557S3VersionKeyDC4F0CD7" - } - ] - } - ] - } - ] - ] - } - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2", - "Arn" - ] - }, - "Runtime": "nodejs12.x", - "Timeout": 120 - }, - "DependsOn": [ - "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" - ] - } - }, - "Parameters": { - "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557S3BucketA250C084": { - "Type": "String", - "Description": "S3 bucket for asset \"d731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557\"" - }, - "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557S3VersionKeyDC4F0CD7": { - "Type": "String", - "Description": "S3 key for asset version \"d731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557\"" - }, - "AssetParametersd731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557ArtifactHash5701DE73": { - "Type": "String", - "Description": "Artifact hash for asset \"d731b1475f16a318a48a76c83d255f7422cfa5f025c5bff93537b8f0b8e94557\"" } }, "Outputs": { diff --git a/packages/@aws-cdk/aws-ecr/test/test.repository.ts b/packages/@aws-cdk/aws-ecr/test/test.repository.ts index 73e5f21d28115..20c53f1a3032a 100644 --- a/packages/@aws-cdk/aws-ecr/test/test.repository.ts +++ b/packages/@aws-cdk/aws-ecr/test/test.repository.ts @@ -28,7 +28,7 @@ export = { test.done(); }, - 'repository creation with imageScanOnPush creates custom resource'(test: Test) { + 'repository creation with imageScanOnPush'(test: Test) { // GIVEN const stack = new cdk.Stack(); @@ -36,7 +36,11 @@ export = { new ecr.Repository(stack, 'Repo', { imageScanOnPush: true }); // THEN - expect(stack).to(haveResource('Custom::ECRImageScanOnPush')); + expect(stack).to(haveResource('AWS::ECR::Repository', { + ImageScanningConfiguration: { + scanOnPush: true, + }, + })); test.done(); }, diff --git a/packages/@aws-cdk/aws-ecs/README.md b/packages/@aws-cdk/aws-ecs/README.md index d63f9974cc76c..d0c7cce7965d2 100644 --- a/packages/@aws-cdk/aws-ecs/README.md +++ b/packages/@aws-cdk/aws-ecs/README.md @@ -298,7 +298,7 @@ taskDefinition.addContainer('container', { }, secrets: { // Retrieved from AWS Secrets Manager or AWS Systems Manager Parameter Store at container start-up. SECRET: ecs.Secret.fromSecretsManager(secret), - DB_PASSWORD: ecs.Secret.fromSecretsManager(dbSecret, 'password'), // Reference a specific JSON field + DB_PASSWORD: ecs.Secret.fromSecretsManager(dbSecret, 'password'), // Reference a specific JSON field, (requires platform version 1.4.0 or later for Fargate tasks) PARAMETER: ecs.Secret.fromSsmParameter(parameter), } }); diff --git a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts index 948ce4ea8ae90..862193b11fe3b 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts @@ -261,6 +261,8 @@ export class TaskDefinition extends TaskDefinitionBase { private _executionRole?: iam.IRole; + private _referencesSecretJsonField?: boolean; + /** * Constructs a new instance of the TaskDefinition class. */ @@ -435,6 +437,9 @@ export class TaskDefinition extends TaskDefinitionBase { if (this.defaultContainer === undefined && container.essential) { this.defaultContainer = container; } + if (container.referencesSecretJsonField) { + this._referencesSecretJsonField = true; + } } /** @@ -476,6 +481,14 @@ export class TaskDefinition extends TaskDefinitionBase { return this._executionRole; } + /** + * Whether this task definition has at least a container that references a + * specific JSON field of a secret stored in Secrets Manager. + */ + public get referencesSecretJsonField(): boolean | undefined { + return this._referencesSecretJsonField; + } + /** * Validates the task definition. */ diff --git a/packages/@aws-cdk/aws-ecs/lib/container-definition.ts b/packages/@aws-cdk/aws-ecs/lib/container-definition.ts index 93fa347799d38..d8ceec33c4a1c 100644 --- a/packages/@aws-cdk/aws-ecs/lib/container-definition.ts +++ b/packages/@aws-cdk/aws-ecs/lib/container-definition.ts @@ -355,6 +355,12 @@ export class ContainerDefinition extends cdk.Construct { */ public readonly logDriverConfig?: LogDriverConfig; + /** + * Whether this container definition references a specific JSON field of a secret + * stored in Secrets Manager. + */ + public readonly referencesSecretJsonField?: boolean; + /** * The configured container links */ @@ -384,13 +390,12 @@ export class ContainerDefinition extends cdk.Construct { if (props.logging) { this.logDriverConfig = props.logging.bind(this, this); } - props.taskDefinition._linkContainer(this); if (props.secrets) { this.secrets = []; for (const [name, secret] of Object.entries(props.secrets)) { - if (this.taskDefinition.isFargateCompatible && secret.hasField) { - throw new Error(`Cannot specify secret JSON field for a task using the FARGATE launch type: '${name}' in container '${this.node.id}'`); + if (secret.hasField) { + this.referencesSecretJsonField = true; } secret.grantRead(this.taskDefinition.obtainExecutionRole()); this.secrets.push({ @@ -399,6 +404,8 @@ export class ContainerDefinition extends cdk.Construct { }); } } + + props.taskDefinition._linkContainer(this); } /** diff --git a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts index e709b705dfa29..fd0c4bbac64b5 100644 --- a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts @@ -141,6 +141,12 @@ export class FargateService extends BaseService implements IFargateService { throw new Error('Only one of SecurityGroup or SecurityGroups can be populated.'); } + if (props.taskDefinition.referencesSecretJsonField + && props.platformVersion + && SECRET_JSON_FIELD_UNSUPPORTED_PLATFORM_VERSIONS.includes(props.platformVersion)) { + throw new Error(`The task definition of this service uses at least one container that references a secret JSON field. This feature requires platform version ${FargatePlatformVersion.VERSION1_4} or later.`); + } + const propagateTagsFromSource = props.propagateTaskTagsFrom !== undefined ? props.propagateTaskTagsFrom : (props.propagateTags !== undefined ? props.propagateTags : PropagatedTagSource.NONE); @@ -219,3 +225,10 @@ export enum FargatePlatformVersion { */ VERSION1_0 = '1.0.0', } + +const SECRET_JSON_FIELD_UNSUPPORTED_PLATFORM_VERSIONS = [ + FargatePlatformVersion.VERSION1_0, + FargatePlatformVersion.VERSION1_1, + FargatePlatformVersion.VERSION1_2, + FargatePlatformVersion.VERSION1_3, +]; diff --git a/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.expected.json b/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.expected.json index 39896001c0e67..2ef36fdc4d94a 100644 --- a/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.expected.json +++ b/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.expected.json @@ -40,6 +40,20 @@ "ValueFrom": { "Ref": "SecretA720EF05" } + }, + { + "Name": "PASSWORD", + "ValueFrom": { + "Fn::Join": [ + "", + [ + { + "Ref": "SecretA720EF05" + }, + ":password::" + ] + ] + } } ] } @@ -109,4 +123,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.ts b/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.ts index 7cc743c05209c..4e3599145dffd 100644 --- a/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.ts +++ b/packages/@aws-cdk/aws-ecs/test/fargate/integ.secret.ts @@ -18,6 +18,7 @@ taskDefinition.addContainer('web', { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), secrets: { SECRET: ecs.Secret.fromSecretsManager(secret), + PASSWORD: ecs.Secret.fromSecretsManager(secret, 'password'), }, }); diff --git a/packages/@aws-cdk/aws-ecs/test/fargate/test.fargate-service.ts b/packages/@aws-cdk/aws-ecs/test/fargate/test.fargate-service.ts index be05fbbac3e9b..7b8dc6975bae1 100644 --- a/packages/@aws-cdk/aws-ecs/test/fargate/test.fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs/test/fargate/test.fargate-service.ts @@ -3,6 +3,7 @@ import * as appscaling from '@aws-cdk/aws-applicationautoscaling'; import * as cloudwatch from '@aws-cdk/aws-cloudwatch'; import * as ec2 from '@aws-cdk/aws-ec2'; import * as elbv2 from '@aws-cdk/aws-elasticloadbalancingv2'; +import * as secretsmanager from '@aws-cdk/aws-secretsmanager'; import * as cloudmap from '@aws-cdk/aws-servicediscovery'; import * as cdk from '@aws-cdk/core'; import { Test } from 'nodeunit'; @@ -301,6 +302,31 @@ export = { test.done(); }, + 'throws whith secret json field on unsupported platform version'(test: Test) { + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'MyVpc', {}); + const cluster = new ecs.Cluster(stack, 'EcsCluster', { vpc }); + const taskDefinition = new ecs.FargateTaskDefinition(stack, 'TaksDef'); + const secret = new secretsmanager.Secret(stack, 'Secret'); + taskDefinition.addContainer('BaseContainer', { + image: ecs.ContainerImage.fromRegistry('test'), + secrets: { + SECRET_KEY: ecs.Secret.fromSecretsManager(secret, 'specificKey'), + }, + }); + + // THEN + test.throws(() => { + new ecs.FargateService(stack, 'FargateService', { + cluster, + taskDefinition, + platformVersion: ecs.FargatePlatformVersion.VERSION1_3, + }); + }, new RegExp(`uses at least one container that references a secret JSON field.+platform version ${ecs.FargatePlatformVersion.VERSION1_4} or later`)); + + test.done(); + }, + 'ignore task definition and launch type if deployment controller is set to be EXTERNAL'(test: Test) { // GIVEN const stack = new cdk.Stack(); diff --git a/packages/@aws-cdk/aws-ecs/test/test.container-definition.ts b/packages/@aws-cdk/aws-ecs/test/test.container-definition.ts index 06acd4f620083..8f5c9f5de0c0f 100644 --- a/packages/@aws-cdk/aws-ecs/test/test.container-definition.ts +++ b/packages/@aws-cdk/aws-ecs/test/test.container-definition.ts @@ -846,21 +846,45 @@ export = { }, - 'throws when using a specific secret JSON field as environment variable for a Fargate task'(test: Test) { + 'use a specific secret JSON field as environment variable for a Fargate task'(test: Test) { // GIVEN const stack = new cdk.Stack(); const taskDefinition = new ecs.FargateTaskDefinition(stack, 'TaskDef'); const secret = new secretsmanager.Secret(stack, 'Secret'); - // THEN - test.throws(() => taskDefinition.addContainer('cont', { + // WHEN + taskDefinition.addContainer('cont', { image: ecs.ContainerImage.fromRegistry('test'), memoryLimitMiB: 1024, secrets: { SECRET_KEY: ecs.Secret.fromSecretsManager(secret, 'specificKey'), }, - }), /Cannot specify secret JSON field for a task using the FARGATE launch type/); + }); + + // THEN + expect(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + ContainerDefinitions: [ + { + Secrets: [ + { + Name: 'SECRET_KEY', + ValueFrom: { + 'Fn::Join': [ + '', + [ + { + Ref: 'SecretA720EF05', + }, + ':specificKey::', + ], + ], + }, + }, + ], + }, + ], + })); test.done(); }, diff --git a/packages/@aws-cdk/aws-efs/README.md b/packages/@aws-cdk/aws-efs/README.md index 853ae097327cb..6a598f1146624 100644 --- a/packages/@aws-cdk/aws-efs/README.md +++ b/packages/@aws-cdk/aws-efs/README.md @@ -56,6 +56,25 @@ the access point. You may specify custom path with the `path` property. If `path created with the settings defined in the `creationInfo`. See [Creating Access Points](https://docs.aws.amazon.com/efs/latest/ug/create-access-point.html) for more details. +Any access point that has been created outside the stack can be imported into your CDK app. + +Use the `fromAccessPointAttributes()` API to import an existing access point. + +```ts +efs.AccessPoint.fromAccessPointAttributes(this, 'ap', { + accessPointArn: 'fsap-1293c4d9832fo0912', + fileSystem: efs.FileSystem.fromFileSystemAttributes(this, 'efs', { + fileSystemId: 'fs-099d3e2f', + securityGroup: SecurityGroup.fromSecurityGroupId(this, 'sg', 'sg-51530134'), + }), +}); +``` + +⚠️ Notice: When importing an Access Point using `fromAccessPointAttributes()`, you must make sure the mount targets are deployed and their lifecycle state is `available`. Otherwise, you may encounter the following error when deploying: +> EFS file system referenced by access point has +mount targets created in all availability zones the function will execute in, but not all are in the available life cycle +state yet. Please wait for them to become available and try the request again. + ### Connecting To control who can access the EFS, use the `.connections` attribute. EFS has diff --git a/packages/@aws-cdk/aws-efs/lib/access-point.ts b/packages/@aws-cdk/aws-efs/lib/access-point.ts index 7f43d88523bf1..29d22a5ec6032 100644 --- a/packages/@aws-cdk/aws-efs/lib/access-point.ts +++ b/packages/@aws-cdk/aws-efs/lib/access-point.ts @@ -20,11 +20,16 @@ export interface IAccessPoint extends IResource { * @attribute */ readonly accessPointArn: string; + + /** + * The efs filesystem + */ + readonly fileSystem: IFileSystem; } /** * Permissions as POSIX ACL - */ +*/ export interface Acl { /** * Specifies the POSIX user ID to apply to the RootDirectory. Accepts values from 0 to 2^32 (4294967295). @@ -109,23 +114,71 @@ export interface AccessPointProps extends AccessPointOptions { readonly fileSystem: IFileSystem; } +/** + * Attributes that can be specified when importing an AccessPoint + */ +export interface AccessPointAttributes { + /** + * The ID of the AccessPoint + * One of this, of {@link accessPointArn} is required + * + * @default - determined based on accessPointArn + */ + readonly accessPointId?: string; + + /** + * The ARN of the AccessPoint + * One of this, of {@link accessPointId} is required + * + * @default - determined based on accessPointId + */ + readonly accessPointArn?: string; + + /** + * The EFS filesystem + * + * @default - no EFS filesystem + */ + readonly fileSystem?: IFileSystem; +} + +abstract class AccessPointBase extends Resource implements IAccessPoint { + /** + * The ARN of the Access Point + * @attribute + */ + public abstract readonly accessPointArn: string; + + /** + * The ID of the Access Point + * @attribute + */ + public abstract readonly accessPointId: string; + + /** + * The filesystem of the access point + */ + public abstract readonly fileSystem: IFileSystem; +} + /** * Represents the AccessPoint */ -export class AccessPoint extends Resource implements IAccessPoint { +export class AccessPoint extends AccessPointBase { /** - * Import an existing Access Point + * Import an existing Access Point by attributes + */ + public static fromAccessPointAttributes(scope: Construct, id: string, attrs: AccessPointAttributes): IAccessPoint { + return new ImportedAccessPoint(scope, id, attrs); + } + + /** + * Import an existing Access Point by id */ public static fromAccessPointId(scope: Construct, id: string, accessPointId: string): IAccessPoint { - class Import extends Resource implements IAccessPoint { - public readonly accessPointId = accessPointId; - public readonly accessPointArn = Stack.of(scope).formatArn({ - service: 'elasticfilesystem', - resource: 'access-point', - resourceName: accessPointId, - }); - } - return new Import(scope, id); + return new ImportedAccessPoint(scope, id, { + accessPointId: accessPointId, + }); } /** @@ -174,3 +227,49 @@ export class AccessPoint extends Resource implements IAccessPoint { this.fileSystem = props.fileSystem; } } + +class ImportedAccessPoint extends AccessPointBase { + public readonly accessPointId: string; + public readonly accessPointArn: string; + private readonly _fileSystem?: IFileSystem; + + constructor(scope: Construct, id: string, attrs: AccessPointAttributes) { + super(scope, id); + + if (!attrs.accessPointId) { + if (!attrs.accessPointArn) { + throw new Error('One of accessPointId or AccessPointArn is required!'); + } + + this.accessPointArn = attrs.accessPointArn; + let maybeApId = Stack.of(scope).parseArn(attrs.accessPointArn).resourceName; + + if (!maybeApId) { + throw new Error('ARN for AccessPoint must provide the resource name.'); + } + + this.accessPointId = maybeApId; + } else { + if (attrs.accessPointArn) { + throw new Error('Only one of accessPointId or AccessPointArn can be provided!'); + } + + this.accessPointId = attrs.accessPointId; + this.accessPointArn = Stack.of(scope).formatArn({ + service: 'elasticfilesystem', + resource: 'access-point', + resourceName: attrs.accessPointId, + }); + } + + this._fileSystem = attrs.fileSystem; + } + + public get fileSystem() { + if (!this._fileSystem) { + throw new Error("fileSystem is not available when 'fromAccessPointId()' is used. Use 'fromAccessPointAttributes()' instead"); + } + + return this._fileSystem; + } +} diff --git a/packages/@aws-cdk/aws-efs/lib/efs-file-system.ts b/packages/@aws-cdk/aws-efs/lib/efs-file-system.ts index 2c28375667fe4..8572d85bf920d 100644 --- a/packages/@aws-cdk/aws-efs/lib/efs-file-system.ts +++ b/packages/@aws-cdk/aws-efs/lib/efs-file-system.ts @@ -206,28 +206,18 @@ export interface FileSystemAttributes { * @resource AWS::EFS::FileSystem */ export class FileSystem extends Resource implements IFileSystem { + /** + * The default port File System listens on. + */ + public static readonly DEFAULT_PORT: number = 2049; /** * Import an existing File System from the given properties. */ public static fromFileSystemAttributes(scope: Construct, id: string, attrs: FileSystemAttributes): IFileSystem { - class Import extends Resource implements IFileSystem { - public readonly fileSystemId = attrs.fileSystemId; - public readonly connections = new ec2.Connections({ - securityGroups: [attrs.securityGroup], - defaultPort: ec2.Port.tcp(FileSystem.DEFAULT_PORT), - }); - public readonly mountTargetsAvailable = new ConcreteDependable(); - } - - return new Import(scope, id); + return new ImportedFileSystem(scope, id, attrs); } - /** - * The default port File System listens on. - */ - private static readonly DEFAULT_PORT: number = 2049; - /** * The security groups/rules used to allow network connections to the file system. */ @@ -303,3 +293,36 @@ export class FileSystem extends Resource implements IFileSystem { }); } } + + +class ImportedFileSystem extends Resource implements IFileSystem { + /** + * The security groups/rules used to allow network connections to the file system. + */ + public readonly connections: ec2.Connections; + + /** + * @attribute + */ + public readonly fileSystemId: string; + + /** + * Dependable that can be depended upon to ensure the mount targets of the filesystem are ready + */ + public readonly mountTargetsAvailable: IDependable; + + constructor(scope: Construct, id: string, attrs: FileSystemAttributes) { + super(scope, id); + + this.fileSystemId = attrs.fileSystemId; + + this.connections = new ec2.Connections({ + securityGroups: [attrs.securityGroup], + defaultPort: ec2.Port.tcp(FileSystem.DEFAULT_PORT), + }); + + this.mountTargetsAvailable = new ConcreteDependable(); + } + + +} diff --git a/packages/@aws-cdk/aws-efs/test/access-point.test.ts b/packages/@aws-cdk/aws-efs/test/access-point.test.ts index 761594507c779..29770d2077d2f 100644 --- a/packages/@aws-cdk/aws-efs/test/access-point.test.ts +++ b/packages/@aws-cdk/aws-efs/test/access-point.test.ts @@ -31,7 +31,7 @@ test('new AccessPoint correctly', () => { expectCDK(stack).to(haveResource('AWS::EFS::AccessPoint')); }); -test('import correctly', () => { +test('import an AccessPoint using fromAccessPointId', () => { // WHEN const ap = new AccessPoint(stack, 'MyAccessPoint', { fileSystem, @@ -41,6 +41,87 @@ test('import correctly', () => { expect(imported.accessPointId).toEqual(ap.accessPointId); }); +test('import an AccessPoint using fromAccessPointId', () => { + // WHEN + const ap = new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + const imported = AccessPoint.fromAccessPointId(stack, 'ImportedAccessPoint', ap.accessPointId); + // THEN + expect(() => imported.fileSystem).toThrow(/fileSystem is not available when 'fromAccessPointId\(\)' is used. Use 'fromAccessPointAttributes\(\)' instead/); +}); + +test('import an AccessPoint using fromAccessPointAttributes and the accessPointId', () => { + // WHEN + const ap = new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + const imported = AccessPoint.fromAccessPointAttributes(stack, 'ImportedAccessPoint', { + accessPointId: ap.accessPointId, + fileSystem: fileSystem, + }); + // THEN + expect(imported.accessPointId).toEqual(ap.accessPointId); + expect(imported.accessPointArn).toEqual(ap.accessPointArn); + expect(imported.fileSystem).toEqual(ap.fileSystem); +}); + +test('import an AccessPoint using fromAccessPointAttributes and the accessPointArn', () => { + // WHEN + const ap = new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + const imported = AccessPoint.fromAccessPointAttributes(stack, 'ImportedAccessPoint', { + accessPointArn: ap.accessPointArn, + fileSystem: fileSystem, + }); + // THEN + expect(imported.accessPointId).toEqual(ap.accessPointId); + expect(imported.accessPointArn).toEqual(ap.accessPointArn); + expect(imported.fileSystem).toEqual(ap.fileSystem); +}); + +test('import using accessPointArn', () => { + // WHEN + const ap = new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + const imported = AccessPoint.fromAccessPointAttributes(stack, 'ImportedAccessPoint', { + accessPointArn: ap.accessPointArn, + fileSystem: fileSystem, + }); + // THEN + expect(imported.accessPointId).toEqual(ap.accessPointId); + expect(imported.accessPointArn).toEqual(ap.accessPointArn); + expect(imported.fileSystem).toEqual(ap.fileSystem); +}); + +test('throw when import using accessPointArn and accessPointId', () => { + // WHEN + const ap = new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + + // THEN + expect(() => AccessPoint.fromAccessPointAttributes(stack, 'ImportedAccessPoint', { + accessPointArn: ap.accessPointArn, + accessPointId: ap.accessPointId, + fileSystem: fileSystem, + })).toThrow(/Only one of accessPointId or AccessPointArn can be provided!/); +}); + +test('throw when import without accessPointArn or accessPointId', () => { + // WHEN + new AccessPoint(stack, 'MyAccessPoint', { + fileSystem, + }); + + // THEN + expect(() => AccessPoint.fromAccessPointAttributes(stack, 'ImportedAccessPoint', { + fileSystem: fileSystem, + })).toThrow(/One of accessPointId or AccessPointArn is required!/); +}); + test('custom access point is created correctly', () => { // WHEN new AccessPoint(stack, 'MyAccessPoint', { @@ -83,4 +164,4 @@ test('custom access point is created correctly', () => { Path: '/export/share', }, })); -}); \ No newline at end of file +}); diff --git a/packages/@aws-cdk/aws-eks/package.json b/packages/@aws-cdk/aws-eks/package.json index f23de775f4ba2..39feb03c3f7db 100644 --- a/packages/@aws-cdk/aws-eks/package.json +++ b/packages/@aws-cdk/aws-eks/package.json @@ -74,7 +74,7 @@ "@aws-cdk/assert": "0.0.0", "@types/nodeunit": "^0.0.31", "@types/yaml": "1.9.6", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-events-targets/package.json b/packages/@aws-cdk/aws-events-targets/package.json index c9d8e2fd475b9..444131100fd25 100644 --- a/packages/@aws-cdk/aws-events-targets/package.json +++ b/packages/@aws-cdk/aws-events-targets/package.json @@ -75,7 +75,7 @@ "@aws-cdk/assert": "0.0.0", "@aws-cdk/aws-codecommit": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "aws-sdk-mock": "^5.1.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", diff --git a/packages/@aws-cdk/aws-iam/README.md b/packages/@aws-cdk/aws-iam/README.md index 9e4db8498e2c1..1cc8740b89927 100644 --- a/packages/@aws-cdk/aws-iam/README.md +++ b/packages/@aws-cdk/aws-iam/README.md @@ -250,8 +250,16 @@ const policyDocument = { ] }; -const newPolicyDocument = PolicyDocument.fromJson(policyDocument); +const customPolicyDocument = PolicyDocument.fromJson(policyDocument); +// You can pass this document as an initial document to a ManagedPolicy +// or inline Policy. +const newManagedPolicy = new ManagedPolicy(stack, 'MyNewManagedPolicy', { + document: customPolicyDocument +}); +const newPolicy = new Policy(stack, 'MyNewPolicy', { + document: customPolicyDocument +}); ``` ### OpenID Connect Providers diff --git a/packages/@aws-cdk/aws-iam/lib/policy.ts b/packages/@aws-cdk/aws-iam/lib/policy.ts index c4fefd21b189d..45cd1fb138927 100644 --- a/packages/@aws-cdk/aws-iam/lib/policy.ts +++ b/packages/@aws-cdk/aws-iam/lib/policy.ts @@ -83,6 +83,15 @@ export interface PolicyProps { * @default false */ readonly force?: boolean; + + /** + * Initial PolicyDocument to use for this Policy. If omited, any + * `PolicyStatement` provided in the `statements` property will be applied + * against the empty default `PolicyDocument`. + * + * @default - An empty policy. + */ + readonly document?: PolicyDocument; } /** @@ -138,6 +147,10 @@ export class Policy extends Resource implements IPolicy { } } + if (props.document) { + this.document = props.document; + } + const resource = new CfnPolicyConditional(this, 'Resource', { policyDocument: this.document, policyName: this.physicalName, diff --git a/packages/@aws-cdk/aws-iam/test/policy.test.ts b/packages/@aws-cdk/aws-iam/test/policy.test.ts index 9facd4acd3973..d2ff50aa4dbb8 100644 --- a/packages/@aws-cdk/aws-iam/test/policy.test.ts +++ b/packages/@aws-cdk/aws-iam/test/policy.test.ts @@ -1,7 +1,7 @@ import { ResourcePart } from '@aws-cdk/assert'; import '@aws-cdk/assert/jest'; import { App, CfnResource, Stack } from '@aws-cdk/core'; -import { AnyPrincipal, CfnPolicy, Group, Policy, PolicyStatement, Role, ServicePrincipal, User } from '../lib'; +import { AnyPrincipal, CfnPolicy, Group, Policy, PolicyDocument, PolicyStatement, Role, ServicePrincipal, User } from '../lib'; /* eslint-disable quote-props */ @@ -52,6 +52,42 @@ describe('IAM policy', () => { }); }); + test('policy from policy document alone', () => { + const policy = new Policy(stack, 'MyPolicy', { + policyName: 'MyPolicyName', + document: PolicyDocument.fromJson({ + Statement: [ + { + Action: 'sqs:SendMessage', + Effect: 'Allow', + Resource: '*', + }, + ], + }), + }); + + const group = new Group(stack, 'MyGroup'); + group.attachInlinePolicy(policy); + + expect(stack).toMatchTemplate({ + Resources: { + MyPolicy39D66CF6: { + Type: 'AWS::IAM::Policy', + Properties: { + PolicyName: 'MyPolicyName', + Groups: [{ Ref: 'MyGroupCBA54B1B' }], + PolicyDocument: { + Statement: [ + { Action: 'sqs:SendMessage', Effect: 'Allow', Resource: '*' }, + ], + Version: '2012-10-17', + }, + }, + }, + MyGroupCBA54B1B: { Type: 'AWS::IAM::Group' }, + }, + }); + }); test('policy name can be omitted, in which case the logical id will be used', () => { const policy = new Policy(stack, 'MyPolicy'); policy.addStatements(new PolicyStatement({ resources: ['*'], actions: ['sqs:SendMessage'] })); diff --git a/packages/@aws-cdk/aws-iotsitewise/.eslintrc.js b/packages/@aws-cdk/aws-iotsitewise/.eslintrc.js new file mode 100644 index 0000000000000..61dd8dd001f63 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/.eslintrc.js @@ -0,0 +1,3 @@ +const baseConfig = require('cdk-build-tools/config/eslintrc'); +baseConfig.parserOptions.project = __dirname + '/tsconfig.json'; +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-iotsitewise/.gitignore b/packages/@aws-cdk/aws-iotsitewise/.gitignore new file mode 100644 index 0000000000000..62ebc95d75ce6 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/.gitignore @@ -0,0 +1,19 @@ +*.js +*.js.map +*.d.ts +tsconfig.json +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk +nyc.config.js +!.eslintrc.js +!jest.config.js +junit.xml diff --git a/packages/@aws-cdk/aws-iotsitewise/.npmignore b/packages/@aws-cdk/aws-iotsitewise/.npmignore new file mode 100644 index 0000000000000..e4486030fcb17 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/.npmignore @@ -0,0 +1,28 @@ +# Don't include original .ts files when doing `npm pack` +*.ts +!*.d.ts +coverage +.nyc_output +*.tgz + +dist +.LAST_PACKAGE +.LAST_BUILD +!*.js + +# Include .jsii +!.jsii + +*.snk + +*.tsbuildinfo + +tsconfig.json + +.eslintrc.js +jest.config.js + +# exclude cdk artifacts +**/cdk.out +junit.xml +test/ diff --git a/packages/@aws-cdk/aws-iotsitewise/LICENSE b/packages/@aws-cdk/aws-iotsitewise/LICENSE new file mode 100644 index 0000000000000..b71ec1688783a --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/@aws-cdk/aws-iotsitewise/NOTICE b/packages/@aws-cdk/aws-iotsitewise/NOTICE new file mode 100644 index 0000000000000..bfccac9a7f69c --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/NOTICE @@ -0,0 +1,2 @@ +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/packages/@aws-cdk/aws-iotsitewise/README.md b/packages/@aws-cdk/aws-iotsitewise/README.md new file mode 100644 index 0000000000000..c92df247f85b4 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/README.md @@ -0,0 +1,16 @@ +## AWS::IoTSiteWise Construct Library + +--- + +![cfn-resources: Stable](https://img.shields.io/badge/cfn--resources-stable-success.svg?style=for-the-badge) + +> All classes with the `Cfn` prefix in this module ([CFN Resources](https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_lib)) are always stable and safe to use. + +--- + + +This module is part of the [AWS Cloud Development Kit](https://github.com/aws/aws-cdk) project. + +```ts +import iotsitewise = require('@aws-cdk/aws-iotsitewise'); +``` diff --git a/packages/@aws-cdk/aws-iotsitewise/jest.config.js b/packages/@aws-cdk/aws-iotsitewise/jest.config.js new file mode 100644 index 0000000000000..54e28beb9798b --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/jest.config.js @@ -0,0 +1,2 @@ +const baseConfig = require('cdk-build-tools/config/jest.config'); +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-iotsitewise/lib/index.ts b/packages/@aws-cdk/aws-iotsitewise/lib/index.ts new file mode 100644 index 0000000000000..c31b4b7c13647 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/lib/index.ts @@ -0,0 +1,2 @@ +// AWS::IoTSiteWise CloudFormation Resources: +export * from './iotsitewise.generated'; diff --git a/packages/@aws-cdk/aws-iotsitewise/package.json b/packages/@aws-cdk/aws-iotsitewise/package.json new file mode 100644 index 0000000000000..8291616094fca --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/package.json @@ -0,0 +1,96 @@ +{ + "name": "@aws-cdk/aws-iotsitewise", + "version": "0.0.0", + "description": "The CDK Construct Library for AWS::IoTSiteWise", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "jsii": { + "outdir": "dist", + "projectReferences": true, + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTSiteWise", + "packageId": "Amazon.CDK.AWS.IoTSiteWise", + "signAssembly": true, + "assemblyOriginatorKeyFile": "../../key.snk", + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "java": { + "package": "software.amazon.awscdk.services.iotsitewise", + "maven": { + "groupId": "software.amazon.awscdk", + "artifactId": "iotsitewise" + } + }, + "python": { + "classifiers": [ + "Framework :: AWS CDK", + "Framework :: AWS CDK :: 1" + ], + "distName": "aws-cdk.aws-iotsitewise", + "module": "aws_cdk.aws_iotsitewise" + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-cdk.git", + "directory": "packages/@aws-cdk/aws-iotsitewise" + }, + "homepage": "https://github.com/aws/aws-cdk", + "scripts": { + "build": "cdk-build", + "watch": "cdk-watch", + "lint": "cdk-lint", + "test": "cdk-test", + "integ": "cdk-integ", + "pkglint": "pkglint -f", + "package": "cdk-package", + "awslint": "cdk-awslint", + "cfn2ts": "cfn2ts", + "build+test+package": "npm run build+test && npm run package", + "build+test": "npm run build && npm test", + "compat": "cdk-compat", + "gen": "cfn2ts" + }, + "cdk-build": { + "cloudformation": "AWS::IoTSiteWise", + "jest": true, + "env": { + "AWSLINT_BASE_CONSTRUCT": "true" + } + }, + "keywords": [ + "aws", + "cdk", + "constructs", + "AWS::IoTSiteWise", + "aws-iotsitewise" + ], + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "devDependencies": { + "@aws-cdk/assert": "0.0.0", + "cdk-build-tools": "0.0.0", + "cfn2ts": "0.0.0", + "pkglint": "0.0.0" + }, + "dependencies": { + "@aws-cdk/core": "0.0.0" + }, + "peerDependencies": { + "@aws-cdk/core": "0.0.0" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "stability": "experimental", + "maturity": "cfn-only", + "awscdkio": { + "announce": false + } +} diff --git a/packages/@aws-cdk/aws-iotsitewise/test/iotsitewise.test.ts b/packages/@aws-cdk/aws-iotsitewise/test/iotsitewise.test.ts new file mode 100644 index 0000000000000..e394ef336bfb4 --- /dev/null +++ b/packages/@aws-cdk/aws-iotsitewise/test/iotsitewise.test.ts @@ -0,0 +1,6 @@ +import '@aws-cdk/assert/jest'; +import {} from '../lib'; + +test('No tests are specified for this package', () => { + expect(true).toBe(true); +}); diff --git a/packages/@aws-cdk/aws-ivs/.eslintrc.js b/packages/@aws-cdk/aws-ivs/.eslintrc.js new file mode 100644 index 0000000000000..61dd8dd001f63 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/.eslintrc.js @@ -0,0 +1,3 @@ +const baseConfig = require('cdk-build-tools/config/eslintrc'); +baseConfig.parserOptions.project = __dirname + '/tsconfig.json'; +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-ivs/.gitignore b/packages/@aws-cdk/aws-ivs/.gitignore new file mode 100644 index 0000000000000..62ebc95d75ce6 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/.gitignore @@ -0,0 +1,19 @@ +*.js +*.js.map +*.d.ts +tsconfig.json +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk +nyc.config.js +!.eslintrc.js +!jest.config.js +junit.xml diff --git a/packages/@aws-cdk/aws-ivs/.npmignore b/packages/@aws-cdk/aws-ivs/.npmignore new file mode 100644 index 0000000000000..e4486030fcb17 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/.npmignore @@ -0,0 +1,28 @@ +# Don't include original .ts files when doing `npm pack` +*.ts +!*.d.ts +coverage +.nyc_output +*.tgz + +dist +.LAST_PACKAGE +.LAST_BUILD +!*.js + +# Include .jsii +!.jsii + +*.snk + +*.tsbuildinfo + +tsconfig.json + +.eslintrc.js +jest.config.js + +# exclude cdk artifacts +**/cdk.out +junit.xml +test/ diff --git a/packages/@aws-cdk/aws-ivs/LICENSE b/packages/@aws-cdk/aws-ivs/LICENSE new file mode 100644 index 0000000000000..b71ec1688783a --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/@aws-cdk/aws-ivs/NOTICE b/packages/@aws-cdk/aws-ivs/NOTICE new file mode 100644 index 0000000000000..bfccac9a7f69c --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/NOTICE @@ -0,0 +1,2 @@ +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/packages/@aws-cdk/aws-ivs/README.md b/packages/@aws-cdk/aws-ivs/README.md new file mode 100644 index 0000000000000..0e8b591f39c21 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/README.md @@ -0,0 +1,16 @@ +## AWS::IVS Construct Library + +--- + +![cfn-resources: Stable](https://img.shields.io/badge/cfn--resources-stable-success.svg?style=for-the-badge) + +> All classes with the `Cfn` prefix in this module ([CFN Resources](https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_lib)) are always stable and safe to use. + +--- + + +This module is part of the [AWS Cloud Development Kit](https://github.com/aws/aws-cdk) project. + +```ts +import ivs = require('@aws-cdk/aws-ivs'); +``` diff --git a/packages/@aws-cdk/aws-ivs/jest.config.js b/packages/@aws-cdk/aws-ivs/jest.config.js new file mode 100644 index 0000000000000..54e28beb9798b --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/jest.config.js @@ -0,0 +1,2 @@ +const baseConfig = require('cdk-build-tools/config/jest.config'); +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-ivs/lib/index.ts b/packages/@aws-cdk/aws-ivs/lib/index.ts new file mode 100644 index 0000000000000..418b7c6157e85 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/lib/index.ts @@ -0,0 +1,2 @@ +// AWS::IVS CloudFormation Resources: +export * from './ivs.generated'; diff --git a/packages/@aws-cdk/aws-ivs/package.json b/packages/@aws-cdk/aws-ivs/package.json new file mode 100644 index 0000000000000..ea872b6960b3f --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/package.json @@ -0,0 +1,96 @@ +{ + "name": "@aws-cdk/aws-ivs", + "version": "0.0.0", + "description": "The CDK Construct Library for AWS::IVS", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "jsii": { + "outdir": "dist", + "projectReferences": true, + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IVS", + "packageId": "Amazon.CDK.AWS.IVS", + "signAssembly": true, + "assemblyOriginatorKeyFile": "../../key.snk", + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "java": { + "package": "software.amazon.awscdk.services.ivs", + "maven": { + "groupId": "software.amazon.awscdk", + "artifactId": "ivs" + } + }, + "python": { + "classifiers": [ + "Framework :: AWS CDK", + "Framework :: AWS CDK :: 1" + ], + "distName": "aws-cdk.aws-ivs", + "module": "aws_cdk.aws_ivs" + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-cdk.git", + "directory": "packages/@aws-cdk/aws-ivs" + }, + "homepage": "https://github.com/aws/aws-cdk", + "scripts": { + "build": "cdk-build", + "watch": "cdk-watch", + "lint": "cdk-lint", + "test": "cdk-test", + "integ": "cdk-integ", + "pkglint": "pkglint -f", + "package": "cdk-package", + "awslint": "cdk-awslint", + "cfn2ts": "cfn2ts", + "build+test+package": "npm run build+test && npm run package", + "build+test": "npm run build && npm test", + "compat": "cdk-compat", + "gen": "cfn2ts" + }, + "cdk-build": { + "cloudformation": "AWS::IVS", + "jest": true, + "env": { + "AWSLINT_BASE_CONSTRUCT": "true" + } + }, + "keywords": [ + "aws", + "cdk", + "constructs", + "AWS::IVS", + "aws-ivs" + ], + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "devDependencies": { + "@aws-cdk/assert": "0.0.0", + "cdk-build-tools": "0.0.0", + "cfn2ts": "0.0.0", + "pkglint": "0.0.0" + }, + "dependencies": { + "@aws-cdk/core": "0.0.0" + }, + "peerDependencies": { + "@aws-cdk/core": "0.0.0" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "stability": "experimental", + "maturity": "cfn-only", + "awscdkio": { + "announce": false + } +} diff --git a/packages/@aws-cdk/aws-ivs/test/ivs.test.ts b/packages/@aws-cdk/aws-ivs/test/ivs.test.ts new file mode 100644 index 0000000000000..e394ef336bfb4 --- /dev/null +++ b/packages/@aws-cdk/aws-ivs/test/ivs.test.ts @@ -0,0 +1,6 @@ +import '@aws-cdk/assert/jest'; +import {} from '../lib'; + +test('No tests are specified for this package', () => { + expect(true).toBe(true); +}); diff --git a/packages/@aws-cdk/aws-lambda-event-sources/README.md b/packages/@aws-cdk/aws-lambda-event-sources/README.md index b1fec3c4c78a7..656d09f56f448 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/README.md +++ b/packages/@aws-cdk/aws-lambda-event-sources/README.md @@ -202,7 +202,7 @@ const stream = new kinesis.Stream(this, 'MyStream'); myFunction.addEventSource(new KinesisEventSource(stream, { batchSize: 100, // default startingPosition: lambda.StartingPosition.TRIM_HORIZON -}); +})); ``` ## Roadmap diff --git a/packages/@aws-cdk/aws-lambda-nodejs/package.json b/packages/@aws-cdk/aws-lambda-nodejs/package.json index de6ea3d7b31a8..8dcc7caa033d9 100644 --- a/packages/@aws-cdk/aws-lambda-nodejs/package.json +++ b/packages/@aws-cdk/aws-lambda-nodejs/package.json @@ -67,7 +67,7 @@ "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "delay": "4.4.0", - "parcel": "2.0.0-nightly.443", + "parcel": "2.0.0-nightly.447", "pkglint": "0.0.0" }, "dependencies": { diff --git a/packages/@aws-cdk/aws-lambda/lib/filesystem.ts b/packages/@aws-cdk/aws-lambda/lib/filesystem.ts index 20b0cb1fc130d..388db50e045ec 100644 --- a/packages/@aws-cdk/aws-lambda/lib/filesystem.ts +++ b/packages/@aws-cdk/aws-lambda/lib/filesystem.ts @@ -50,7 +50,7 @@ export class FileSystem { * @param ap the Amazon EFS access point * @param mountPath the target path in the lambda runtime environment */ - public static fromEfsAccessPoint(ap: efs.AccessPoint, mountPath: string): FileSystem { + public static fromEfsAccessPoint(ap: efs.IAccessPoint, mountPath: string): FileSystem { return new FileSystem({ localMountPath: mountPath, arn: ap.accessPointArn, diff --git a/packages/@aws-cdk/aws-lambda/lib/function-base.ts b/packages/@aws-cdk/aws-lambda/lib/function-base.ts index ab1012b6015bc..d02f355f0c5f3 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function-base.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function-base.ts @@ -149,6 +149,19 @@ export interface FunctionAttributes { * to this Lambda. */ readonly securityGroup?: ec2.ISecurityGroup; + + /** + * Setting this property informs the CDK that the imported function is in the same environment as the stack. + * This affects certain behaviours such as, whether this function's permission can be modified. + * When not configured, the CDK attempts to auto-determine this. For environment agnostic stacks, i.e., stacks + * where the account is not specified with the `env` property, this is determined to be false. + * + * Set this to property *ONLY IF* the imported function is in the same account as the stack + * it's imported in. + * @default - depends: true, if the Stack is configured with an explicit `env` (account and region) and the account is the same as this function. + * For environment-agnostic stacks this will default to `false`. + */ + readonly sameEnvironment?: boolean; } export abstract class FunctionBase extends Resource implements IFunction { @@ -301,7 +314,8 @@ export abstract class FunctionBase extends Resource implements IFunction { const permissionNode = this._functionNode().tryFindChild(identifier); if (!permissionNode) { - throw new Error('Cannot modify permission to lambda function. Function is either imported or $LATEST version.'); + throw new Error('Cannot modify permission to lambda function. Function is either imported or $LATEST version. ' + + 'If the function is imported from the same account use `fromFunctionAttributes()` API with the `allowPermissions` flag.'); } return { statementAdded: true, policyDependable: permissionNode }; }, @@ -361,13 +375,13 @@ export abstract class FunctionBase extends Resource implements IFunction { * ..which means that in order to extract the `account-id` component from the ARN, we can * split the ARN using ":" and select the component in index 4. * - * @returns true if account id of function matches this account, or the accounts are unresolved. + * @returns true if account id of function matches the account specified on the stack, false otherwise. * * @internal */ protected _isStackAccount(): boolean { if (Token.isUnresolved(this.stack.account) || Token.isUnresolved(this.functionArn)) { - return true; + return false; } return this.stack.parseArn(this.functionArn).account === this.stack.account; } diff --git a/packages/@aws-cdk/aws-lambda/lib/function.ts b/packages/@aws-cdk/aws-lambda/lib/function.ts index d44a14a3aa4f1..e2d81c064c894 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function.ts @@ -383,7 +383,7 @@ export class Function extends FunctionBase { public readonly role = role; public readonly permissionsNode = this.node; - protected readonly canCreatePermissions = this._isStackAccount(); + protected readonly canCreatePermissions = attrs.sameEnvironment ?? this._isStackAccount(); constructor(s: Construct, i: string) { super(s, i); diff --git a/packages/@aws-cdk/aws-lambda/test/function.test.ts b/packages/@aws-cdk/aws-lambda/test/function.test.ts index 761a688762c48..038167a460423 100644 --- a/packages/@aws-cdk/aws-lambda/test/function.test.ts +++ b/packages/@aws-cdk/aws-lambda/test/function.test.ts @@ -269,6 +269,24 @@ describe('function', () => { principal: new iam.ServicePrincipal('cloudformation.amazonaws.com'), }); + // THEN + expect(stack).not.toHaveResource('AWS::Lambda::Permission'); + }); + + test('imported Function w/ unresolved account & allowPermissions set', () => { + // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'Imports'); + + // WHEN + const iFunc = lambda.Function.fromFunctionAttributes(stack, 'iFunc', { + functionArn: 'arn:aws:lambda:us-east-1:123456789012:function:BaseFunction', + sameEnvironment: true, // since this is false, by default, for env agnostic stacks + }); + iFunc.addPermission('iFunc', { + principal: new iam.ServicePrincipal('cloudformation.amazonaws.com'), + }); + // THEN expect(stack).toHaveResource('AWS::Lambda::Permission'); }); @@ -953,10 +971,22 @@ describe('function', () => { }); test('on an imported function (unresolved account)', () => { - // GIVEN const stack = new cdk.Stack(); const fn = lambda.Function.fromFunctionArn(stack, 'Function', 'arn:aws:lambda:us-east-1:123456789012:function:MyFn'); + expect( + () => fn.grantInvoke(new iam.ServicePrincipal('elasticloadbalancing.amazonaws.com')), + ).toThrow(/Cannot modify permission to lambda function/); + }); + + test('on an imported function (unresolved account & w/ allowPermissions)', () => { + // GIVEN + const stack = new cdk.Stack(); + const fn = lambda.Function.fromFunctionAttributes(stack, 'Function', { + functionArn: 'arn:aws:lambda:us-east-1:123456789012:function:MyFn', + sameEnvironment: true, + }); + // WHEN fn.grantInvoke(new iam.ServicePrincipal('elasticloadbalancing.amazonaws.com')); diff --git a/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.expected.json b/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.expected.json index ff7a04f8b7fd5..3d17a0e6ca6bf 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.expected.json +++ b/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.expected.json @@ -736,7 +736,7 @@ "Type": "AWS::Lambda::Function", "Properties": { "Code": { - "ZipFile": "\nimport json\nimport os\nimport string\nimport random\nimport datetime\n\nMSG_FILE_PATH = '/mnt/msg/content'\n\ndef randomString(stringLength=10):\n letters = string.ascii_lowercase\n return ''.join(random.choice(letters) for i in range(stringLength))\n\ndef lambda_handler(event, context):\n with open(MSG_FILE_PATH, 'a') as f:\n f.write(f\"{datetime.datetime.utcnow():%Y-%m-%d-%H:%M:%S} \" + randomString(5) + ' ')\n\n file = open(MSG_FILE_PATH, \"r\")\n file_content = file.read()\n file.close()\n\n return {\n 'statusCode': 200,\n 'body': str(file_content)\n }\n " + "ZipFile": "\nimport json\nimport os\nimport string\nimport random\nimport datetime\n\nMSG_FILE_PATH = '/mnt/msg/content'\n\ndef randomString(stringLength=10):\n letters = string.ascii_lowercase\n return ''.join(random.choice(letters) for i in range(stringLength))\n\ndef lambda_handler(event, context):\n with open(MSG_FILE_PATH, 'a') as f:\n f.write(f\"{datetime.datetime.utcnow():%Y-%m-%d-%H:%M:%S} \" + randomString(5) + ' ')\n\n file = open(MSG_FILE_PATH, \"r\")\n file_content = file.read()\n file.close()\n\n return {\n 'statusCode': 200,\n 'body': str(file_content)\n }\n" }, "Handler": "index.lambda_handler", "Role": { @@ -746,6 +746,34 @@ ] }, "Runtime": "python3.7", + "FileSystemConfigs": [ + { + "LocalMountPath": "/mnt/msg", + "Arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":elasticfilesystem:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":access-point/", + { + "Ref": "EfsAccessPointE419FED9" + } + ] + ] + } + } + ], "VpcConfig": { "SecurityGroupIds": [ { @@ -766,7 +794,203 @@ "Ref": "VpcPrivateSubnet3SubnetF258B56E" } ] + } + }, + "DependsOn": [ + "EfsEfsMountTarget195B2DD2E", + "EfsEfsMountTarget2315C927F", + "EfsEfsMountTarget36646B9A0", + "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "MyLambdaServiceRole4539ECB6" + ] + }, + "securityGroupfromawscdklambda1MyLambda2SecurityGroup7492F70D20498301D9D2": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "IpProtocol": "tcp", + "Description": "from awscdklambda1MyLambda2SecurityGroup7492F70D:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EfsEfsSecurityGroup6F40EA3B", + "GroupId" + ] + }, + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "MyLambda2SecurityGroup3C507954", + "GroupId" + ] + }, + "ToPort": 2049 + } + }, + "MyLambda2ServiceRoleD09B370C": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" + ] + ] + } + ] + }, + "DependsOn": [ + "MyLambdaCCE802FB", + "MyLambdaSecurityGroup1E71A818", + "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "MyLambdaServiceRole4539ECB6" + ] + }, + "MyLambda2ServiceRoleDefaultPolicy2BECE79D": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "elasticfilesystem:ClientMount", + "Condition": { + "StringEquals": { + "elasticfilesystem:AccessPointArn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":elasticfilesystem:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":access-point/", + { + "Ref": "EfsAccessPointE419FED9" + } + ] + ] + } + } + }, + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "elasticfilesystem:ClientWrite", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":elasticfilesystem:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":file-system/", + { + "Ref": "Efs9E8BF36B" + } + ] + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyLambda2ServiceRoleDefaultPolicy2BECE79D", + "Roles": [ + { + "Ref": "MyLambda2ServiceRoleD09B370C" + } + ] + }, + "DependsOn": [ + "MyLambdaCCE802FB", + "MyLambdaSecurityGroup1E71A818", + "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "MyLambdaServiceRole4539ECB6" + ] + }, + "MyLambda2SecurityGroup3C507954": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "Automatic security group for Lambda Function awscdklambda1MyLambda232FB7CD2", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + }, + "DependsOn": [ + "MyLambdaCCE802FB", + "MyLambdaSecurityGroup1E71A818", + "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "MyLambdaServiceRole4539ECB6" + ] + }, + "MyLambda2254B54D5": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "ZipFile": "\nimport json\nimport os\nimport string\nimport random\nimport datetime\n\nMSG_FILE_PATH = '/mnt/msg/content'\n\ndef randomString(stringLength=10):\n letters = string.ascii_lowercase\n return ''.join(random.choice(letters) for i in range(stringLength))\n\ndef lambda_handler(event, context):\n with open(MSG_FILE_PATH, 'a') as f:\n f.write(f\"{datetime.datetime.utcnow():%Y-%m-%d-%H:%M:%S} \" + randomString(5) + ' ')\n\n file = open(MSG_FILE_PATH, \"r\")\n file_content = file.read()\n file.close()\n\n return {\n 'statusCode': 200,\n 'body': str(file_content)\n }\n" + }, + "Handler": "index.lambda_handler", + "Role": { + "Fn::GetAtt": [ + "MyLambda2ServiceRoleD09B370C", + "Arn" + ] }, + "Runtime": "python3.7", "FileSystemConfigs": [ { "LocalMountPath": "/mnt/msg", @@ -794,14 +1018,36 @@ ] } } - ] + ], + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "MyLambda2SecurityGroup3C507954", + "GroupId" + ] + } + ], + "SubnetIds": [ + { + "Ref": "VpcPrivateSubnet1Subnet536B997A" + }, + { + "Ref": "VpcPrivateSubnet2Subnet3788AAA1" + }, + { + "Ref": "VpcPrivateSubnet3SubnetF258B56E" + } + ] + } }, "DependsOn": [ - "EfsEfsMountTarget195B2DD2E", - "EfsEfsMountTarget2315C927F", - "EfsEfsMountTarget36646B9A0", + "MyLambdaCCE802FB", + "MyLambdaSecurityGroup1E71A818", "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "MyLambdaServiceRole4539ECB6" + "MyLambdaServiceRole4539ECB6", + "MyLambda2ServiceRoleDefaultPolicy2BECE79D", + "MyLambda2ServiceRoleD09B370C" ] } } diff --git a/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.ts b/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.ts index da6515233e770..c9441c1cd0a52 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.ts +++ b/packages/@aws-cdk/aws-lambda/test/integ.lambda.filesystem.ts @@ -7,6 +7,7 @@ const app = new cdk.App(); const stack = new cdk.Stack(app, 'aws-cdk-lambda-1'); + const vpc = new ec2.Vpc(stack, 'Vpc', { maxAzs: 3, natGateways: 1, @@ -31,9 +32,7 @@ const accessPoint = fileSystem.addAccessPoint('AccessPoint', { }, }); -// this function will mount the access point to '/mnt/msg' and write content onto /mnt/msg/content -new lambda.Function(stack, 'MyLambda', { - code: new lambda.InlineCode(` +const lambdaCode = new lambda.InlineCode(` import json import os import string @@ -58,11 +57,46 @@ def lambda_handler(event, context): 'statusCode': 200, 'body': str(file_content) } - `), +`); + +// this function will mount the access point to '/mnt/msg' and write content onto /mnt/msg/content +const lambda1 = new lambda.Function(stack, 'MyLambda', { + code: lambdaCode, handler: 'index.lambda_handler', runtime: lambda.Runtime.PYTHON_3_7, vpc, filesystem: lambda.FileSystem.fromEfsAccessPoint(accessPoint, '/mnt/msg'), }); +let importedFileSystem = efs.FileSystem.fromFileSystemAttributes(stack, 'fileSystemImported', { + fileSystemId: fileSystem.fileSystemId, + securityGroup: ec2.SecurityGroup.fromSecurityGroupId( + stack, + 'securityGroup', + fileSystem.connections.securityGroups[0].securityGroupId, + ), +}); + +let importedAccessPoint = efs.AccessPoint.fromAccessPointAttributes(stack, 'AccessPointImported', { + accessPointId: accessPoint.accessPointId, + fileSystem: importedFileSystem, +}); + +// this function will mount the access point to '/mnt/msg' and write content onto /mnt/msg/content +const lambda2 = new lambda.Function(stack, 'MyLambda2', { + code: lambdaCode, + handler: 'index.lambda_handler', + runtime: lambda.Runtime.PYTHON_3_7, + vpc, + filesystem: lambda.FileSystem.fromEfsAccessPoint( + importedAccessPoint, + '/mnt/msg', + ), +}); + +// lambda2 doesn't have dependencies on MountTargets because the fileSystem is imported. +// Ideally, lambda2 would be deployed in another stack but integ doesn't support it. +// We are adding a dependency on the first lambda to simulate this situation. +lambda2.node.addDependency(lambda1); + app.synth(); diff --git a/packages/@aws-cdk/aws-logs/README.md b/packages/@aws-cdk/aws-logs/README.md index 038b6db28c3a2..880113852e355 100644 --- a/packages/@aws-cdk/aws-logs/README.md +++ b/packages/@aws-cdk/aws-logs/README.md @@ -41,11 +41,32 @@ lambda](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.h This is implemented using a [CloudFormation custom resource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html) which pre-creates the log group if it doesn't exist, and sets the specified log retention period (never expire, by default). - + By default, the log group will be created in the same region as the stack. The `logGroupRegion` property can be used to configure log groups in other regions. This is typically useful when controlling retention for log groups auto-created by global services that publish their log group to a specific region, such as AWS Chatbot creating a log group in `us-east-1`. - + +### Encrypting Log Groups + +By default, log group data is always encrypted in CloudWatch Logs. You have the +option to encrypt log group data using a AWS KMS customer master key (CMK) should +you not wish to use the default AWS encryption. Keep in mind that if you decide to +encrypt a log group, any service or IAM identity that needs to read the encrypted +log streams in the future will require the same CMK to decrypt the data. + +Here's a simple example of creating an encrypted Log Group using a KMS CMK. + +```ts +import * as kms from '@aws-cdk/aws-kms'; + +new LogGroup(this, 'LogGroup', { + encryptionKey: new kms.Key(this, 'Key'), +}); +``` + +See the AWS documentation for more detailed information about [encrypting CloudWatch +Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html). + ### Subscriptions and Destinations Log events matching a particular filter can be sent to either a Lambda function @@ -100,7 +121,7 @@ the name `Namespace/MetricName`. #### Exposing Metric on a Metric Filter -You can expose a metric on a metric filter by calling the `MetricFilter.metric()` API. +You can expose a metric on a metric filter by calling the `MetricFilter.metric()` API. This has a default of `statistic = 'avg'` if the statistic is not set in the `props`. ```ts diff --git a/packages/@aws-cdk/aws-logs/lib/log-group.ts b/packages/@aws-cdk/aws-logs/lib/log-group.ts index e041b16b29bbd..83c4a8e170b89 100644 --- a/packages/@aws-cdk/aws-logs/lib/log-group.ts +++ b/packages/@aws-cdk/aws-logs/lib/log-group.ts @@ -1,5 +1,6 @@ import * as cloudwatch from '@aws-cdk/aws-cloudwatch'; import * as iam from '@aws-cdk/aws-iam'; +import * as kms from '@aws-cdk/aws-kms'; import { IResource, RemovalPolicy, Resource, Stack, Token } from '@aws-cdk/core'; import { Construct } from 'constructs'; import { LogStream } from './log-stream'; @@ -273,6 +274,13 @@ export enum RetentionDays { * Properties for a LogGroup */ export interface LogGroupProps { + /** + * The KMS Key to encrypt the log group with. + * + * @default - log group is encrypted with the default master key + */ + readonly encryptionKey?: kms.IKey; + /** * Name of the log group. * @@ -363,6 +371,7 @@ export class LogGroup extends LogGroupBase { } const resource = new CfnLogGroup(this, 'Resource', { + kmsKeyId: props.encryptionKey?.keyArn, logGroupName: this.physicalName, retentionInDays, }); diff --git a/packages/@aws-cdk/aws-logs/package.json b/packages/@aws-cdk/aws-logs/package.json index 9034ee8214849..d3df5c52c5a63 100644 --- a/packages/@aws-cdk/aws-logs/package.json +++ b/packages/@aws-cdk/aws-logs/package.json @@ -73,7 +73,7 @@ "devDependencies": { "@aws-cdk/assert": "0.0.0", "@types/nodeunit": "^0.0.31", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "aws-sdk-mock": "^5.1.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", @@ -86,6 +86,7 @@ "dependencies": { "@aws-cdk/aws-cloudwatch": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", + "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-s3-assets": "0.0.0", "@aws-cdk/core": "0.0.0", "constructs": "^3.2.0" @@ -94,6 +95,7 @@ "peerDependencies": { "@aws-cdk/aws-cloudwatch": "0.0.0", "@aws-cdk/aws-iam": "0.0.0", + "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-s3-assets": "0.0.0", "@aws-cdk/core": "0.0.0", "constructs": "^3.2.0" diff --git a/packages/@aws-cdk/aws-logs/test/test.loggroup.ts b/packages/@aws-cdk/aws-logs/test/test.loggroup.ts index 22330ae0e3b1f..333ae71a976c3 100644 --- a/packages/@aws-cdk/aws-logs/test/test.loggroup.ts +++ b/packages/@aws-cdk/aws-logs/test/test.loggroup.ts @@ -1,10 +1,30 @@ import { expect, haveResource, matchTemplate } from '@aws-cdk/assert'; import * as iam from '@aws-cdk/aws-iam'; +import * as kms from '@aws-cdk/aws-kms'; import { CfnParameter, RemovalPolicy, Stack } from '@aws-cdk/core'; import { Test } from 'nodeunit'; import { LogGroup, RetentionDays } from '../lib'; export = { + 'set kms key when provided'(test: Test) { + // GIVEN + const stack = new Stack(); + const encryptionKey = new kms.Key(stack, 'Key'); + + // WHEN + new LogGroup(stack, 'LogGroup', { + encryptionKey, + }); + + // THEN + expect(stack).to(haveResource('AWS::Logs::LogGroup', { + KmsKeyId: { 'Fn::GetAtt': ['Key961B73FD', 'Arn'] }, + + })); + + test.done(); + }, + 'fixed retention'(test: Test) { // GIVEN const stack = new Stack(); @@ -326,4 +346,4 @@ function dataDrivenTests(cases: any[][], body: (test: Test, ...args: any[]) => v }; } return ret; -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-mediapackage/.eslintrc.js b/packages/@aws-cdk/aws-mediapackage/.eslintrc.js new file mode 100644 index 0000000000000..61dd8dd001f63 --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/.eslintrc.js @@ -0,0 +1,3 @@ +const baseConfig = require('cdk-build-tools/config/eslintrc'); +baseConfig.parserOptions.project = __dirname + '/tsconfig.json'; +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-mediapackage/.gitignore b/packages/@aws-cdk/aws-mediapackage/.gitignore new file mode 100644 index 0000000000000..62ebc95d75ce6 --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/.gitignore @@ -0,0 +1,19 @@ +*.js +*.js.map +*.d.ts +tsconfig.json +node_modules +*.generated.ts +dist +.jsii + +.LAST_BUILD +.nyc_output +coverage +.nycrc +.LAST_PACKAGE +*.snk +nyc.config.js +!.eslintrc.js +!jest.config.js +junit.xml diff --git a/packages/@aws-cdk/aws-mediapackage/.npmignore b/packages/@aws-cdk/aws-mediapackage/.npmignore new file mode 100644 index 0000000000000..e4486030fcb17 --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/.npmignore @@ -0,0 +1,28 @@ +# Don't include original .ts files when doing `npm pack` +*.ts +!*.d.ts +coverage +.nyc_output +*.tgz + +dist +.LAST_PACKAGE +.LAST_BUILD +!*.js + +# Include .jsii +!.jsii + +*.snk + +*.tsbuildinfo + +tsconfig.json + +.eslintrc.js +jest.config.js + +# exclude cdk artifacts +**/cdk.out +junit.xml +test/ diff --git a/packages/@aws-cdk/aws-mediapackage/LICENSE b/packages/@aws-cdk/aws-mediapackage/LICENSE new file mode 100644 index 0000000000000..b71ec1688783a --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/@aws-cdk/aws-mediapackage/NOTICE b/packages/@aws-cdk/aws-mediapackage/NOTICE new file mode 100644 index 0000000000000..bfccac9a7f69c --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/NOTICE @@ -0,0 +1,2 @@ +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/packages/@aws-cdk/aws-mediapackage/README.md b/packages/@aws-cdk/aws-mediapackage/README.md new file mode 100644 index 0000000000000..11d84261af563 --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/README.md @@ -0,0 +1,16 @@ +## AWS::MediaPackage Construct Library + +--- + +![cfn-resources: Stable](https://img.shields.io/badge/cfn--resources-stable-success.svg?style=for-the-badge) + +> All classes with the `Cfn` prefix in this module ([CFN Resources](https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_lib)) are always stable and safe to use. + +--- + + +This module is part of the [AWS Cloud Development Kit](https://github.com/aws/aws-cdk) project. + +```ts +import mediapackage = require('@aws-cdk/aws-mediapackage'); +``` diff --git a/packages/@aws-cdk/aws-mediapackage/jest.config.js b/packages/@aws-cdk/aws-mediapackage/jest.config.js new file mode 100644 index 0000000000000..54e28beb9798b --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/jest.config.js @@ -0,0 +1,2 @@ +const baseConfig = require('cdk-build-tools/config/jest.config'); +module.exports = baseConfig; diff --git a/packages/@aws-cdk/aws-mediapackage/lib/index.ts b/packages/@aws-cdk/aws-mediapackage/lib/index.ts new file mode 100644 index 0000000000000..730abc4ac52fc --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/lib/index.ts @@ -0,0 +1,2 @@ +// AWS::MediaPackage CloudFormation Resources: +export * from './mediapackage.generated'; diff --git a/packages/@aws-cdk/aws-mediapackage/package.json b/packages/@aws-cdk/aws-mediapackage/package.json new file mode 100644 index 0000000000000..c3561ae1027bf --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/package.json @@ -0,0 +1,96 @@ +{ + "name": "@aws-cdk/aws-mediapackage", + "version": "0.0.0", + "description": "The CDK Construct Library for AWS::MediaPackage", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "jsii": { + "outdir": "dist", + "projectReferences": true, + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaPackage", + "packageId": "Amazon.CDK.AWS.MediaPackage", + "signAssembly": true, + "assemblyOriginatorKeyFile": "../../key.snk", + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png" + }, + "java": { + "package": "software.amazon.awscdk.services.mediapackage", + "maven": { + "groupId": "software.amazon.awscdk", + "artifactId": "mediapackage" + } + }, + "python": { + "classifiers": [ + "Framework :: AWS CDK", + "Framework :: AWS CDK :: 1" + ], + "distName": "aws-cdk.aws-mediapackage", + "module": "aws_cdk.aws_mediapackage" + } + } + }, + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-cdk.git", + "directory": "packages/@aws-cdk/aws-mediapackage" + }, + "homepage": "https://github.com/aws/aws-cdk", + "scripts": { + "build": "cdk-build", + "watch": "cdk-watch", + "lint": "cdk-lint", + "test": "cdk-test", + "integ": "cdk-integ", + "pkglint": "pkglint -f", + "package": "cdk-package", + "awslint": "cdk-awslint", + "cfn2ts": "cfn2ts", + "build+test+package": "npm run build+test && npm run package", + "build+test": "npm run build && npm test", + "compat": "cdk-compat", + "gen": "cfn2ts" + }, + "cdk-build": { + "cloudformation": "AWS::MediaPackage", + "jest": true, + "env": { + "AWSLINT_BASE_CONSTRUCT": "true" + } + }, + "keywords": [ + "aws", + "cdk", + "constructs", + "AWS::MediaPackage", + "aws-mediapackage" + ], + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "devDependencies": { + "@aws-cdk/assert": "0.0.0", + "cdk-build-tools": "0.0.0", + "cfn2ts": "0.0.0", + "pkglint": "0.0.0" + }, + "dependencies": { + "@aws-cdk/core": "0.0.0" + }, + "peerDependencies": { + "@aws-cdk/core": "0.0.0" + }, + "engines": { + "node": ">= 10.13.0 <13 || >=13.7.0" + }, + "stability": "experimental", + "maturity": "cfn-only", + "awscdkio": { + "announce": false + } +} diff --git a/packages/@aws-cdk/aws-mediapackage/test/mediapackage.test.ts b/packages/@aws-cdk/aws-mediapackage/test/mediapackage.test.ts new file mode 100644 index 0000000000000..e394ef336bfb4 --- /dev/null +++ b/packages/@aws-cdk/aws-mediapackage/test/mediapackage.test.ts @@ -0,0 +1,6 @@ +import '@aws-cdk/assert/jest'; +import {} from '../lib'; + +test('No tests are specified for this package', () => { + expect(true).toBe(true); +}); diff --git a/packages/@aws-cdk/aws-route53/package.json b/packages/@aws-cdk/aws-route53/package.json index c2ae9cfcb68b6..301fee1bba9fe 100644 --- a/packages/@aws-cdk/aws-route53/package.json +++ b/packages/@aws-cdk/aws-route53/package.json @@ -73,7 +73,7 @@ "devDependencies": { "@aws-cdk/assert": "0.0.0", "@types/nodeunit": "^0.0.31", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-sqs/package.json b/packages/@aws-cdk/aws-sqs/package.json index f1a5ee11d78bb..0a88a1730515f 100644 --- a/packages/@aws-cdk/aws-sqs/package.json +++ b/packages/@aws-cdk/aws-sqs/package.json @@ -74,7 +74,7 @@ "@aws-cdk/assert": "0.0.0", "@aws-cdk/aws-s3": "0.0.0", "@types/nodeunit": "^0.0.31", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", "cfn2ts": "0.0.0", diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/athena/start-query-execution.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/athena/start-query-execution.ts index 50dc1b03a24bc..893bb55af6b02 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/lib/athena/start-query-execution.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/lib/athena/start-query-execution.ts @@ -157,7 +157,7 @@ export class AthenaStartQueryExecution extends sfn.TaskStateBase { }), cdk.Stack.of(this).formatArn({ service: 'glue', - resource: 'userdefinedfunction', + resource: 'userDefinedFunction', resourceName: (this.props.queryExecutionContext?.databaseName ?? 'default') + '/*', // grant access to get all user defined functions for the particular database in the request or the default database https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awsglue.html }), ], @@ -167,6 +167,17 @@ export class AthenaStartQueryExecution extends sfn.TaskStateBase { return policyStatements; } + private renderEncryption(): any { + const encryptionConfiguration = this.props.resultConfiguration?.encryptionConfiguration !== undefined + ? { + EncryptionOption: this.props.resultConfiguration.encryptionConfiguration.encryptionOption, + KmsKey: this.props.resultConfiguration.encryptionConfiguration.encryptionKey, + } + : undefined; + + return encryptionConfiguration; + } + /** * Provides the Athena start query execution service integration task configuration */ @@ -185,10 +196,7 @@ export class AthenaStartQueryExecution extends sfn.TaskStateBase { Database: this.props.queryExecutionContext?.databaseName, }, ResultConfiguration: { - EncryptionConfiguration: { - EncryptionOption: this.props.resultConfiguration?.encryptionConfiguration?.encryptionOption, - KmsKey: this.props.resultConfiguration?.encryptionConfiguration?.encryptionKey, - }, + EncryptionConfiguration: this.renderEncryption(), OutputLocation: `s3://${this.props.resultConfiguration?.outputLocation?.bucketName}/${this.props.resultConfiguration?.outputLocation?.objectKey}/`, }, WorkGroup: this.props.workGroup, @@ -205,10 +213,7 @@ export class AthenaStartQueryExecution extends sfn.TaskStateBase { Database: this.props.queryExecutionContext?.databaseName, }, ResultConfiguration: { - EncryptionConfiguration: { - EncryptionOption: this.props.resultConfiguration?.encryptionConfiguration?.encryptionOption, - KmsKey: this.props.resultConfiguration?.encryptionConfiguration?.encryptionKey, - }, + EncryptionConfiguration: this.renderEncryption(), }, WorkGroup: this.props.workGroup, }), diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-execution.expected.json b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-execution.expected.json index 07442708a7080..2e06603d20af1 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-execution.expected.json +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-execution.expected.json @@ -89,7 +89,7 @@ "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObject" - ], + ], "Effect": "Allow", "Resource": "*" }, @@ -208,7 +208,7 @@ { "Ref": "AWS::AccountId" }, - ":userdefinedfunction/mydatabase/*" + ":userDefinedFunction/mydatabase/*" ] ] } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-results.expected.json b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-results.expected.json index b11ec6cee2c3a..444c2edcf72de 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-results.expected.json +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.get-query-results.expected.json @@ -89,7 +89,7 @@ "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObject" - ], + ], "Effect": "Allow", "Resource": "*" }, @@ -208,7 +208,7 @@ { "Ref": "AWS::AccountId" }, - ":userdefinedfunction/mydatabase/*" + ":userDefinedFunction/mydatabase/*" ] ] } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.start-query-execution.expected.json b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.start-query-execution.expected.json index 200fc56302b66..fb4d0e0169f51 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.start-query-execution.expected.json +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.start-query-execution.expected.json @@ -89,7 +89,7 @@ "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObject" - ], + ], "Effect": "Allow", "Resource": "*" }, @@ -208,7 +208,7 @@ { "Ref": "AWS::AccountId" }, - ":userdefinedfunction/mydatabase/*" + ":userDefinedFunction/mydatabase/*" ] ] } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.stop-query-execution.expected.json b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.stop-query-execution.expected.json index a25e8d93b5bba..aa90bd274d85f 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.stop-query-execution.expected.json +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/integ.stop-query-execution.expected.json @@ -89,7 +89,7 @@ "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObject" - ], + ], "Effect": "Allow", "Resource": "*" }, @@ -208,7 +208,7 @@ { "Ref": "AWS::AccountId" }, - ":userdefinedfunction/mydatabase/*" + ":userDefinedFunction/mydatabase/*" ] ] } diff --git a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/start-query-execution.test.ts b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/start-query-execution.test.ts index c96e4356c7a11..5742872286167 100644 --- a/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/start-query-execution.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions-tasks/test/athena/start-query-execution.test.ts @@ -101,4 +101,56 @@ describe('Start Query Execution', () => { }, }); }); + + test('no encryptionConfiguration', () => { + // GIVEN + const stack = new cdk.Stack(); + + // WHEN + const task = new AthenaStartQueryExecution(stack, 'Query', { + queryString: 'CREATE DATABASE database', + clientRequestToken: 'unique-client-request-token', + queryExecutionContext: { + databaseName: 'mydatabase', + catalogName: 'AwsDataCatalog', + }, + resultConfiguration: { + outputLocation: { + bucketName: 'query-results-bucket', + objectKey: 'folder', + }, + }, + workGroup: 'primary', + }); + + // THEN + expect(stack.resolve(task.toStateJson())).toEqual({ + Type: 'Task', + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':states:::athena:startQueryExecution', + ], + ], + }, + End: true, + Parameters: { + QueryString: 'CREATE DATABASE database', + ClientRequestToken: 'unique-client-request-token', + QueryExecutionContext: { + Database: 'mydatabase', + Catalog: 'AwsDataCatalog', + }, + ResultConfiguration: { + OutputLocation: 's3://query-results-bucket/folder/', + }, + WorkGroup: 'primary', + }, + }); + }); }); diff --git a/packages/@aws-cdk/cfnspec/CHANGELOG.md b/packages/@aws-cdk/cfnspec/CHANGELOG.md index 80dcd61c194ee..8a871d71fe7ce 100644 --- a/packages/@aws-cdk/cfnspec/CHANGELOG.md +++ b/packages/@aws-cdk/cfnspec/CHANGELOG.md @@ -1,3 +1,195 @@ +# CloudFormation Resource Specification v20.2.0 + +## New Resource Types + +* AWS::CloudWatch::MetricStream +* AWS::Events::Archive +* AWS::IoT::DomainConfiguration +* AWS::RDS::GlobalCluster + +## Attribute Changes + + +## Property Changes + +* AWS::CodeArtifact::Domain Tags (__added__) +* AWS::CodeArtifact::Repository Tags (__added__) +* AWS::Kendra::DataSource DataSourceConfiguration.Required (__changed__) + * Old: true + * New: false +* AWS::Kendra::DataSource RoleArn.Required (__changed__) + * Old: true + * New: false +* AWS::S3::Bucket IntelligentTieringConfigurations (__added__) +* AWS::S3::Bucket OwnershipControls (__added__) +* AWS::SecretsManager::ResourcePolicy BlockPublicPolicy (__added__) + +## Property Type Changes + +* AWS::Batch::JobDefinition.EvaluateOnExit (__added__) +* AWS::S3::Bucket.IntelligentTieringConfiguration (__added__) +* AWS::S3::Bucket.OwnershipControls (__added__) +* AWS::S3::Bucket.OwnershipControlsRule (__added__) +* AWS::S3::Bucket.Tiering (__added__) +* AWS::Batch::JobDefinition.RetryStrategy EvaluateOnExit (__added__) +* AWS::EC2::LaunchTemplate.CapacityReservationTarget CapacityReservationResourceGroupArn (__added__) +* AWS::EC2::LaunchTemplate.NetworkInterface AssociateCarrierIpAddress (__added__) +* AWS::EC2::LaunchTemplate.NetworkInterface NetworkCardIndex (__added__) +* AWS::Kendra::DataSource.S3DataSourceConfiguration InclusionPatterns (__added__) + + +# CloudFormation Resource Specification v20.0.0 + +## New Resource Types + +* AWS::IVS::Channel +* AWS::IVS::PlaybackKeyPair +* AWS::IVS::StreamKey +* AWS::IoTSiteWise::Asset +* AWS::IoTSiteWise::AssetModel +* AWS::IoTSiteWise::Gateway +* AWS::MediaPackage::Asset +* AWS::MediaPackage::Channel +* AWS::MediaPackage::OriginEndpoint +* AWS::MediaPackage::PackagingConfiguration +* AWS::MediaPackage::PackagingGroup + +## Attribute Changes + +* AWS::AutoScaling::AutoScalingGroup LaunchConfigurationName (__added__) +* AWS::AutoScaling::AutoScalingGroup LaunchTemplateSpecification (__added__) +* AWS::AutoScaling::AutoScalingGroup MixedInstancesPolicy (__added__) +* AWS::AutoScaling::AutoScalingGroup PlacementGroup (__added__) +* AWS::AutoScaling::AutoScalingGroup VPCZoneIdentifier (__added__) +* AWS::EC2::Subnet OutpostArn (__added__) + +## Property Changes + +* AWS::AmazonMQ::Broker LdapMetadata (__deleted__) +* AWS::AppSync::ApiKey ApiKeyId (__added__) +* AWS::AppSync::FunctionConfiguration SyncConfig (__added__) +* AWS::Athena::NamedQuery WorkGroup (__added__) +* AWS::AutoScaling::AutoScalingGroup CapacityRebalance (__added__) +* AWS::AutoScaling::LaunchConfiguration MetadataOptions (__added__) +* AWS::Batch::ComputeEnvironment Tags (__added__) +* AWS::Batch::JobDefinition Tags (__added__) +* AWS::Batch::JobQueue Tags (__added__) +* AWS::EC2::ClientVpnEndpoint SelfServicePortal (__added__) +* AWS::EC2::Route CarrierGatewayId (__added__) +* AWS::EC2::Route LocalGatewayId (__added__) +* AWS::EC2::Route VpcEndpointId (__added__) +* AWS::EC2::Subnet OutpostArn (__added__) +* AWS::EC2::VPCEndpointService ApplianceLoadBalancerArns (__deleted__) +* AWS::EMR::Cluster LogEncryptionKmsKeyId (__added__) +* AWS::EMR::Cluster ManagedScalingPolicy (__added__) +* AWS::EMR::Cluster StepConcurrencyLevel (__added__) +* AWS::ElastiCache::ReplicationGroup GlobalReplicationGroupId (__added__) +* AWS::ElastiCache::ReplicationGroup MultiAZEnabled.UpdateType (__changed__) + * Old: Immutable + * New: Mutable +* AWS::ElasticLoadBalancingV2::Listener Port.Required (__changed__) + * Old: true + * New: false +* AWS::ElasticLoadBalancingV2::Listener Protocol.Required (__changed__) + * Old: true + * New: false +* AWS::ElasticLoadBalancingV2::LoadBalancer SubnetMappings.UpdateType (__changed__) + * Old: Immutable + * New: Mutable +* AWS::GameLift::MatchmakingConfiguration FlexMatchMode (__added__) +* AWS::GameLift::MatchmakingConfiguration GameSessionQueueArns.Required (__changed__) + * Old: true + * New: false +* AWS::GlobalAccelerator::EndpointGroup PortOverrides (__added__) +* AWS::KinesisFirehose::DeliveryStream DeliveryStreamEncryptionConfigurationInput (__added__) +* AWS::KinesisFirehose::DeliveryStream Tags (__added__) +* AWS::KinesisFirehose::DeliveryStream KinesisStreamSourceConfiguration.UpdateType (__changed__) + * Old: Mutable + * New: Immutable +* AWS::LakeFormation::DataLakeSettings TrustedResourceOwners (__added__) +* AWS::Lambda::EventSourceMapping Queues (__added__) +* AWS::Lambda::EventSourceMapping SourceAccessConfigurations (__added__) +* AWS::Logs::LogGroup KmsKeyId (__added__) +* AWS::Logs::LogGroup LogGroupName.Documentation (__changed__) + * Old: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-cwl-loggroup-loggroupname + * New: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-loggroupname +* AWS::Logs::LogGroup RetentionInDays.Documentation (__changed__) + * Old: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-cwl-loggroup-retentionindays + * New: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-retentionindays +* AWS::RDS::DBCluster GlobalClusterIdentifier (__added__) +* AWS::RDS::DBCluster Engine.UpdateType (__changed__) + * Old: Immutable + * New: Conditional +* AWS::RDS::DBCluster EngineVersion.UpdateType (__changed__) + * Old: Immutable + * New: Mutable +* AWS::RDS::DBInstance Engine.UpdateType (__changed__) + * Old: Immutable + * New: Conditional +* AWS::SNS::Subscription SubscriptionRoleArn (__added__) +* AWS::SNS::Topic FifoTopic (__added__) + +## Property Type Changes + +* AWS::AmazonMQ::Broker.InterBrokerCred (__removed__) +* AWS::AmazonMQ::Broker.LdapMetadata (__removed__) +* AWS::AmazonMQ::Broker.ServerMetadata (__removed__) +* AWS::AppSync::FunctionConfiguration.LambdaConflictHandlerConfig (__added__) +* AWS::AppSync::FunctionConfiguration.SyncConfig (__added__) +* AWS::AutoScaling::LaunchConfiguration.MetadataOption (__added__) +* AWS::CloudFront::Distribution.OriginShield (__added__) +* AWS::EMR::Cluster.ComputeLimits (__added__) +* AWS::EMR::Cluster.ManagedScalingPolicy (__added__) +* AWS::EMR::Cluster.OnDemandProvisioningSpecification (__added__) +* AWS::EMR::InstanceFleetConfig.OnDemandProvisioningSpecification (__added__) +* AWS::Events::Rule.DeadLetterConfig (__added__) +* AWS::Events::Rule.RedshiftDataParameters (__added__) +* AWS::Events::Rule.RetryPolicy (__added__) +* AWS::GlobalAccelerator::EndpointGroup.PortOverride (__added__) +* AWS::KinesisFirehose::DeliveryStream.DeliveryStreamEncryptionConfigurationInput (__added__) +* AWS::Lambda::EventSourceMapping.SourceAccessConfiguration (__added__) +* AWS::SageMaker::Model.ImageConfig (__added__) +* AWS::Transfer::Server.SecurityGroupId (__added__) +* AWS::AutoScaling::AutoScalingGroup.LaunchTemplateOverrides LaunchTemplateSpecification (__added__) +* AWS::CloudFront::Distribution.Origin OriginShield (__added__) +* AWS::DLM::LifecyclePolicy.Parameters NoReboot (__added__) +* AWS::EC2::ClientVpnEndpoint.FederatedAuthenticationRequest SelfServiceSAMLProviderArn (__added__) +* AWS::EMR::Cluster.InstanceFleetProvisioningSpecifications OnDemandSpecification (__added__) +* AWS::EMR::Cluster.InstanceFleetProvisioningSpecifications SpotSpecification.Required (__changed__) + * Old: true + * New: false +* AWS::EMR::Cluster.SpotProvisioningSpecification AllocationStrategy (__added__) +* AWS::EMR::InstanceFleetConfig.InstanceFleetProvisioningSpecifications OnDemandSpecification (__added__) +* AWS::EMR::InstanceFleetConfig.InstanceFleetProvisioningSpecifications SpotSpecification.Required (__changed__) + * Old: true + * New: false +* AWS::EMR::InstanceFleetConfig.SpotProvisioningSpecification AllocationStrategy (__added__) +* AWS::ElasticLoadBalancingV2::LoadBalancer.SubnetMapping IPv6Address (__added__) +* AWS::ElasticLoadBalancingV2::TargetGroup.Matcher HttpCode.Required (__changed__) + * Old: true + * New: false +* AWS::Elasticsearch::Domain.ElasticsearchClusterConfig WarmCount (__added__) +* AWS::Elasticsearch::Domain.ElasticsearchClusterConfig WarmEnabled (__added__) +* AWS::Elasticsearch::Domain.ElasticsearchClusterConfig WarmType (__added__) +* AWS::Events::Rule.Target DeadLetterConfig (__added__) +* AWS::Events::Rule.Target RedshiftDataParameters (__added__) +* AWS::Events::Rule.Target RetryPolicy (__added__) +* AWS::KinesisFirehose::DeliveryStream.KinesisStreamSourceConfiguration KinesisStreamARN.UpdateType (__changed__) + * Old: Mutable + * New: Immutable +* AWS::KinesisFirehose::DeliveryStream.KinesisStreamSourceConfiguration RoleARN.UpdateType (__changed__) + * Old: Mutable + * New: Immutable +* AWS::S3::Bucket.Metrics EventThreshold.Required (__changed__) + * Old: true + * New: false +* AWS::S3::Bucket.SourceSelectionCriteria SseKmsEncryptedObjects.Required (__changed__) + * Old: true + * New: false +* AWS::SageMaker::Model.ContainerDefinition ImageConfig (__added__) +* AWS::Transfer::Server.EndpointDetails SecurityGroupIds (__added__) + + # CloudFormation Resource Specification v18.7.0 ## New Resource Types diff --git a/packages/@aws-cdk/cfnspec/build-tools/create-missing-libraries.ts b/packages/@aws-cdk/cfnspec/build-tools/create-missing-libraries.ts index 2bf2b707b6a09..55863ee5f8e13 100644 --- a/packages/@aws-cdk/cfnspec/build-tools/create-missing-libraries.ts +++ b/packages/@aws-cdk/cfnspec/build-tools/create-missing-libraries.ts @@ -298,19 +298,31 @@ async function main() { await fs.copy(path.join(templateDir, file), path.join(packagePath, file)); } - // update decdk - const decdkPkgJsonPath = path.join(__dirname, '..', '..', '..', 'decdk', 'package.json'); - const decdkPkg = JSON.parse(await fs.readFile(decdkPkgJsonPath, 'utf8')); + await addDependencyToMegaPackage(path.join('@aws-cdk', 'cloudformation-include'), packageName, version, ['dependencies', 'peerDependencies']); + await addDependencyToMegaPackage('aws-cdk-lib', packageName, version, ['devDependencies']); + await addDependencyToMegaPackage('monocdk', packageName, version, ['devDependencies']); + await addDependencyToMegaPackage('decdk', packageName, version, ['dependencies']); + } +} + +/** + * A few of our packages (e.g., decdk, aws-cdk-lib) require a dependency on every service package. + * This automates adding the dependency (and peer dependency) to the package.json. + */ +async function addDependencyToMegaPackage(megaPackageName: string, packageName: string, version: string, dependencyTypes: string[]) { + const packageJsonPath = path.join(__dirname, '..', '..', '..', megaPackageName, 'package.json'); + const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); + dependencyTypes.forEach(dependencyType => { const unorderedDeps = { - ...decdkPkg.dependencies, + ...packageJson[dependencyType], [packageName]: version, }; - decdkPkg.dependencies = {}; + packageJson[dependencyType] = {}; Object.keys(unorderedDeps).sort().forEach(k => { - decdkPkg.dependencies[k] = unorderedDeps[k]; + packageJson[dependencyType][k] = unorderedDeps[k]; }); - await fs.writeFile(decdkPkgJsonPath, JSON.stringify(decdkPkg, null, 2) + '\n'); - } + }); + await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n'); } main().catch(e => { diff --git a/packages/@aws-cdk/cfnspec/cfn.version b/packages/@aws-cdk/cfnspec/cfn.version index fb67e3d517039..86d4688d0910a 100644 --- a/packages/@aws-cdk/cfnspec/cfn.version +++ b/packages/@aws-cdk/cfnspec/cfn.version @@ -1 +1 @@ -18.7.0 +20.2.0 diff --git a/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json b/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json index a118251db1d89..e9a8d24f35f4f 100644 --- a/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json +++ b/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json @@ -236,41 +236,6 @@ } } }, - "AWS::AmazonMQ::Broker.InterBrokerCred": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-interbrokercred.html", - "Properties": { - "Password": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-interbrokercred.html#cfn-amazonmq-broker-interbrokercred-password", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "Username": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-interbrokercred.html#cfn-amazonmq-broker-interbrokercred-username", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - } - } - }, - "AWS::AmazonMQ::Broker.LdapMetadata": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapmetadata.html", - "Properties": { - "InterBrokerCreds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapmetadata.html#cfn-amazonmq-broker-ldapmetadata-interbrokercreds", - "ItemType": "InterBrokerCred", - "Required": false, - "Type": "List", - "UpdateType": "Mutable" - }, - "ServerMetadata": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapmetadata.html#cfn-amazonmq-broker-ldapmetadata-servermetadata", - "Required": true, - "Type": "ServerMetadata", - "UpdateType": "Mutable" - } - } - }, "AWS::AmazonMQ::Broker.LdapServerMetadata": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html", "Properties": { @@ -383,78 +348,6 @@ } } }, - "AWS::AmazonMQ::Broker.ServerMetadata": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html", - "Properties": { - "Hosts": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-hosts", - "PrimitiveItemType": "String", - "Required": true, - "Type": "List", - "UpdateType": "Mutable" - }, - "RoleBase": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-rolebase", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "RoleName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-rolename", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" - }, - "RoleSearchMatching": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-rolesearchmatching", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "RoleSearchSubtree": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-rolesearchsubtree", - "PrimitiveType": "Boolean", - "Required": false, - "UpdateType": "Mutable" - }, - "ServiceAccountPassword": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-serviceaccountpassword", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "ServiceAccountUsername": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-serviceaccountusername", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "UserBase": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-userbase", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "UserRoleName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-userrolename", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" - }, - "UserSearchMatching": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-usersearchmatching", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" - }, - "UserSearchSubtree": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-servermetadata.html#cfn-amazonmq-broker-servermetadata-usersearchsubtree", - "PrimitiveType": "Boolean", - "Required": false, - "UpdateType": "Mutable" - } - } - }, "AWS::AmazonMQ::Broker.TagsEntry": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-tagsentry.html", "Properties": { @@ -5284,6 +5177,40 @@ } } }, + "AWS::AppSync::FunctionConfiguration.LambdaConflictHandlerConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-lambdaconflicthandlerconfig.html", + "Properties": { + "LambdaConflictHandlerArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-lambdaconflicthandlerconfig.html#cfn-appsync-functionconfiguration-lambdaconflicthandlerconfig-lambdaconflicthandlerarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::AppSync::FunctionConfiguration.SyncConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html", + "Properties": { + "ConflictDetection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-conflictdetection", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "ConflictHandler": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-conflicthandler", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "LambdaConflictHandlerConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-lambdaconflicthandlerconfig", + "Required": false, + "Type": "LambdaConflictHandlerConfig", + "UpdateType": "Mutable" + } + } + }, "AWS::AppSync::GraphQLApi.AdditionalAuthenticationProvider": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html", "Properties": { @@ -6255,6 +6182,12 @@ "Required": false, "UpdateType": "Mutable" }, + "LaunchTemplateSpecification": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-launchtemplatespecification", + "Required": false, + "Type": "LaunchTemplateSpecification", + "UpdateType": "Mutable" + }, "WeightedCapacity": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-weightedcapacity", "PrimitiveType": "String", @@ -6481,6 +6414,29 @@ } } }, + "AWS::AutoScaling::LaunchConfiguration.MetadataOption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoption.html", + "Properties": { + "HttpEndpoint": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoption.html#cfn-autoscaling-launchconfig-metadataoption-httpendpoint", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "HttpPutResponseHopLimit": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoption.html#cfn-autoscaling-launchconfig-metadataoption-httpputresponsehoplimit", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "HttpTokens": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoption.html#cfn-autoscaling-launchconfig-metadataoption-httptokens", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::AutoScaling::ScalingPolicy.CustomizedMetricSpecification": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html", "Properties": { @@ -7390,6 +7346,35 @@ } } }, + "AWS::Batch::JobDefinition.EvaluateOnExit": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html", + "Properties": { + "Action": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-action", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "OnExitCode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onexitcode", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "OnReason": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onreason", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "OnStatusReason": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onstatusreason", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::Batch::JobDefinition.LinuxParameters": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html", "Properties": { @@ -7546,6 +7531,13 @@ "PrimitiveType": "Integer", "Required": false, "UpdateType": "Mutable" + }, + "EvaluateOnExit": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-retrystrategy.html#cfn-batch-jobdefinition-retrystrategy-evaluateonexit", + "ItemType": "EvaluateOnExit", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" } } }, @@ -8812,6 +8804,12 @@ "Required": false, "UpdateType": "Mutable" }, + "OriginShield": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-originshield", + "Required": false, + "Type": "OriginShield", + "UpdateType": "Mutable" + }, "S3OriginConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-s3originconfig", "Required": false, @@ -8918,6 +8916,23 @@ } } }, + "AWS::CloudFront::Distribution.OriginShield": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html", + "Properties": { + "Enabled": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html#cfn-cloudfront-distribution-originshield-enabled", + "PrimitiveType": "Boolean", + "Required": true, + "UpdateType": "Mutable" + }, + "OriginShieldRegion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html#cfn-cloudfront-distribution-originshield-originshieldregion", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::CloudFront::Distribution.Restrictions": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-restrictions.html", "Properties": { @@ -9440,6 +9455,17 @@ "Type": "List", "UpdateType": "Mutable" }, + "AWS::CloudWatch::MetricStream.MetricStreamFilter": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html", + "Properties": { + "Namespace": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html#cfn-cloudwatch-metricstream-metricstreamfilter-namespace", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::CodeBuild::Project.Artifacts": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html", "Properties": { @@ -12194,6 +12220,12 @@ "PrimitiveType": "Boolean", "Required": false, "UpdateType": "Mutable" + }, + "NoReboot": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-parameters.html#cfn-dlm-lifecyclepolicy-parameters-noreboot", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" } } }, @@ -13016,6 +13048,12 @@ "PrimitiveType": "String", "Required": true, "UpdateType": "Mutable" + }, + "SelfServiceSAMLProviderArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-selfservicesamlproviderarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" } } }, @@ -13725,6 +13763,12 @@ "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" + }, + "CapacityReservationResourceGroupArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationresourcegrouparn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" } } }, @@ -14104,6 +14148,12 @@ "AWS::EC2::LaunchTemplate.NetworkInterface": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html", "Properties": { + "AssociateCarrierIpAddress": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatecarrieripaddress", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, "AssociatePublicIpAddress": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatepublicipaddress", "PrimitiveType": "Boolean", @@ -14154,6 +14204,12 @@ "Type": "List", "UpdateType": "Mutable" }, + "NetworkCardIndex": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkcardindex", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, "NetworkInterfaceId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkinterfaceid", "PrimitiveType": "String", @@ -16824,6 +16880,41 @@ } } }, + "AWS::EMR::Cluster.ComputeLimits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html", + "Properties": { + "MaximumCapacityUnits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumcapacityunits", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + }, + "MaximumCoreCapacityUnits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumcorecapacityunits", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MaximumOnDemandCapacityUnits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumondemandcapacityunits", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinimumCapacityUnits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-minimumcapacityunits", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + }, + "UnitType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-unittype", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::EMR::Cluster.Configuration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-configuration.html", "Properties": { @@ -16960,9 +17051,15 @@ "AWS::EMR::Cluster.InstanceFleetProvisioningSpecifications": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html", "Properties": { + "OnDemandSpecification": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-cluster-instancefleetprovisioningspecifications-ondemandspecification", + "Required": false, + "Type": "OnDemandProvisioningSpecification", + "UpdateType": "Mutable" + }, "SpotSpecification": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-cluster-instancefleetprovisioningspecifications-spotspecification", - "Required": true, + "Required": false, "Type": "SpotProvisioningSpecification", "UpdateType": "Mutable" } @@ -17225,6 +17322,17 @@ } } }, + "AWS::EMR::Cluster.ManagedScalingPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-managedscalingpolicy.html", + "Properties": { + "ComputeLimits": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-managedscalingpolicy.html#cfn-elasticmapreduce-cluster-managedscalingpolicy-computelimits", + "Required": false, + "Type": "ComputeLimits", + "UpdateType": "Mutable" + } + } + }, "AWS::EMR::Cluster.MetricDimension": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-metricdimension.html", "Properties": { @@ -17242,6 +17350,17 @@ } } }, + "AWS::EMR::Cluster.OnDemandProvisioningSpecification": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ondemandprovisioningspecification.html", + "Properties": { + "AllocationStrategy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ondemandprovisioningspecification.html#cfn-elasticmapreduce-cluster-ondemandprovisioningspecification-allocationstrategy", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::EMR::Cluster.PlacementType": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-placementtype.html", "Properties": { @@ -17372,6 +17491,12 @@ "AWS::EMR::Cluster.SpotProvisioningSpecification": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html", "Properties": { + "AllocationStrategy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-allocationstrategy", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "BlockDurationMinutes": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-blockdurationminutes", "PrimitiveType": "Integer", @@ -17504,9 +17629,15 @@ "AWS::EMR::InstanceFleetConfig.InstanceFleetProvisioningSpecifications": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html", "Properties": { + "OnDemandSpecification": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications-ondemandspecification", + "Required": false, + "Type": "OnDemandProvisioningSpecification", + "UpdateType": "Mutable" + }, "SpotSpecification": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications-spotspecification", - "Required": true, + "Required": false, "Type": "SpotProvisioningSpecification", "UpdateType": "Mutable" } @@ -17555,9 +17686,26 @@ } } }, + "AWS::EMR::InstanceFleetConfig.OnDemandProvisioningSpecification": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification.html", + "Properties": { + "AllocationStrategy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification-allocationstrategy", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::EMR::InstanceFleetConfig.SpotProvisioningSpecification": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html", "Properties": { + "AllocationStrategy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-allocationstrategy", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "BlockDurationMinutes": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-blockdurationminutes", "PrimitiveType": "Integer", @@ -19173,6 +19321,12 @@ "Required": false, "UpdateType": "Mutable" }, + "IPv6Address": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-ipv6address", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "PrivateIPv4Address": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-privateipv4address", "PrimitiveType": "String", @@ -19193,7 +19347,7 @@ "HttpCode": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-matcher.html#cfn-elasticloadbalancingv2-targetgroup-matcher-httpcode", "PrimitiveType": "String", - "Required": true, + "Required": false, "UpdateType": "Mutable" } } @@ -19369,6 +19523,24 @@ "Required": false, "UpdateType": "Mutable" }, + "WarmCount": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmcount", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "WarmEnabled": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmenabled", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "WarmType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmtype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "ZoneAwarenessConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-zoneawarenessconfig", "Required": false, @@ -19646,6 +19818,17 @@ } } }, + "AWS::Events::Rule.DeadLetterConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-deadletterconfig.html", + "Properties": { + "Arn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-deadletterconfig.html#cfn-events-rule-deadletterconfig-arn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::Events::Rule.EcsParameters": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html", "Properties": { @@ -19757,6 +19940,64 @@ } } }, + "AWS::Events::Rule.RedshiftDataParameters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html", + "Properties": { + "Database": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-database", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "DbUser": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-dbuser", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "SecretManagerArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-secretmanagerarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Sql": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-sql", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "StatementName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-statementname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "WithEvent": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-withevent", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::Events::Rule.RetryPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html", + "Properties": { + "MaximumEventAgeInSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html#cfn-events-rule-retrypolicy-maximumeventageinseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MaximumRetryAttempts": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html#cfn-events-rule-retrypolicy-maximumretryattempts", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::Events::Rule.RunCommandParameters": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandparameters.html", "Properties": { @@ -19815,6 +20056,12 @@ "Type": "BatchParameters", "UpdateType": "Mutable" }, + "DeadLetterConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-deadletterconfig", + "Required": false, + "Type": "DeadLetterConfig", + "UpdateType": "Mutable" + }, "EcsParameters": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-ecsparameters", "Required": false, @@ -19857,6 +20104,18 @@ "Type": "KinesisParameters", "UpdateType": "Mutable" }, + "RedshiftDataParameters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-redshiftdataparameters", + "Required": false, + "Type": "RedshiftDataParameters", + "UpdateType": "Mutable" + }, + "RetryPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-retrypolicy", + "Required": false, + "Type": "RetryPolicy", + "UpdateType": "Mutable" + }, "RoleArn": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-rolearn", "PrimitiveType": "String", @@ -20460,6 +20719,23 @@ } } }, + "AWS::GlobalAccelerator::EndpointGroup.PortOverride": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html", + "Properties": { + "EndpointPort": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html#cfn-globalaccelerator-endpointgroup-portoverride-endpointport", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + }, + "ListenerPort": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html#cfn-globalaccelerator-endpointgroup-portoverride-listenerport", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::GlobalAccelerator::Listener.PortRange": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-listener-portrange.html", "Properties": { @@ -23154,6 +23430,58 @@ "AWS::IoT::Authorizer.TokenSigningPublicKeys": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-authorizer-tokensigningpublickeys.html" }, + "AWS::IoT::DomainConfiguration.AuthorizerConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html", + "Properties": { + "AllowAuthorizerOverride": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html#cfn-iot-domainconfiguration-authorizerconfig-allowauthorizeroverride", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "DefaultAuthorizerName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html#cfn-iot-domainconfiguration-authorizerconfig-defaultauthorizername", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoT::DomainConfiguration.ServerCertificateSummary": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html", + "Properties": { + "ServerCertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatearn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ServerCertificateStatus": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatestatus", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ServerCertificateStatusDetail": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatestatusdetail", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoT::DomainConfiguration.Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-tags.html", + "Properties": { + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-tags.html#cfn-iot-domainconfiguration-tags-tags", + "ItemType": "Json", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, "AWS::IoT::ProvisioningTemplate.ProvisioningHook": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-provisioningtemplate-provisioninghook.html", "Properties": { @@ -25378,6 +25706,281 @@ } } }, + "AWS::IoTSiteWise::Asset.AssetHierarchy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html", + "Properties": { + "ChildAssetId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html#cfn-iotsitewise-asset-assethierarchy-childassetid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "LogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html#cfn-iotsitewise-asset-assethierarchy-logicalid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::Asset.AssetProperty": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html", + "Properties": { + "Alias": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-alias", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "LogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-logicalid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "NotificationState": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-notificationstate", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.AssetModelHierarchy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html", + "Properties": { + "ChildAssetModelId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-childassetmodelid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "LogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-logicalid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.AssetModelProperty": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html", + "Properties": { + "DataType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-datatype", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "LogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-logicalid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-type", + "Required": true, + "Type": "PropertyType", + "UpdateType": "Mutable" + }, + "Unit": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-unit", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.Attribute": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-attribute.html", + "Properties": { + "DefaultValue": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-attribute.html#cfn-iotsitewise-assetmodel-attribute-defaultvalue", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.ExpressionVariable": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html", + "Properties": { + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html#cfn-iotsitewise-assetmodel-expressionvariable-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Value": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html#cfn-iotsitewise-assetmodel-expressionvariable-value", + "Required": true, + "Type": "VariableValue", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.Metric": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html", + "Properties": { + "Expression": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-expression", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Variables": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-variables", + "ItemType": "ExpressionVariable", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "Window": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-window", + "Required": true, + "Type": "MetricWindow", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.MetricWindow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metricwindow.html", + "Properties": { + "Tumbling": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metricwindow.html#cfn-iotsitewise-assetmodel-metricwindow-tumbling", + "Required": false, + "Type": "TumblingWindow", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.PropertyType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html", + "Properties": { + "Attribute": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-attribute", + "Required": false, + "Type": "Attribute", + "UpdateType": "Mutable" + }, + "Metric": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-metric", + "Required": false, + "Type": "Metric", + "UpdateType": "Mutable" + }, + "Transform": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-transform", + "Required": false, + "Type": "Transform", + "UpdateType": "Mutable" + }, + "TypeName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-typename", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.Transform": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html", + "Properties": { + "Expression": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html#cfn-iotsitewise-assetmodel-transform-expression", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Variables": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html#cfn-iotsitewise-assetmodel-transform-variables", + "ItemType": "ExpressionVariable", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.TumblingWindow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html", + "Properties": { + "Interval": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html#cfn-iotsitewise-assetmodel-tumblingwindow-interval", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel.VariableValue": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html", + "Properties": { + "HierarchyLogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html#cfn-iotsitewise-assetmodel-variablevalue-hierarchylogicalid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "PropertyLogicalId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html#cfn-iotsitewise-assetmodel-variablevalue-propertylogicalid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::Gateway.GatewayCapabilitySummary": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html", + "Properties": { + "CapabilityConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html#cfn-iotsitewise-gateway-gatewaycapabilitysummary-capabilityconfiguration", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "CapabilityNamespace": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html#cfn-iotsitewise-gateway-gatewaycapabilitysummary-capabilitynamespace", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::Gateway.GatewayPlatform": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html", + "Properties": { + "Greengrass": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html#cfn-iotsitewise-gateway-gatewayplatform-greengrass", + "Required": true, + "Type": "Greengrass", + "UpdateType": "Immutable" + } + } + }, + "AWS::IoTSiteWise::Gateway.Greengrass": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrass.html", + "Properties": { + "GroupArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrass.html#cfn-iotsitewise-gateway-greengrass-grouparn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, "AWS::IoTThingsGraph::FlowTemplate.DefinitionDocument": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotthingsgraph-flowtemplate-definitiondocument.html", "Properties": { @@ -25755,6 +26358,12 @@ "Type": "DataSourceInclusionsExclusionsStrings", "UpdateType": "Mutable" }, + "InclusionPatterns": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionpatterns", + "Required": false, + "Type": "DataSourceInclusionsExclusionsStrings", + "UpdateType": "Mutable" + }, "InclusionPrefixes": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionprefixes", "Required": false, @@ -27728,6 +28337,23 @@ } } }, + "AWS::KinesisFirehose::DeliveryStream.DeliveryStreamEncryptionConfigurationInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html", + "Properties": { + "KeyARN": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput-keyarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "KeyType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput-keytype", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::KinesisFirehose::DeliveryStream.Deserializer": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deserializer.html", "Properties": { @@ -28110,13 +28736,13 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration-kinesisstreamarn", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, "RoleARN": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration-rolearn", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" } } }, @@ -28894,6 +29520,23 @@ } } }, + "AWS::Lambda::EventSourceMapping.SourceAccessConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html", + "Properties": { + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html#cfn-lambda-eventsourcemapping-sourceaccessconfiguration-type", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "URI": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html#cfn-lambda-eventsourcemapping-sourceaccessconfiguration-uri", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::Lambda::Function.Code": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html", "Properties": { @@ -33717,6 +34360,832 @@ } } }, + "AWS::MediaPackage::Asset.EgressEndpoint": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html", + "Properties": { + "PackagingConfigurationId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html#cfn-mediapackage-asset-egressendpoint-packagingconfigurationid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Url": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html#cfn-mediapackage-asset-egressendpoint-url", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::Channel.HlsIngest": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-hlsingest.html", + "Properties": { + "ingestEndpoints": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-hlsingest.html#cfn-mediapackage-channel-hlsingest-ingestendpoints", + "ItemType": "IngestEndpoint", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::Channel.IngestEndpoint": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html", + "Properties": { + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-id", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Password": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-password", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Url": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-url", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Username": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-username", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.Authorization": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html", + "Properties": { + "CdnIdentifierSecret": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html#cfn-mediapackage-originendpoint-authorization-cdnidentifiersecret", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SecretsRoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html#cfn-mediapackage-originendpoint-authorization-secretsrolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.CmafEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html", + "Properties": { + "KeyRotationIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-keyrotationintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-spekekeyprovider", + "Required": true, + "Type": "SpekeKeyProvider", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.CmafPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html", + "Properties": { + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-encryption", + "Required": false, + "Type": "CmafEncryption", + "UpdateType": "Mutable" + }, + "HlsManifests": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-hlsmanifests", + "ItemType": "HlsManifest", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentPrefix": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-segmentprefix", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.DashEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html", + "Properties": { + "KeyRotationIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html#cfn-mediapackage-originendpoint-dashencryption-keyrotationintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html#cfn-mediapackage-originendpoint-dashencryption-spekekeyprovider", + "Required": true, + "Type": "SpekeKeyProvider", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.DashPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html", + "Properties": { + "AdTriggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-adtriggers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "AdsOnDeliveryRestrictions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-adsondeliveryrestrictions", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-encryption", + "Required": false, + "Type": "DashEncryption", + "UpdateType": "Mutable" + }, + "ManifestLayout": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-manifestlayout", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ManifestWindowSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-manifestwindowseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinBufferTimeSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-minbuffertimeseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinUpdatePeriodSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-minupdateperiodseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "PeriodTriggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-periodtriggers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Profile": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-profile", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentTemplateFormat": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-segmenttemplateformat", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + }, + "SuggestedPresentationDelaySeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-suggestedpresentationdelayseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.HlsEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html", + "Properties": { + "ConstantInitializationVector": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-constantinitializationvector", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "EncryptionMethod": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-encryptionmethod", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "KeyRotationIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-keyrotationintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "RepeatExtXKey": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-repeatextxkey", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-spekekeyprovider", + "Required": true, + "Type": "SpekeKeyProvider", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.HlsManifest": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html", + "Properties": { + "AdMarkers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-admarkers", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "AdTriggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-adtriggers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "AdsOnDeliveryRestrictions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-adsondeliveryrestrictions", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "IncludeIframeOnlyStream": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-includeiframeonlystream", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "ManifestName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-manifestname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "PlaylistType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-playlisttype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "PlaylistWindowSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-playlistwindowseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "ProgramDateTimeIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-programdatetimeintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Url": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-url", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.HlsPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html", + "Properties": { + "AdMarkers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-admarkers", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "AdTriggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-adtriggers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "AdsOnDeliveryRestrictions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-adsondeliveryrestrictions", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-encryption", + "Required": false, + "Type": "HlsEncryption", + "UpdateType": "Mutable" + }, + "IncludeIframeOnlyStream": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-includeiframeonlystream", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "PlaylistType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-playlisttype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "PlaylistWindowSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-playlistwindowseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "ProgramDateTimeIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-programdatetimeintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + }, + "UseAudioRenditionGroup": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-useaudiorenditiongroup", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.MssEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-mssencryption.html", + "Properties": { + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-mssencryption.html#cfn-mediapackage-originendpoint-mssencryption-spekekeyprovider", + "Required": true, + "Type": "SpekeKeyProvider", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.MssPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html", + "Properties": { + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-encryption", + "Required": false, + "Type": "MssEncryption", + "UpdateType": "Mutable" + }, + "ManifestWindowSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-manifestwindowseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html", + "Properties": { + "CertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-certificatearn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ResourceId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-resourceid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-rolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SystemIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-systemids", + "PrimitiveItemType": "String", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "Url": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-url", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint.StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html", + "Properties": { + "MaxVideoBitsPerSecond": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-maxvideobitspersecond", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinVideoBitsPerSecond": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-minvideobitspersecond", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamOrder": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-streamorder", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.CmafEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafencryption.html", + "Properties": { + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafencryption.html#cfn-mediapackage-packagingconfiguration-cmafencryption-spekekeyprovider", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.CmafPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html", + "Properties": { + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-encryption", + "Required": false, + "Type": "CmafEncryption", + "UpdateType": "Mutable" + }, + "HlsManifests": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-hlsmanifests", + "ItemType": "HlsManifest", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.DashEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashencryption.html", + "Properties": { + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashencryption.html#cfn-mediapackage-packagingconfiguration-dashencryption-spekekeyprovider", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.DashManifest": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html", + "Properties": { + "ManifestLayout": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-manifestlayout", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ManifestName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-manifestname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "MinBufferTimeSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-minbuffertimeseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Profile": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-profile", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.DashPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html", + "Properties": { + "DashManifests": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-dashmanifests", + "ItemType": "DashManifest", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-encryption", + "Required": false, + "Type": "DashEncryption", + "UpdateType": "Mutable" + }, + "PeriodTriggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-periodtriggers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SegmentTemplateFormat": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-segmenttemplateformat", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.HlsEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html", + "Properties": { + "ConstantInitializationVector": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-constantinitializationvector", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "EncryptionMethod": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-encryptionmethod", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-spekekeyprovider", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.HlsManifest": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html", + "Properties": { + "AdMarkers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-admarkers", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "IncludeIframeOnlyStream": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-includeiframeonlystream", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "ManifestName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-manifestname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ProgramDateTimeIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-programdatetimeintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "RepeatExtXKey": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-repeatextxkey", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.HlsPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html", + "Properties": { + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-encryption", + "Required": false, + "Type": "HlsEncryption", + "UpdateType": "Mutable" + }, + "HlsManifests": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-hlsmanifests", + "ItemType": "HlsManifest", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "UseAudioRenditionGroup": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-useaudiorenditiongroup", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.MssEncryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssencryption.html", + "Properties": { + "SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssencryption.html#cfn-mediapackage-packagingconfiguration-mssencryption-spekekeyprovider", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.MssManifest": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html", + "Properties": { + "ManifestName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html#cfn-mediapackage-packagingconfiguration-mssmanifest-manifestname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html#cfn-mediapackage-packagingconfiguration-mssmanifest-streamselection", + "Required": false, + "Type": "StreamSelection", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.MssPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html", + "Properties": { + "Encryption": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-encryption", + "Required": false, + "Type": "MssEncryption", + "UpdateType": "Mutable" + }, + "MssManifests": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-mssmanifests", + "ItemType": "MssManifest", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "SegmentDurationSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-segmentdurationseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.SpekeKeyProvider": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html", + "Properties": { + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-rolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SystemIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-systemids", + "PrimitiveItemType": "String", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + }, + "Url": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-url", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration.StreamSelection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html", + "Properties": { + "MaxVideoBitsPerSecond": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-maxvideobitspersecond", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinVideoBitsPerSecond": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-minvideobitspersecond", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "StreamOrder": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-streamorder", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingGroup.Authorization": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html", + "Properties": { + "CdnIdentifierSecret": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html#cfn-mediapackage-packaginggroup-authorization-cdnidentifiersecret", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SecretsRoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html#cfn-mediapackage-packaginggroup-authorization-secretsrolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::MediaStore::Container.CorsRule": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html", "Properties": { @@ -36600,6 +38069,45 @@ } } }, + "AWS::S3::Bucket.IntelligentTieringConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html", + "Properties": { + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Prefix": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-prefix", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Status": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-status", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "TagFilters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-tagfilters", + "DuplicatesAllowed": false, + "ItemType": "TagFilter", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Tierings": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-tierings", + "DuplicatesAllowed": false, + "ItemType": "Tiering", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, "AWS::S3::Bucket.InventoryConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html", "Properties": { @@ -36707,7 +38215,7 @@ "Properties": { "EventThreshold": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metrics.html#cfn-s3-bucket-metrics-eventthreshold", - "Required": true, + "Required": false, "Type": "ReplicationTimeValue", "UpdateType": "Mutable" }, @@ -36829,6 +38337,30 @@ } } }, + "AWS::S3::Bucket.OwnershipControls": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html", + "Properties": { + "Rules": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html#cfn-s3-bucket-ownershipcontrols-rules", + "DuplicatesAllowed": false, + "ItemType": "OwnershipControlsRule", + "Required": true, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::S3::Bucket.OwnershipControlsRule": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrolsrule.html", + "Properties": { + "ObjectOwnership": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrolsrule.html#cfn-s3-bucket-ownershipcontrolsrule-objectownership", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, "AWS::S3::Bucket.PublicAccessBlockConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html", "Properties": { @@ -37285,7 +38817,7 @@ "Properties": { "SseKmsEncryptedObjects": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html#cfn-s3-bucket-sourceselectioncriteria-ssekmsencryptedobjects", - "Required": true, + "Required": false, "Type": "SseKmsEncryptedObjects", "UpdateType": "Mutable" } @@ -37330,6 +38862,23 @@ } } }, + "AWS::S3::Bucket.Tiering": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html", + "Properties": { + "AccessTier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html#cfn-s3-bucket-tiering-accesstier", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Days": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html#cfn-s3-bucket-tiering-days", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::S3::Bucket.TopicConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html", "Properties": { @@ -38478,6 +40027,12 @@ "Required": false, "UpdateType": "Immutable" }, + "ImageConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-imageconfig", + "Required": false, + "Type": "ImageConfig", + "UpdateType": "Immutable" + }, "Mode": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-mode", "PrimitiveType": "String", @@ -38498,6 +40053,17 @@ } } }, + "AWS::SageMaker::Model.ImageConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig.html", + "Properties": { + "RepositoryAccessMode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig.html#cfn-sagemaker-model-containerdefinition-imageconfig-repositoryaccessmode", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, "AWS::SageMaker::Model.VpcConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-vpcconfig.html", "Properties": { @@ -39511,6 +41077,13 @@ "Type": "List", "UpdateType": "Conditional" }, + "SecurityGroupIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-securitygroupids", + "ItemType": "SecurityGroupId", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "SubnetIds": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-subnetids", "PrimitiveItemType": "String", @@ -39552,6 +41125,9 @@ "AWS::Transfer::Server.Protocol": { "PrimitiveType": "String" }, + "AWS::Transfer::Server.SecurityGroupId": { + "PrimitiveType": "String" + }, "AWS::Transfer::User.HomeDirectoryMapEntry": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-homedirectorymapentry.html", "Properties": { @@ -41698,7 +43274,7 @@ } } }, - "ResourceSpecificationVersion": "18.7.0", + "ResourceSpecificationVersion": "20.2.0", "ResourceTypes": { "AWS::ACMPCA::Certificate": { "Attributes": { @@ -41956,12 +43532,6 @@ "Required": true, "UpdateType": "Mutable" }, - "LdapMetadata": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-ldapmetadata", - "Required": false, - "Type": "LdapMetadata", - "UpdateType": "Mutable" - }, "LdapServerMetadata": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-ldapservermetadata", "Required": false, @@ -45088,6 +46658,12 @@ "Required": true, "UpdateType": "Immutable" }, + "ApiKeyId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-apikeyid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "Description": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-description", "PrimitiveType": "String", @@ -45245,6 +46821,12 @@ "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" + }, + "SyncConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-syncconfig", + "Required": false, + "Type": "SyncConfig", + "UpdateType": "Mutable" } } }, @@ -45666,6 +47248,12 @@ "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" + }, + "WorkGroup": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-workgroup", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" } } }, @@ -45722,6 +47310,23 @@ } }, "AWS::AutoScaling::AutoScalingGroup": { + "Attributes": { + "LaunchConfigurationName": { + "PrimitiveType": "String" + }, + "LaunchTemplateSpecification": { + "PrimitiveType": "String" + }, + "MixedInstancesPolicy": { + "PrimitiveType": "String" + }, + "PlacementGroup": { + "PrimitiveType": "String" + }, + "VPCZoneIdentifier": { + "PrimitiveType": "String" + } + }, "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html", "Properties": { "AutoScalingGroupName": { @@ -45738,6 +47343,12 @@ "Type": "List", "UpdateType": "Mutable" }, + "CapacityRebalance": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-capacityrebalance", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, "Cooldown": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-cooldown", "PrimitiveType": "String", @@ -45973,6 +47584,12 @@ "Required": false, "UpdateType": "Immutable" }, + "MetadataOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-autoscaling-launchconfig-metadataoptions", + "Required": false, + "Type": "MetadataOption", + "UpdateType": "Immutable" + }, "PlacementTenancy": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-placementtenancy", "PrimitiveType": "String", @@ -46323,6 +47940,12 @@ "Required": false, "UpdateType": "Mutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-tags", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" + }, "Type": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-type", "PrimitiveType": "String", @@ -46364,6 +47987,12 @@ "Type": "RetryStrategy", "UpdateType": "Mutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-tags", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" + }, "Timeout": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-timeout", "Required": false, @@ -46405,6 +48034,12 @@ "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-tags", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" } } }, @@ -47424,6 +49059,67 @@ } } }, + "AWS::CloudWatch::MetricStream": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "CreationDate": { + "PrimitiveType": "String" + }, + "LastUpdateDate": { + "PrimitiveType": "String" + }, + "State": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html", + "Properties": { + "ExcludeFilters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-excludefilters", + "DuplicatesAllowed": false, + "ItemType": "MetricStreamFilter", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "FirehoseArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-firehosearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "IncludeFilters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-includefilters", + "DuplicatesAllowed": false, + "ItemType": "MetricStreamFilter", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-name", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-rolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, "AWS::CodeArtifact::Domain": { "Attributes": { "Arn": { @@ -47452,6 +49148,13 @@ "PrimitiveType": "Json", "Required": false, "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html#cfn-codeartifact-domain-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" } } }, @@ -47497,6 +49200,13 @@ "Required": true, "UpdateType": "Immutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "Upstreams": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-upstreams", "PrimitiveItemType": "String", @@ -50651,6 +52361,12 @@ "Type": "List", "UpdateType": "Mutable" }, + "SelfServicePortal": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-selfserviceportal", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "ServerCertificateArn": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-servercertificatearn", "PrimitiveType": "String", @@ -51771,6 +53487,12 @@ "AWS::EC2::Route": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html", "Properties": { + "CarrierGatewayId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-carriergatewayid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "DestinationCidrBlock": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationcidrblock", "PrimitiveType": "String", @@ -51801,6 +53523,12 @@ "Required": false, "UpdateType": "Mutable" }, + "LocalGatewayId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-localgatewayid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "NatGatewayId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-natgatewayid", "PrimitiveType": "String", @@ -51825,6 +53553,12 @@ "Required": false, "UpdateType": "Mutable" }, + "VpcEndpointId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcendpointid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "VpcPeeringConnectionId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcpeeringconnectionid", "PrimitiveType": "String", @@ -52066,6 +53800,9 @@ "NetworkAclAssociationId": { "PrimitiveType": "String" }, + "OutpostArn": { + "PrimitiveType": "String" + }, "VpcId": { "PrimitiveType": "String" } @@ -52102,6 +53839,12 @@ "Required": false, "UpdateType": "Mutable" }, + "OutpostArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-outpostarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, "Tags": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-tags", "DuplicatesAllowed": true, @@ -52727,13 +54470,6 @@ "Required": false, "UpdateType": "Mutable" }, - "ApplianceLoadBalancerArns": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-applianceloadbalancerarns", - "PrimitiveItemType": "String", - "Required": false, - "Type": "List", - "UpdateType": "Mutable" - }, "NetworkLoadBalancerArns": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-networkloadbalancerarns", "PrimitiveItemType": "String", @@ -53941,12 +55677,24 @@ "Type": "KerberosAttributes", "UpdateType": "Immutable" }, + "LogEncryptionKmsKeyId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-logencryptionkmskeyid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, "LogUri": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-loguri", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, + "ManagedScalingPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-managedscalingpolicy", + "Required": false, + "Type": "ManagedScalingPolicy", + "UpdateType": "Mutable" + }, "Name": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-name", "PrimitiveType": "String", @@ -53977,6 +55725,12 @@ "Required": true, "UpdateType": "Immutable" }, + "StepConcurrencyLevel": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-stepconcurrencylevel", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, "Steps": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-steps", "DuplicatesAllowed": false, @@ -54442,6 +56196,12 @@ "Required": false, "UpdateType": "Mutable" }, + "GlobalReplicationGroupId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-globalreplicationgroupid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, "KmsKeyId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-kmskeyid", "PrimitiveType": "String", @@ -54452,7 +56212,7 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-multiazenabled", "PrimitiveType": "Boolean", "Required": false, - "UpdateType": "Immutable" + "UpdateType": "Mutable" }, "NodeGroupConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-nodegroupconfiguration", @@ -54986,13 +56746,13 @@ "Port": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-port", "PrimitiveType": "Integer", - "Required": true, + "Required": false, "UpdateType": "Mutable" }, "Protocol": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-protocol", "PrimitiveType": "String", - "Required": true, + "Required": false, "UpdateType": "Mutable" }, "SslPolicy": { @@ -55116,7 +56876,7 @@ "ItemType": "SubnetMapping", "Required": false, "Type": "List", - "UpdateType": "Immutable" + "UpdateType": "Mutable" }, "Subnets": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-subnets", @@ -55524,6 +57284,43 @@ } } }, + "AWS::Events::Archive": { + "Attributes": { + "ArchiveName": { + "PrimitiveType": "String" + }, + "Arn": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html", + "Properties": { + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-description", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "EventPattern": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-eventpattern", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, + "RetentionDays": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-retentiondays", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "SourceArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-sourcearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, "AWS::Events::EventBus": { "Attributes": { "Arn": { @@ -56184,6 +57981,12 @@ "Required": false, "UpdateType": "Mutable" }, + "FlexMatchMode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-flexmatchmode", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "GameProperties": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-gameproperties", "ItemType": "GameProperty", @@ -56200,7 +58003,7 @@ "GameSessionQueueArns": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-gamesessionqueuearns", "PrimitiveItemType": "String", - "Required": true, + "Required": false, "Type": "List", "UpdateType": "Mutable" }, @@ -56382,6 +58185,13 @@ "Required": true, "UpdateType": "Immutable" }, + "PortOverrides": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-portoverrides", + "ItemType": "PortOverride", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "ThresholdCount": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-thresholdcount", "PrimitiveType": "Integer", @@ -58096,6 +59906,114 @@ } } }, + "AWS::IVS::Channel": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "IngestEndpoint": { + "PrimitiveType": "String" + }, + "PlaybackUrl": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html", + "Properties": { + "Authorized": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-authorized", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "LatencyMode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-latencymode", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-name", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-type", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IVS::PlaybackKeyPair": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "Fingerprint": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html", + "Properties": { + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-name", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "PublicKeyMaterial": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-publickeymaterial", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::IVS::StreamKey": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "Value": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html", + "Properties": { + "ChannelArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html#cfn-ivs-streamkey-channelarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html#cfn-ivs-streamkey-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, "AWS::ImageBuilder::Component": { "Attributes": { "Arn": { @@ -58754,6 +60672,72 @@ } } }, + "AWS::IoT::DomainConfiguration": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "DomainType": { + "PrimitiveType": "String" + }, + "ServerCertificates": { + "ItemType": "ServerCertificateSummary", + "Type": "List" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html", + "Properties": { + "AuthorizerConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-authorizerconfig", + "Required": false, + "Type": "AuthorizerConfig", + "UpdateType": "Mutable" + }, + "DomainConfigurationName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainconfigurationname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "DomainConfigurationStatus": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainconfigurationstatus", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "DomainName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "ServerCertificateArns": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-servercertificatearns", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Immutable" + }, + "ServiceType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-servicetype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-tags", + "Required": false, + "Type": "Tags", + "UpdateType": "Mutable" + }, + "ValidationCertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-validationcertificatearn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + } + } + }, "AWS::IoT::Policy": { "Attributes": { "Arn": { @@ -59115,6 +61099,137 @@ } } }, + "AWS::IoTSiteWise::Asset": { + "Attributes": { + "AssetArn": { + "PrimitiveType": "String" + }, + "AssetId": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html", + "Properties": { + "AssetHierarchies": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assethierarchies", + "ItemType": "AssetHierarchy", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "AssetModelId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetmodelid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "AssetName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "AssetProperties": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetproperties", + "ItemType": "AssetProperty", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-tags", + "DuplicatesAllowed": true, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::AssetModel": { + "Attributes": { + "AssetModelArn": { + "PrimitiveType": "String" + }, + "AssetModelId": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html", + "Properties": { + "AssetModelDescription": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodeldescription", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "AssetModelHierarchies": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelhierarchies", + "ItemType": "AssetModelHierarchy", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "AssetModelName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "AssetModelProperties": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelproperties", + "ItemType": "AssetModelProperty", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoTSiteWise::Gateway": { + "Attributes": { + "GatewayId": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html", + "Properties": { + "GatewayCapabilitySummaries": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewaycapabilitysummaries", + "DuplicatesAllowed": false, + "ItemType": "GatewayCapabilitySummary", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "GatewayName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewayname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "GatewayPlatform": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewayplatform", + "Required": true, + "Type": "GatewayPlatform", + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-tags", + "DuplicatesAllowed": true, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, "AWS::IoTThingsGraph::FlowTemplate": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotthingsgraph-flowtemplate.html", "Properties": { @@ -59218,7 +61333,7 @@ "Properties": { "DataSourceConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-datasourceconfiguration", - "Required": true, + "Required": false, "Type": "DataSourceConfiguration", "UpdateType": "Mutable" }, @@ -59243,7 +61358,7 @@ "RoleArn": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-rolearn", "PrimitiveType": "String", - "Required": true, + "Required": false, "UpdateType": "Mutable" }, "Schedule": { @@ -59623,6 +61738,12 @@ }, "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html", "Properties": { + "DeliveryStreamEncryptionConfigurationInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput", + "Required": false, + "Type": "DeliveryStreamEncryptionConfigurationInput", + "UpdateType": "Mutable" + }, "DeliveryStreamName": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamname", "PrimitiveType": "String", @@ -59657,7 +61778,7 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration", "Required": false, "Type": "KinesisStreamSourceConfiguration", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, "RedshiftDestinationConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration", @@ -59676,6 +61797,13 @@ "Required": false, "Type": "SplunkDestinationConfiguration", "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" } } }, @@ -59687,6 +61815,13 @@ "Required": false, "Type": "Admins", "UpdateType": "Mutable" + }, + "TrustedResourceOwners": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-trustedresourceowners", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" } } }, @@ -59888,6 +62023,22 @@ "Required": false, "UpdateType": "Mutable" }, + "Queues": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-queues", + "DuplicatesAllowed": false, + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "SourceAccessConfigurations": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-sourceaccessconfigurations", + "DuplicatesAllowed": false, + "ItemType": "SourceAccessConfiguration", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "StartingPosition": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-startingposition", "PrimitiveType": "String", @@ -60204,14 +62355,20 @@ }, "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html", "Properties": { + "KmsKeyId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-kmskeyid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "LogGroupName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-cwl-loggroup-loggroupname", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-loggroupname", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, "RetentionInDays": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-cwl-loggroup-retentionindays", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-retentionindays", "PrimitiveType": "Integer", "Required": false, "UpdateType": "Mutable" @@ -60899,6 +63056,284 @@ } } }, + "AWS::MediaPackage::Asset": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "CreatedAt": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html", + "Properties": { + "EgressEndpoints": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-egressendpoints", + "ItemType": "EgressEndpoint", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "PackagingGroupId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-packaginggroupid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "ResourceId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-resourceid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "SourceArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-sourcearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SourceRoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-sourcerolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::Channel": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "HlsIngest": { + "Type": "HlsIngest" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html", + "Properties": { + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-description", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::MediaPackage::OriginEndpoint": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "Url": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html", + "Properties": { + "Authorization": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-authorization", + "Required": false, + "Type": "Authorization", + "UpdateType": "Mutable" + }, + "ChannelId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-channelid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "CmafPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-cmafpackage", + "Required": false, + "Type": "CmafPackage", + "UpdateType": "Mutable" + }, + "DashPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-dashpackage", + "Required": false, + "Type": "DashPackage", + "UpdateType": "Mutable" + }, + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-description", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "HlsPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-hlspackage", + "Required": false, + "Type": "HlsPackage", + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "ManifestName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-manifestname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "MssPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-msspackage", + "Required": false, + "Type": "MssPackage", + "UpdateType": "Mutable" + }, + "Origination": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-origination", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "StartoverWindowSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-startoverwindowseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "TimeDelaySeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-timedelayseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Whitelist": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-whitelist", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingConfiguration": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html", + "Properties": { + "CmafPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-cmafpackage", + "Required": false, + "Type": "CmafPackage", + "UpdateType": "Mutable" + }, + "DashPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-dashpackage", + "Required": false, + "Type": "DashPackage", + "UpdateType": "Mutable" + }, + "HlsPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-hlspackage", + "Required": false, + "Type": "HlsPackage", + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "MssPackage": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-msspackage", + "Required": false, + "Type": "MssPackage", + "UpdateType": "Mutable" + }, + "PackagingGroupId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-packaginggroupid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::MediaPackage::PackagingGroup": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "DomainName": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html", + "Properties": { + "Authorization": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-authorization", + "Required": false, + "Type": "Authorization", + "UpdateType": "Mutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-tags", + "DuplicatesAllowed": false, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, "AWS::MediaStore::Container": { "Attributes": { "Endpoint": { @@ -63466,7 +65901,7 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-engine", "PrimitiveType": "String", "Required": true, - "UpdateType": "Immutable" + "UpdateType": "Conditional" }, "EngineMode": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enginemode", @@ -63478,7 +65913,13 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-engineversion", "PrimitiveType": "String", "Required": false, - "UpdateType": "Immutable" + "UpdateType": "Mutable" + }, + "GlobalClusterIdentifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-globalclusteridentifier", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Conditional" }, "KmsKeyId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-kmskeyid", @@ -63778,7 +66219,7 @@ "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-engine", "PrimitiveType": "String", "Required": false, - "UpdateType": "Immutable" + "UpdateType": "Conditional" }, "EngineVersion": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-engineversion", @@ -64242,6 +66683,47 @@ } } }, + "AWS::RDS::GlobalCluster": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html", + "Properties": { + "DeletionProtection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-deletionprotection", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "Engine": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-engine", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "EngineVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-engineversion", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "GlobalClusterIdentifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-globalclusteridentifier", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "SourceDBClusterIdentifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-sourcedbclusteridentifier", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "StorageEncrypted": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-storageencrypted", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Immutable" + } + } + }, "AWS::RDS::OptionGroup": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html", "Properties": { @@ -65357,6 +67839,14 @@ "Type": "CorsConfiguration", "UpdateType": "Mutable" }, + "IntelligentTieringConfigurations": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-intelligenttieringconfigurations", + "DuplicatesAllowed": false, + "ItemType": "IntelligentTieringConfiguration", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "InventoryConfigurations": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-inventoryconfigurations", "DuplicatesAllowed": false, @@ -65403,6 +67893,12 @@ "Required": false, "UpdateType": "Immutable" }, + "OwnershipControls": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-ownershipcontrols", + "Required": false, + "Type": "OwnershipControls", + "UpdateType": "Mutable" + }, "PublicAccessBlockConfiguration": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-publicaccessblockconfiguration", "Required": false, @@ -65594,6 +68090,12 @@ "Required": false, "UpdateType": "Mutable" }, + "SubscriptionRoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-subscriptionrolearn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, "TopicArn": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#topicarn", "PrimitiveType": "String", @@ -65622,6 +68124,12 @@ "Required": false, "UpdateType": "Mutable" }, + "FifoTopic": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#cfn-sns-topic-fifotopic", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Immutable" + }, "KmsMasterKeyId": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#cfn-sns-topic-kmsmasterkeyid", "PrimitiveType": "String", @@ -66822,6 +69330,12 @@ "AWS::SecretsManager::ResourcePolicy": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html", "Properties": { + "BlockPublicPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html#cfn-secretsmanager-resourcepolicy-blockpublicpolicy", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, "ResourcePolicy": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html#cfn-secretsmanager-resourcepolicy-resourcepolicy", "PrimitiveType": "Json", diff --git a/packages/@aws-cdk/cfnspec/spec-source/670_MediaPackage_PackagingConfiguration_patch.json b/packages/@aws-cdk/cfnspec/spec-source/670_MediaPackage_PackagingConfiguration_patch.json new file mode 100644 index 0000000000000..ed0f382b5ba59 --- /dev/null +++ b/packages/@aws-cdk/cfnspec/spec-source/670_MediaPackage_PackagingConfiguration_patch.json @@ -0,0 +1,29 @@ +{ + "PropertyTypes": { + "patch": { + "description": "missing type information for SpekeKeyProvider - mirrors patch in cfn-lint (https://github.com/aws-cloudformation/cfn-python-lint/pull/1751)", + "operations": [ + { + "op": "add", + "path": "/AWS::MediaPackage::PackagingConfiguration.CmafEncryption/Properties/SpekeKeyProvider/Type", + "value": "SpekeKeyProvider" + }, + { + "op": "add", + "path": "/AWS::MediaPackage::PackagingConfiguration.DashEncryption/Properties/SpekeKeyProvider/Type", + "value": "SpekeKeyProvider" + }, + { + "op": "add", + "path": "/AWS::MediaPackage::PackagingConfiguration.HlsEncryption/Properties/SpekeKeyProvider/Type", + "value": "SpekeKeyProvider" + }, + { + "op": "add", + "path": "/AWS::MediaPackage::PackagingConfiguration.MssEncryption/Properties/SpekeKeyProvider/Type", + "value": "SpekeKeyProvider" + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/cfnspec/spec-source/680_AutoScaling_AutoScalingGroup_patch.json b/packages/@aws-cdk/cfnspec/spec-source/680_AutoScaling_AutoScalingGroup_patch.json new file mode 100644 index 0000000000000..c79b21da417e1 --- /dev/null +++ b/packages/@aws-cdk/cfnspec/spec-source/680_AutoScaling_AutoScalingGroup_patch.json @@ -0,0 +1,31 @@ +{ + "ResourceTypes": { + "AWS::AutoScaling::AutoScalingGroup": { + "patch": { + "description": "remove (presumed accidentally included) new autoscaling group attributes", + "operations": [ + { + "op": "remove", + "path": "/Attributes/LaunchConfigurationName" + }, + { + "op": "remove", + "path": "/Attributes/LaunchTemplateSpecification" + }, + { + "op": "remove", + "path": "/Attributes/MixedInstancesPolicy" + }, + { + "op": "remove", + "path": "/Attributes/PlacementGroup" + }, + { + "op": "remove", + "path": "/Attributes/VPCZoneIdentifier" + } + ] + } + } + } +} diff --git a/packages/@aws-cdk/cfnspec/spec-source/680_MediaPackage_Channel_patch.json b/packages/@aws-cdk/cfnspec/spec-source/680_MediaPackage_Channel_patch.json new file mode 100644 index 0000000000000..5eb3d2a657645 --- /dev/null +++ b/packages/@aws-cdk/cfnspec/spec-source/680_MediaPackage_Channel_patch.json @@ -0,0 +1,15 @@ +{ + "ResourceTypes": { + "AWS::MediaPackage::Channel": { + "patch": { + "description": "remove the unusable attribute HlsIngest, which represents a complex type and cannot be directly converted to a primitive type", + "operations": [ + { + "op": "remove", + "path": "/Attributes/HlsIngest" + } + ] + } + } + } +} diff --git a/packages/@aws-cdk/cfnspec/spec-source/690_IoT_DomainConfiguration_Tags_CorrectItemType_patch.json b/packages/@aws-cdk/cfnspec/spec-source/690_IoT_DomainConfiguration_Tags_CorrectItemType_patch.json new file mode 100644 index 0000000000000..5ffa659a47b46 --- /dev/null +++ b/packages/@aws-cdk/cfnspec/spec-source/690_IoT_DomainConfiguration_Tags_CorrectItemType_patch.json @@ -0,0 +1,21 @@ +{ + "PropertyTypes": { + "AWS::IoT::DomainConfiguration.Tags": { + "patch": { + "description": "AWS::IoT::DomainConfiguration.Tag.ItemType should have been PrimitiveItemType", + "operations": [ + { + "op": "remove", + "path": "/Properties/Tags/ItemType", + "value": "Json" + }, + { + "op": "add", + "path": "/Properties/Tags/PrimitiveItemType", + "value": "Json" + } + ] + } + } + } +} diff --git a/packages/@aws-cdk/cloudformation-diff/package.json b/packages/@aws-cdk/cloudformation-diff/package.json index 2fb02810b2182..e465c8aa10595 100644 --- a/packages/@aws-cdk/cloudformation-diff/package.json +++ b/packages/@aws-cdk/cloudformation-diff/package.json @@ -33,7 +33,7 @@ "@types/string-width": "^4.0.1", "@types/table": "^5.0.0", "cdk-build-tools": "0.0.0", - "fast-check": "^2.6.1", + "fast-check": "^2.7.0", "jest": "^26.6.3", "pkglint": "0.0.0", "ts-jest": "^26.4.4" diff --git a/packages/@aws-cdk/cloudformation-include/package.json b/packages/@aws-cdk/cloudformation-include/package.json index 5504214ff2f62..787e999447b0c 100644 --- a/packages/@aws-cdk/cloudformation-include/package.json +++ b/packages/@aws-cdk/cloudformation-include/package.json @@ -141,11 +141,13 @@ "@aws-cdk/aws-iot1click": "0.0.0", "@aws-cdk/aws-iotanalytics": "0.0.0", "@aws-cdk/aws-iotevents": "0.0.0", + "@aws-cdk/aws-iotsitewise": "0.0.0", "@aws-cdk/aws-iotthingsgraph": "0.0.0", + "@aws-cdk/aws-ivs": "0.0.0", + "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kinesis": "0.0.0", "@aws-cdk/aws-kinesisanalytics": "0.0.0", "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-lakeformation": "0.0.0", "@aws-cdk/aws-lambda": "0.0.0", @@ -154,6 +156,7 @@ "@aws-cdk/aws-managedblockchain": "0.0.0", "@aws-cdk/aws-mediaconvert": "0.0.0", "@aws-cdk/aws-medialive": "0.0.0", + "@aws-cdk/aws-mediapackage": "0.0.0", "@aws-cdk/aws-mediastore": "0.0.0", "@aws-cdk/aws-msk": "0.0.0", "@aws-cdk/aws-neptune": "0.0.0", @@ -271,7 +274,9 @@ "@aws-cdk/aws-iot1click": "0.0.0", "@aws-cdk/aws-iotanalytics": "0.0.0", "@aws-cdk/aws-iotevents": "0.0.0", + "@aws-cdk/aws-iotsitewise": "0.0.0", "@aws-cdk/aws-iotthingsgraph": "0.0.0", + "@aws-cdk/aws-ivs": "0.0.0", "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kinesis": "0.0.0", "@aws-cdk/aws-kinesisanalytics": "0.0.0", @@ -284,6 +289,7 @@ "@aws-cdk/aws-managedblockchain": "0.0.0", "@aws-cdk/aws-mediaconvert": "0.0.0", "@aws-cdk/aws-medialive": "0.0.0", + "@aws-cdk/aws-mediapackage": "0.0.0", "@aws-cdk/aws-mediastore": "0.0.0", "@aws-cdk/aws-msk": "0.0.0", "@aws-cdk/aws-neptune": "0.0.0", diff --git a/packages/@aws-cdk/core/NOTICE b/packages/@aws-cdk/core/NOTICE index 9ff5649eac07b..d23152578fbfd 100644 --- a/packages/@aws-cdk/core/NOTICE +++ b/packages/@aws-cdk/core/NOTICE @@ -86,3 +86,145 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------- + +** at-least-node - https://www.npmjs.com/package/at-least-node +Copyright (c) 2020 Ryan Zimmerman + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** graceful-fs - https://www.npmjs.com/package/graceful-fs +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** jsonfile - https://www.npmjs.com/package/jsonfile +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** universalify - https://www.npmjs.com/package/universalify +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** brace-expansion - https://www.npmjs.com/package/brace-expansion +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** balanced-match - https://www.npmjs.com/package/balanced-match +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** concat-map - https://www.npmjs.com/package/concat-map + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- diff --git a/packages/@aws-cdk/core/lib/cfn-output.ts b/packages/@aws-cdk/core/lib/cfn-output.ts index ae1a52159244c..480de577db06c 100644 --- a/packages/@aws-cdk/core/lib/cfn-output.ts +++ b/packages/@aws-cdk/core/lib/cfn-output.ts @@ -103,7 +103,8 @@ export class CfnOutput extends CfnElement { /** * The name used to export the value of this output across stacks. * - * To import the value from another stack, use `Fn.importValue(exportName)`. + * To use the value in another stack, pass the value of + * `output.importValue` to it. * * @default - the output is not exported */ @@ -115,6 +116,38 @@ export class CfnOutput extends CfnElement { this._exportName = exportName; } + /** + * Return the `Fn.importValue` expression to import this value into another stack + * + * The returned value should not be used in the same stack, but in a + * different one. It must be deployed to the same environment, as + * CloudFormation exports can only be imported in the same Region and + * account. + * + * The is no automatic registration of dependencies between stacks when using + * this mechanism, so you should make sure to deploy them in the right order + * yourself. + * + * You can use this mechanism to share values across Stacks in different + * Stages. If you intend to share the value to another Stack inside the same + * Stage, the automatic cross-stack referencing mechanism is more convenient. + */ + public get importValue() { + // We made _exportName mutable so this will have to be lazy. + return Fn.importValue(Lazy.stringValue({ + produce: (ctx) => { + if (Stack.of(ctx.scope) === this.stack) { + throw new Error(`'importValue' property of '${this.node.path}' should only be used in a different Stack`); + } + if (!this._exportName) { + throw new Error(`Add an exportName to the CfnOutput at '${this.node.path}' in order to use 'output.importValue'`); + } + + return this._exportName; + }, + })); + } + /** * @internal */ @@ -133,3 +166,7 @@ export class CfnOutput extends CfnElement { } import { CfnCondition } from './cfn-condition'; +import { Fn } from './cfn-fn'; +import { Lazy } from './lazy'; +import { Stack } from './stack'; + diff --git a/packages/@aws-cdk/core/package.json b/packages/@aws-cdk/core/package.json index c673193b26427..3dec43079144e 100644 --- a/packages/@aws-cdk/core/package.json +++ b/packages/@aws-cdk/core/package.json @@ -174,7 +174,7 @@ "@types/sinon": "^9.0.8", "cdk-build-tools": "0.0.0", "cfn2ts": "0.0.0", - "fast-check": "^2.6.1", + "fast-check": "^2.7.0", "lodash": "^4.17.20", "nodeunit-shim": "0.0.0", "pkglint": "0.0.0", diff --git a/packages/@aws-cdk/core/test/output.test.ts b/packages/@aws-cdk/core/test/output.test.ts index d7b509159a2bb..1179c3111c0c9 100644 --- a/packages/@aws-cdk/core/test/output.test.ts +++ b/packages/@aws-cdk/core/test/output.test.ts @@ -1,10 +1,16 @@ import { nodeunitShim, Test } from 'nodeunit-shim'; -import { CfnOutput, CfnResource, Stack } from '../lib'; +import { App, CfnOutput, CfnResource, Stack } from '../lib'; import { toCloudFormation } from './util'; +let app: App; +let stack: Stack; +beforeEach(() => { + app = new App(); + stack = new Stack(app, 'Stack'); +}); + nodeunitShim({ 'outputs can be added to the stack'(test: Test) { - const stack = new Stack(); const res = new CfnResource(stack, 'MyResource', { type: 'R' }); const ref = res.ref; @@ -29,9 +35,6 @@ nodeunitShim({ }, 'No export is created by default'(test: Test) { - // GIVEN - const stack = new Stack(); - // WHEN new CfnOutput(stack, 'SomeOutput', { value: 'x' }); @@ -46,4 +49,68 @@ nodeunitShim({ test.done(); }, + + 'importValue can be used to obtain a Fn::ImportValue expression'(test: Test) { + // GIVEN + const stack2 = new Stack(app, 'Stack2'); + + // WHEN + const output = new CfnOutput(stack, 'SomeOutput', { value: 'x', exportName: 'asdf' }); + new CfnResource(stack2, 'Resource', { + type: 'Some::Resource', + properties: { + input: output.importValue, + }, + }); + + // THEN + test.deepEqual(toCloudFormation(stack2), { + Resources: { + Resource: { + Type: 'Some::Resource', + Properties: { + input: { 'Fn::ImportValue': 'asdf' }, + }, + }, + }, + }); + + test.done(); + }, + + 'importValue used inside the same stack produces an error'(test: Test) { + // WHEN + const output = new CfnOutput(stack, 'SomeOutput', { value: 'x', exportName: 'asdf' }); + new CfnResource(stack, 'Resource', { + type: 'Some::Resource', + properties: { + input: output.importValue, + }, + }); + + // THEN + expect(() => toCloudFormation(stack)).toThrow(/should only be used in a different Stack/); + + test.done(); + }, + + 'error message if importValue is used and Output is not exported'(test: Test) { + // GIVEN + const stack2 = new Stack(app, 'Stack2'); + + // WHEN + const output = new CfnOutput(stack, 'SomeOutput', { value: 'x' }); + new CfnResource(stack2, 'Resource', { + type: 'Some::Resource', + properties: { + input: output.importValue, + }, + }); + + test.throws(() => { + toCloudFormation(stack2); + }, /Add an exportName to the CfnOutput/); + + test.done(); + }, }); diff --git a/packages/@aws-cdk/core/test/stage.test.ts b/packages/@aws-cdk/core/test/stage.test.ts index 8a4b27a4d412a..897b3513d6163 100644 --- a/packages/@aws-cdk/core/test/stage.test.ts +++ b/packages/@aws-cdk/core/test/stage.test.ts @@ -1,3 +1,4 @@ +import * as cxschema from '@aws-cdk/cloud-assembly-schema'; import * as cxapi from '@aws-cdk/cx-api'; import { nodeunitShim, Test } from 'nodeunit-shim'; import { App, CfnResource, Construct, IAspect, IConstruct, Stack, Stage, Aspects } from '../lib'; @@ -311,6 +312,40 @@ nodeunitShim({ }, }); +test('missing context in Stages is propagated up to root assembly', () => { + // GIVEN + const app = new App(); + const stage = new Stage(app, 'Stage', { + env: { account: 'account', region: 'region' }, + }); + const stack = new Stack(stage, 'Stack'); + new CfnResource(stack, 'Resource', { type: 'Something' }); + + // WHEN + stack.reportMissingContext({ + key: 'missing-context-key', + provider: cxschema.ContextProvider.AVAILABILITY_ZONE_PROVIDER, + props: { + account: 'account', + region: 'region', + }, + }); + + // THEN + const assembly = app.synth(); + + expect(assembly.manifest.missing).toEqual([ + { + key: 'missing-context-key', + provider: cxschema.ContextProvider.AVAILABILITY_ZONE_PROVIDER, + props: { + account: 'account', + region: 'region', + }, + }, + ]); +}); + class TouchingAspect implements IAspect { public readonly visits = new Array(); public visit(node: IConstruct): void { diff --git a/packages/@aws-cdk/custom-resources/package.json b/packages/@aws-cdk/custom-resources/package.json index b8942190103fe..8f17efcc963b9 100644 --- a/packages/@aws-cdk/custom-resources/package.json +++ b/packages/@aws-cdk/custom-resources/package.json @@ -79,7 +79,7 @@ "@types/aws-lambda": "^8.10.64", "@types/fs-extra": "^8.1.1", "@types/sinon": "^9.0.8", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "aws-sdk-mock": "^5.1.0", "cdk-build-tools": "0.0.0", "cdk-integ-tools": "0.0.0", diff --git a/packages/@aws-cdk/cx-api/lib/cloud-assembly.ts b/packages/@aws-cdk/cx-api/lib/cloud-assembly.ts index df947f379ab46..53fafe3d37049 100644 --- a/packages/@aws-cdk/cx-api/lib/cloud-assembly.ts +++ b/packages/@aws-cdk/cx-api/lib/cloud-assembly.ts @@ -219,6 +219,13 @@ export interface CloudAssemblyBuilderProps { * @default - Same as the manifest outdir */ readonly assetOutdir?: string; + + /** + * If this builder is for a nested assembly, the parent assembly builder + * + * @default - This is a root assembly + */ + readonly parentBuilder?: CloudAssemblyBuilder; } /** @@ -237,6 +244,7 @@ export class CloudAssemblyBuilder { private readonly artifacts: { [id: string]: cxschema.ArtifactManifest } = { }; private readonly missing = new Array(); + private readonly parentBuilder?: CloudAssemblyBuilder; /** * Initializes a cloud assembly builder. @@ -245,6 +253,7 @@ export class CloudAssemblyBuilder { constructor(outdir?: string, props: CloudAssemblyBuilderProps = {}) { this.outdir = determineOutputDirectory(outdir); this.assetOutdir = props.assetOutdir ?? this.outdir; + this.parentBuilder = props.parentBuilder; // we leverage the fact that outdir is long-lived to avoid staging assets into it // that were already staged (copying can be expensive). this is achieved by the fact @@ -270,6 +279,8 @@ export class CloudAssemblyBuilder { if (this.missing.every(m => m.key !== missing.key)) { this.missing.push(missing); } + // Also report in parent + this.parentBuilder?.addMissing(missing); } /** @@ -320,6 +331,7 @@ export class CloudAssemblyBuilder { return new CloudAssemblyBuilder(innerAsmDir, { // Reuse the same asset output directory as the current Casm builder assetOutdir: this.assetOutdir, + parentBuilder: this, }); } } diff --git a/packages/@aws-cdk/cx-api/test/cloud-assembly-builder.test.ts b/packages/@aws-cdk/cx-api/test/cloud-assembly-builder.test.ts index fb7ad4d71a407..13b81c572a126 100644 --- a/packages/@aws-cdk/cx-api/test/cloud-assembly-builder.test.ts +++ b/packages/@aws-cdk/cx-api/test/cloud-assembly-builder.test.ts @@ -174,6 +174,28 @@ test('write and read nested cloud assembly artifact', () => { expect(nested?.artifacts.length).toEqual(0); }); +test('missing values are reported to top-level asm', () => { + // GIVEN + const outdir = fs.mkdtempSync(path.join(os.tmpdir(), 'cloud-assembly-builder-tests')); + const session = new cxapi.CloudAssemblyBuilder(outdir); + + const innerAsm = session.createNestedAssembly('hello', 'hello'); + + // WHEN + const props: cxschema.ContextQueryProperties = { + account: '1234', + region: 'asdf', + filter: { a: 'a' }, + }; + + innerAsm.addMissing({ key: 'foo', provider: cxschema.ContextProvider.VPC_PROVIDER, props }); + + // THEN + const assembly = session.buildAssembly(); + + expect(assembly.manifest.missing?.length).toEqual(1); +}); + test('artifcats are written in topological order', () => { // GIVEN const outdir = fs.mkdtempSync(path.join(os.tmpdir(), 'cloud-assembly-builder-tests')); diff --git a/packages/@aws-cdk/pipelines/lib/actions/deploy-cdk-stack-action.ts b/packages/@aws-cdk/pipelines/lib/actions/deploy-cdk-stack-action.ts index b491c9698e7a0..9fe520112931f 100644 --- a/packages/@aws-cdk/pipelines/lib/actions/deploy-cdk-stack-action.ts +++ b/packages/@aws-cdk/pipelines/lib/actions/deploy-cdk-stack-action.ts @@ -9,6 +9,7 @@ import { Aws, Stack } from '@aws-cdk/core'; import * as cxapi from '@aws-cdk/cx-api'; import { Construct, Node } from 'constructs'; import { appOf, assemblyBuilderOf } from '../private/construct-internals'; +import { toPosixPath } from '../private/fs'; // v2 - keep this import as a separate section to reduce merge conflict when forward merging with the v2 branch. // eslint-disable-next-line @@ -186,8 +187,8 @@ export class DeployCdkStackAction implements codepipeline.IAction { return new DeployCdkStackAction({ actionRole, cloudFormationExecutionRole, - templatePath: path.relative(appAsmRoot, fullTemplatePath), - templateConfigurationPath: fullConfigPath ? path.relative(appAsmRoot, fullConfigPath) : undefined, + templatePath: toPosixPath(path.relative(appAsmRoot, fullTemplatePath)), + templateConfigurationPath: fullConfigPath ? toPosixPath(path.relative(appAsmRoot, fullConfigPath)) : undefined, region, stackArtifactId: artifact.id, dependencyStackArtifactIds: artifact.dependencies.filter(isStackArtifact).map(s => s.id), diff --git a/packages/@aws-cdk/pipelines/lib/private/fs.ts b/packages/@aws-cdk/pipelines/lib/private/fs.ts new file mode 100644 index 0000000000000..b5f861a4abc76 --- /dev/null +++ b/packages/@aws-cdk/pipelines/lib/private/fs.ts @@ -0,0 +1,14 @@ +import * as path from 'path'; + +/** + * Convert a file path on the current system to a file path that can be used on Linux + * + * Takes the current OS' file separator and replaces all of them with a '/'. + * + * Relevant if the current system is a Windows machine but is generating + * commands for a Linux CodeBuild image. + */ +export function toPosixPath(osPath: string, currentSep?: string) { + const regex = new RegExp(`\\${currentSep ?? path.sep}`, 'g'); + return osPath.replace(regex, '/'); +} \ No newline at end of file diff --git a/packages/@aws-cdk/pipelines/lib/synths/simple-synth-action.ts b/packages/@aws-cdk/pipelines/lib/synths/simple-synth-action.ts index 8365a3404e120..d04408b9175cd 100644 --- a/packages/@aws-cdk/pipelines/lib/synths/simple-synth-action.ts +++ b/packages/@aws-cdk/pipelines/lib/synths/simple-synth-action.ts @@ -8,6 +8,7 @@ import * as events from '@aws-cdk/aws-events'; import * as iam from '@aws-cdk/aws-iam'; import { Construct, Stack } from '@aws-cdk/core'; import { cloudAssemblyBuildSpecDir } from '../private/construct-internals'; +import { toPosixPath } from '../private/fs'; import { copyEnvironmentVariables, filterEmpty } from './_util'; /** @@ -373,7 +374,7 @@ export class SimpleSynthAction implements codepipeline.IAction, iam.IGrantable { // using secondary artifacts or not. const cloudAsmArtifactSpec = { - 'base-directory': path.join(self.props.subdirectory ?? '.', cloudAssemblyBuildSpecDir(scope)), + 'base-directory': toPosixPath(path.join(self.props.subdirectory ?? '.', cloudAssemblyBuildSpecDir(scope))), 'files': '**/*', }; @@ -388,7 +389,7 @@ export class SimpleSynthAction implements codepipeline.IAction, iam.IGrantable { throw new Error('You must give the output artifact a name'); } secondary[art.artifact.artifactName] = { - 'base-directory': path.join(self.props.subdirectory ?? '.', art.directory), + 'base-directory': toPosixPath(path.join(self.props.subdirectory ?? '.', art.directory)), 'files': '**/*', }; }); diff --git a/packages/@aws-cdk/pipelines/test/fs.test.ts b/packages/@aws-cdk/pipelines/test/fs.test.ts new file mode 100644 index 0000000000000..49cbe2458e64a --- /dev/null +++ b/packages/@aws-cdk/pipelines/test/fs.test.ts @@ -0,0 +1,11 @@ +import * as path from 'path'; +import { toPosixPath } from '../lib/private/fs'; + +test('translate path.sep', () => { + expect(toPosixPath(`a${path.sep}b${path.sep}c`)).toEqual('a/b/c'); +}); + +test('windows path to posix path', () => { + const winPath = path.win32.join('a', 'b', 'c'); + expect(toPosixPath(winPath, path.win32.sep)).toEqual('a/b/c'); +}); \ No newline at end of file diff --git a/packages/aws-cdk-lib/NOTICE b/packages/aws-cdk-lib/NOTICE index 201344067fcb2..725bfc01ce553 100644 --- a/packages/aws-cdk-lib/NOTICE +++ b/packages/aws-cdk-lib/NOTICE @@ -193,3 +193,145 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------- + +** at-least-node - https://www.npmjs.com/package/at-least-node +Copyright (c) 2020 Ryan Zimmerman + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** graceful-fs - https://www.npmjs.com/package/graceful-fs +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** jsonfile - https://www.npmjs.com/package/jsonfile +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** universalify - https://www.npmjs.com/package/universalify +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** brace-expansion - https://www.npmjs.com/package/brace-expansion +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** balanced-match - https://www.npmjs.com/package/balanced-match +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** concat-map - https://www.npmjs.com/package/concat-map + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- diff --git a/packages/aws-cdk-lib/package.json b/packages/aws-cdk-lib/package.json index 113df7a9afce8..9ab275a5198ba 100644 --- a/packages/aws-cdk-lib/package.json +++ b/packages/aws-cdk-lib/package.json @@ -190,11 +190,13 @@ "@aws-cdk/aws-iot1click": "0.0.0", "@aws-cdk/aws-iotanalytics": "0.0.0", "@aws-cdk/aws-iotevents": "0.0.0", + "@aws-cdk/aws-iotsitewise": "0.0.0", "@aws-cdk/aws-iotthingsgraph": "0.0.0", + "@aws-cdk/aws-ivs": "0.0.0", + "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kinesis": "0.0.0", "@aws-cdk/aws-kinesisanalytics": "0.0.0", "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-lakeformation": "0.0.0", "@aws-cdk/aws-lambda": "0.0.0", @@ -208,6 +210,7 @@ "@aws-cdk/aws-managedblockchain": "0.0.0", "@aws-cdk/aws-mediaconvert": "0.0.0", "@aws-cdk/aws-medialive": "0.0.0", + "@aws-cdk/aws-mediapackage": "0.0.0", "@aws-cdk/aws-mediastore": "0.0.0", "@aws-cdk/aws-msk": "0.0.0", "@aws-cdk/aws-neptune": "0.0.0", diff --git a/packages/aws-cdk/package.json b/packages/aws-cdk/package.json index 375fe4b4f9ff6..2e8e5beea9f3d 100644 --- a/packages/aws-cdk/package.json +++ b/packages/aws-cdk/package.json @@ -71,7 +71,7 @@ "@aws-cdk/region-info": "0.0.0", "@aws-cdk/yaml-cfn": "0.0.0", "archiver": "^5.0.2", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "camelcase": "^6.2.0", "cdk-assets": "0.0.0", "colors": "^1.4.0", @@ -87,7 +87,7 @@ "table": "^6.0.3", "uuid": "^8.3.1", "wrap-ansi": "^7.0.0", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "repository": { "url": "https://github.com/aws/aws-cdk.git", diff --git a/packages/awslint/package.json b/packages/awslint/package.json index abe3c5a357ca1..393013289819a 100644 --- a/packages/awslint/package.json +++ b/packages/awslint/package.json @@ -21,7 +21,7 @@ "colors": "^1.4.0", "fs-extra": "^9.0.1", "jsii-reflect": "^1.14.1", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "devDependencies": { "@types/fs-extra": "^8.1.1", diff --git a/packages/cdk-assets/package.json b/packages/cdk-assets/package.json index 6d82300abeb4d..52aadabc11688 100644 --- a/packages/cdk-assets/package.json +++ b/packages/cdk-assets/package.json @@ -47,9 +47,9 @@ "@aws-cdk/cloud-assembly-schema": "0.0.0", "@aws-cdk/cx-api": "0.0.0", "archiver": "^5.0.2", - "aws-sdk": "^2.789.0", + "aws-sdk": "^2.792.0", "glob": "^7.1.6", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "repository": { "url": "https://github.com/aws/aws-cdk.git", diff --git a/packages/decdk/package.json b/packages/decdk/package.json index 0871274f0b016..29d9c38d5bedf 100644 --- a/packages/decdk/package.json +++ b/packages/decdk/package.json @@ -117,7 +117,9 @@ "@aws-cdk/aws-iot1click": "0.0.0", "@aws-cdk/aws-iotanalytics": "0.0.0", "@aws-cdk/aws-iotevents": "0.0.0", + "@aws-cdk/aws-iotsitewise": "0.0.0", "@aws-cdk/aws-iotthingsgraph": "0.0.0", + "@aws-cdk/aws-ivs": "0.0.0", "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kinesis": "0.0.0", "@aws-cdk/aws-kinesisanalytics": "0.0.0", @@ -135,6 +137,7 @@ "@aws-cdk/aws-managedblockchain": "0.0.0", "@aws-cdk/aws-mediaconvert": "0.0.0", "@aws-cdk/aws-medialive": "0.0.0", + "@aws-cdk/aws-mediapackage": "0.0.0", "@aws-cdk/aws-mediastore": "0.0.0", "@aws-cdk/aws-msk": "0.0.0", "@aws-cdk/aws-neptune": "0.0.0", @@ -193,7 +196,7 @@ "jsii-reflect": "^1.14.1", "jsonschema": "^1.4.0", "yaml": "1.10.0", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "devDependencies": { "@types/fs-extra": "^8.1.1", diff --git a/packages/monocdk/NOTICE b/packages/monocdk/NOTICE index 201344067fcb2..725bfc01ce553 100644 --- a/packages/monocdk/NOTICE +++ b/packages/monocdk/NOTICE @@ -193,3 +193,145 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------- + +** at-least-node - https://www.npmjs.com/package/at-least-node +Copyright (c) 2020 Ryan Zimmerman + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** graceful-fs - https://www.npmjs.com/package/graceful-fs +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------------- + +** jsonfile - https://www.npmjs.com/package/jsonfile +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** universalify - https://www.npmjs.com/package/universalify +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------------- + +** brace-expansion - https://www.npmjs.com/package/brace-expansion +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** balanced-match - https://www.npmjs.com/package/balanced-match +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- + +** concat-map - https://www.npmjs.com/package/concat-map + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------- diff --git a/packages/monocdk/package.json b/packages/monocdk/package.json index f6b5dc263a9fb..7123a4b0469e8 100644 --- a/packages/monocdk/package.json +++ b/packages/monocdk/package.json @@ -189,11 +189,13 @@ "@aws-cdk/aws-iot1click": "0.0.0", "@aws-cdk/aws-iotanalytics": "0.0.0", "@aws-cdk/aws-iotevents": "0.0.0", + "@aws-cdk/aws-iotsitewise": "0.0.0", "@aws-cdk/aws-iotthingsgraph": "0.0.0", + "@aws-cdk/aws-ivs": "0.0.0", + "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kinesis": "0.0.0", "@aws-cdk/aws-kinesisanalytics": "0.0.0", "@aws-cdk/aws-kinesisfirehose": "0.0.0", - "@aws-cdk/aws-kendra": "0.0.0", "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-lakeformation": "0.0.0", "@aws-cdk/aws-lambda": "0.0.0", @@ -207,6 +209,7 @@ "@aws-cdk/aws-managedblockchain": "0.0.0", "@aws-cdk/aws-mediaconvert": "0.0.0", "@aws-cdk/aws-medialive": "0.0.0", + "@aws-cdk/aws-mediapackage": "0.0.0", "@aws-cdk/aws-mediastore": "0.0.0", "@aws-cdk/aws-msk": "0.0.0", "@aws-cdk/aws-neptune": "0.0.0", diff --git a/scripts/script-tests/package.json b/scripts/script-tests/package.json index 2c6d0ff48e94a..91bca5735c77a 100644 --- a/scripts/script-tests/package.json +++ b/scripts/script-tests/package.json @@ -10,6 +10,6 @@ "build+test+package": "npm run build+test" }, "devDependencies": { - "jest": "^26.6.2" + "jest": "^26.6.3" } } diff --git a/tools/cdk-build-tools/package.json b/tools/cdk-build-tools/package.json index 9504a4075cb86..c81340a9f7986 100644 --- a/tools/cdk-build-tools/package.json +++ b/tools/cdk-build-tools/package.json @@ -39,12 +39,12 @@ "pkglint": "0.0.0" }, "dependencies": { - "@typescript-eslint/eslint-plugin": "^4.7.0", - "@typescript-eslint/parser": "^4.6.1", + "@typescript-eslint/eslint-plugin": "^4.8.0", + "@typescript-eslint/parser": "^4.7.0", "eslint-plugin-cdk": "0.0.0", "awslint": "0.0.0", "colors": "^1.4.0", - "eslint": "^7.12.1", + "eslint": "^7.13.0", "eslint-import-resolver-node": "^0.3.4", "eslint-import-resolver-typescript": "^2.3.0", "eslint-plugin-import": "^2.22.1", @@ -56,7 +56,7 @@ "nyc": "^15.1.0", "ts-jest": "^26.4.4", "typescript": "~3.9.7", - "yargs": "^16.1.0", + "yargs": "^16.1.1", "yarn-cling": "0.0.0" }, "keywords": [ diff --git a/tools/cdk-integ-tools/package.json b/tools/cdk-integ-tools/package.json index 6237634e6be3d..fae89fa59d2a9 100644 --- a/tools/cdk-integ-tools/package.json +++ b/tools/cdk-integ-tools/package.json @@ -40,7 +40,7 @@ "@aws-cdk/assert": "0.0.0", "aws-cdk": "0.0.0", "fs-extra": "^9.0.1", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "keywords": [ "aws", diff --git a/tools/cfn2ts/package.json b/tools/cfn2ts/package.json index 7ef2c7f940205..6343ce98a7de5 100644 --- a/tools/cfn2ts/package.json +++ b/tools/cfn2ts/package.json @@ -33,7 +33,7 @@ "codemaker": "^1.14.1", "fast-json-patch": "^3.0.0-1", "fs-extra": "^9.0.1", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "devDependencies": { "@types/fs-extra": "^8.1.1", diff --git a/tools/eslint-plugin-cdk/package.json b/tools/eslint-plugin-cdk/package.json index 24c0c14813522..9de20764c4898 100644 --- a/tools/eslint-plugin-cdk/package.json +++ b/tools/eslint-plugin-cdk/package.json @@ -12,7 +12,7 @@ "build+test": "npm run build && npm test" }, "devDependencies": { - "@types/eslint": "^7.2.4", + "@types/eslint": "^7.2.5", "@types/fs-extra": "^8.1.1", "@types/jest": "^26.0.15", "@types/node": "^10.17.44", @@ -21,8 +21,8 @@ "typescript": "~3.9.7" }, "dependencies": { - "@typescript-eslint/parser": "^4.6.1", - "eslint": "^7.12.1", + "@typescript-eslint/parser": "^4.7.0", + "eslint": "^7.13.0", "fs-extra": "^9.0.1" }, "jest": { diff --git a/tools/pkglint/lib/packagejson.ts b/tools/pkglint/lib/packagejson.ts index 86be0b30cdc50..a59e8f1c6e307 100644 --- a/tools/pkglint/lib/packagejson.ts +++ b/tools/pkglint/lib/packagejson.ts @@ -1,6 +1,8 @@ import * as path from 'path'; import * as colors from 'colors/safe'; import * as fs from 'fs-extra'; +// eslint-disable-next-line @typescript-eslint/no-require-imports +const bundled = require('npm-bundled'); // do not descend into these directories when searching for `package.json` files. export const PKGLINT_IGNORES = ['node_modules', 'cdk.out', '.cdk.staging']; @@ -209,8 +211,11 @@ export class PackageJson { return Object.keys(this.json.dependencies || {}).filter(predicate).map(name => ({ name, version: this.json.dependencies[name] })); } - public getBundledDependencies(): string[] { - return this.json.bundledDependencies ?? []; + /** + * Retrieves all packages that are bundled in, including transitive bundled dependency of a bundled dependency. + */ + public getAllBundledDependencies(): string[] { + return bundled.sync({ path: this.packageRoot }); } /** diff --git a/tools/pkglint/lib/rules.ts b/tools/pkglint/lib/rules.ts index b3ae82fce7160..78d2bc7ec436e 100644 --- a/tools/pkglint/lib/rules.ts +++ b/tools/pkglint/lib/rules.ts @@ -146,7 +146,7 @@ export class ThirdPartyAttributions extends ValidationRule { if (pkg.json.private && !alwaysCheck.includes(pkg.json.name)) { return; } - const bundled = pkg.getBundledDependencies(); + const bundled = pkg.getAllBundledDependencies().filter(dep => !dep.startsWith('@aws-cdk')); const lines = fs.readFileSync(path.join(pkg.packageRoot, 'NOTICE'), { encoding: 'utf8' }).split('\n'); const re = /^\*\* (\S+)/; @@ -1460,24 +1460,51 @@ export class JestSetup extends ValidationRule { export class UbergenPackageVisibility extends ValidationRule { public readonly name = 'ubergen/package-visibility'; + private readonly publicPackages = [ + '@aws-cdk/cloud-assembly-schema', + '@aws-cdk/cloudformation-diff', + '@aws-cdk/cx-api', + 'aws-cdk-lib', + 'aws-cdk', + 'awslint', + 'cdk', + ]; public validate(pkg: PackageJson): void { // eslint-disable-next-line @typescript-eslint/no-require-imports const releaseJson = require(`${__dirname}/../../../release.json`); if (releaseJson.majorVersion === 2) { - // skip in v2 for now - return; - } - if (pkg.json.private && !pkg.json.ubergen?.exclude) { - pkg.report({ - ruleName: this.name, - message: 'ubergen.exclude must be configured for private packages', - fix: () => { - pkg.json.ubergen = { - exclude: true, - }; - }, - }); + // Only packages in the publicPackages list should be "public". Everything else should be private. + if (this.publicPackages.includes(pkg.json.name) && pkg.json.private === true) { + pkg.report({ + ruleName: this.name, + message: 'Package must be public', + fix: () => { + delete pkg.json.private; + }, + }); + } else if (!this.publicPackages.includes(pkg.json.name) && pkg.json.private !== true) { + pkg.report({ + ruleName: this.name, + message: 'Package must not be public', + fix: () => { + delete pkg.json.private; + pkg.json.private = true; + }, + }); + } + } else { + if (pkg.json.private && !pkg.json.ubergen?.exclude) { + pkg.report({ + ruleName: this.name, + message: 'ubergen.exclude must be configured for private packages', + fix: () => { + pkg.json.ubergen = { + exclude: true, + }; + }, + }); + } } } } diff --git a/tools/pkglint/package.json b/tools/pkglint/package.json index 3f6a213c666ab..4c387a03ea16d 100644 --- a/tools/pkglint/package.json +++ b/tools/pkglint/package.json @@ -47,7 +47,8 @@ "colors": "^1.4.0", "fs-extra": "^9.0.1", "glob": "^7.1.6", + "npm-bundled": "^1.1.1", "semver": "^7.3.2", - "yargs": "^16.1.0" + "yargs": "^16.1.1" } } diff --git a/tools/pkglint/test/fake-module.ts b/tools/pkglint/test/fake-module.ts index 535805b2106d8..32cc8041afff7 100644 --- a/tools/pkglint/test/fake-module.ts +++ b/tools/pkglint/test/fake-module.ts @@ -4,23 +4,12 @@ import * as fs from 'fs-extra'; export interface FakeModuleProps { /** - * The contents of the package json. - * If an empty object, i.e. `{}`, is provided, an empty file is created. - * @default - no package json will be created + * The list of files to be created. + * The key specifies the path of the file relative to the package directory including the file name. + * If the value is a string, the string is written to the file. If object, the object is stringified + * using `JSON.stringify()` and written into the file. */ - readonly packagejson?: any; - /** - * The contents of the README.md file. Each item in the array represents a single line. - * If an empty list is provided, an empty file is created. - * @default - no README.md file will be created - */ - readonly readme?: string[]; - /** - * The contents of the NOTICE file. Each item in the array represents a single line. - * If an empty list is provided, an empty file is created. - * @default - no NOTICE file will be created - */ - readonly notice?: string[]; + readonly files?: { [key: string]: string | {} }; } export class FakeModule { @@ -35,17 +24,12 @@ export class FakeModule { throw new Error('Cannot re-create cleaned up fake module'); } if (!this._tmpdir) { - const tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'pkglint-rules-test-')); - await fs.writeFile(path.join(tmpdir, 'package.json'), JSON.stringify(this.props.packagejson ?? {}), { encoding: 'utf8' }); - if (this.props.readme !== undefined) { - const contents = this.props.readme.join('\n'); - await fs.writeFile(path.join(tmpdir, 'README.md'), contents, { encoding: 'utf8' }); - } - if (this.props.notice !== undefined) { - const contents = this.props.notice.join('\n'); - await fs.writeFile(path.join(tmpdir, 'NOTICE'), contents, { encoding: 'utf8' }); + this._tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'pkglint-rules-test-')); + for (const [key, value] of Object.entries(this.props.files ?? {})) { + await fs.mkdirp(path.join(this._tmpdir, path.dirname(key))); + const toWrite = typeof value === 'string' ? value : JSON.stringify(value); + await fs.writeFile(path.join(this._tmpdir, key), toWrite, { encoding: 'utf8' }); } - this._tmpdir = tmpdir; } return this._tmpdir; } diff --git a/tools/pkglint/test/rules.test.ts b/tools/pkglint/test/rules.test.ts index 70e8942697271..767dbe81b1e1d 100644 --- a/tools/pkglint/test/rules.test.ts +++ b/tools/pkglint/test/rules.test.ts @@ -19,15 +19,17 @@ describe('FeatureStabilityRule', () => { test('feature table is rendered', async () => { fakeModule = new FakeModule({ - packagejson: { - features: [ - { name: 'Experimental Feature', stability: 'Experimental' }, - { name: 'Stable Feature', stability: 'Stable' }, - { name: 'Dev Preview Feature', stability: 'Developer Preview' }, - { name: 'Not Implemented Feature', stability: 'Not Implemented' }, - ], + files: { + 'package.json': { + features: [ + { name: 'Experimental Feature', stability: 'Experimental' }, + { name: 'Stable Feature', stability: 'Stable' }, + { name: 'Dev Preview Feature', stability: 'Developer Preview' }, + { name: 'Not Implemented Feature', stability: 'Not Implemented' }, + ], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -47,11 +49,13 @@ describe('FeatureStabilityRule', () => { test('CFN Resources is rendered', async () => { fakeModule = new FakeModule({ - packagejson: { - 'cdk-build': { cloudformation: 'Foo::Bar' }, - 'features': [], + files: { + 'package.json': { + 'cdk-build': { cloudformation: 'Foo::Bar' }, + 'features': [], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); @@ -68,11 +72,13 @@ describe('FeatureStabilityRule', () => { describe('banner notices', () => { test('CFN Resources', async () => { fakeModule = new FakeModule({ - packagejson: { - 'cdk-build': { cloudformation: 'Foo::Bar' }, - 'features': [], + files: { + 'package.json': { + 'cdk-build': { cloudformation: 'Foo::Bar' }, + 'features': [], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -87,12 +93,14 @@ describe('FeatureStabilityRule', () => { test('experimental', async () => { fakeModule = new FakeModule({ - packagejson: { - features: [ - { name: 'Feature', stability: 'Experimental' }, - ], + files: { + 'package.json': { + features: [ + { name: 'Feature', stability: 'Experimental' }, + ], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -109,12 +117,14 @@ describe('FeatureStabilityRule', () => { test('developer preview', async () => { fakeModule = new FakeModule({ - packagejson: { - features: [ - { name: 'Feature', stability: 'Developer Preview' }, - ], + files: { + 'package.json': { + features: [ + { name: 'Feature', stability: 'Developer Preview' }, + ], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -131,12 +141,14 @@ describe('FeatureStabilityRule', () => { test('stable', async () => { fakeModule = new FakeModule({ - packagejson: { - features: [ - { name: 'Feature', stability: 'Stable' }, - ], + files: { + 'package.json': { + features: [ + { name: 'Feature', stability: 'Stable' }, + ], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -154,13 +166,15 @@ describe('FeatureStabilityRule', () => { test('skip if package private', async () => { fakeModule = new FakeModule({ - packagejson: { - private: true, - features: [ - { name: 'Experimental Feature', stability: 'Experimental' }, - ], + files: { + 'package.json': { + private: true, + features: [ + { name: 'Experimental Feature', stability: 'Experimental' }, + ], + }, + 'README.md': '', }, - readme: [], }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -173,8 +187,10 @@ describe('FeatureStabilityRule', () => { test('skip if features is not specified', async () => { fakeModule = new FakeModule({ - packagejson: {}, - readme: [], + files: { + 'package.json': {}, + 'README.md': '', + }, }); const dirPath = await fakeModule.tmpdir(); const rule = new rules.FeatureStabilityRule(); @@ -187,10 +203,12 @@ describe('FeatureStabilityRule', () => { test('skip if README.md is missing', async () => { fakeModule = new FakeModule({ - packagejson: { - features: [ - { name: 'Experimental Feature', stability: 'Experimental' }, - ], + files: { + 'package.json': { + features: [ + { name: 'Experimental Feature', stability: 'Experimental' }, + ], + }, }, }); const dirPath = await fakeModule.tmpdir(); @@ -218,10 +236,14 @@ describe('ThirdPartyAttributions', () => { test('errors when attribution missing for bundled dependencies', async() => { fakeModule = new FakeModule({ - packagejson: { - bundledDependencies: ['dep1', 'dep2'], + files: { + 'package.json': { + bundledDependencies: ['dep1', 'dep2'], + }, + 'node_modules/dep1/package.json': {}, + 'node_modules/dep2/package.json': {}, + 'NOTICE': '', }, - notice: [], }); const dirPath = await fakeModule.tmpdir(); @@ -242,14 +264,17 @@ describe('ThirdPartyAttributions', () => { test('errors when there are excessive attributions', async() => { fakeModule = new FakeModule({ - packagejson: { - bundledDependencies: ['dep1'], + files: { + 'package.json': { + bundledDependencies: ['dep1'], + }, + 'node_modules/dep1/package.json': {}, + 'NOTICE': [ + '** dep1 - https://link-somewhere', + '** dep2 - https://link-elsewhere', + '** dep3-rev - https://link-elsewhere', + ].join('\n'), }, - notice: [ - '** dep1 - https://link-somewhere', - '** dep2 - https://link-elsewhere', - '** dep3-rev - https://link-elsewhere', - ], }); const dirPath = await fakeModule.tmpdir(); @@ -270,13 +295,17 @@ describe('ThirdPartyAttributions', () => { test('passes when attribution is present', async() => { fakeModule = new FakeModule({ - packagejson: { - bundledDependencies: ['dep1', 'dep2'], + files: { + 'package.json': { + bundledDependencies: ['dep1', 'dep2'], + }, + 'node_modules/dep1/package.json': {}, + 'node_modules/dep2/package.json': {}, + 'NOTICE': [ + '** dep1 - https://link-somewhere', + '** dep2 - https://link-elsewhere', + ].join('\n'), }, - notice: [ - '** dep1 - https://link-somewhere', - '** dep2 - https://link-elsewhere', - ], }); const dirPath = await fakeModule.tmpdir(); @@ -288,11 +317,68 @@ describe('ThirdPartyAttributions', () => { expect(pkgJson.hasReports).toBe(false); }); + test('passes when attribution for transitive bundled deps are present', async() => { + fakeModule = new FakeModule({ + files: { + 'package.json': { + bundledDependencies: ['dep1'], + }, + 'node_modules/dep1/package.json': { + dependencies: { dep2: '1.2.3' }, + }, + 'node_modules/dep2/package.json': {}, + 'NOTICE': [ + '** dep1 - https://link-somewhere', + '** dep2 - https://link-elsewhere', + ].join('\n'), + }, + }); + const dirPath = await fakeModule.tmpdir(); + + const rule = new rules.ThirdPartyAttributions(); + + const pkgJson = new PackageJson(path.join(dirPath, 'package.json')); + rule.validate(pkgJson); + + expect(pkgJson.hasReports).toBe(false); + }); + + test('fails when attribution for transitive bundled deps are missing', async() => { + fakeModule = new FakeModule({ + files: { + 'package.json': { + bundledDependencies: ['dep1'], + }, + 'node_modules/dep1/package.json': { + dependencies: { dep2: '1.2.3' }, + }, + 'node_modules/dep2/package.json': {}, + 'NOTICE': [ + '** dep1 - https://link-somewhere', + ].join('\n'), + }, + }); + const dirPath = await fakeModule.tmpdir(); + + const rule = new rules.ThirdPartyAttributions(); + + const pkgJson = new PackageJson(path.join(dirPath, 'package.json')); + rule.validate(pkgJson); + + expect(pkgJson.hasReports).toBe(true); + expect(pkgJson.reports.length).toEqual(1); + expect(pkgJson.reports[0].ruleName).toEqual('license/3p-attributions'); + expect(pkgJson.reports[0].message).toContain('Missing attribution'); + expect(pkgJson.reports[0].message).toContain('dep2'); + }); + test('skipped when no bundled dependencies', async() => { fakeModule = new FakeModule({ - packagejson: { + files: { + 'package.json': { + }, + 'NOTICE': '', }, - notice: [], }); const dirPath = await fakeModule.tmpdir(); @@ -306,11 +392,15 @@ describe('ThirdPartyAttributions', () => { test('skipped for private packages', async () => { fakeModule = new FakeModule({ - packagejson: { - private: true, - bundledDependencies: ['dep1', 'dep2'], + files: { + 'package.json': { + private: true, + bundledDependencies: ['dep1', 'dep2'], + }, + 'node_modules/dep1/package.json': {}, + 'node_modules/dep2/package.json': {}, + 'NOTICE': '', }, - notice: [], }); const dirPath = await fakeModule.tmpdir(); diff --git a/tools/pkgtools/package.json b/tools/pkgtools/package.json index 0337051d556fb..278d8531c2375 100644 --- a/tools/pkgtools/package.json +++ b/tools/pkgtools/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "fs-extra": "^9.0.1", - "yargs": "^16.1.0" + "yargs": "^16.1.1" }, "keywords": [ "aws", diff --git a/version.v1.json b/version.v1.json index 80ff54da9d296..9b48089bc1d8f 100644 --- a/version.v1.json +++ b/version.v1.json @@ -1,3 +1,3 @@ { - "version": "1.73.0" + "version": "1.74.0" } diff --git a/yarn.lock b/yarn.lock index aae1f4a455d64..d76198c99898f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2159,128 +2159,128 @@ dependencies: "@types/node" ">= 8" -"@parcel/babel-ast-utils@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/babel-ast-utils/-/babel-ast-utils-2.0.0-nightly.2067.tgz#bbb65a31eb2531a8d8bec1416b5d0047a74b57ac" - integrity sha512-1oWLszHqibl9giNCzzwd9DVePmivPridrcOlX+txSAkuQ2FG0mVSutv25XturJ6g/B6z78pL2tNV/fdVjf6lkA== +"@parcel/babel-ast-utils@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/babel-ast-utils/-/babel-ast-utils-2.0.0-nightly.2071.tgz#e2f0f84f9da701debb36d412fbe9b9f0a793f261" + integrity sha512-Y5qKBqvneFuDEMT0G9SZlbxJz5dEyF1+BIFyQC01zydNCzbrff/BVyLsEzFRBthSefzW6wUfTKnxUdWcpygTeQ== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/babel-preset-env@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/babel-preset-env/-/babel-preset-env-2.0.0-nightly.445.tgz#93ecf8ed29179c99e5e6d7e1534fcfae7a72a73e" - integrity sha512-fkYiZocLAsEyjz50nibkVIHULP0hwV9K2Qjl+/tqA1WJYh6/TMb1/EsaQ4T1CTY+zVsCh3TgRY4a+WqQ+OCu/A== +"@parcel/babel-preset-env@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/babel-preset-env/-/babel-preset-env-2.0.0-nightly.449.tgz#90b382dc53f040585a7f69b18c9c56003b24e7cd" + integrity sha512-xoUBvWrkft85Ch9bai4vLytgUeYshHJS/jRGJgbhaa4Vle6/R4QfP4i9mmq/Ai3Wbk2iErznlkFVS9T4gCQI/g== dependencies: "@babel/preset-env" "^7.4.0" semver "^5.4.1" -"@parcel/babylon-walk@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/babylon-walk/-/babylon-walk-2.0.0-nightly.2067.tgz#102349d4f52d8046868429cb70f5fd4fe544957e" - integrity sha512-PlFGav6fC8HIsA1pS7moWTWgXuwL4OI+xH50Wee5Dc0Q3KNmfyqCJpnhRhCJTGmVe8KGYEgXF6MNwrvjVWUCbg== +"@parcel/babylon-walk@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/babylon-walk/-/babylon-walk-2.0.0-nightly.2071.tgz#f4d49163214074d2cd2bbc43cd2602eaf993cb53" + integrity sha512-MXStP3yWHGCY2nRGi6kh9ezeS3x9ITUCZn0zX80TJc183I/Cz1PHcJKqeS0lwXl8VtPFqDvjXVqoSBY8UCFQ9g== dependencies: "@babel/types" "^7.0.0" lodash.clone "^4.5.0" -"@parcel/bundler-default@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.0.0-nightly.445.tgz#bac962673e7ebe6c8314e5cab7e89f03a00fca77" - integrity sha512-v6zhPfvte103vtZkAUh4mJkVLCLvX9ZjI8p6ZP3fDSI1Y5F8akWe4LWXOo1ATMjfELcwbcb317rOAKgwvV6fiQ== +"@parcel/bundler-default@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.0.0-nightly.449.tgz#1898eb0a5b2bc42748a1b56eb695787ee4d808dc" + integrity sha512-92vgvqsBKPSamstAcfAkKDLCbw5r2IP9FL6PVSb0u6gmCuOKCUMM4JUtoiAWm0njSSmW1B3Zqtzbhfu2JlNflQ== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/cache@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.0.0-nightly.445.tgz#ade1c56a3b8064223b5b4004d0f3a76116290617" - integrity sha512-HhOkWCCNRs8zdKRyiWUiYI63BZc4MjrgFCiNv00KxyDCtDXtZrD5yjzRdVbVMmJvoth8iAtNoSCrJ2hGsouPBQ== +"@parcel/cache@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.0.0-nightly.449.tgz#8d3cbcfd79657fc8a83a8fa920b14e985b57e878" + integrity sha512-SYtpAKL4+AuHINgxfqrKwdG26jxsAJgeETpk9ILm9FvwOw40H9ImktNYIiT5dYaehpmuOl35msVlkocNWWHOjA== dependencies: - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/codeframe@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.0.0-nightly.445.tgz#4a89d283e26a0e24eb91954e499ecd80cf4472a2" - integrity sha512-lptg9/JUko0GXe4dbG39w7sIVyOhT414qVem6mOC7P7Fy0Us7Qat23nAlWGLICZ4iYavOO44B9yIRbwUv/WB7g== +"@parcel/codeframe@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.0.0-nightly.449.tgz#77c7ba848cdef8dd7cedfa122b422acf824fc821" + integrity sha512-GrA41h6DCM9zTwo0LRu6aWCoFhlAVIB5hsZO1i6GcKrl9hb5RxRWt56YSPdigN67S4FCY0XyfrS6M98yaHrb2w== dependencies: chalk "^2.4.2" emphasize "^2.1.0" slice-ansi "^4.0.0" string-width "^4.2.0" -"@parcel/config-default@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.0.0-nightly.445.tgz#d48b91629ccf3b065702ce1b893fd7011a3cb494" - integrity sha512-v7l35yN+KYLzuzMEGxdHr8WSaTXhZlY7FQKeoZ7XupFRXAB2QsOyoIpm74LMkSsRLAWZ3JOQej3Ii79bbTvFHQ== - dependencies: - "@parcel/bundler-default" "2.0.0-nightly.445+adb92ee0" - "@parcel/namer-default" "2.0.0-nightly.445+adb92ee0" - "@parcel/optimizer-cssnano" "2.0.0-nightly.445+adb92ee0" - "@parcel/optimizer-data-url" "2.0.0-nightly.445+adb92ee0" - "@parcel/optimizer-htmlnano" "2.0.0-nightly.445+adb92ee0" - "@parcel/optimizer-terser" "2.0.0-nightly.445+adb92ee0" - "@parcel/packager-css" "2.0.0-nightly.445+adb92ee0" - "@parcel/packager-html" "2.0.0-nightly.445+adb92ee0" - "@parcel/packager-js" "2.0.0-nightly.445+adb92ee0" - "@parcel/packager-raw" "2.0.0-nightly.445+adb92ee0" - "@parcel/packager-raw-url" "2.0.0-nightly.2067+adb92ee0" - "@parcel/packager-ts" "2.0.0-nightly.445+adb92ee0" - "@parcel/reporter-bundle-analyzer" "2.0.0-nightly.2067+adb92ee0" - "@parcel/reporter-bundle-buddy" "2.0.0-nightly.2067+adb92ee0" - "@parcel/reporter-cli" "2.0.0-nightly.445+adb92ee0" - "@parcel/reporter-dev-server" "2.0.0-nightly.445+adb92ee0" - "@parcel/resolver-default" "2.0.0-nightly.445+adb92ee0" - "@parcel/runtime-browser-hmr" "2.0.0-nightly.445+adb92ee0" - "@parcel/runtime-js" "2.0.0-nightly.445+adb92ee0" - "@parcel/runtime-react-refresh" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-babel" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-coffeescript" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-css" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-glsl" "2.0.0-nightly.2067+adb92ee0" - "@parcel/transformer-graphql" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-html" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-image" "2.0.0-nightly.2067+adb92ee0" - "@parcel/transformer-inline-string" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-js" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-json" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-jsonld" "2.0.0-nightly.2067+adb92ee0" - "@parcel/transformer-less" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-mdx" "2.0.0-nightly.2067+adb92ee0" - "@parcel/transformer-postcss" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-posthtml" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-pug" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-raw" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-react-refresh-babel" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-react-refresh-wrap" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-sass" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-stylus" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-sugarss" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-toml" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-typescript-types" "2.0.0-nightly.445+adb92ee0" - "@parcel/transformer-vue" "2.0.0-nightly.2067+adb92ee0" - "@parcel/transformer-yaml" "2.0.0-nightly.445+adb92ee0" - -"@parcel/core@2.0.0-nightly.443+adb92ee0": - version "2.0.0-nightly.443" - resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.0.0-nightly.443.tgz#2aadb331972f97738d74e1032d8894cdd7b08fa1" - integrity sha512-tjxlSYwrR4X4244PvdKYQslAQf1jqsBSjVtb19tD+5r/B+nmWrZtVe3/S1JEu8rFVt54TGsgifrO4RyOOlvqVA== - dependencies: - "@parcel/cache" "2.0.0-nightly.445+adb92ee0" - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/events" "2.0.0-nightly.445+adb92ee0" - "@parcel/fs" "2.0.0-nightly.445+adb92ee0" - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/package-manager" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" +"@parcel/config-default@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.0.0-nightly.449.tgz#0b34f279469c3cf5b343da369b7c77b5472992c5" + integrity sha512-5gsByLMQbUmKAtLf79diY4AcP2mTkMd2ljuLZ6oJMNDL8viqG0pCFvp88KBC/xKg8NpU5gvj2mLrwG6pkOzu+Q== + dependencies: + "@parcel/bundler-default" "2.0.0-nightly.449+837d1fbd" + "@parcel/namer-default" "2.0.0-nightly.449+837d1fbd" + "@parcel/optimizer-cssnano" "2.0.0-nightly.449+837d1fbd" + "@parcel/optimizer-data-url" "2.0.0-nightly.449+837d1fbd" + "@parcel/optimizer-htmlnano" "2.0.0-nightly.449+837d1fbd" + "@parcel/optimizer-terser" "2.0.0-nightly.449+837d1fbd" + "@parcel/packager-css" "2.0.0-nightly.449+837d1fbd" + "@parcel/packager-html" "2.0.0-nightly.449+837d1fbd" + "@parcel/packager-js" "2.0.0-nightly.449+837d1fbd" + "@parcel/packager-raw" "2.0.0-nightly.449+837d1fbd" + "@parcel/packager-raw-url" "2.0.0-nightly.2071+837d1fbd" + "@parcel/packager-ts" "2.0.0-nightly.449+837d1fbd" + "@parcel/reporter-bundle-analyzer" "2.0.0-nightly.2071+837d1fbd" + "@parcel/reporter-bundle-buddy" "2.0.0-nightly.2071+837d1fbd" + "@parcel/reporter-cli" "2.0.0-nightly.449+837d1fbd" + "@parcel/reporter-dev-server" "2.0.0-nightly.449+837d1fbd" + "@parcel/resolver-default" "2.0.0-nightly.449+837d1fbd" + "@parcel/runtime-browser-hmr" "2.0.0-nightly.449+837d1fbd" + "@parcel/runtime-js" "2.0.0-nightly.449+837d1fbd" + "@parcel/runtime-react-refresh" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-babel" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-coffeescript" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-css" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-glsl" "2.0.0-nightly.2071+837d1fbd" + "@parcel/transformer-graphql" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-html" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-image" "2.0.0-nightly.2071+837d1fbd" + "@parcel/transformer-inline-string" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-js" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-json" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-jsonld" "2.0.0-nightly.2071+837d1fbd" + "@parcel/transformer-less" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-mdx" "2.0.0-nightly.2071+837d1fbd" + "@parcel/transformer-postcss" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-posthtml" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-pug" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-raw" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-react-refresh-babel" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-react-refresh-wrap" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-sass" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-stylus" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-sugarss" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-toml" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-typescript-types" "2.0.0-nightly.449+837d1fbd" + "@parcel/transformer-vue" "2.0.0-nightly.2071+837d1fbd" + "@parcel/transformer-yaml" "2.0.0-nightly.449+837d1fbd" + +"@parcel/core@2.0.0-nightly.447+837d1fbd": + version "2.0.0-nightly.447" + resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.0.0-nightly.447.tgz#ddf02b86f3a62b5f74259d9d97703592d8797ea6" + integrity sha512-UUL9+mytJo48Uze954POXkWEnv4l1NuPNFdP4FKunyeRSQp4hK8jBMFctLDigVYXXs/pQ8q0pxDIkWfucf86dg== + dependencies: + "@parcel/cache" "2.0.0-nightly.449+837d1fbd" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/events" "2.0.0-nightly.449+837d1fbd" + "@parcel/fs" "2.0.0-nightly.449+837d1fbd" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/package-manager" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/types" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" - "@parcel/workers" "2.0.0-nightly.445+adb92ee0" + "@parcel/types" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" + "@parcel/workers" "2.0.0-nightly.449+837d1fbd" abortcontroller-polyfill "^1.1.9" base-x "^3.0.8" browserslist "^4.6.6" @@ -2294,72 +2294,72 @@ querystring "^0.2.0" semver "^5.4.1" -"@parcel/diagnostic@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.0.0-nightly.445.tgz#9ee4346683445c7e6c05695d0c1e105dbc4a81ce" - integrity sha512-uURmdKGPQn5ZGHzJbuPTnTYDFWzsYlt6SBysVU5/OGoWXDlsW7nQ+MU7rfIQl9D5pgFtC9G+orwSPvjDmBi83w== +"@parcel/diagnostic@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.0.0-nightly.449.tgz#5ea6f709fad1376ae833497b507422661115a95e" + integrity sha512-HUR5X9cDjBpTeWzB0kBhudv6enSTBPng1f5x2SJUnPKIK1EdpEKGXIei4xwvTH1Tz0oIHcIVhrx2k4AZtaALPg== dependencies: json-source-map "^0.6.1" nullthrows "^1.1.1" -"@parcel/events@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.0.0-nightly.445.tgz#f8c7b0ab75bc9c2676bb65c428780467378f31ee" - integrity sha512-4w1NoPtP4lAl2IC0B3dNKEJgukSSArdnd/+D33Y57S6C9Ninw6nTrEQtfePmoZqNVcmEk/ztSBxixn484NE+IA== +"@parcel/events@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.0.0-nightly.449.tgz#e7e41c368c7f1357e118c1da4264e7add57b6475" + integrity sha512-gOGHFGWW3tvBXSmXj6fKGfCTsjVV0KHrka5mL0vrNpi6n0LUQgpPtsZJokyQy91U/B5neUtLX/ubQT0gordqjA== -"@parcel/fs-write-stream-atomic@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/fs-write-stream-atomic/-/fs-write-stream-atomic-2.0.0-nightly.2067.tgz#e868a6d75e791f66477f9fbc6b65763c0cd9f16c" - integrity sha512-zIKF9CfZQPi7iwbHTaulTY2k8ZUcnSj4tVeHKrd2XiX+5yv7Q80Kuk5GbpcnMw/FxSubxNvHX/x7oxbtFCiXeA== +"@parcel/fs-write-stream-atomic@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/fs-write-stream-atomic/-/fs-write-stream-atomic-2.0.0-nightly.2071.tgz#e239927e1d6b55a7b8ae2445f3839483752e75d6" + integrity sha512-Liv3eXtB5Ap/HvLyAmbBNdil9K33YlPJkDcTQjji9vt9PS7K53rX4woHIgdBvFmzOk54jZMbBgfwwxr1Z3Qu1g== dependencies: graceful-fs "^4.1.2" iferr "^1.0.2" imurmurhash "^0.1.4" readable-stream "1 || 2" -"@parcel/fs@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.0.0-nightly.445.tgz#28bc385de0dc9ab7a776a0329fad92a33c5bc074" - integrity sha512-iQL/gAC7PfS8N1Vt6GZeb7b6zjtr0umEFlyC7uQ6lyV/Ln2syqTJWQ+OKCdpURdi2PY3dqzqD9OyNqVFpp5+IA== +"@parcel/fs@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.0.0-nightly.449.tgz#07822ea3db9a558015db223fa0dbb1edaca6a449" + integrity sha512-k2MiwJr0NSodBUKud1h2cxYurJXgscrYpFDZTPYnyoJk0YBPHZcjmQBivXkX0ImH9MwOYIpRg/7dPDwnSaykXg== dependencies: - "@parcel/fs-write-stream-atomic" "2.0.0-nightly.2067+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/fs-write-stream-atomic" "2.0.0-nightly.2071+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" "@parcel/watcher" "2.0.0-alpha.8" - "@parcel/workers" "2.0.0-nightly.445+adb92ee0" + "@parcel/workers" "2.0.0-nightly.449+837d1fbd" graceful-fs "^4.2.4" mkdirp "^0.5.1" ncp "^2.0.0" nullthrows "^1.1.1" rimraf "^3.0.2" -"@parcel/logger@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.0.0-nightly.445.tgz#5085896f9f4cd398b94ce2956e74a497886825f6" - integrity sha512-AtTE3ciR/xrqDSaEqEBgFd0zhUK5mCq+G7tXYeCu71+OphnCo30vSVe9NhsoZmWHoFvtOjCZ0M9ECfTJzVXRuw== +"@parcel/logger@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.0.0-nightly.449.tgz#0a088eacaa32fca33fc835d382feecda86b3d54c" + integrity sha512-ZEuV2tx3aPTW/Ceo2SzS9cQbyNPmkJHKESGwFx7SWke2hZaIsyh6BqgDNGpnNkzK6mD2fgMzgNajb+FeH0IJww== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/events" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/events" "2.0.0-nightly.449+837d1fbd" -"@parcel/markdown-ansi@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.0.0-nightly.445.tgz#5a271162f65e2a2a3c5de5a2a95999d72336c01e" - integrity sha512-CoVZYc5JsdQfsgt3BVlR9u+36I6EBAwQOo7y4iR4nNiF/MWb8s30PGLTNjykYxyNxBI92YfHl8RTMgyeGuHCqw== +"@parcel/markdown-ansi@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.0.0-nightly.449.tgz#27f75e203b4fa67bebfb0b34c4951319e32d4ea3" + integrity sha512-MaygzYxLEc9IzIttqe+W8W9XpgsthoSiPgkJOpWlY7ICvKr3yHAlbmPgawbbNpMukjSzqOrcgDTwe22F/wV5ww== dependencies: chalk "^2.4.2" -"@parcel/namer-default@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.0.0-nightly.445.tgz#19bd7440ac7c9510cf8b321838e39e5549d83dfb" - integrity sha512-hsYj0OCkh8LSshTSuW6HKR6O0YbHTPJydZ+5+XrV5v87PDOp1QBLeuDCR6hporRqx7KWBp20PROWrrXgjcvJmQ== +"@parcel/namer-default@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.0.0-nightly.449.tgz#448a1ad3b0dc38f0431cf1ebdee8403d73d05519" + integrity sha512-KVskg+otIp5P2hRnezWqmPMN5h44Bgh2pJ/1gcktfsKJUVygYeb1oPz+4Z+l32dkYlLlR05A0/+oZTzhCb0KcA== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/node-libs-browser@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/node-libs-browser/-/node-libs-browser-2.0.0-nightly.2067.tgz#8b6195a0013f2c4018d637bcd9de7b778aaf6e42" - integrity sha512-0Q5ZwBM3bZM3tYsMvh7SEc3iMc5d3AgSkn5MG6+rRbLnFP3dwRQws/2qpCghX9//2ifTa9jNwU7cSqlMdVN/Ng== +"@parcel/node-libs-browser@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/node-libs-browser/-/node-libs-browser-2.0.0-nightly.2071.tgz#08a3a1de1e3d3c4fdab4e302abbbc325c0e604e0" + integrity sha512-L+0XNhMbQUvHyra9X3vvV+k2SnO5YPlHvew/6sClQNh+osXWz/FW/Uxi0pVwyrjqJAPS+0PQ4xV8CynvqYZUTg== dependencies: assert "^2.0.0" browserify-zlib "^0.2.0" @@ -2384,71 +2384,71 @@ util "^0.12.3" vm-browserify "^1.1.2" -"@parcel/node-resolver-core@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.0.0-nightly.2067.tgz#27b083414d0a6f4ec532c67441f4b844bffde5c7" - integrity sha512-pXh5flmV49zo25nhZPxDzeIdQmuUNCX5okXELQC7aCbbSInLHZNwCAks0PaGCMXo+Cx5nWtzRaC50URn2LnJVA== +"@parcel/node-resolver-core@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.0.0-nightly.2071.tgz#a725fa191419b2e1a64ef970ac1c08858c822cc3" + integrity sha512-3W1qH5QgExDLd82EJMF9EJkAd7vSN3B7u554CKjCnrv6+oUwwWYySI8o8pdPZNpDhlXx+amUhg76IMPfqfxWUw== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/node-libs-browser" "2.0.0-nightly.2067+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/node-libs-browser" "2.0.0-nightly.2071+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" micromatch "^3.0.4" nullthrows "^1.1.1" querystring "^0.2.0" -"@parcel/optimizer-cssnano@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-cssnano/-/optimizer-cssnano-2.0.0-nightly.445.tgz#b4e3e8a42dfbbfee6f3e93bfa794ea575ee17f6f" - integrity sha512-jD4AEtloLMmEN2kJ7wGD+bN6krv/7MFifNSQTLSjuHR4X5yE68LYanUDiFwZFLoA5PS6IN0k2MPV5uQx5b/Iag== +"@parcel/optimizer-cssnano@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-cssnano/-/optimizer-cssnano-2.0.0-nightly.449.tgz#f22c22863df7b23a70fab857e89377fd2376ce3d" + integrity sha512-2iuro2UrzDbfJPgke0CpwmQpR+Nf9NiiUV31JvdM8m2uBRafhMVQV6DXlFUwqfvFu4WkBfgvt6tSOZtpaobKGA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" cssnano "^4.1.10" postcss "^8.0.5" -"@parcel/optimizer-data-url@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-data-url/-/optimizer-data-url-2.0.0-nightly.445.tgz#ecf601c69be85a343d4d7889048163c9b06f71da" - integrity sha512-6aCjXaEBHcMtr9u/7FBNRd0v2de27CdG+AKcDUopHOeT7algwlam59dvFQK/cGqTFYjuoTRQcEZaC3R6tmLqwg== +"@parcel/optimizer-data-url@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-data-url/-/optimizer-data-url-2.0.0-nightly.449.tgz#afa33f9cc38b6f4f9b56b39e951529f5883f4549" + integrity sha512-RGFQ5KAv8/U05WnKA11vw7olWLAY5INuwIPZA22e6j1pr5mWNB0kdyHu3WgU4dAVmz7J7KcwWtPrBx+PgKvE6A== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" isbinaryfile "^4.0.2" mime "^2.4.4" -"@parcel/optimizer-htmlnano@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.0.0-nightly.445.tgz#d056a71c0f5e29a9a7c3103579a5cb977733fa2d" - integrity sha512-RiPJEStbZ4OtQYvTPd8KKuXANsgy86viA76u4mnadInupxsM+MRlxj/7eUt7t+kSqE/z6yoH1HTF69kpUgwXYw== +"@parcel/optimizer-htmlnano@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.0.0-nightly.449.tgz#30ebdb834b2ac35fbd2ce8570e564c5c47a303f8" + integrity sha512-da4/qr+LlZn/QEyh+NAhkLY1rz64NjnHUR/49UweJSCmtTK4WKPmByawQPyg/++7fWVmeqUu39bKeZW7yzsqGA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" htmlnano "^0.2.2" nullthrows "^1.1.1" posthtml "^0.11.3" -"@parcel/optimizer-terser@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.0.0-nightly.445.tgz#3e48db6cc5725151b6ef2ed12c65b904a2422bfb" - integrity sha512-DH+0UZCcFmeBEwLlY64ZZWyvoHi1bjVnKW7WLaRauHPBwrT3xGVkIa+hN7QHQ+E2t4jDCQd7IpfoswzBqGohvA== +"@parcel/optimizer-terser@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.0.0-nightly.449.tgz#7834577cb4a87071ae99d82d4ff1bab0853fdb80" + integrity sha512-WpGIbULuwIPhxbPmJ7do1fyxxmhY+aluQomptwopZsL9tPB4jqceGH3LHPbghn+r25qneaQKvwt5mjtrOHcYvg== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" terser "^5.2.0" -"@parcel/package-manager@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.0.0-nightly.445.tgz#5eaa68935f96ac11a92ccea99323aaa218f721b7" - integrity sha512-DhGslnPGIk/jd1DS5sNL3JLxk59GqvDn9Q+gAicB6QvKjF2Lq3GQLlnl6bi4bXetZwOYjdRBdaXikweJmKBs4A== +"@parcel/package-manager@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.0.0-nightly.449.tgz#3374d94997d48bc55f0c2c284a4fdde3c154eccc" + integrity sha512-hhBg3CZSe07dGAddE8Ft0ZP1fbaJ1v3jMgWSIO3uMwVYCIHiOs2KkIqMsiFaqlMesbeEQrSR0QiovTyUa3FGJg== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/fs" "2.0.0-nightly.445+adb92ee0" - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" - "@parcel/workers" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/fs" "2.0.0-nightly.449+837d1fbd" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" + "@parcel/workers" "2.0.0-nightly.449+837d1fbd" command-exists "^1.2.6" cross-spawn "^6.0.4" nullthrows "^1.1.1" @@ -2456,91 +2456,91 @@ semver "^5.4.1" split2 "^3.1.1" -"@parcel/packager-css@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.0.0-nightly.445.tgz#688c2f1c96bd698325d8765c7acf3ebb049027ef" - integrity sha512-p1V4yBeF3RSds/o0e8V+Qs4/z+rDY32yakgdzBBYAtSYhPIIXUNaZMw0/DWqq7ClALeM6Xs+UQwFtT95worcIA== +"@parcel/packager-css@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.0.0-nightly.449.tgz#961e747e88dfcaf7037454887412b57f10532a4a" + integrity sha512-QPb67kErKKIVohmFKNiH9oysW/NoLRJMgOeZXmXzQ8wT2IYHdKmcBuer7DcWKegU4dCkrCd7IRx8dSnQcoQqAA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/packager-html@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.0.0-nightly.445.tgz#53fd08f3c9bd838940441a5098c2f70ac04a5099" - integrity sha512-LwOJELmGXX0yT0///njuzEzHSygjMZMDuDcJLMnMoiyA5MivoYWeVU/MTZvorTU8dzZ61SqiUIS1NbjDORp4vg== +"@parcel/packager-html@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.0.0-nightly.449.tgz#3a8e07496ae23da802a217ed6c82df5b9529a0e1" + integrity sha512-x6IWTU4w0Mfc1m8jcHUradSM9XrRX2umPk7QjhQ5X+v07N0diBpPoqnVSd4ujO29VYFHjh9by5dm3uEkF3mBLg== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/types" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/types" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" posthtml "^0.11.3" -"@parcel/packager-js@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.0.0-nightly.445.tgz#7ce928ed783c924457395d1a1adc48e56490dda4" - integrity sha512-ePZzrgLJgZW+RUDiX/qZLDme2UmkIsFUr/4Rhdyc2S/QBMDAHcmBgXb61bavItw9CdzmyWdabqSx7jDr6RqzMw== +"@parcel/packager-js@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.0.0-nightly.449.tgz#ce9e8c165c8f3f0c2ba8c447cc3b55c523c892e0" + integrity sha512-D/ixE0TzZ+Iq7t1gSsSWrh/HUzohJ2eBggxQnim0E/ymkj3TxuGRh4NLTSweThEiA2xyR7EVeYhM6aq4rZp/pw== dependencies: "@babel/traverse" "^7.2.3" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/scope-hoisting" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/scope-hoisting" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/packager-raw-url@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/packager-raw-url/-/packager-raw-url-2.0.0-nightly.2067.tgz#5b93d627266ae4bd859c00c19da21a67cad56549" - integrity sha512-bCcOOrNAx17tOXMI5PJ1FtjJYj/idZokjmmeHZzrOmOjvppbGTNsDW92EyL3iBzB4aX0l9Dn9MSwV52/tWCVRA== +"@parcel/packager-raw-url@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/packager-raw-url/-/packager-raw-url-2.0.0-nightly.2071.tgz#6adda25e448f0edbf707b54a75129b21a4c99c44" + integrity sha512-sNAUDE35DCe/0yI3jjDC8Lfy8RY5xxT0RRBII89aVx2VxhpEqSAGSLw0xHSh2OsWPBxvFaLzGbyyLZ9TOe/Y6Q== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/packager-raw@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.0.0-nightly.445.tgz#a02bda8f218a03bcca9660e88f14e91e48c1830e" - integrity sha512-ZxZoWc9+5Bs+FXD6Kw2EP3DRp6F+Ya3qq4R2Jd+9EjjnfuH8leYOKwPghUio/G+AkSQEeOmBYgjhsE18o8ZpvA== +"@parcel/packager-raw@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.0.0-nightly.449.tgz#d3e14dc2d8c80d4ace8a01ce7a1718479c74dda6" + integrity sha512-PC5amaAv6cVzkP+CUDpgm58IKH0fS6AEHEJKuXbCUcLbYmnaDh2JUjDb2q6pXbTT7uITNUtC62FHTtXZdyHWCw== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/packager-ts@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/packager-ts/-/packager-ts-2.0.0-nightly.445.tgz#04110a5ade9682fe90b26f6f547ff0da47f50af4" - integrity sha512-adNSvw8A736QEhjI7quvo5RzZOZW3Q14d/vmP86qx1nBrCSeHy/MFl/CyjeebQpJuZeGXnoiIHX8aWhz96kshQ== +"@parcel/packager-ts@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/packager-ts/-/packager-ts-2.0.0-nightly.449.tgz#8970151da387141a7d0328a3d41c7d1e09b545f5" + integrity sha512-GxxdUaHX6BvxFST7UEK1oJF/btaXfv4cBMixuA4Ii+ENvcISh/X4bhA8KlfKoquyFo0/58Enq0zo6u/psjkBlA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/plugin@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.0.0-nightly.445.tgz#c9f5a2ed3ad214d78744d761d4c3301ab2ff9fa2" - integrity sha512-qxcX+BiKRdHyCYTpEjjMOzjzLjpZmhdXdmL6PwAESg0PjqA7KCx1pL6zVJHaR68mQ/WBXE2lX7hl++Nfg2vtbw== +"@parcel/plugin@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.0.0-nightly.449.tgz#3299648d71296068a2f259803e241fcbcc034b26" + integrity sha512-FocqYaPUytyrC5AE1aYszb+e1gdsFAecHPgJYc/iEnVwM+eCIRArVbLqvudZoFBTcSM26F2uyBoIjMtiqhWpmg== dependencies: - "@parcel/types" "2.0.0-nightly.445+adb92ee0" + "@parcel/types" "2.0.0-nightly.449+837d1fbd" -"@parcel/reporter-bundle-analyzer@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.0.0-nightly.2067.tgz#ddf3984b2e088d33b2332c6e8b07b8286172e74c" - integrity sha512-GitRUuMGk4cf2Jais2mSVNUH2R3hmojCUMS9zrxmK9zu+W9Okl1V4yhEX6NbwSmuzKXEUOU2utMlqUYN12z1dg== +"@parcel/reporter-bundle-analyzer@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.0.0-nightly.2071.tgz#f4ff3848c0957c37dfe2c5107822268f86fce51e" + integrity sha512-V201PqmBwMy4JjuRaCDtMjKeTcQFB8QHaGRAtudD+FI2ulsms3m0yMTabmRrt2VAQH97gVF8HtqkHF5aKDU9rA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/reporter-bundle-buddy@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-buddy/-/reporter-bundle-buddy-2.0.0-nightly.2067.tgz#38e05ca74d0c8c342a7269dc1a1bb65c064599d8" - integrity sha512-DEazr+ZzSTnDoP/kOamsPmD77IqwE8Fbp/HvDIDA4DQvkobxHLIt0w0Qr8lJ2tAgwzLRuAxA6UAHOvX6qVB1IQ== +"@parcel/reporter-bundle-buddy@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-buddy/-/reporter-bundle-buddy-2.0.0-nightly.2071.tgz#a3a93797ec9554da98292f960975565296b88a72" + integrity sha512-/UfvDyhwqNP8AoDrvFMkpKTZIJVKDTr7sRi/2gxxnhf2LW+qoLOpSsWSWue679tTntOKCqMhAUI/SS6YlNI0rQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/reporter-cli@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.0.0-nightly.445.tgz#135ad99e1568ec2534d1d4553857b241537a6b9b" - integrity sha512-88oGRxN2Eimi3BqzEHb1fdITCh0XPRHf79EFxY7jUoxJobJwBIu967BzG+yy7NvARgYkm8aBa9+f+KyASrXPpw== +"@parcel/reporter-cli@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.0.0-nightly.449.tgz#4d8df81dc6ad464b79c304ee4cfb1b52629af29a" + integrity sha512-GsgC96hWZPqVVU6xqj4o1ddAhSM+EoEu7LTm/41T6tyW3Qv9OmfprsKUbSMK+48HZLL1UVJ0mEK/T4f7K+dg0Q== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/types" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/types" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" chalk "^3.0.0" filesize "^3.6.0" nullthrows "^1.1.1" @@ -2549,13 +2549,13 @@ strip-ansi "^6.0.0" term-size "^2.1.1" -"@parcel/reporter-dev-server@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.0.0-nightly.445.tgz#45b7d8d2bcf17609e4542e5c7b6872fa5aa15189" - integrity sha512-mYJ+t9KMCA52AaYvg0dxIMqdSZbnckxxunIM/uPe+J7Nd71ImfSNMv7K/xVx67RrSm/YD0gSgbGI4yfWX2/kGQ== +"@parcel/reporter-dev-server@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.0.0-nightly.449.tgz#5ec9ec25d3696f52ccc8c92018d78caff470e070" + integrity sha512-49s+jUBClCqdWMNTk2IvpAoRWf2axjXrB615mO5WGeVqBEZIHaSKA2WpfsaKb4mbJYmqNGKrBZbUqwK0lA2YlA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" connect "^3.7.0" ejs "^2.6.1" http-proxy-middleware "^1.0.0" @@ -2563,54 +2563,54 @@ serve-handler "^6.0.0" ws "^6.2.0" -"@parcel/resolver-default@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.0.0-nightly.445.tgz#3aeff1e04f6005f019e93304ffbf29e01e38903a" - integrity sha512-A5hpAqtvFeA4AifeMSRBvUuJcKI5AnXotPXJ+ZoP6H8GjRcUbdkGSpObc+B6W4ZmMuYEtojGSHFA+eHcyVgQsg== +"@parcel/resolver-default@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.0.0-nightly.449.tgz#9d3465c225614598b0ab68f62fae0dab4c0d71d5" + integrity sha512-+V9IjjZPhkjCF2GppU/QSlnnQkOLGd3WNvJkRPOEWZtIpVOVy7lzoL9rBPFoE94aHwM0m4BolqyuiYv/6nqTpg== dependencies: - "@parcel/node-resolver-core" "2.0.0-nightly.2067+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/node-resolver-core" "2.0.0-nightly.2071+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/runtime-browser-hmr@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.0.0-nightly.445.tgz#04f2863e4a82a16a3f31f69535757d0077418899" - integrity sha512-kqUdNGh0oxHOM8UcMzxXW6EiDq6rSaAR3TGXam+HcLPyid9U5rPGUn0+476vtoiwH/mOrjKXRWEZJ0DsdfhnFw== +"@parcel/runtime-browser-hmr@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.0.0-nightly.449.tgz#5bb4f08873193dd4cab8e134ec5ead1066d2509d" + integrity sha512-okbif6vgJ6bMbjGuJk6I/+zBnP/OJeT8eKWii9uvZmN2tZv1MoIgXrXIJdNsUgunBPHur9dozk5K8cO1zTazuQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/runtime-js@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.0.0-nightly.445.tgz#da86efc2f7c05ce0b6fd1f2d7c7935434f088b9c" - integrity sha512-/8HEZVm9Kc/mXM/wS3vyQxU3XLwKq/zEMiX8dKmWIrgFyqHBnKg06Xru1665mj1vhgpw1Viwr5DfrdjYVbuVVg== +"@parcel/runtime-js@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.0.0-nightly.449.tgz#26c4b28a1f05a26bddbbe95d45c9589048ed2086" + integrity sha512-GSUFxH/XxeN3tAezPOCHVS84NqYUJln2N1W8N8f1HRm1w52NB8VCIeB0mMuM0lGH1GM9le48oAHzISEixLkH4g== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/runtime-react-refresh@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.0.0-nightly.445.tgz#ef0edf335e69c0c659213de7445242373fa62390" - integrity sha512-4V8Hf3XumyPcfKRehf8/3mfTZduuWWN/tz+A4fh/9WRh9u6Hz1ozAbTjS/fpd78HnzK5BUIglUkvMyD5inhxoQ== +"@parcel/runtime-react-refresh@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.0.0-nightly.449.tgz#e3903b5c6dbf46c296966f4787905553f853ea13" + integrity sha512-ltrrakt2uCZ5Q6tDST2l5Ums4KpB9dM0kuZcwa6qJCpn4+YCYb1fVO3VSgk4zIVNhRdVwZspB+TEF2xLlBlWzA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" react-refresh "^0.9.0" -"@parcel/scope-hoisting@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/scope-hoisting/-/scope-hoisting-2.0.0-nightly.445.tgz#bfe8f3bc4b5020e71df0d5845944c00136783277" - integrity sha512-+S9Ud91ONAQzG/F6LTOyrZwNGXeT394vrI6/FqAtVVqnHWZXK6JmN26kPnou+8SB8oxkMbzGhMxzoft7mORQVQ== +"@parcel/scope-hoisting@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/scope-hoisting/-/scope-hoisting-2.0.0-nightly.449.tgz#9fbe4b8bf479e7bfc96f076aef0308ae2545058e" + integrity sha512-R3lgrFVUccomYxN/A76qTCqav2+yU2OO5fb6qttUY7d0syQOuj72Vmj6X4djv8XD1wZMVpmGmWumr8if+UdqxQ== dependencies: "@babel/generator" "^7.3.3" "@babel/parser" "^7.0.0" "@babel/template" "^7.4.0" "@babel/traverse" "^7.2.3" "@babel/types" "^7.3.3" - "@parcel/babel-ast-utils" "2.0.0-nightly.2067+adb92ee0" - "@parcel/babylon-walk" "2.0.0-nightly.2067+adb92ee0" - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" + "@parcel/babel-ast-utils" "2.0.0-nightly.2071+837d1fbd" + "@parcel/babylon-walk" "2.0.0-nightly.2071+837d1fbd" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" "@parcel/source-map@2.0.0-alpha.4.16": @@ -2621,10 +2621,10 @@ node-addon-api "^3.0.0" node-gyp-build "^4.2.2" -"@parcel/transformer-babel@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.0.0-nightly.445.tgz#b12affbcd5df92597d91e8d404698fd7add574b0" - integrity sha512-+vf48c1BLe/4GAz7XXARc9+O92yhQVELmmFOX5uV1dnNy1bdSg6Ek7Ln/uHe3iabcMJF4YbYKBKXJMWiUdalWw== +"@parcel/transformer-babel@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.0.0-nightly.449.tgz#099259ef4ac9f02f61cc5c6ff8102d07489345cf" + integrity sha512-BTuOrG892ZmAx7M3jT0WX+2Yxi/bLtbuDWP8SfH9lXgrCJtx6fPObk7mqIrTvdmefKjeLcRmig1nS7XcnFKJPA== dependencies: "@babel/core" "^7.0.0" "@babel/generator" "^7.0.0" @@ -2634,85 +2634,85 @@ "@babel/preset-env" "^7.0.0" "@babel/preset-react" "^7.0.0" "@babel/traverse" "^7.0.0" - "@parcel/babel-ast-utils" "2.0.0-nightly.2067+adb92ee0" - "@parcel/babel-preset-env" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/babel-ast-utils" "2.0.0-nightly.2071+837d1fbd" + "@parcel/babel-preset-env" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" browserslist "^4.6.6" core-js "^3.2.1" nullthrows "^1.1.1" semver "^5.7.0" -"@parcel/transformer-coffeescript@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-coffeescript/-/transformer-coffeescript-2.0.0-nightly.445.tgz#b109291ec5d289cc3c02b3897aef64cb00a43358" - integrity sha512-81z83poTX4ZsoA7QnW0RqIsP7WXHsIz9X3+IXW78Gm12lmgXOXGD/cSY6QtlBi4oqFxtiE9gVgEWety4j8qcgw== +"@parcel/transformer-coffeescript@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-coffeescript/-/transformer-coffeescript-2.0.0-nightly.449.tgz#a1bcf008ec744aa29875081808e6e7f4072b2c68" + integrity sha512-VxpRqifHbgUlNLcJRqcScdcquqSpQ+PUEevZuJmFsGa1SWIFisG0enfSgQL3eI6DbcT+a06tDMwkOTwm9Fx4+w== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" coffeescript "^2.0.3" nullthrows "^1.1.1" semver "^5.4.1" -"@parcel/transformer-css@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.0.0-nightly.445.tgz#5c443563ae8e005af6be424b0de9ec5f81560ed6" - integrity sha512-g0tCf/U5PDVjbttEfS0OipXYkcJ9AgibkWt4K4BtP8q6t+lctB71eyinHamcNHFJoi/mKW0EzlObBER9pIV+4w== +"@parcel/transformer-css@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.0.0-nightly.449.tgz#78b87be06020aed3463f2acaa8761c7e535e888d" + integrity sha512-YN3mVmIsNHDpNasxevaY0m9jSJzESyRWIfN4P6LkhS1al69KEWxIOmshGB5EV+r7GJ7MmealZP1x74mjJCzK1Q== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" postcss "^8.0.5" postcss-value-parser "^4.1.0" semver "^5.4.1" -"@parcel/transformer-glsl@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/transformer-glsl/-/transformer-glsl-2.0.0-nightly.2067.tgz#11599d0f5804e1503f8e28e750b260c8bbc08cd1" - integrity sha512-IG0dggCM8R3EycMmMgT3BAhtIENfLf2FsaMGFlTiKcF71IXn9JPLjjbx+Yn5yASJyAHP0dWgycw4xCjrxxg5yA== +"@parcel/transformer-glsl@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/transformer-glsl/-/transformer-glsl-2.0.0-nightly.2071.tgz#fe62e491bff66fdc4817895600ba207cff582fb2" + integrity sha512-qfs82sSYbm6CspMvoQczi6Ec7KbvDJewubnxOG0xVA+1RokNbOrpWGXDf6QNhCVy91rPipd+w/stG4y4Qn3ACQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-graphql@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-graphql/-/transformer-graphql-2.0.0-nightly.445.tgz#fe311396f080a605810625fcaaa5a2238c2a74f6" - integrity sha512-i+lkzhzUp7DAOZeCWZbsa83+abzLRmijxMYVkMRKer8yaDNDlcqWfCVbzAcVFBI/wc6/mQ2nA/1erhePjqwfTA== +"@parcel/transformer-graphql@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-graphql/-/transformer-graphql-2.0.0-nightly.449.tgz#6014a1ffd2f0d0af3c84b6c8616770c54f9c428b" + integrity sha512-vbsUYTpqLBVXHW0VoKxu+iXjdnwB7BPvxCxhIBa/iaNIZRiMuX5IPovLVY4AxL+9EjdbAN5K93GMP7hcsDxLMQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-html@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.0.0-nightly.445.tgz#561136797d7c6c476ab607f881dab34ca1b89d9e" - integrity sha512-sL1clzjug9xs25HN8VKyUnxKc1/wDfa9GBZNPUN7cysmbCCWGvPNiYd7LWp8EihMj+vEbyZ27rMF/hz6iN77UA== +"@parcel/transformer-html@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.0.0-nightly.449.tgz#c24aff17cce228fdd85da8604756e1f7165c28cd" + integrity sha512-hr3p6meUM+tZ2xL8NPEnc5b+9TIkAJIUJreMC1wpgcEmj6jqxTsDg0wnWNNP8hyYGE26VSal3aVGpnY+ad+Nww== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" posthtml "^0.11.3" posthtml-parser "^0.4.1" posthtml-render "^1.1.5" semver "^5.4.1" -"@parcel/transformer-image@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.0.0-nightly.2067.tgz#2ed9c82340861742466235e3adef342f61b2c553" - integrity sha512-9b/539/IUMu/JAAzrwRP+1rZ5c1jcrobOY3hfT6gPc9dYsZPg6GAI5Zgri8k+D769Y/nxVzT3wHjx4asjOTy1g== +"@parcel/transformer-image@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.0.0-nightly.2071.tgz#bc45d8ebe906fa91aa7b8d9a6735c78aad96a905" + integrity sha512-xqM71Gjl5AqTuZCXGw7dzJ7UDmQTJbAAJ/3A5OqOycl1iTPL0c2pAGSUkDRJRIX4380vplAgqYTco+FvBBvj3A== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-inline-string@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-inline-string/-/transformer-inline-string-2.0.0-nightly.445.tgz#4646777d25bad1964ceef442d45e2d1701a31d25" - integrity sha512-5q4+7gMhDMDXZrrDFGc7BSAr59bE9Mh6lYfqF4pPK70Gr5L5+ntUMGtscySnRl7IoIMd2T59SuHWZjxHdfNWHg== +"@parcel/transformer-inline-string@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-inline-string/-/transformer-inline-string-2.0.0-nightly.449.tgz#015aca67e176adb080d324931053c2ce86d70441" + integrity sha512-HSgsZcUhPNY5d55TZDR7N8lMff1yyi7zNw1ONsQyQeRG0POfWA3kMWbCvnAaVbM+VA3+en0fLtpJ4Lurn6T7Mg== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-js@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.0.0-nightly.445.tgz#8fbae7bfb3b2a9a76a47219dcafd38948e4311c1" - integrity sha512-6/FN3GyBJAAsI5qR5rL1GNxdRCvnQli4p3lGvT2CGQZvy6FpScSw4KrtAKUzcGSTuJJM7P1fXkN0RYeR5RpD8w== +"@parcel/transformer-js@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.0.0-nightly.449.tgz#abd06895e8b3c0f1348f17a28bac9c7e87c2610f" + integrity sha512-5fPgwfW0+mJN4uq6yYHI9nkyGrS4Pg9U0Rc9Td7Fcc1jt82qIGE5LovZSonudw3tqnbpP6oqNEe/J48KdLdpBQ== dependencies: "@babel/core" "^7.0.0" "@babel/generator" "^7.0.0" @@ -2721,193 +2721,193 @@ "@babel/template" "^7.4.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - "@parcel/babel-ast-utils" "2.0.0-nightly.2067+adb92ee0" - "@parcel/babylon-walk" "2.0.0-nightly.2067+adb92ee0" - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/scope-hoisting" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/babel-ast-utils" "2.0.0-nightly.2071+837d1fbd" + "@parcel/babylon-walk" "2.0.0-nightly.2071+837d1fbd" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/scope-hoisting" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" micromatch "^4.0.2" nullthrows "^1.1.1" semver "^5.4.1" -"@parcel/transformer-json@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.0.0-nightly.445.tgz#7a2218d38d392ef125f938c6093f7ef89d6fcda6" - integrity sha512-skEW2uwFs3NYSv56Nwa16rqKVnApYHbMrjv2DnuiNhlY3JP+f03aTvdYxtvoB8aQni5HzMUm68aRnBH+rEqypg== +"@parcel/transformer-json@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.0.0-nightly.449.tgz#18c4e9181bf55dd85bbee016427bda3864e742d7" + integrity sha512-2OIxk/Kk1AFj3ZrOK0DztchFFgnxp+sZBejKac8tPGrXO7IgixTKpsW+8wNCTWXdK8ohcg0+eCvIRw8IKfJgkQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" json5 "^2.1.0" -"@parcel/transformer-jsonld@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/transformer-jsonld/-/transformer-jsonld-2.0.0-nightly.2067.tgz#b45351918734cd1b8a39ebae224bdc29db47bd9b" - integrity sha512-nppjkCAqGTVyHDUgKmBIfTfKsiARpiVA1TCN9T2QBbW8FNU0duFDZBF+++NfH2pLtOt2KbRk7dRE/fimpMjAxA== +"@parcel/transformer-jsonld@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/transformer-jsonld/-/transformer-jsonld-2.0.0-nightly.2071.tgz#bb9d432d9efafb17c9832f848644e97e964e8ce6" + integrity sha512-cdbqRIefMSwbxIBsMoLjr1M8V30Bs1BpjdTsQ7gJsc9hMJsx59LdRtOg8Dx6iwyuJwdQrpIYdi1IyaUJVrKsag== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/types" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/types" "2.0.0-nightly.449+837d1fbd" json5 "^2.1.2" -"@parcel/transformer-less@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-less/-/transformer-less-2.0.0-nightly.445.tgz#400612ba75ca3546b59c56807aaab415b751e27c" - integrity sha512-EjGK2ZsbGHQc5YD6CIVdVZn9hmL7sTM8SjuRU0/CFgKVQh3NI0e8vVjfA4UnMgRAsVAxFKDiyIc10pZuRrTBEQ== +"@parcel/transformer-less@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-less/-/transformer-less-2.0.0-nightly.449.tgz#a4798842c463b7f4aa9b6e85dd790db55ef3a41b" + integrity sha512-cknM1CZjcbLIzbaUpi1kp7kjdkGFB7uxX0Dj7MKCVZKXOYFJlwGCycb/DXw1LRw+N4Tc6IjHaIsCGaw6Z7LGOw== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" -"@parcel/transformer-mdx@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/transformer-mdx/-/transformer-mdx-2.0.0-nightly.2067.tgz#4ac94a9a33c495ede3638d036d493999d6624e96" - integrity sha512-tRIJLA2W6EmxXjjvBc37t8xASNaR0ZmmFc4K0LmJbiO5kuHWfOjuw/npq6p+TShYUUZYTSgeVsN9HolCDw/v4g== +"@parcel/transformer-mdx@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/transformer-mdx/-/transformer-mdx-2.0.0-nightly.2071.tgz#ff7e77aec3897a9c80ffda3b21145545c9817fc9" + integrity sha512-LjnKXkUI6fTXRnT21uKVTRoPi7d4+o6kBS9O/ojEniDqe97zQ6qb4R2teSS2UuMtxVKWVp2ojXchC+V+frke/w== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-postcss@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.0.0-nightly.445.tgz#18fd18252b035192ef2b53a4029bd3f29a75e2b3" - integrity sha512-vGfrP0zkbwo7eMLQmWd29K6JAmoyKUMRt3U8fOE3KMxWTR4EwR/jAnv9qwimlz5GoEDne7dsBv1eHcrqpl50uQ== +"@parcel/transformer-postcss@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.0.0-nightly.449.tgz#d90d1ac841f253d04308603e78f21c93256b6705" + integrity sha512-QdAKy+dO9VEOAypJ7k75ah29zdPGgzECU7s6NqiAexcoAmgoOJEKQO9b3geVd7wyX7PBa+dHU1N1vnibUhA+ng== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" css-modules-loader-core "^1.1.0" nullthrows "^1.1.1" postcss-value-parser "^4.1.0" semver "^5.4.1" -"@parcel/transformer-posthtml@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.0.0-nightly.445.tgz#49d26ae8bf6f0d210066517972315fbb45a36a2b" - integrity sha512-jTUj+zyXKCTNgnJHNOKgjzmJgpcbmQgPEnac8TEwrW1iENaAxU+6gUChczf9xyzLpsV3WRT/4F8UheSiTqbpvw== +"@parcel/transformer-posthtml@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.0.0-nightly.449.tgz#076f3b05d6d02b0391e48de126a8db12af761021" + integrity sha512-wpueXMbZRQxaRPlxP9qyYcJNPtfnVfpRcj2CneJ99gze+1eEO6GmjMdxrr4jq0ejruy+/qL7dTzXwcoQ3LllwQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" posthtml "^0.11.3" posthtml-parser "^0.4.1" posthtml-render "^1.1.5" semver "^5.4.1" -"@parcel/transformer-pug@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-pug/-/transformer-pug-2.0.0-nightly.445.tgz#a3df420a1bcb441381fb291e8d81b53be61ae3d0" - integrity sha512-0oMbtawueZgnWVRUxUZNBSZipfJ5IpzIDE++PnIkqChSukVHNtCaYuSYrsButDSmJ1R9lcbCfwGD6jKYiNGqtQ== +"@parcel/transformer-pug@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-pug/-/transformer-pug-2.0.0-nightly.449.tgz#cdafcb2be4bf3726d8958ff630a93b6b4b804457" + integrity sha512-gxCUN5CM88DpEfo7w9/Rihs93vNAFkeb7kjFSLxVdMWdm7rRc0OBuwBGSkihOZpqalF7r6BVxmE+wEJUp775kQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-raw@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.0.0-nightly.445.tgz#ae26126a6e9100a0c2422f9bfdd205fe78b3b715" - integrity sha512-EpmlvQmEo0Efiq8UXw5zBB7N+cOUP8/2jT+Q3fTRO5dCwhVury/kE1dauApcrCoeUWyWNEyE19cQCirrdeNbZQ== +"@parcel/transformer-raw@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.0.0-nightly.449.tgz#bd7af800b97d7ea45771ff8a0662d51b2e93f736" + integrity sha512-batlnjTd3Nda40r8aWwMjlB6z2I5OHjHHpXcNj12DPJO3amUN/4PU0banRK0WZ6FV8ab7hUnNsQLiC+GGKmW7w== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-react-refresh-babel@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-babel/-/transformer-react-refresh-babel-2.0.0-nightly.445.tgz#742e48f22fc9bb1418bb0e75217f44276b0f6283" - integrity sha512-3bY1JfS2m/4yXQEO5Lu7IAGcWmAyGu5KzGAtNXlC9lQRB2xSkNaSDuuIaj2XdQ3MmJUssnwUNjI2J+BQO+/2HA== +"@parcel/transformer-react-refresh-babel@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-babel/-/transformer-react-refresh-babel-2.0.0-nightly.449.tgz#53bc3896bc88777115421b8f9dbd0c928493f153" + integrity sha512-qrBbT9jiUsAlEw7Q4qLgPmu7Qx8mc1YONarP06bC3hBv7fDE6nY40++mIpb9kxTwev9/CP0uYKBRyD3LrFk38w== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" react-refresh "^0.9.0" -"@parcel/transformer-react-refresh-wrap@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.0.0-nightly.445.tgz#0290c472f753b2b313dc2d04b75304513bec4911" - integrity sha512-9+97jl4sGdyMXKcVyqEQiHPdPjkyIa5bDWxGCuZ3JuefrTrFcghHTTl7Q/BenFV/m0iBkqmaQ5fFGmAUQWZ1OQ== +"@parcel/transformer-react-refresh-wrap@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.0.0-nightly.449.tgz#4505f39499140bef21b9d2c9cf4cd8227f7591dd" + integrity sha512-3EwT7VFuWCB3qs4CaVEjw1y3vrMzNUFUYech5VZ673SP5tpOKg12+LOfJ3goEdhOZ8qvsknJhxOhpJzR/anbNQ== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.4.0" "@babel/types" "^7.0.0" - "@parcel/babel-ast-utils" "2.0.0-nightly.2067+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/babel-ast-utils" "2.0.0-nightly.2071+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" react-refresh "^0.9.0" semver "^5.4.1" -"@parcel/transformer-sass@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-sass/-/transformer-sass-2.0.0-nightly.445.tgz#8d2e998f637ecb691f6f6c0062ccf2fdc74b04cf" - integrity sha512-Hioyt64523DpDq2dMK1Ww8PFyvnyReuTSuwEi4TCgXeZsUX0cmwZILe0X1e/nhYUsPZMPjnnQL3qnRNoxK3cVg== +"@parcel/transformer-sass@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-sass/-/transformer-sass-2.0.0-nightly.449.tgz#6a5e6f3c0b77e5db1ce8665fda07687373f6b586" + integrity sha512-vxAGmRUu8/AvH2WXF43q2gwFJajitx/UM+Rz42cl/YNUJanzlYZpqLSg4rPjiWIO1h8pY5atC7x4XbrNDOY/BA== dependencies: - "@parcel/fs" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/fs" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-stylus@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-stylus/-/transformer-stylus-2.0.0-nightly.445.tgz#b1d96c46207300a66e55c37fd9876f9550bc9f45" - integrity sha512-y1/dkOu37IwODQhKo0Bp01ouToO4OwTHO1Ibs6gojqTsc2T7ac0SeX02J20K1bmYvucj9rT/y4yyWuW6xk49KA== +"@parcel/transformer-stylus@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-stylus/-/transformer-stylus-2.0.0-nightly.449.tgz#8c30eb821c59360e2901688993a423726f496518" + integrity sha512-MJimqbrHvGlkh1gKu9xoMKhi2Boztm3Hc75h68wBWVqTc+OmBHGl8eftpCNFvBgbMaTjhTDLY+GkOODi9Xe9NA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-sugarss@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-sugarss/-/transformer-sugarss-2.0.0-nightly.445.tgz#745d8862f895b3a98dc30f4be21f9a043994a639" - integrity sha512-256XNk0p8Kd5tEEVRN7KjGq+NDlNr+CrqFUAuNdr2C4tnxB+DrtNLRXh16UDdfD3jgWOxLHp4rmFjnqpLBHEHA== +"@parcel/transformer-sugarss@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-sugarss/-/transformer-sugarss-2.0.0-nightly.449.tgz#5e577e3c6cb155ad3402e8366d50dcef35f71e6c" + integrity sha512-ccDVMSh5cvdHKT5lp2KKE+vyeqiRqQaVoBwW5S1QhVaAW7op/dHzhxCxA08SDQLaT/G5FzQC4lFGPfsTkeRQwA== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" postcss "^8.0.5" -"@parcel/transformer-toml@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-toml/-/transformer-toml-2.0.0-nightly.445.tgz#fd179834e5ff0b8219eeb926e41de0b08b05ce7c" - integrity sha512-wGTqFwVI4is8O3JWEvSDTk7Z/U58DlEHB49C2CwqR0xVSjCQbKuFt+fLOSaEhs7D4lTcr9U1dBwwXRgA38yBJg== +"@parcel/transformer-toml@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-toml/-/transformer-toml-2.0.0-nightly.449.tgz#0141bedbc6746e702b31e3a64efc59bc211261a1" + integrity sha512-vDevoB6UP72FaoD6YybBbm8mVl8CVQFSS2Ef1XPHWWip0nYpWUA9CBnx7h7FRy4kvIzKU/Wq/Tn2W6gfySDjAQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/transformer-typescript-types@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.0.0-nightly.445.tgz#8dc435fdea20a1b8e84e48ce78762c4c5b0dcf45" - integrity sha512-NtcZOYLoSpoV3oVLxEDDGfZhziMKQS/znOxwVrNgy04pens2cQ028Tj42sdjL05V8vUEf3kVXVZlZGSyHFQhQQ== +"@parcel/transformer-typescript-types@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.0.0-nightly.449.tgz#254f735f17c302141ee5e710e55ecf1adc9ac025" + integrity sha512-9jMcRXJ13bMiRg7R3DgPkVNVr6uLjoBkOr33OX6Aat0o9ep8wFKalG1UbDHjLnTmISBsG3FJm9v+qKyQyzwHmQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/ts-utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/ts-utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" -"@parcel/transformer-vue@2.0.0-nightly.2067+adb92ee0": - version "2.0.0-nightly.2067" - resolved "https://registry.yarnpkg.com/@parcel/transformer-vue/-/transformer-vue-2.0.0-nightly.2067.tgz#41bf71f2e6d5189fe40e9eaacf9f7871a51992b9" - integrity sha512-O8Yn74mwz5fiws1vDsc13xtNyFIKL83vebs+SrW6ALZUJzIndQr2J8WRvic5C25WF2NEtnUni+dUlUAUKUqXdg== +"@parcel/transformer-vue@2.0.0-nightly.2071+837d1fbd": + version "2.0.0-nightly.2071" + resolved "https://registry.yarnpkg.com/@parcel/transformer-vue/-/transformer-vue-2.0.0-nightly.2071.tgz#37e4c6eb1bfb3af35d66bf9583c93deb32d97577" + integrity sha512-y2yzc8u//WyA9u/I0HNt9Dv4YueXWhTntNkL/TKuB+S4RaZyetUepQqEvUv0JWgzqbuj5XxXWZ5Lk74bNMHQVg== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" nullthrows "^1.1.1" semver "^5.4.1" -"@parcel/transformer-yaml@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/transformer-yaml/-/transformer-yaml-2.0.0-nightly.445.tgz#e23988b79c50039d581b1753e32272645ed87771" - integrity sha512-V7kMbEPf5NAjAPWY4c2hezX4D23VhZwiDkFycFKD0f3SuDfnSVa/taZcH15h9cu6mAVl11X3w4X2R/v+RZhA6A== +"@parcel/transformer-yaml@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/transformer-yaml/-/transformer-yaml-2.0.0-nightly.449.tgz#7ee792f2fca24d1c7591b63e225296a046d80caa" + integrity sha512-n1GNhTXWPOvOoG3QGP1TXRGlbcOmyihkJH8hC73F4COvWxLzE3RgkB+nCBy34KgBO+yzFMeMzNpmIcg9HnMezQ== dependencies: - "@parcel/plugin" "2.0.0-nightly.445+adb92ee0" + "@parcel/plugin" "2.0.0-nightly.449+837d1fbd" -"@parcel/ts-utils@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.0.0-nightly.445.tgz#ff958629a2389184cb37eac5a14ee91fd30da5f2" - integrity sha512-gSsShUlj/zw/Ds9MmcbTkjsFbe0Il2MZhITc1U6ID1dUxdGVaRehhkCgwN8562L+rjS9ZRZUZACR7fTGiacSZA== +"@parcel/ts-utils@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.0.0-nightly.449.tgz#1585e2e1a0c7a483936347cac5fc7f4c60c73e8d" + integrity sha512-jk/VoHAln8F6Q/qDSKosOPbxUwhJJw2dRptm3Zn0kznWXceWE8EYDmjzRB1JAUCjxJ5ux0n1EYjm+UcmwhbIbA== dependencies: nullthrows "^1.1.1" -"@parcel/types@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.0.0-nightly.445.tgz#835026da93994a76a12e9066b48956b4a4e7e627" - integrity sha512-sY6fx7C7RAmfB6hSoVayRm2W5+TB04sLw8OK/aRDu5xiwAKX0h4ebUX+2G9EtGYKUF8gfhiQ6njt/f/SevXGdw== +"@parcel/types@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.0.0-nightly.449.tgz#549346dc2451927d5ad934a1179f031aadffebef" + integrity sha512-v4cpFFQtz5nUpsDxU+VsIPNlW1cV7pExYiv/oijAGH6S3XbY8GJ2XPX8lUHCH4Y6+WWQtnp3NJJCWzRtx4zEtA== -"@parcel/utils@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.0.0-nightly.445.tgz#fdeedba16af79b05ff61ced710ce479f154c4a09" - integrity sha512-srgHWtlvd8Jua7EmVvEBVvzO1ZDB8qIE0u677g39WDIBe7OAJ90ybHyV+zJZVRUD4JSEo4R7AFv3L7L4gkX3Mw== +"@parcel/utils@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.0.0-nightly.449.tgz#575b88501650ce0ce1e3d34a5fc4e5bba3948471" + integrity sha512-eZn5+QV4BsNq9tEK4pylVJVNS8iH7xTKZIXssvM1i2dVLzpkjlRnky8PazLOyfk2ZkqwY73UvQ7Ltsq+MIEHYg== dependencies: "@iarna/toml" "^2.2.0" - "@parcel/codeframe" "2.0.0-nightly.445+adb92ee0" - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/markdown-ansi" "2.0.0-nightly.445+adb92ee0" + "@parcel/codeframe" "2.0.0-nightly.449+837d1fbd" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/markdown-ansi" "2.0.0-nightly.449+837d1fbd" "@parcel/source-map" "2.0.0-alpha.4.16" ansi-html "^0.0.7" chalk "^2.4.2" @@ -2932,14 +2932,14 @@ node-addon-api "^3.0.0" node-gyp-build "^4.2.1" -"@parcel/workers@2.0.0-nightly.445+adb92ee0": - version "2.0.0-nightly.445" - resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.0.0-nightly.445.tgz#b3366b7c4abe4bcfaae954c4e9bb97727523d3c7" - integrity sha512-692D89hFYrqU36UxxA9VtVMzbGH4OXsWJshE1GibjurICJ8L149/pxu8v/oCsE/M8Ng1Hj9iIKdtiCrS6w6Z0w== +"@parcel/workers@2.0.0-nightly.449+837d1fbd": + version "2.0.0-nightly.449" + resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.0.0-nightly.449.tgz#d9cf498864cf263abdcf53ddac21cf2f6f830327" + integrity sha512-d0+z/JhsCwRrKns5KvDkZg0UiLbLWvnrMT1Rw+N2bE3FdHlUlgckbOPUGFAM0LStaFartC3nsXnBwbSou1BKQg== dependencies: - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" chrome-trace-event "^1.0.2" nullthrows "^1.1.1" @@ -3034,10 +3034,10 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/eslint@^7.2.4": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.4.tgz#d12eeed7741d2491b69808576ac2d20c14f74c41" - integrity sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q== +"@types/eslint@^7.2.5": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.5.tgz#92172ecf490c2fce4b076739693d75f30376d610" + integrity sha512-Dc6ar9x16BdaR3NSxSF7T4IjL9gxxViJq8RmFd+2UAyA+K6ck2W+gUwfgpG/y9TPyUuBL35109bbULpEynvltA== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -3288,49 +3288,41 @@ resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.4.tgz#445251eb00bd9c1e751f82c7c6bf4f714edfd464" integrity sha512-/emrKCfQMQmFCqRqqBJ0JueHBT06jBRM3e8OgnvDUcvuExONujIk2hFA5dNsN9Nt41ljGVDdChvCydATZ+KOZw== -"@typescript-eslint/eslint-plugin@^4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.7.0.tgz#85c9bbda00c0cb604d3c241f7bc7fb171a2d3479" - integrity sha512-li9aiSVBBd7kU5VlQlT1AqP0uWGDK6JYKUQ9cVDnOg34VNnd9t4jr0Yqc/bKxJr/tDCPDaB4KzoSFN9fgVxe/Q== +"@typescript-eslint/eslint-plugin@^4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.0.tgz#ad12cba28e426b24295291ad4c43b1cdc8b9dbb1" + integrity sha512-nm80Yy5D7Ot00bomzBYodnGmGhNdePHS3iaxJ3Th0wxRWEI/6KCgbmL8PR78fF7MtT1VDcYNtY5y+YYyGlRhBg== dependencies: - "@typescript-eslint/experimental-utils" "4.7.0" - "@typescript-eslint/scope-manager" "4.7.0" + "@typescript-eslint/experimental-utils" "4.8.0" + "@typescript-eslint/scope-manager" "4.8.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.7.0.tgz#8d1058c38bec3d3bbd9c898a1c32318d80faf3c5" - integrity sha512-cymzovXAiD4EF+YoHAB5Oh02MpnXjvyaOb+v+BdpY7lsJXZQN34oIETeUwVT2XfV9rSNpXaIcknDLfupO/tUoA== +"@typescript-eslint/experimental-utils@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.0.tgz#ff035f917aec0698c156a6039166ecf9d7a24f57" + integrity sha512-1yOvI++HMdA9lpaAkXXQlVUwJjruNz7Z9K3lgpcU+JU/Szvsv42H6G6DECalAuz2Dd0KFU/MeUrPC0jXnuAvlA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.7.0" - "@typescript-eslint/types" "4.7.0" - "@typescript-eslint/typescript-estree" "4.7.0" + "@typescript-eslint/scope-manager" "4.8.0" + "@typescript-eslint/types" "4.8.0" + "@typescript-eslint/typescript-estree" "4.8.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.6.1.tgz#b801bff67b536ecc4a840ac9289ba2be57e02428" - integrity sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ== +"@typescript-eslint/parser@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.7.0.tgz#44bdab0f788b478178368baa65d3365fdc63da1c" + integrity sha512-+meGV8bMP1sJHBI2AFq1GeTwofcGiur8LoIr6v+rEmD9knyCqDlrQcFHR0KDDfldHIFDU/enZ53fla6ReF4wRw== dependencies: - "@typescript-eslint/scope-manager" "4.6.1" - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/typescript-estree" "4.6.1" + "@typescript-eslint/scope-manager" "4.7.0" + "@typescript-eslint/types" "4.7.0" + "@typescript-eslint/typescript-estree" "4.7.0" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz#21872b91cbf7adfc7083f17b8041149148baf992" - integrity sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg== - dependencies: - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/visitor-keys" "4.6.1" - "@typescript-eslint/scope-manager@4.7.0": version "4.7.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.7.0.tgz#2115526085fb72723ccdc1eeae75dec7126220ed" @@ -3339,29 +3331,23 @@ "@typescript-eslint/types" "4.7.0" "@typescript-eslint/visitor-keys" "4.7.0" -"@typescript-eslint/types@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.6.1.tgz#d3ad7478f53f22e7339dc006ab61aac131231552" - integrity sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w== +"@typescript-eslint/scope-manager@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.8.0.tgz#f960b6c5df1a5b230b8488e71c5c04e58dd494e0" + integrity sha512-eJ+SV6w5WcyFusQ/Ru4A/c7E65HMGzWWGPJAqSuM/1EKEE6wOw9LUQTqAvLa6v2oIcaDo9F+/EyOPZgoD/BcLA== + dependencies: + "@typescript-eslint/types" "4.8.0" + "@typescript-eslint/visitor-keys" "4.8.0" "@typescript-eslint/types@4.7.0": version "4.7.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.7.0.tgz#5e95ef5c740f43d942542b35811f87b62fccca69" integrity sha512-uLszFe0wExJc+I7q0Z/+BnP7wao/kzX0hB5vJn4LIgrfrMLgnB2UXoReV19lkJQS1a1mHWGGODSxnBx6JQC3Sg== -"@typescript-eslint/typescript-estree@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz#6025cce724329413f57e4959b2d676fceeca246f" - integrity sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ== - dependencies: - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/visitor-keys" "4.6.1" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.0.tgz#87e73883637f662d9a638b0e9b01ed77edc44fb7" + integrity sha512-2/mGmXxr3sTxCvCT1mhR2b9rbfpMEBK41tiu0lMnMtZEbpphcUyrmgt2ogDFWNvsvyyeUxO1159eDrgFb7zV4Q== "@typescript-eslint/typescript-estree@4.7.0": version "4.7.0" @@ -3377,13 +3363,19 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz#6b125883402d8939df7b54528d879e88f7ba3614" - integrity sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw== +"@typescript-eslint/typescript-estree@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.0.tgz#b5160588495f18b739003b6078309b76fece0c55" + integrity sha512-jEdeERN8DIs7S8PlTdI7Sdy63Caxg2VtR21/RV7Z1Dtixiq/QEFSPrDXggMXKNOPPlrtMS+eCz7d7NV0HWLFVg== dependencies: - "@typescript-eslint/types" "4.6.1" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "4.8.0" + "@typescript-eslint/visitor-keys" "4.8.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" "@typescript-eslint/visitor-keys@4.7.0": version "4.7.0" @@ -3393,6 +3385,14 @@ "@typescript-eslint/types" "4.7.0" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.0.tgz#7786b92bbaf25c6aa9fb860eb8dbb1f7d3b7d0ad" + integrity sha512-JluNZLvnkRUr0h3L6MnQVLuy2rw9DpD0OyMC21FVbgcezr0LQkbBjDp9kyKZhuZrLrtq4mwPiIkpfRb8IRqneA== + dependencies: + "@typescript-eslint/types" "4.8.0" + eslint-visitor-keys "^2.0.0" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -3877,10 +3877,10 @@ aws-sdk-mock@^5.1.0: sinon "^9.0.1" traverse "^0.6.6" -aws-sdk@^2.637.0, aws-sdk@^2.789.0: - version "2.789.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.789.0.tgz#a1b0a8b8b4227a7947c04e8d75239ba27d2deb93" - integrity sha512-Jqq+M4N0EgkyS4OPf05UHa7IWUcpuBdnpwMRgBnu4Ju6PxpOTh1UQcmYepVmIN3m6YVpLwFctEYzAMJFM3LT1A== +aws-sdk@^2.637.0, aws-sdk@^2.792.0: + version "2.792.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.792.0.tgz#d124a6074244a4675e0416887734e8f6934bdd30" + integrity sha512-h7oSlrCDtZkW5qNw/idKmMjjNJaaPlXFY+NbqtaTjejpCyVuIonUmFvm8GW16V58Avj/hujJfhpX9q0BMCg+VQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -6345,10 +6345,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.12.1: - version "7.12.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" - integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== +eslint@^7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da" + integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.2.1" @@ -6585,12 +6585,12 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-check@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.6.1.tgz#c9ff58b69c2eee872588985d8b93424c84359a6e" - integrity sha512-CauHEKfAjgAFpNDpFqSccu7C5kOlifCNfRxMjzY76MaAaH7ddkqqEzRE2Vm5bjpHJpndD0iVXiZC+d1rYzv5qg== +fast-check@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.7.0.tgz#d935243a43bc5e8ac4724ee2cb6c109533e8fd85" + integrity sha512-+frnWpxp43Egnx2wuqRVrbHj1YXpHRwLle6lhKJODnu7uH0krGjNRlUo+1oioKULA5jgQ6I6ctTrqFuaw4gZFA== dependencies: - pure-rand "^3.0.0" + pure-rand "^4.0.0" fast-deep-equal@^2.0.1: version "2.0.1" @@ -8707,7 +8707,7 @@ jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^26.6.2, jest@^26.6.3: +jest@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== @@ -10079,7 +10079,7 @@ normalize-url@^3.0.0, normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -npm-bundled@^1.0.1: +npm-bundled@^1.0.1, npm-bundled@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== @@ -10622,19 +10622,19 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -parcel@2.0.0-nightly.443: - version "2.0.0-nightly.443" - resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.0.0-nightly.443.tgz#40f709a86acf1a6c44db6dd60ef3e9006abe3fb1" - integrity sha512-teFdXNFYWh77eBc86RVHdeKTUJch+mU51/2r2Djn75qqXglgxG5gSn613Ul52YxEjaRjI7MeZzqtY5EeaAaJTA== - dependencies: - "@parcel/config-default" "2.0.0-nightly.445+adb92ee0" - "@parcel/core" "2.0.0-nightly.443+adb92ee0" - "@parcel/diagnostic" "2.0.0-nightly.445+adb92ee0" - "@parcel/events" "2.0.0-nightly.445+adb92ee0" - "@parcel/fs" "2.0.0-nightly.445+adb92ee0" - "@parcel/logger" "2.0.0-nightly.445+adb92ee0" - "@parcel/package-manager" "2.0.0-nightly.445+adb92ee0" - "@parcel/utils" "2.0.0-nightly.445+adb92ee0" +parcel@2.0.0-nightly.447: + version "2.0.0-nightly.447" + resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.0.0-nightly.447.tgz#325e4f3797fe68d2e416ddfb9acbe80e818130a9" + integrity sha512-ZxUeUq+fudKskOXEpKKQCWgFRT1Y8b28AGes1Cd2uSgiioM5zhXC/5Jlu0W2QFTrPzt2TrUlU9ioFPV04T9Pgw== + dependencies: + "@parcel/config-default" "2.0.0-nightly.449+837d1fbd" + "@parcel/core" "2.0.0-nightly.447+837d1fbd" + "@parcel/diagnostic" "2.0.0-nightly.449+837d1fbd" + "@parcel/events" "2.0.0-nightly.449+837d1fbd" + "@parcel/fs" "2.0.0-nightly.449+837d1fbd" + "@parcel/logger" "2.0.0-nightly.449+837d1fbd" + "@parcel/package-manager" "2.0.0-nightly.449+837d1fbd" + "@parcel/utils" "2.0.0-nightly.449+837d1fbd" chalk "^2.1.0" commander "^2.19.0" get-port "^4.2.0" @@ -11507,10 +11507,10 @@ punycode@^2.0.0, punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pure-rand@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-3.1.0.tgz#646b812635cbac86105c46b0b03aa5dac1c759b3" - integrity sha512-xkCSMNjEnLG/A8iTH9M5ayXN4SCWRP+ih3rxi09Q7Fu0b9jAP6V9H59pOtcB37IsVt3eHxf1FMy9n7YrqdDdSA== +pure-rand@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-4.0.0.tgz#df8f44bc1b82c4f3d0e245e8f7ced6f09c1e9dc4" + integrity sha512-5+HGyGi+6VygEcP1O4jMj0c5HyFgsP9lEy2uA4c+KBq84y21hpmv85wAzPZ/H+q1TUbP3mIMZhqFg08/HAOUqw== purgecss@^2.3.0: version "2.3.0" @@ -14129,10 +14129,10 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -y18n@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.4.tgz#0ab2db89dd5873b5ec4682d8e703e833373ea897" - integrity sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yallist@^2.1.2: version "2.1.2" @@ -14243,17 +14243,17 @@ yargs@^15.0.2, yargs@^15.3.1, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.0.3, yargs@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.0.tgz#fc333fe4791660eace5a894b39d42f851cd48f2a" - integrity sha512-upWFJOmDdHN0syLuESuvXDmrRcWd1QafJolHskzaw79uZa7/x53gxQKiR07W59GWY1tFhhU/Th9DrtSfpS782g== +yargs@^16.0.3, yargs@^16.1.0, yargs@^16.1.1: + version "16.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" + integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== dependencies: cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.0" - y18n "^5.0.2" + y18n "^5.0.5" yargs-parser "^20.2.2" yn@3.1.1: