diff --git a/.gitignore b/.gitignore index 0cfc0594e..3770cb71b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ yarn-error.log #Defines license that must be present !license-header.js + +# Visual Studio Code working space +.vscode/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 50c56b42b..32d872632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,46 @@ 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.0.0](https://github.com/aws/aws-rfdk/compare/v0.42.0...v1.0.0) (2022-08-30) + +This release marks the first official stable release of RFDK. All RFDK APIs in this release are +considered to be stable and will only be removed through a deprecation process that allows +consumers to phase out their usage for at least one **minor** RFDK version. + +**NOTE:** Future minor RFDK releases may still introduce backwards-incompatible breaking +changes. RFDK will continue to announce these breaking changes in this CHANGELOG and on each +GitHub release along with documentation and guidance on navigating the change. + +### Supported CDK Version + +* [2.33.0](https://github.com/aws/aws-cdk/releases/tag/v2.33.0) + + +### Officially Supported Deadline Versions + +* [10.1.9.2 to 10.1.23.6](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html) + + +### ⚠ BREAKING CHANGES + +This change migrates the RFDK to be based on CDK v2. +All apps that adopt RFDK 1.x will have to be migrated to CDK v2 as well. +To update your app, follow the [CDK v2 migration guide](https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html). + +Additional breaking changes: + +* **deadline:** The `userAwsThinkboxEulaAcceptance` property of the `ThinkboxDockerImages` +construct has been removed and replaced with `userAwsCustomerAgreementAndIpLicenseAcceptance`. +The licensing terms of Deadline have been retroactively changed with the +release of Deadline 10.1.23, and these new terms must be agreed to by a +code change in your applications. + +### Features + +* **all:** migrate to CDKv2 ([#738](https://github.com/aws/aws-rfdk/issues/738)) ([7c06857](https://github.com/aws/aws-rfdk/commit/7c06857f6315dcd59ccb3ac0c12f7094ef6be706)) +* **deadline:** adds UserData property to WorkerInstanceFleet ([#781](https://github.com/aws/aws-rfdk/issues/781)) ([b7e48b0](https://github.com/aws/aws-rfdk/commit/b7e48b04f09f504d4fd85ed61f3befc8ec843e55)) +* **deadline:** update to Deadline licensing terms ([#742](https://github.com/aws/aws-rfdk/issues/742)) ([03bc8ee](https://github.com/aws/aws-rfdk/commit/03bc8ee2e02bbf88df92b0cebef41a765c39a906)) + ## [0.42.0](https://github.com/aws/aws-rfdk/compare/v0.41.0...v0.42.0) (2022-06-18) diff --git a/bump.sh b/bump.sh index beac1a12c..baec8c33e 100755 --- a/bump.sh +++ b/bump.sh @@ -18,7 +18,13 @@ # -------------------------------------------------------------------------------------------------- set -euxo pipefail -version=${1:-minor} +current_version=$(node -p "require('./package.json').version") +if test "${current_version}" = "0.42.0"; then + # The version after 0.42.0 will be 1.0.0 + version=${1:-major} +else + version=${1:-minor} +fi cd "$(dirname "$0")" @@ -66,7 +72,7 @@ deadline_version_section="\n\n\n### Officially Supported Deadline Versions\n\n* sed -i "s|\($version_header\)|\1$deadline_version_section|" ./CHANGELOG.md # Add a section to the changelog that state the version of CDK being used -cdk_version=$(node -p "require('./package.json').devDependencies['aws-cdk']") +cdk_version=$(node -p "require('./package.json').devDependencies['aws-cdk-lib']") cdk_version_section="\n\n\n### Supported CDK Version\n\n* [$cdk_version](https://github.com/aws/aws-cdk/releases/tag/v$cdk_version)" sed -i "s|\($version_header\)|\1$cdk_version_section|" ./CHANGELOG.md diff --git a/clean.sh b/clean.sh index 1f43b5b67..5d70c7074 100755 --- a/clean.sh +++ b/clean.sh @@ -5,8 +5,6 @@ echo "Cleaning base directory and tools..." # Installation directories rm -rf ./node_modules/ -rm -rf ./tools/awslint/node_modules/ -rm -rf ./tools/cdk-build-tools/node_modules/ rm -rf ./tools/pkglint/node_modules/ # Build files diff --git a/tools/cdk-build-tools/config/eslintrc.js b/config/eslintrc.js similarity index 100% rename from tools/cdk-build-tools/config/eslintrc.js rename to config/eslintrc.js diff --git a/tools/cdk-build-tools/config/jest.config.js b/config/jest.config.js similarity index 100% rename from tools/cdk-build-tools/config/jest.config.js rename to config/jest.config.js diff --git a/tools/cdk-build-tools/config/nyc.config.js b/config/nyc.config.js similarity index 100% rename from tools/cdk-build-tools/config/nyc.config.js rename to config/nyc.config.js diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md index ace63a10d..8f5967cce 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md @@ -32,15 +32,13 @@ These instructions assume that your working directory is `examples/deadline/All- popd pip install ../../../../dist/python/aws-rfdk-.tar.gz ``` -4. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `accept_aws_thinkbox_eula` in `package/config.py`: +4. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `accept_aws_customer_agreement_and_ip_license` in `package/config.py`: ```py - # Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA - # for Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before - # using the AWS Thinkbox Deadline container images. - # - # See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE ``` 5. Change the value of the `deadline_version` variable in `package/config.py` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the latest `10.1.12.x` release of Deadline, use: diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/cdk.json b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/cdk.json index fa91d40d2..954054a6e 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/cdk.json +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/cdk.json @@ -1,18 +1,5 @@ { "app": "python -m package.app", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/app.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/app.py index bdba29ef6..076e05a35 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/app.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/app.py @@ -5,7 +5,7 @@ import os -from aws_cdk.core import ( +from aws_cdk import ( App, Environment ) @@ -113,7 +113,7 @@ def main(): root_ca=security.root_ca, dns_zone=network.dns_zone, deadline_version=config.deadline_version, - accept_aws_thinkbox_eula=config.accept_aws_thinkbox_eula, + user_aws_customer_agreement_and_ip_license_acceptance=config.accept_aws_customer_agreement_and_ip_license, enable_secrets_management=config.enable_secrets_management, secrets_management_secret_arn=config.secrets_management_secret_arn ) diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/config.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/config.py index 01f270c1b..fed71e530 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/config.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/config.py @@ -9,7 +9,7 @@ from aws_rfdk import MongoDbSsplLicenseAcceptance from aws_rfdk.deadline import ( - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, UsageBasedLicense ) @@ -21,12 +21,11 @@ class AppConfig: TODO: Fill these in with your own values. """ def __init__(self): - # Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA - # for Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before - # using the AWS Thinkbox Deadline container images. - # - # See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA + # By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + # and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + # is AWS Content as defined in those Agreements. + # To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE # Fill this in if you want to receive alarm emails when: # 1) You are crossing thresholds on decreasing burst Credits on the Amazon EFS that is @@ -46,6 +45,7 @@ def __init__(self): self.deadline_client_linux_ami_map: Mapping[str, str] = {'us-west-2': 'ami-04ae356533dc07fb5'} # A secret (in binary form) in SecretsManager that stores the UBL certificates in a .zip file. + # This must be in the format `arn::secretsmanager:::secret:-<6RandomCharacters` self.ubl_certificate_secret_arn: str =\ '' diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/compute_tier.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/compute_tier.py index ebf94a3f3..41fbd3577 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/compute_tier.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/compute_tier.py @@ -8,8 +8,7 @@ Optional ) -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Stack, StackProps ) @@ -35,6 +34,9 @@ UsageBasedLicensing, WorkerInstanceFleet, ) +from constructs import ( + Construct +) from . import subnets diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/network_tier.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/network_tier.py index 51182b948..e895d094d 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/network_tier.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/network_tier.py @@ -1,11 +1,9 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from aws_cdk.core import ( +from aws_cdk import ( Stack, - Construct ) - from aws_cdk.aws_ec2 import ( FlowLogDestination, FlowLogTrafficType, @@ -15,10 +13,12 @@ SubnetSelection, SubnetType ) - from aws_cdk.aws_route53 import ( PrivateHostedZone ) +from constructs import ( + Construct +) from . import subnets diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/security_tier.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/security_tier.py index c14169f0f..de7f4fd7e 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/security_tier.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/security_tier.py @@ -1,14 +1,16 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Stack, ) from aws_rfdk import ( DistinguishedName, X509CertificatePem ) +from constructs import ( + Construct +) class SecurityTier(Stack): diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/service_tier.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/service_tier.py index 381f3620c..1e272f494 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/service_tier.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/service_tier.py @@ -4,8 +4,7 @@ import typing from dataclasses import dataclass -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Duration, Stack, StackProps @@ -26,7 +25,6 @@ from aws_cdk.aws_route53 import ( IPrivateHostedZone ) - from aws_rfdk import ( DistinguishedName, MountableEfs, @@ -34,7 +32,7 @@ X509CertificatePem ) from aws_rfdk.deadline import ( - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, DatabaseConnection, RenderQueue, RenderQueueHostNameProps, @@ -47,6 +45,10 @@ UsageBasedLicensing, VersionQuery, ) +from constructs import ( + Construct +) + from . import subnets @@ -72,8 +74,8 @@ class ServiceTierProps(StackProps): dns_zone: IPrivateHostedZone # Version of Deadline to use deadline_version: str - # Whether the AWS Thinkbox End-User License Agreement is accepted or not - accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance + # Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. + user_aws_customer_agreement_and_ip_license_acceptance: AwsCustomerAgreementAndIpLicenseAcceptance # Whether to enable Deadline Secrets Management. enable_secrets_management: bool # The ARN of the AWS Secret containing the admin credentials for Deadline Secrets Management. @@ -153,7 +155,7 @@ def __init__(self, scope: Construct, stack_id: str, *, props: ServiceTierProps, self, 'Images', version=self.version, - user_aws_thinkbox_eula_acceptance=props.accept_aws_thinkbox_eula + user_aws_customer_agreement_and_ip_license_acceptance=props.user_aws_customer_agreement_and_ip_license_acceptance ) server_cert = X509CertificatePem( @@ -222,7 +224,7 @@ def __init__(self, scope: Construct, stack_id: str, *, props: ServiceTierProps, if props.ubl_licenses: if not props.ubl_certs_secret_arn: raise ValueError('UBL certificates secret ARN is required when using UBL but was not specified.') - ubl_cert_secret = Secret.from_secret_arn(self, 'ublcertssecret', props.ubl_certs_secret_arn) + ubl_cert_secret = Secret.from_secret_complete_arn(self, 'ublcertssecret', props.ubl_certs_secret_arn) self.ubl_licensing = UsageBasedLicensing( self, 'UsageBasedLicensing', diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/storage_tier.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/storage_tier.py index d3b52c645..22600a7c2 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/storage_tier.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/package/lib/storage_tier.py @@ -5,8 +5,7 @@ from dataclasses import dataclass from typing import Optional -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Duration, RemovalPolicy, Size, @@ -52,7 +51,6 @@ from aws_cdk.aws_sns_subscriptions import ( EmailSubscription ) - from aws_rfdk import ( MongoDbUsers, MongoDbX509User, @@ -67,10 +65,12 @@ X509CertificatePem, X509CertificatePkcs12 ) - from aws_rfdk.deadline import ( DatabaseConnection ) +from constructs import ( + Construct +) from . import subnets @@ -231,8 +231,7 @@ def add_low_efs_burst_credit_alarms(self, filesystem: FileSystem, email_address: 'SNSEncryptionKey', description='Used to encrypt the SNS Topic for sending EFS Burst Credit alerts', enable_key_rotation=True, - removal_policy=RemovalPolicy.DESTROY, - trust_account_identities=True + removal_policy=RemovalPolicy.DESTROY ) key.grant(ServicePrincipal('cloudwatch.amazonaws.com'), 'kms:Decrypt', 'kms:GenerateDataKey') diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py index 439e5607a..ed64cda35 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py @@ -17,8 +17,8 @@ packages=setuptools.find_packages(where="package"), install_requires=[ - "aws-cdk.core==1.160.0", - "aws-rfdk==0.42.0" + "aws-cdk-lib==2.33.0", + "aws-rfdk==1.0.0" ], python_requires=">=3.7", diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md index cb54996cb..e7b5bdcc2 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md @@ -18,18 +18,15 @@ These instructions assume that your working directory is `examples/deadline/All- ``` yarn install ``` -3. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `acceptAwsThinkboxEula` in `bin/config.ts`: +3. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `acceptAwsCustomerAgreementAndIpLicense` in `bin/config.ts`: ```ts - /** - * Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA for - * Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before using the - * AWS Thinkbox Deadline container images. - * - * See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. - */ - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; ``` + 4. Change the value of the `deadlineVersion` variable in `bin/config.ts` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the latest `10.1.12.x` release of Deadline, use: ```ts diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/app.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/app.ts index 0fb24bd20..f7ae07af9 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/app.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/app.ts @@ -6,7 +6,7 @@ import 'source-map-support/register'; import { config } from './config'; -import * as cdk from '@aws-cdk/core'; +import * as cdk from 'aws-cdk-lib'; import { NetworkTier } from '../lib/network-tier'; import { ServiceTier, @@ -22,7 +22,7 @@ import { InstanceSize, InstanceType, MachineImage, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ComputeTier } from '../lib/compute-tier'; // ------------------------------ // @@ -111,7 +111,7 @@ const service = new ServiceTier(app, 'ServiceTier', { ublLicenses: config.ublLicenses, rootCa: security.rootCa, dnsZone: network.dnsZone, - acceptAwsThinkboxEula: config.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: config.acceptAwsCustomerAgreementAndIpLicense, enableSecretsManagement: config.enableSecretsManagement, secretsManagementSecretArn: config.secretsManagementSecretArn }); diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/config.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/config.ts index b04d67e0e..66ea3b40b 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/config.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/bin/config.ts @@ -6,7 +6,7 @@ import 'source-map-support/register'; import { UsageBasedLicense } from 'aws-rfdk/deadline'; import { MongoDbSsplLicenseAcceptance } from 'aws-rfdk'; -import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; +import { AwsCustomerAgreementAndIpLicenseAcceptance } from 'aws-rfdk/deadline'; /** * Configuration values for the sample app. @@ -15,13 +15,12 @@ import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; */ class AppConfig { /** - * Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA for - * Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before using the - * AWS Thinkbox Deadline container images. - * - * See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. + * By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + * and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + * is AWS Content as defined in those Agreements. + * To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE */ - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; /** * Fill this in if you want to receive alarm emails when: @@ -49,6 +48,7 @@ class AppConfig { /** * (Optional) A secret (in binary form) in SecretsManager that stores the UBL certificates in a .zip file. + * This must be in the format `arn::secretsmanager:::secret:-<6RandomCharacters` */ public readonly ublCertificatesSecretArn?: string; diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/cdk.json b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/cdk.json index c39a981a2..15a1c8fa2 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/cdk.json +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/app.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/compute-tier.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/compute-tier.ts index 9479d0dab..d9ff2d3ea 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/compute-tier.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/compute-tier.ts @@ -8,8 +8,8 @@ import { IMachineImage, IVpc, Port, -} from '@aws-cdk/aws-ec2'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; import { IHost, InstanceUserDataProvider, @@ -24,7 +24,8 @@ import { IHealthMonitor, SessionManagerHelper, } from 'aws-rfdk'; -import { Asset } from '@aws-cdk/aws-s3-assets'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; import * as path from 'path' import { Subnets } from './subnets'; @@ -83,7 +84,7 @@ class UserDataProvider extends InstanceUserDataProvider { host.userData.addCommands('echo postWorkerLaunch'); if (host.node.scope != undefined) { const testScript = new Asset( - host.node.scope as cdk.Construct, + host.node.scope as Construct, 'SampleAsset', {path: path.join(__dirname, '..', '..', 'scripts', 'configure_worker.sh')}, ); @@ -120,7 +121,7 @@ export class ComputeTier extends cdk.Stack { * @param id The ID of this construct. * @param props The properties of this construct. */ - constructor(scope: cdk.Construct, id: string, props: ComputeTierProps) { + constructor(scope: Construct, id: string, props: ComputeTierProps) { super(scope, id, props); this.healthMonitor = new HealthMonitor(this, 'HealthMonitor', { diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/network-tier.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/network-tier.ts index 0c314f59e..15916bbd8 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/network-tier.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/network-tier.ts @@ -14,11 +14,12 @@ import { SubnetSelection, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { PrivateHostedZone, -} from '@aws-cdk/aws-route53'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-route53'; +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; import { Subnets } from './subnets'; @@ -67,7 +68,7 @@ export class NetworkTier extends cdk.Stack { * @param id The ID of this construct. * @param props The stack properties. */ - constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); this.vpc = new Vpc(this, 'Vpc', { diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/security-tier.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/security-tier.ts index f4e4376af..85ffe6e97 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/security-tier.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/security-tier.ts @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as cdk from '@aws-cdk/core'; +import * as cdk from 'aws-cdk-lib'; import { X509CertificatePem, } from 'aws-rfdk'; +import { Construct } from 'constructs'; /** * The security tier of the render farm. This stack contains resources used to @@ -24,7 +25,7 @@ export class SecurityTier extends cdk.Stack { * @param id The ID of this construct. * @param props The properties for the security tier. */ - constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) { + constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); this.rootCa = new X509CertificatePem(this, 'RootCA', { diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/service-tier.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/service-tier.ts index 0b184a750..bbc184a86 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/service-tier.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/service-tier.ts @@ -7,20 +7,20 @@ import { BastionHostLinux, BlockDeviceVolume, IVpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ApplicationProtocol, -} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IPrivateHostedZone, -} from '@aws-cdk/aws-route53'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-route53'; +import * as cdk from 'aws-cdk-lib'; import { MountableEfs, X509CertificatePem, } from 'aws-rfdk'; import { - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, DatabaseConnection, RenderQueue, Repository, @@ -31,8 +31,9 @@ import { } from 'aws-rfdk/deadline'; import { Secret, -} from '@aws-cdk/aws-secretsmanager'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { SessionManagerHelper } from 'aws-rfdk/lib/core'; +import { Construct } from 'constructs'; import { Subnets } from './subnets'; @@ -84,9 +85,9 @@ export interface ServiceTierProps extends cdk.StackProps { readonly deadlineVersion?: string; /** - * Whether the AWS Thinkbox End-User License Agreement is accepted or not + * Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. */ - readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance; + readonly userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; /** * Whether to enable Deadline Secrets Management. @@ -130,7 +131,7 @@ export class ServiceTier extends cdk.Stack { * @param id The ID of this construct. * @param props The properties for this construct. */ - constructor(scope: cdk.Construct, id: string, props: ServiceTierProps) { + constructor(scope: Construct, id: string, props: ServiceTierProps) { super(scope, id, props); // Bastion instance for convenience (e.g. SSH into RenderQueue and WorkerFleet instances). @@ -181,7 +182,7 @@ export class ServiceTier extends cdk.Stack { const images = new ThinkboxDockerImages(this, 'Images', { version: this.version, - userAwsThinkboxEulaAcceptance: props.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: props.userAwsCustomerAgreementAndIpLicenseAcceptance, }); const serverCert = new X509CertificatePem(this, 'RQCert', { diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/storage-tier.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/storage-tier.ts index 05cc9c19e..b9862683c 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/storage-tier.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/storage-tier.ts @@ -7,35 +7,35 @@ import { InstanceType, IVpc, SubnetSelection, -} from '@aws-cdk/aws-ec2'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; import { ComparisonOperator, Metric, TreatMissingData, -} from '@aws-cdk/aws-cloudwatch'; +} from 'aws-cdk-lib/aws-cloudwatch'; import { SnsAction, -} from '@aws-cdk/aws-cloudwatch-actions'; -import { DatabaseCluster } from '@aws-cdk/aws-docdb'; +} from 'aws-cdk-lib/aws-cloudwatch-actions'; +import { DatabaseCluster } from 'aws-cdk-lib/aws-docdb'; import { AccessPoint, FileSystem, -} from '@aws-cdk/aws-efs'; +} from 'aws-cdk-lib/aws-efs'; import { ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Key, -} from '@aws-cdk/aws-kms'; -import { IPrivateHostedZone } from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-kms'; +import { IPrivateHostedZone } from 'aws-cdk-lib/aws-route53'; import { Topic, -} from '@aws-cdk/aws-sns'; +} from 'aws-cdk-lib/aws-sns'; import { EmailSubscription, -} from '@aws-cdk/aws-sns-subscriptions'; -import { RemovalPolicy, Duration } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-sns-subscriptions'; +import { RemovalPolicy, Duration } from 'aws-cdk-lib'; import { MongoDbInstance, MongoDbPostInstallSetup, @@ -49,6 +49,7 @@ import { import { DatabaseConnection, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { Subnets } from './subnets'; @@ -91,7 +92,7 @@ export abstract class StorageTier extends cdk.Stack { * @param id The ID of this construct. * @param props The properties for the storage tier. */ - constructor(scope: cdk.Construct, id: string, props: StorageTierProps) { + constructor(scope: Construct, id: string, props: StorageTierProps) { super(scope, id, props); const fileSystem = new FileSystem(this, 'EfsFileSystem', { @@ -208,8 +209,7 @@ export abstract class StorageTier extends cdk.Stack { const key = new Key(this, 'SNSEncryptionKey', { description: 'Used to encrypt the SNS Topic for sending EFS Burst Credit alerts', enableKeyRotation: true, - removalPolicy: RemovalPolicy.DESTROY, - trustAccountIdentities: true, + removalPolicy: RemovalPolicy.DESTROY }); key.grant(new ServicePrincipal('cloudwatch.amazonaws.com'), 'kms:Decrypt', 'kms:GenerateDataKey'); @@ -310,7 +310,7 @@ export class StorageTierDocDB extends StorageTier { * @param id The ID of this construct. * @param props The properties for this construct. */ - constructor(scope: cdk.Construct, id: string, props: StorageTierDocDBProps) { + constructor(scope: Construct, id: string, props: StorageTierDocDBProps) { super(scope, id, props); const docDb = new DatabaseCluster(this, 'DocDBCluster', { @@ -391,7 +391,7 @@ export class StorageTierMongoDB extends StorageTier { * @param id The ID of this construct. * @param props The properties for this construct. */ - constructor(scope: cdk.Construct, id: string, props: StorageTierMongoDBProps) { + constructor(scope: Construct, id: string, props: StorageTierMongoDBProps) { super(scope, id, props); const serverCert = new X509CertificatePem(this, 'MongoCert', { diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/subnets.ts b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/subnets.ts index 01f9665c3..f0b97722e 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/subnets.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/lib/subnets.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SubnetConfiguration, SubnetType } from '@aws-cdk/aws-ec2'; +import { SubnetConfiguration, SubnetType } from 'aws-cdk-lib/aws-ec2'; export class Subnets { /** diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/package.json b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/package.json index cdff21c5b..bdb6a1156 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/package.json +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/package.json @@ -1,6 +1,6 @@ { "name": "all-in-farm-basic", - "version": "0.42.0", + "version": "1.0.0", "bin": { "app": "bin/app.js" }, @@ -14,13 +14,13 @@ }, "devDependencies": { "@types/node": "^18.0.0", - "aws-cdk": "1.160.0", + "aws-cdk": "2.33.0", "ts-node": "^10.8.1", "typescript": "~4.7.3" }, "dependencies": { - "@aws-cdk/core": "1.160.0", - "aws-rfdk": "0.42.0", + "aws-cdk-lib": "^2.33.0", + "aws-rfdk": "1.0.0", "source-map-support": "^0.5.21" } } diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/cdk.json b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/cdk.json index fa91d40d2..954054a6e 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/cdk.json +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/cdk.json @@ -1,18 +1,5 @@ { "app": "python -m package.app", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/app.py b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/app.py index 194e70c45..12186f4bf 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/app.py +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/app.py @@ -5,7 +5,7 @@ import os -from aws_cdk.core import ( +from aws_cdk import ( App, Environment, ) diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/config.py b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/config.py index 21102770a..5922be355 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/config.py +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/config.py @@ -2,9 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 from typing import ( - List, Mapping, - Optional, ) class AppConfig: diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/lib/sep_stack.py b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/lib/sep_stack.py index 3732ef590..68d8a52f0 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/lib/sep_stack.py +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/package/lib/sep_stack.py @@ -1,12 +1,8 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from typing import ( - Optional, -) from dataclasses import dataclass -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Duration, RemovalPolicy, Stack, @@ -49,6 +45,9 @@ DistinguishedName, X509CertificatePem, ) +from constructs import ( + Construct +) @dataclass diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/setup.py b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/setup.py index 4f04f6bd5..74874686c 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/python/setup.py +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/python/setup.py @@ -17,8 +17,8 @@ packages=setuptools.find_packages(where="package"), install_requires=[ - "aws-cdk.core==1.160.0", - "aws-rfdk==0.42.0" + "aws-cdk-lib==2.33.0", + "aws-rfdk==1.0.0" ], python_requires=">=3.7", diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/bin/app.ts b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/bin/app.ts index d66c05a2f..f1dbb9fba 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/bin/app.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/bin/app.ts @@ -7,8 +7,8 @@ import 'source-map-support/register'; import * as path from 'path'; import * as pkg from '../package.json'; -import { MachineImage } from '@aws-cdk/aws-ec2'; -import * as cdk from '@aws-cdk/core'; +import { MachineImage } from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; import { SEPStack } from '../lib/sep-stack'; import { config } from './config'; diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/cdk.json b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/cdk.json index c39a981a2..15a1c8fa2 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/cdk.json +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/app.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/lib/sep-stack.ts b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/lib/sep-stack.ts index 9464a4998..921c02b43 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/lib/sep-stack.ts +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/lib/sep-stack.ts @@ -9,22 +9,21 @@ import { InstanceSize, InstanceType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { - Construct, Duration, RemovalPolicy, Stack, StackProps, Tags, -} from '@aws-cdk/core'; -import { ApplicationProtocol } from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib'; +import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { ManagedPolicy, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; -import { PrivateHostedZone } from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-iam'; +import { PrivateHostedZone } from 'aws-cdk-lib/aws-route53'; import { ConfigureSpotEventPlugin, RenderQueue, @@ -34,6 +33,7 @@ import { ThinkboxDockerRecipes, } from 'aws-rfdk/deadline'; import { X509CertificatePem } from 'aws-rfdk'; +import { Construct } from 'constructs'; /** * Properties for {@link SEPStack}. diff --git a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/package.json b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/package.json index 0492fecde..1b03093b8 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/package.json +++ b/examples/deadline/All-In-AWS-Infrastructure-SEP/ts/package.json @@ -1,6 +1,6 @@ { "name": "all-in-farm-sep", - "version": "0.42.0", + "version": "1.0.0", "bin": { "app": "bin/app.js" }, @@ -19,13 +19,14 @@ }, "devDependencies": { "@types/node": "^18.0.0", - "aws-cdk": "1.160.0", + "aws-cdk": "2.33.0", "ts-node": "^10.8.1", "typescript": "~4.7.3" }, "dependencies": { - "@aws-cdk/core": "1.160.0", - "aws-rfdk": "0.42.0", + "aws-cdk-lib": "^2.33.0", + "aws-rfdk": "1.0.0", + "constructs": "^10.0.0", "source-map-support": "^0.5.21" } } diff --git a/examples/deadline/EC2-Image-Builder/python/README.md b/examples/deadline/EC2-Image-Builder/python/README.md index a9f246cd2..227e45cb1 100644 --- a/examples/deadline/EC2-Image-Builder/python/README.md +++ b/examples/deadline/EC2-Image-Builder/python/README.md @@ -35,10 +35,13 @@ These instructions assume that your working directory is `examples/deadline/EC2- pip install ../../../../dist/python/aws-rfdk-.tar.gz ``` -4. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `accept_aws_thinkbox_eula` in `package/config.py` like this: +4. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `accept_aws_customer_agreement_and_ip_license` in `package/config.py`: ```py - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE ``` 5. Change the value of the `deadline_version` variable in `package/config.py` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the `10.1.13` release of Deadline, use `10.1.13.2`. diff --git a/examples/deadline/EC2-Image-Builder/python/cdk.json b/examples/deadline/EC2-Image-Builder/python/cdk.json index fa91d40d2..954054a6e 100644 --- a/examples/deadline/EC2-Image-Builder/python/cdk.json +++ b/examples/deadline/EC2-Image-Builder/python/cdk.json @@ -1,18 +1,5 @@ { "app": "python -m package.app", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/EC2-Image-Builder/python/package/app.py b/examples/deadline/EC2-Image-Builder/python/package/app.py index 5a59030b1..fe2334941 100644 --- a/examples/deadline/EC2-Image-Builder/python/package/app.py +++ b/examples/deadline/EC2-Image-Builder/python/package/app.py @@ -5,7 +5,7 @@ import os -from aws_cdk.core import ( +from aws_cdk import ( App, Environment ) @@ -30,7 +30,7 @@ def main(): farm_props = base_farm_stack.BaseFarmStackProps( deadline_version=config.deadline_version, - accept_aws_thinkbox_eula=config.accept_aws_thinkbox_eula + accept_aws_customer_agreement_and_ip_license=config.accept_aws_customer_agreement_and_ip_license ) farm_stack = base_farm_stack.BaseFarmStack(app, 'BaseFarmStack', props=farm_props, env=env) diff --git a/examples/deadline/EC2-Image-Builder/python/package/config.py b/examples/deadline/EC2-Image-Builder/python/package/config.py index 61c597379..a0ea4ed12 100644 --- a/examples/deadline/EC2-Image-Builder/python/package/config.py +++ b/examples/deadline/EC2-Image-Builder/python/package/config.py @@ -1,7 +1,7 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from aws_rfdk.deadline import AwsThinkboxEulaAcceptance +from aws_rfdk.deadline import AwsCustomerAgreementAndIpLicenseAcceptance class AppConfig: """ @@ -10,12 +10,11 @@ class AppConfig: TODO: Fill these in with your own values. """ def __init__(self): - # Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA for - # Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before using the - # AWS Thinkbox Deadline container images. - # - # See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA + # By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + # and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + # is AWS Content as defined in those Agreements. + # To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE # The version of Deadline to install on the AMI. This can be either a partial version that will use the latest patch, such as # '10.1' or '10.1.13', or a full version that will be pinned to a specific patch release, such as '10.1.13.1'. diff --git a/examples/deadline/EC2-Image-Builder/python/package/lib/base_farm_stack.py b/examples/deadline/EC2-Image-Builder/python/package/lib/base_farm_stack.py index 3bfac26d9..7b6ea6730 100644 --- a/examples/deadline/EC2-Image-Builder/python/package/lib/base_farm_stack.py +++ b/examples/deadline/EC2-Image-Builder/python/package/lib/base_farm_stack.py @@ -3,8 +3,7 @@ from dataclasses import dataclass -from aws_cdk.core import ( - Construct, +from aws_cdk import ( RemovalPolicy, Stack, StackProps @@ -13,19 +12,22 @@ Vpc, ) from aws_rfdk.deadline import ( - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, RenderQueue, Repository, RepositoryRemovalPolicies, ThinkboxDockerImages, VersionQuery, ) +from constructs import ( + Construct +) @dataclass class BaseFarmStackProps(StackProps): - # Whether the AWS Thinkbox End-User License Agreement is accepted or not - accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance + # Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. + accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance # Version of Deadline to use deadline_version: str @@ -59,7 +61,7 @@ def __init__(self, scope: Construct, stack_id: str, *, props: BaseFarmStackProps self, 'Images', version=version, - user_aws_thinkbox_eula_acceptance=props.accept_aws_thinkbox_eula, + user_aws_customer_agreement_and_ip_license_acceptance=props.accept_aws_customer_agreement_and_ip_license, ) repository = Repository( diff --git a/examples/deadline/EC2-Image-Builder/python/package/lib/compute_stack.py b/examples/deadline/EC2-Image-Builder/python/package/lib/compute_stack.py index 2a187ebe0..ef45012a3 100644 --- a/examples/deadline/EC2-Image-Builder/python/package/lib/compute_stack.py +++ b/examples/deadline/EC2-Image-Builder/python/package/lib/compute_stack.py @@ -8,8 +8,7 @@ Vpc, WindowsVersion ) -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Stack, StackProps ) @@ -18,6 +17,9 @@ VersionQuery, WorkerInstanceFleet ) +from constructs import ( + Construct +) from .deadline_machine_image import ( DeadlineMachineImage, diff --git a/examples/deadline/EC2-Image-Builder/python/package/lib/deadline_machine_image.py b/examples/deadline/EC2-Image-Builder/python/package/lib/deadline_machine_image.py index 05d07b77a..4914f2b5b 100644 --- a/examples/deadline/EC2-Image-Builder/python/package/lib/deadline_machine_image.py +++ b/examples/deadline/EC2-Image-Builder/python/package/lib/deadline_machine_image.py @@ -6,6 +6,9 @@ import os from typing import List +from aws_cdk import ( + Token +) from aws_cdk.aws_ec2 import ( IMachineImage, OperatingSystemType @@ -24,9 +27,8 @@ CfnImageRecipe, CfnInfrastructureConfiguration ) -from aws_cdk.core import ( - Construct, - Token +from constructs import ( + Construct ) from . import template diff --git a/examples/deadline/EC2-Image-Builder/python/setup.py b/examples/deadline/EC2-Image-Builder/python/setup.py index 3317a0fe3..21d2e133d 100644 --- a/examples/deadline/EC2-Image-Builder/python/setup.py +++ b/examples/deadline/EC2-Image-Builder/python/setup.py @@ -17,12 +17,8 @@ packages=setuptools.find_packages(where="package"), install_requires=[ - "aws-cdk.aws-iam==1.160.0", - "aws-cdk.aws-imagebuilder==1.160.0", - "aws-cdk.aws-ec2==1.160.0", - "aws-cdk.aws-s3-assets==1.160.0", - "aws-cdk.core==1.160.0", - "aws-rfdk==0.42.0", + "aws-cdk-lib==2.33.0", + "aws-rfdk==1.0.0", ], python_requires=">=3.7", diff --git a/examples/deadline/EC2-Image-Builder/ts/README.md b/examples/deadline/EC2-Image-Builder/ts/README.md index f63f62c67..c59446cea 100644 --- a/examples/deadline/EC2-Image-Builder/ts/README.md +++ b/examples/deadline/EC2-Image-Builder/ts/README.md @@ -13,10 +13,13 @@ These instructions assume that your working directory is `examples/deadline/EC2- --- 1. This sample app on the `mainline` branch may contain features that have not yet been officially released, and may not be available in the `aws-rfdk` package installed through npm from npmjs. To work from an example of the latest release, please switch to the `release` branch. If you would like to try out unreleased features, you can stay on `mainline` and follow the instructions for building and using the `aws-rfdk` from your local repository. -2. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `acceptAwsThinkboxEula` in `bin/config.ts` like this: +2. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `acceptAwsCustomerAgreementAndIpLicense` in `bin/config.ts`: ```ts - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; ``` 3. Change the value of the `deadlineVersion` variable in `bin/config.ts` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the `10.1.13` release of Deadline, use `10.1.13.2`. diff --git a/examples/deadline/EC2-Image-Builder/ts/bin/app.ts b/examples/deadline/EC2-Image-Builder/ts/bin/app.ts index e81370803..94a2d0227 100644 --- a/examples/deadline/EC2-Image-Builder/ts/bin/app.ts +++ b/examples/deadline/EC2-Image-Builder/ts/bin/app.ts @@ -5,7 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as cdk from '@aws-cdk/core'; +import * as cdk from 'aws-cdk-lib'; import { config } from './config'; @@ -22,7 +22,7 @@ const app = new cdk.App(); const baseFarm = new BaseFarmStack(app, 'BaseFarmStack', { env, deadlineVersion: config.deadlineVersion, - acceptAwsThinkboxEula: config.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: config.acceptAwsCustomerAgreementAndIpLicense, }); new ComputeStack(app, 'ComputeStack', { diff --git a/examples/deadline/EC2-Image-Builder/ts/bin/config.ts b/examples/deadline/EC2-Image-Builder/ts/bin/config.ts index d0f89b535..2bf66e24e 100644 --- a/examples/deadline/EC2-Image-Builder/ts/bin/config.ts +++ b/examples/deadline/EC2-Image-Builder/ts/bin/config.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; +import { AwsCustomerAgreementAndIpLicenseAcceptance } from 'aws-rfdk/deadline'; /** * Configuration values for the sample app. @@ -12,13 +12,12 @@ import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; */ class AppConfig { /** - * Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA for - * Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before using the - * AWS Thinkbox Deadline container images. - * - * See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. + * By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + * and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + * is AWS Content as defined in those Agreements. + * To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE */ - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; /** * The version of Deadline to install on the AMI. This can be either a partial version that will use the latest patch, such as diff --git a/examples/deadline/EC2-Image-Builder/ts/cdk.json b/examples/deadline/EC2-Image-Builder/ts/cdk.json index c39a981a2..15a1c8fa2 100644 --- a/examples/deadline/EC2-Image-Builder/ts/cdk.json +++ b/examples/deadline/EC2-Image-Builder/ts/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/app.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/EC2-Image-Builder/ts/lib/base-farm-stack.ts b/examples/deadline/EC2-Image-Builder/ts/lib/base-farm-stack.ts index de2addf04..ae3c3595a 100644 --- a/examples/deadline/EC2-Image-Builder/ts/lib/base-farm-stack.ts +++ b/examples/deadline/EC2-Image-Builder/ts/lib/base-farm-stack.ts @@ -5,26 +5,26 @@ import { Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { - Construct, RemovalPolicy, Stack, StackProps -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; import { - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, RenderQueue, Repository, ThinkboxDockerImages, VersionQuery } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; export interface FarmProps extends StackProps { /** - * Whether the AWS Thinkbox End-User License Agreement is accepted or not + * Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. */ - readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance; + readonly userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; /** * Version of Deadline to use. @@ -50,7 +50,7 @@ export class BaseFarmStack extends Stack { const images = new ThinkboxDockerImages(this, 'Images', { version: version, - userAwsThinkboxEulaAcceptance: props.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: props.userAwsCustomerAgreementAndIpLicenseAcceptance, }); const repository = new Repository(this, 'Repository', { diff --git a/examples/deadline/EC2-Image-Builder/ts/lib/compute-stack.ts b/examples/deadline/EC2-Image-Builder/ts/lib/compute-stack.ts index 19842b982..7b2eaa256 100644 --- a/examples/deadline/EC2-Image-Builder/ts/lib/compute-stack.ts +++ b/examples/deadline/EC2-Image-Builder/ts/lib/compute-stack.ts @@ -7,18 +7,18 @@ import { MachineImage, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { CfnResource, - Construct, Stack, StackProps -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; import { RenderQueue, VersionQuery, WorkerInstanceFleet, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { DeadlineMachineImage, diff --git a/examples/deadline/EC2-Image-Builder/ts/lib/deadline-machine-image.ts b/examples/deadline/EC2-Image-Builder/ts/lib/deadline-machine-image.ts index 423095df2..99d0a6ca6 100644 --- a/examples/deadline/EC2-Image-Builder/ts/lib/deadline-machine-image.ts +++ b/examples/deadline/EC2-Image-Builder/ts/lib/deadline-machine-image.ts @@ -8,26 +8,26 @@ import * as path from 'path'; import { IMachineImage, OperatingSystemType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { CfnInstanceProfile, ManagedPolicy, PolicyStatement, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { CfnComponent, CfnDistributionConfiguration, CfnImage, CfnImageRecipe, CfnInfrastructureConfiguration, -} from '@aws-cdk/aws-imagebuilder'; +} from 'aws-cdk-lib/aws-imagebuilder'; import { CfnResource, - Construct, Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { Construct } from 'constructs'; import { templateComponent } from './template'; diff --git a/examples/deadline/EC2-Image-Builder/ts/package.json b/examples/deadline/EC2-Image-Builder/ts/package.json index 25725229b..d17b9cd02 100644 --- a/examples/deadline/EC2-Image-Builder/ts/package.json +++ b/examples/deadline/EC2-Image-Builder/ts/package.json @@ -1,6 +1,6 @@ { "name": "all-in-farm-image-builder", - "version": "0.42.0", + "version": "1.0.0", "bin": { "app": "bin/app.js" }, @@ -15,16 +15,14 @@ }, "devDependencies": { "@types/node": "^18.0.0", - "aws-cdk": "1.160.0", + "aws-cdk": "2.33.0", "ts-node": "^10.8.1", "typescript": "~4.7.3" }, "dependencies": { - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-imagebuilder": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/core": "1.160.0", - "aws-rfdk": "0.42.0" + "aws-cdk-lib": "^2.33.0", + "aws-rfdk": "1.0.0", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" } } diff --git a/examples/deadline/Local-Zone/python/README.md b/examples/deadline/Local-Zone/python/README.md index c5a72831b..c58011072 100644 --- a/examples/deadline/Local-Zone/python/README.md +++ b/examples/deadline/Local-Zone/python/README.md @@ -35,10 +35,13 @@ These instructions assume that your working directory is `examples/deadline/Loca pip install ../../../../dist/python/aws-rfdk-.tar.gz ``` -4. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `accept_aws_thinkbox_eula` in `package/lib/config.py` like this: +4. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `accept_aws_customer_agreement_and_ip_license` in `package/config.py`: ```py - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE ``` 5. Change the value of the `deadline_version` variable in `package/config.py` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the latest `10.1.15.x` release of Deadline, use: diff --git a/examples/deadline/Local-Zone/python/cdk.json b/examples/deadline/Local-Zone/python/cdk.json index fa91d40d2..954054a6e 100644 --- a/examples/deadline/Local-Zone/python/cdk.json +++ b/examples/deadline/Local-Zone/python/cdk.json @@ -1,18 +1,5 @@ { "app": "python -m package.app", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/Local-Zone/python/package/app.py b/examples/deadline/Local-Zone/python/package/app.py index e89aeac53..3b97aada1 100644 --- a/examples/deadline/Local-Zone/python/package/app.py +++ b/examples/deadline/Local-Zone/python/package/app.py @@ -5,7 +5,7 @@ import os -from aws_cdk.core import ( +from aws_cdk import ( App, Environment ) @@ -70,7 +70,7 @@ def main(): root_ca=security.root_ca, dns_zone=network.dns_zone, deadline_version=config.config.deadline_version, - accept_aws_thinkbox_eula=config.config.accept_aws_thinkbox_eula + user_aws_customer_agreement_and_ip_license_acceptance=config.config.accept_aws_customer_agreement_and_ip_license ) service = service_tier.ServiceTier(app, 'ServiceTier', props=service_props, env=env) diff --git a/examples/deadline/Local-Zone/python/package/lib/compute_tier.py b/examples/deadline/Local-Zone/python/package/lib/compute_tier.py index 57b2d7200..e95c5b042 100644 --- a/examples/deadline/Local-Zone/python/package/lib/compute_tier.py +++ b/examples/deadline/Local-Zone/python/package/lib/compute_tier.py @@ -7,8 +7,7 @@ Optional ) -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Stack, StackProps ) @@ -21,7 +20,6 @@ SubnetSelection, SubnetType ) - from aws_rfdk import ( HealthMonitor, SessionManagerHelper @@ -31,7 +29,9 @@ IRenderQueue, WorkerInstanceFleet ) - +from constructs import ( + Construct +) @dataclass class ComputeTierProps(StackProps): diff --git a/examples/deadline/Local-Zone/python/package/lib/config.py b/examples/deadline/Local-Zone/python/package/lib/config.py index 17702d84b..077ae7990 100644 --- a/examples/deadline/Local-Zone/python/package/lib/config.py +++ b/examples/deadline/Local-Zone/python/package/lib/config.py @@ -8,7 +8,7 @@ ) from aws_rfdk.deadline import ( - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, ) @@ -19,12 +19,11 @@ class AppConfig: TODO: Fill these in with your own values. """ def __init__(self): - # Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA - # for Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before - # using the AWS Thinkbox Deadline container images. - # - # See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. - self.accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA + # By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + # and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + # is AWS Content as defined in those Agreements. + # To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE + self.accept_aws_customer_agreement_and_ip_license: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE # The standard availability zones that the render farm will deploy into. It is recommended to use at least # two and they must be from the same region. The default values being provided are two of the four standard diff --git a/examples/deadline/Local-Zone/python/package/lib/network_tier.py b/examples/deadline/Local-Zone/python/package/lib/network_tier.py index 4fb0c0f5c..fd8915068 100644 --- a/examples/deadline/Local-Zone/python/package/lib/network_tier.py +++ b/examples/deadline/Local-Zone/python/package/lib/network_tier.py @@ -4,6 +4,9 @@ import builtins import typing +from aws_cdk import ( + Stack +) from aws_cdk.aws_ec2 import ( GatewayVpcEndpointAwsService, InterfaceVpcEndpointAwsService, @@ -15,9 +18,8 @@ from aws_cdk.aws_route53 import ( PrivateHostedZone ) -from aws_cdk.core import ( - Construct, - Stack +from constructs import ( + Construct ) import jsii diff --git a/examples/deadline/Local-Zone/python/package/lib/security_tier.py b/examples/deadline/Local-Zone/python/package/lib/security_tier.py index c14169f0f..1e2cdfa2c 100644 --- a/examples/deadline/Local-Zone/python/package/lib/security_tier.py +++ b/examples/deadline/Local-Zone/python/package/lib/security_tier.py @@ -1,15 +1,16 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -from aws_cdk.core import ( - Construct, +from aws_cdk import ( Stack, ) from aws_rfdk import ( DistinguishedName, X509CertificatePem ) - +from constructs import ( + Construct +) class SecurityTier(Stack): """ diff --git a/examples/deadline/Local-Zone/python/package/lib/service_tier.py b/examples/deadline/Local-Zone/python/package/lib/service_tier.py index d6bc3c361..2e2d9687b 100644 --- a/examples/deadline/Local-Zone/python/package/lib/service_tier.py +++ b/examples/deadline/Local-Zone/python/package/lib/service_tier.py @@ -4,6 +4,12 @@ from dataclasses import dataclass from typing import List +from aws_cdk import ( + Duration, + RemovalPolicy, + Stack, + StackProps +) from aws_cdk.aws_ec2 import ( IVpc, SubnetSelection, @@ -15,21 +21,13 @@ from aws_cdk.aws_route53 import ( IPrivateHostedZone ) -from aws_cdk.core import ( - Construct, - Duration, - RemovalPolicy, - Stack, - StackProps -) - from aws_rfdk import ( DistinguishedName, SessionManagerHelper, X509CertificatePem ) from aws_rfdk.deadline import ( - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, RenderQueue, RenderQueueHostNameProps, RenderQueueTrafficEncryptionProps, @@ -39,7 +37,9 @@ ThinkboxDockerImages, VersionQuery ) - +from constructs import ( + Construct +) @dataclass class ServiceTierProps(StackProps): @@ -48,8 +48,8 @@ class ServiceTierProps(StackProps): """ # The VPC to deploy service tier resources into. vpc: IVpc - # Whether the AWS Thinkbox End-User License Agreement is accepted or not - accept_aws_thinkbox_eula: AwsThinkboxEulaAcceptance + # Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. + user_aws_customer_agreement_and_ip_license_acceptance: AwsCustomerAgreementAndIpLicenseAcceptance # The availability zones that components in this stack will be deployed into. These should all be in the same # region and only be standard availability zones, as some constucts use services that aren't available in # local zones yet. @@ -107,7 +107,7 @@ def __init__(self, scope: Construct, stack_id: str, *, props: ServiceTierProps, self, 'Images', version=self.version, - user_aws_thinkbox_eula_acceptance=props.accept_aws_thinkbox_eula + user_aws_customer_agreement_and_ip_license_acceptance=props.user_aws_customer_agreement_and_ip_license_acceptance ) server_cert = X509CertificatePem( diff --git a/examples/deadline/Local-Zone/python/setup.py b/examples/deadline/Local-Zone/python/setup.py index 0faf4a02b..13ac033b9 100644 --- a/examples/deadline/Local-Zone/python/setup.py +++ b/examples/deadline/Local-Zone/python/setup.py @@ -17,12 +17,8 @@ packages=setuptools.find_packages(where="package"), install_requires=[ - "aws-cdk.aws-ec2==1.160.0", - "aws-cdk.aws-elasticloadbalancingv2==1.160.0", - "aws-cdk.aws-route53==1.160.0", - "aws-cdk.core==1.160.0", - "aws-rfdk==0.42.0", - "jsii==1.50.0", + "aws-cdk-lib==2.33.0", + "aws-rfdk==1.0.0" ], python_requires=">=3.7", diff --git a/examples/deadline/Local-Zone/ts/README.md b/examples/deadline/Local-Zone/ts/README.md index f9773bc80..cd84c4501 100644 --- a/examples/deadline/Local-Zone/ts/README.md +++ b/examples/deadline/Local-Zone/ts/README.md @@ -13,10 +13,13 @@ These instructions assume that your working directory is `examples/deadline/Loca --- 1. This sample app on the `mainline` branch may contain features that have not yet been officially released, and may not be available in the `aws-rfdk` package installed through npm from npmjs. To work from an example of the latest release, please switch to the `release` branch. If you would like to try out unreleased features, you can stay on `mainline` and follow the instructions for building and using the `aws-rfdk` from your local repository. -2. You must read and accept the [AWS Thinkbox End-User License Agreement (EULA)](https://www.awsthinkbox.com/end-user-license-agreement) to deploy and run Deadline. To do so, change the value of the `acceptAwsThinkboxEula` in `bin/config.ts` like this: +2. By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. + To accept these terms, change the value of `acceptAwsCustomerAgreementAndIpLicense` in `bin/config.ts`: ```ts - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; ``` 3. Change the value of the `deadlineVersion` variable in `bin/config.ts` to specify the desired version of Deadline to be deployed to your render farm. RFDK is compatible with Deadline versions 10.1.9.x and later. To see the available versions of Deadline, consult the [Deadline release notes](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/release-notes.html). It is recommended to use the latest version of Deadline available when building your farm, but to pin this version when the farm is ready for production use. For example, to pin to the latest `10.1.15.x` release of Deadline, use: diff --git a/examples/deadline/Local-Zone/ts/bin/app.ts b/examples/deadline/Local-Zone/ts/bin/app.ts index dc075f05c..1e72a84a5 100644 --- a/examples/deadline/Local-Zone/ts/bin/app.ts +++ b/examples/deadline/Local-Zone/ts/bin/app.ts @@ -7,8 +7,8 @@ import 'source-map-support/register'; import { MachineImage, -} from '@aws-cdk/aws-ec2'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; import { config } from './config'; import { ComputeTier } from '../lib/compute-tier'; @@ -45,7 +45,7 @@ const service = new ServiceTier(app, 'ServiceTier', { deadlineVersion: config.deadlineVersion, rootCa: security.rootCa, dnsZone: network.dnsZone, - acceptAwsThinkboxEula: config.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: config.acceptAwsCustomerAgreementAndIpLicense, }); new ComputeTier(app, 'ComputeTier', { diff --git a/examples/deadline/Local-Zone/ts/bin/config.ts b/examples/deadline/Local-Zone/ts/bin/config.ts index 8fc9ff340..57a41af62 100644 --- a/examples/deadline/Local-Zone/ts/bin/config.ts +++ b/examples/deadline/Local-Zone/ts/bin/config.ts @@ -4,7 +4,7 @@ */ import 'source-map-support/register'; -import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; +import { AwsCustomerAgreementAndIpLicenseAcceptance } from 'aws-rfdk/deadline'; /** * Configuration values for the sample app. @@ -13,13 +13,12 @@ import { AwsThinkboxEulaAcceptance } from 'aws-rfdk/deadline'; */ class AppConfig { /** - * Change this value to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA if you wish to accept the EULA for - * Deadline and proceed with Deadline deployment. Users must explicitly accept the AWS Thinkbox EULA before using the - * AWS Thinkbox Deadline container images. - * - * See https://www.awsthinkbox.com/end-user-license-agreement for the terms of the agreement. + * By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + * and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + * is AWS Content as defined in those Agreements. + * To accept these terms, change the value here to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE */ - public readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA; + public readonly acceptAwsCustomerAgreementAndIpLicense: AwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; /** * The standard availability zones that the render farm will deploy into. It is recommended to use at least diff --git a/examples/deadline/Local-Zone/ts/cdk.json b/examples/deadline/Local-Zone/ts/cdk.json index c39a981a2..15a1c8fa2 100644 --- a/examples/deadline/Local-Zone/ts/cdk.json +++ b/examples/deadline/Local-Zone/ts/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/app.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/examples/deadline/Local-Zone/ts/lib/compute-tier.ts b/examples/deadline/Local-Zone/ts/lib/compute-tier.ts index 5eddadcab..9af87fecf 100644 --- a/examples/deadline/Local-Zone/ts/lib/compute-tier.ts +++ b/examples/deadline/Local-Zone/ts/lib/compute-tier.ts @@ -12,8 +12,8 @@ import { IVpc, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as cdk from 'aws-cdk-lib'; import { HealthMonitor, IHealthMonitor, @@ -26,6 +26,7 @@ import { IWorkerFleet, WorkerInstanceFleet, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; /** * Properties for {@link ComputeTier}. @@ -89,7 +90,7 @@ export class ComputeTier extends cdk.Stack { /** * Initializes a new instance of {@link ComputeTier}. */ - constructor(scope: cdk.Construct, id: string, props: ComputeTierProps) { + constructor(scope: Construct, id: string, props: ComputeTierProps) { super(scope, id, props); // We can put the health monitor and worker fleet in all of the local zones we're using diff --git a/examples/deadline/Local-Zone/ts/lib/network-tier.ts b/examples/deadline/Local-Zone/ts/lib/network-tier.ts index 5743b25b9..62f05527e 100644 --- a/examples/deadline/Local-Zone/ts/lib/network-tier.ts +++ b/examples/deadline/Local-Zone/ts/lib/network-tier.ts @@ -12,11 +12,12 @@ import { SubnetSelection, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { PrivateHostedZone, -} from '@aws-cdk/aws-route53'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-route53'; +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; import { config } from '../bin/config'; @@ -72,7 +73,7 @@ export class NetworkTier extends cdk.Stack { /** * Initializes a new instance of {@link NetworkTier}. */ - constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) { + constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); // We're creating a SubnetSelection with only the standard availability zones to be diff --git a/examples/deadline/Local-Zone/ts/lib/security-tier.ts b/examples/deadline/Local-Zone/ts/lib/security-tier.ts index f4e4376af..85ffe6e97 100644 --- a/examples/deadline/Local-Zone/ts/lib/security-tier.ts +++ b/examples/deadline/Local-Zone/ts/lib/security-tier.ts @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as cdk from '@aws-cdk/core'; +import * as cdk from 'aws-cdk-lib'; import { X509CertificatePem, } from 'aws-rfdk'; +import { Construct } from 'constructs'; /** * The security tier of the render farm. This stack contains resources used to @@ -24,7 +25,7 @@ export class SecurityTier extends cdk.Stack { * @param id The ID of this construct. * @param props The properties for the security tier. */ - constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) { + constructor(scope: Construct, id: string, props: cdk.StackProps) { super(scope, id, props); this.rootCa = new X509CertificatePem(this, 'RootCA', { diff --git a/examples/deadline/Local-Zone/ts/lib/service-tier.ts b/examples/deadline/Local-Zone/ts/lib/service-tier.ts index 3cd9f15f8..bcdf20638 100644 --- a/examples/deadline/Local-Zone/ts/lib/service-tier.ts +++ b/examples/deadline/Local-Zone/ts/lib/service-tier.ts @@ -7,31 +7,31 @@ import { IVpc, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ApplicationProtocol, -} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IPrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { - Construct, Duration, RemovalPolicy, Stack, StackProps, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; import { SessionManagerHelper, X509CertificatePem, } from 'aws-rfdk'; import { - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, RenderQueue, Repository, ThinkboxDockerImages, VersionQuery, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; /** * Properties for {@link ServiceTier}. @@ -43,9 +43,9 @@ export interface ServiceTierProps extends StackProps { readonly vpc: IVpc; /** - * Whether the AWS Thinkbox End-User License Agreement is accepted or not + * Whether the AWS Customer Agreement and AWS Intellectual Property License are agreed to. */ - readonly acceptAwsThinkboxEula: AwsThinkboxEulaAcceptance; + readonly userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; /** * The availability zones that components in this stack will be deployed into. These should all be in the same @@ -114,7 +114,7 @@ export class ServiceTier extends Stack { const images = new ThinkboxDockerImages(this, 'Images', { version: this.version, - userAwsThinkboxEulaAcceptance: props.acceptAwsThinkboxEula, + userAwsCustomerAgreementAndIpLicenseAcceptance: props.userAwsCustomerAgreementAndIpLicenseAcceptance, }); const serverCert = new X509CertificatePem(this, 'RQCert', { diff --git a/examples/deadline/Local-Zone/ts/package.json b/examples/deadline/Local-Zone/ts/package.json index e46984d34..61a3d12fe 100644 --- a/examples/deadline/Local-Zone/ts/package.json +++ b/examples/deadline/Local-Zone/ts/package.json @@ -1,6 +1,6 @@ { "name": "all-in-farm-local-zone", - "version": "0.42.0", + "version": "1.0.0", "bin": { "app": "bin/app.js" }, @@ -14,16 +14,14 @@ }, "devDependencies": { "@types/node": "^18.0.0", - "aws-cdk": "1.160.0", + "aws-cdk": "2.33.0", "ts-node": "^10.8.1", "typescript": "~4.7.3" }, "dependencies": { - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/core": "1.160.0", - "aws-rfdk": "0.42.0", + "aws-cdk-lib": "^2.33.0", + "aws-rfdk": "1.0.0", + "constructs": "^10.0.0", "source-map-support": "^0.5.21" } } diff --git a/integ/.eslintrc.js b/integ/.eslintrc.js index bb0135b29..a4b3fde67 100644 --- a/integ/.eslintrc.js +++ b/integ/.eslintrc.js @@ -1,2 +1,2 @@ -const baseConfig = require('../tools/cdk-build-tools/config/eslintrc'); +const baseConfig = require('../config/eslintrc'); module.exports = baseConfig; diff --git a/integ/components/_infrastructure/bin/_infrastructure.ts b/integ/components/_infrastructure/bin/_infrastructure.ts index dde187338..3247abb23 100644 --- a/integ/components/_infrastructure/bin/_infrastructure.ts +++ b/integ/components/_infrastructure/bin/_infrastructure.ts @@ -5,7 +5,7 @@ /* eslint-disable no-console */ -import { App } from '@aws-cdk/core'; +import { App } from 'aws-cdk-lib'; import { NetworkTier } from '../lib/network-tier'; // Create a cdk app containing just a Vpc, that will then be used for the tests that follow diff --git a/integ/components/_infrastructure/cdk.json b/integ/components/_infrastructure/cdk.json index 3654e66bc..22fb34fa1 100644 --- a/integ/components/_infrastructure/cdk.json +++ b/integ/components/_infrastructure/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/_infrastructure.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/_infrastructure/lib/network-tier.ts b/integ/components/_infrastructure/lib/network-tier.ts index e58fec08a..45f65aa94 100644 --- a/integ/components/_infrastructure/lib/network-tier.ts +++ b/integ/components/_infrastructure/lib/network-tier.ts @@ -3,16 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { + Stack, + StackProps, +} from 'aws-cdk-lib'; import { SubnetConfiguration, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; -import { - Construct, - Stack, - StackProps, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { Construct } from 'constructs'; export interface NetworkTierSubnetConfiguration { readonly testRunner: SubnetConfiguration; diff --git a/integ/components/deadline/common/functions/awaitSsmCommand.ts b/integ/components/deadline/common/functions/awaitSsmCommand.ts index 1a99e8f0a..d9d0bfe60 100644 --- a/integ/components/deadline/common/functions/awaitSsmCommand.ts +++ b/integ/components/deadline/common/functions/awaitSsmCommand.ts @@ -5,6 +5,11 @@ import {SSM, SendCommandRequest } from '@aws-sdk/client-ssm'; +// Workaround for AWS SDK v3 bug: https://github.com/aws/aws-sdk-js-v3/issues/3807 +declare global { + interface ReadableStream {} +} + const ssm = new SSM({}); interface CommandResponse { diff --git a/integ/components/deadline/deadline_01_repository/bin/deadline_01_repository.ts b/integ/components/deadline/deadline_01_repository/bin/deadline_01_repository.ts index 823bf5a01..2da3cc926 100644 --- a/integ/components/deadline/deadline_01_repository/bin/deadline_01_repository.ts +++ b/integ/components/deadline/deadline_01_repository/bin/deadline_01_repository.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { App, Stack, Aspects } from '@aws-cdk/core'; +import { App, Stack, Aspects } from 'aws-cdk-lib'; import { Stage, ThinkboxDockerRecipes, diff --git a/integ/components/deadline/deadline_01_repository/cdk.json b/integ/components/deadline/deadline_01_repository/cdk.json index f1efd7cbd..6a9421292 100644 --- a/integ/components/deadline/deadline_01_repository/cdk.json +++ b/integ/components/deadline/deadline_01_repository/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/deadline_01_repository.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/deadline/deadline_01_repository/lib/repository-testing-tier.ts b/integ/components/deadline/deadline_01_repository/lib/repository-testing-tier.ts index ff539ed7d..c2a155949 100644 --- a/integ/components/deadline/deadline_01_repository/lib/repository-testing-tier.ts +++ b/integ/components/deadline/deadline_01_repository/lib/repository-testing-tier.ts @@ -4,10 +4,11 @@ */ import * as path from 'path'; -import { ILogGroup } from '@aws-cdk/aws-logs'; -import { CfnOutput, Construct } from '@aws-cdk/core'; +import { CfnOutput } from 'aws-cdk-lib'; +import { ILogGroup } from 'aws-cdk-lib/aws-logs'; import { MongoDbInstaller, MongoDbSsplLicenseAcceptance, MongoDbVersion } from 'aws-rfdk'; import { Repository } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { StorageStruct } from '../../../../lib/storage-struct'; import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; diff --git a/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts b/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts index f355fe4ac..11cf1f63d 100644 --- a/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts +++ b/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { App, Stack, Aspects } from '@aws-cdk/core'; +import { App, Stack, Aspects } from 'aws-cdk-lib'; import { Stage, ThinkboxDockerRecipes, diff --git a/integ/components/deadline/deadline_02_renderQueue/cdk.json b/integ/components/deadline/deadline_02_renderQueue/cdk.json index 90af678a0..29b735e05 100644 --- a/integ/components/deadline/deadline_02_renderQueue/cdk.json +++ b/integ/components/deadline/deadline_02_renderQueue/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/deadline_02_renderQueue.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/deadline/deadline_02_renderQueue/lib/renderQueue-testing-tier.ts b/integ/components/deadline/deadline_02_renderQueue/lib/renderQueue-testing-tier.ts index a7e63ef76..70b5b13c2 100644 --- a/integ/components/deadline/deadline_02_renderQueue/lib/renderQueue-testing-tier.ts +++ b/integ/components/deadline/deadline_02_renderQueue/lib/renderQueue-testing-tier.ts @@ -4,7 +4,7 @@ */ import * as path from 'path'; -import { Construct } from '@aws-cdk/core'; +import { Construct } from 'constructs'; import { RenderStruct } from '../../../../lib/render-struct'; import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; diff --git a/integ/components/deadline/deadline_03_workerFleetHttp/bin/deadline_03_workerFleetHttp.ts b/integ/components/deadline/deadline_03_workerFleetHttp/bin/deadline_03_workerFleetHttp.ts index d48d51975..2090e355b 100644 --- a/integ/components/deadline/deadline_03_workerFleetHttp/bin/deadline_03_workerFleetHttp.ts +++ b/integ/components/deadline/deadline_03_workerFleetHttp/bin/deadline_03_workerFleetHttp.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { App, Stack, Aspects } from '@aws-cdk/core'; +import { App, Stack, Aspects } from 'aws-cdk-lib'; import { Stage, ThinkboxDockerRecipes, diff --git a/integ/components/deadline/deadline_03_workerFleetHttp/cdk.json b/integ/components/deadline/deadline_03_workerFleetHttp/cdk.json index 3d187c870..3a24211a6 100644 --- a/integ/components/deadline/deadline_03_workerFleetHttp/cdk.json +++ b/integ/components/deadline/deadline_03_workerFleetHttp/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/deadline_03_workerFleetHttp.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/deadline/deadline_03_workerFleetHttp/lib/workerFleetHttp-testing-tier.ts b/integ/components/deadline/deadline_03_workerFleetHttp/lib/workerFleetHttp-testing-tier.ts index fb858a1d7..672e7e8ee 100644 --- a/integ/components/deadline/deadline_03_workerFleetHttp/lib/workerFleetHttp-testing-tier.ts +++ b/integ/components/deadline/deadline_03_workerFleetHttp/lib/workerFleetHttp-testing-tier.ts @@ -4,9 +4,9 @@ */ import * as path from 'path'; -import { Port } from '@aws-cdk/aws-ec2'; -import { Construct } from '@aws-cdk/core'; +import { Port } from 'aws-cdk-lib/aws-ec2'; import { IWorkerFleet } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; import { WorkerStruct } from '../../../../lib/worker-struct'; diff --git a/integ/components/deadline/deadline_04_workerFleetHttps/bin/deadline_04_workerFleetHttps.ts b/integ/components/deadline/deadline_04_workerFleetHttps/bin/deadline_04_workerFleetHttps.ts index c2888dba3..3642b96bd 100644 --- a/integ/components/deadline/deadline_04_workerFleetHttps/bin/deadline_04_workerFleetHttps.ts +++ b/integ/components/deadline/deadline_04_workerFleetHttps/bin/deadline_04_workerFleetHttps.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { App, Stack, Aspects } from '@aws-cdk/core'; +import { App, Stack, Aspects } from 'aws-cdk-lib'; import { Stage, ThinkboxDockerRecipes, diff --git a/integ/components/deadline/deadline_04_workerFleetHttps/cdk.json b/integ/components/deadline/deadline_04_workerFleetHttps/cdk.json index a121ce687..db8ddb2bf 100644 --- a/integ/components/deadline/deadline_04_workerFleetHttps/cdk.json +++ b/integ/components/deadline/deadline_04_workerFleetHttps/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/deadline_04_workerFleetHttps.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/deadline/deadline_04_workerFleetHttps/lib/workerFleetHttps-testing-tier.ts b/integ/components/deadline/deadline_04_workerFleetHttps/lib/workerFleetHttps-testing-tier.ts index b80d67b32..15e37aced 100644 --- a/integ/components/deadline/deadline_04_workerFleetHttps/lib/workerFleetHttps-testing-tier.ts +++ b/integ/components/deadline/deadline_04_workerFleetHttps/lib/workerFleetHttps-testing-tier.ts @@ -4,9 +4,9 @@ */ import * as path from 'path'; -import { Port } from '@aws-cdk/aws-ec2'; -import { Construct } from '@aws-cdk/core'; +import { Port } from 'aws-cdk-lib/aws-ec2'; import { IWorkerFleet } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; import { WorkerStruct } from '../../../../lib/worker-struct'; diff --git a/integ/components/deadline/deadline_05_secretsManagement/bin/deadline_05_secretsManagement.ts b/integ/components/deadline/deadline_05_secretsManagement/bin/deadline_05_secretsManagement.ts index 08ffa8898..6b44de71b 100644 --- a/integ/components/deadline/deadline_05_secretsManagement/bin/deadline_05_secretsManagement.ts +++ b/integ/components/deadline/deadline_05_secretsManagement/bin/deadline_05_secretsManagement.ts @@ -5,8 +5,8 @@ import * as fs from 'fs'; import * as path from 'path'; -import { App, Stack, Aspects } from '@aws-cdk/core'; import { SecretsManager, ResourceNotFoundException } from '@aws-sdk/client-secrets-manager'; +import { App, Stack, Aspects } from 'aws-cdk-lib'; import { Stage, ThinkboxDockerRecipes, diff --git a/integ/components/deadline/deadline_05_secretsManagement/cdk.json b/integ/components/deadline/deadline_05_secretsManagement/cdk.json index e209b4377..2ce57444a 100644 --- a/integ/components/deadline/deadline_05_secretsManagement/cdk.json +++ b/integ/components/deadline/deadline_05_secretsManagement/cdk.json @@ -1,18 +1,5 @@ { "app": "npx ts-node bin/deadline_05_secretsManagement.ts", "context": { - "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, - "@aws-cdk/core:enableStackNameDuplicates": true, - "aws-cdk:enableDiffNoFail": true, - "@aws-cdk/core:stackRelativeExports": true, - "@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true, - "@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true, - "@aws-cdk/aws-kms:defaultKeyPolicies": true, - "@aws-cdk/aws-s3:grantWriteWithoutAcl": true, - "@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true, - "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, - "@aws-cdk/aws-efs:defaultEncryptionAtRest": true, - "@aws-cdk/aws-lambda:recognizeVersionProps": true, - "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true } } diff --git a/integ/components/deadline/deadline_05_secretsManagement/lib/secretsManagement-testing-tier.ts b/integ/components/deadline/deadline_05_secretsManagement/lib/secretsManagement-testing-tier.ts index 8d009d647..0ade06e70 100644 --- a/integ/components/deadline/deadline_05_secretsManagement/lib/secretsManagement-testing-tier.ts +++ b/integ/components/deadline/deadline_05_secretsManagement/lib/secretsManagement-testing-tier.ts @@ -4,11 +4,12 @@ */ import * as path from 'path'; +import { CfnOutput } from 'aws-cdk-lib'; import { IVpc, -} from '@aws-cdk/aws-ec2'; -import { CfnOutput, Construct } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { Repository } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { RenderStruct } from '../../../../lib/render-struct'; import { StorageStruct } from '../../../../lib/storage-struct'; import { diff --git a/integ/components/deadline/deadline_05_secretsManagement/test/deadline_05_secretsManagement.test.ts b/integ/components/deadline/deadline_05_secretsManagement/test/deadline_05_secretsManagement.test.ts index f3b18a53b..7c96b6dbf 100644 --- a/integ/components/deadline/deadline_05_secretsManagement/test/deadline_05_secretsManagement.test.ts +++ b/integ/components/deadline/deadline_05_secretsManagement/test/deadline_05_secretsManagement.test.ts @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { CloudFormation } from '@aws-sdk/client-cloudformation'; +import { SecretsManager } from '@aws-sdk/client-secrets-manager'; import { CidrBlock, NetworkUtils, -} from '@aws-cdk/aws-ec2/lib/network-util'; -import { CloudFormation } from '@aws-sdk/client-cloudformation'; -import { SecretsManager } from '@aws-sdk/client-secrets-manager'; +} from 'aws-cdk-lib/aws-ec2/lib/network-util'; import { ssmCommand } from '../../common/functions/awaitSsmCommand'; // Name of testing stack is derived from env variable to ensure uniqueness diff --git a/integ/lib/render-struct.ts b/integ/lib/render-struct.ts index 0e0859457..5f334f33d 100644 --- a/integ/lib/render-struct.ts +++ b/integ/lib/render-struct.ts @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Vpc } from '@aws-cdk/aws-ec2'; -import { ApplicationProtocol } from '@aws-cdk/aws-elasticloadbalancingv2'; -import { PrivateHostedZone } from '@aws-cdk/aws-route53'; -import { Secret } from '@aws-cdk/aws-secretsmanager'; -import { Construct, Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { Vpc } from 'aws-cdk-lib/aws-ec2'; +import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { PrivateHostedZone } from 'aws-cdk-lib/aws-route53'; +import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; import { X509CertificatePem } from 'aws-rfdk'; import { IRepository, @@ -18,6 +19,7 @@ import { UsageBasedLicense, UsageBasedLicensing, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { NetworkTier } from '../components/_infrastructure/lib/network-tier'; import { ThinkboxDockerImageOverrides } from './thinkbox-docker-image-overrides'; @@ -106,7 +108,8 @@ export class RenderStruct extends Construct { repository: props.repository, images: dockerImageOverrides?.renderQueueImages ?? props.recipes.renderQueueImages, logGroupProps: { - logGroupPrefix: Stack.of(this).stackName + '-' + id, + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, }, hostname, version: props.recipes.version, @@ -125,6 +128,10 @@ export class RenderStruct extends Construct { images: dockerImageOverrides?.ublImages ?? props.recipes.ublImages, licenses: props.ubl.licenses, certificateSecret: ublCertificates, + logGroupProps: { + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, + }, }); } } diff --git a/integ/lib/sep-worker-struct.ts b/integ/lib/sep-worker-struct.ts index 96aab3502..04a84b110 100644 --- a/integ/lib/sep-worker-struct.ts +++ b/integ/lib/sep-worker-struct.ts @@ -3,19 +3,22 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { + Stack, +} from 'aws-cdk-lib'; import { InstanceType, MachineImage, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { - Construct, - Stack, -} from '@aws-cdk/core'; + RetentionDays, +} from 'aws-cdk-lib/aws-logs'; import { ConfigureSpotEventPlugin, SpotEventPluginFleet, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { NetworkTier } from '../components/_infrastructure/lib/network-tier'; import { RenderStruct } from './render-struct'; @@ -52,6 +55,10 @@ export class SepWorkerStruct extends Construct { workerMachineImage: MachineImage.genericLinux({ [Stack.of(this).region]: linuxAmi }), deadlineGroups: ['sep_group'], instanceTypes: [new InstanceType('t2.micro')], + logGroupProps: { + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, + }, }), ]; diff --git a/integ/lib/ssm-policy-aspect.ts b/integ/lib/ssm-policy-aspect.ts index 1c52a00a7..5684ded6a 100644 --- a/integ/lib/ssm-policy-aspect.ts +++ b/integ/lib/ssm-policy-aspect.ts @@ -3,14 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { AutoScalingGroup } from '@aws-cdk/aws-autoscaling'; -import { Instance } from '@aws-cdk/aws-ec2'; -import { ManagedPolicy } from '@aws-cdk/aws-iam'; -import * as cdk from '@aws-cdk/core'; +import * as cdk from 'aws-cdk-lib'; +import { AutoScalingGroup } from 'aws-cdk-lib/aws-autoscaling'; +import { Instance } from 'aws-cdk-lib/aws-ec2'; +import { ManagedPolicy } from 'aws-cdk-lib/aws-iam'; +import { IConstruct } from 'constructs'; export class SSMInstancePolicyAspect implements cdk.IAspect { private static readonly SSM_POLICY = ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'); - public visit(node: cdk.IConstruct): void { + public visit(node: IConstruct): void { if (node instanceof Instance || node instanceof AutoScalingGroup) { node.role.addManagedPolicy(SSMInstancePolicyAspect.SSM_POLICY); } diff --git a/integ/lib/storage-struct.ts b/integ/lib/storage-struct.ts index da41bb3d3..f0188dd04 100644 --- a/integ/lib/storage-struct.ts +++ b/integ/lib/storage-struct.ts @@ -3,26 +3,29 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { DatabaseCluster } from '@aws-cdk/aws-docdb'; +import { + Duration, + RemovalPolicy, + Stack, +} from 'aws-cdk-lib'; +import { DatabaseCluster } from 'aws-cdk-lib/aws-docdb'; import { InstanceClass, InstanceSize, InstanceType, Vpc, SubnetType, -} from '@aws-cdk/aws-ec2'; + Volume, +} from 'aws-cdk-lib/aws-ec2'; import { AccessPoint, FileSystem, -} from '@aws-cdk/aws-efs'; -import { PrivateHostedZone } from '@aws-cdk/aws-route53'; -import { ISecret } from '@aws-cdk/aws-secretsmanager'; +} from 'aws-cdk-lib/aws-efs'; import { - Construct, - Duration, - RemovalPolicy, - Stack, -} from '@aws-cdk/core'; + RetentionDays, +} from 'aws-cdk-lib/aws-logs'; +import { PrivateHostedZone } from 'aws-cdk-lib/aws-route53'; +import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; import { MongoDbInstance, MongoDbPostInstallSetup, @@ -37,6 +40,7 @@ import { IVersion, Repository, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; // Interface for supplying database connection and accompanying secret for credentials @@ -172,6 +176,10 @@ export class StorageStruct extends Construct { // Create the mongoDB instance database = new MongoDbInstance(this, 'MongoDB', { + logGroupProps: { + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, + }, mongoDb: { userSsplAcceptance, version: MongoDbVersion.COMMUNITY_3_6, @@ -185,6 +193,9 @@ export class StorageStruct extends Construct { vpc, }); databaseSecret = database.adminUser!; + // Ensure that the EBS Volume created by the MongoDB construct is deleted. + const dbDataEBS = database.node.findChild('MongoDbData') as Volume; + dbDataEBS.applyRemovalPolicy(RemovalPolicy.DESTROY); new MongoDbPostInstallSetup(this, 'MongoDbPostInstall', { vpc, @@ -220,7 +231,8 @@ export class StorageStruct extends Construct { version: props.version, repositoryInstallationTimeout: Duration.minutes(20), logGroupProps: { - logGroupPrefix: Stack.of(this).stackName + '-' + id, + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, }, removalPolicy: { database: RemovalPolicy.DESTROY, diff --git a/integ/lib/testing-tier.ts b/integ/lib/testing-tier.ts index 9f2925740..ef287e41d 100644 --- a/integ/lib/testing-tier.ts +++ b/integ/lib/testing-tier.ts @@ -4,19 +4,20 @@ */ import * as path from 'path'; +import { CfnOutput, Duration, Stack, StackProps } from 'aws-cdk-lib'; import { BastionHostLinux, InstanceType, Port, Vpc, -} from '@aws-cdk/aws-ec2'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { CfnOutput, Construct, Duration, Stack, StackProps } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; import { SessionManagerHelper, X509CertificatePem, } from 'aws-rfdk'; import { RenderQueue } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { NetworkTier } from '../components/_infrastructure/lib/network-tier'; import { IRenderFarmDb } from './storage-struct'; diff --git a/integ/lib/thinkbox-docker-image-overrides.ts b/integ/lib/thinkbox-docker-image-overrides.ts index 2fa68b05e..6e63637fb 100644 --- a/integ/lib/thinkbox-docker-image-overrides.ts +++ b/integ/lib/thinkbox-docker-image-overrides.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Repository } from '@aws-cdk/aws-ecr'; -import { ContainerImage } from '@aws-cdk/aws-ecs'; -import { Construct } from '@aws-cdk/core'; +import { Repository } from 'aws-cdk-lib/aws-ecr'; +import { ContainerImage } from 'aws-cdk-lib/aws-ecs'; import { RenderQueueImages, ThinkboxManagedDeadlineDockerRecipes as Recipes, UsageBasedLicensingImages, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; type DeadlineDockerImageOverrides = {[key in Recipes]?: string}; diff --git a/integ/lib/worker-struct.ts b/integ/lib/worker-struct.ts index 508f7708e..1d898a598 100644 --- a/integ/lib/worker-struct.ts +++ b/integ/lib/worker-struct.ts @@ -3,13 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { IMachineImage, MachineImage, Port, Vpc } from '@aws-cdk/aws-ec2'; -import { Construct, Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { IMachineImage, MachineImage, Port, Vpc } from 'aws-cdk-lib/aws-ec2'; +import { + RetentionDays, +} from 'aws-cdk-lib/aws-logs'; import { X509CertificatePem } from 'aws-rfdk'; import { RenderQueue, WorkerInstanceFleet, } from 'aws-rfdk/deadline'; +import { Construct } from 'constructs'; import { NetworkTier } from '../components/_infrastructure/lib/network-tier'; import { RenderStruct } from './render-struct'; @@ -58,7 +62,8 @@ export class WorkerStruct extends Construct { renderQueue: this.renderQueue, workerMachineImage, logGroupProps: { - logGroupPrefix: Stack.of(this).stackName + '-' + id, + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, }, groups: ['testgroup'], }), @@ -68,7 +73,8 @@ export class WorkerStruct extends Construct { renderQueue: this.renderQueue, workerMachineImage, logGroupProps: { - logGroupPrefix: Stack.of(this).stackName + '-' + id, + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, }, pools: ['testpool'], }), @@ -78,7 +84,8 @@ export class WorkerStruct extends Construct { renderQueue: this.renderQueue, workerMachineImage, logGroupProps: { - logGroupPrefix: Stack.of(this).stackName + '-' + id, + logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`, + retention: RetentionDays.TWO_MONTHS, }, region: 'testregion', }), diff --git a/integ/package.json b/integ/package.json index e56032f6a..c7001ac70 100644 --- a/integ/package.json +++ b/integ/package.json @@ -1,6 +1,6 @@ { "name": "integ", - "version": "0.42.0", + "version": "1.0.0", "private": false, "description": "Integration tests for RFDK constructs", "bin": { @@ -25,16 +25,11 @@ }, "pkglint": { "exclude": [ - "dependencies/cdk-point-dependencies", "dependencies/node-version", - "ignore/strong-name-key", "package-info/homepage", - "package-info/scripts/build", - "package-info/scripts/watch", - "dependencies/build-tools", + "package-info/jest.config", + "package-info/README.md", "package-info/scripts/package", - "package-info/scripts/compat", - "package-info/stability", "jsii/dotnet/icon-url", "jsii/dotnet/strong-name", "fast-failing-build-scripts" @@ -52,63 +47,42 @@ "clean": "./scripts/bash/cleanup.sh", "deploy-all": "./scripts/bash/deploy-all.sh", "tear-down": "./scripts/bash/tear-down.sh", - "pkglint": "pkglint -f" + "pkglint": "pkglint", + "pkglintfix": "pkglint -f", + "lint": "eslint . --ext=.ts", + "lintfix": "eslint . --ext=.ts --fix" }, "devDependencies": { - "@aws-cdk/assert": "1.160.0", "@types/jest": "^27.5.2", "@types/node": "^18.0.0", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "aws-cdk": "1.160.0", - "eslint": "^7.32.0", + "@typescript-eslint/eslint-plugin": "^5.33.1", + "@typescript-eslint/parser": "^5.31.0", + "aws-cdk": "2.33.0", + "eslint": "^8.22.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", + "eslint-import-resolver-typescript": "^3.4.2", "eslint-plugin-deprecation": "^1.3.2", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-license-header": "^0.4.0", + "eslint-plugin-jest": "^26.8.3", + "eslint-plugin-license-header": "^0.6.0", "jest": "^27.5.1", - "pkglint": "0.42.0", - "ts-jest": "^27.1.5", - "typescript": "~4.7.3" + "pkglint": "1.0.0", + "ts-jest": "^28.0.8", + "typescript": "~4.7.4" }, "dependencies": { - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/core": "1.160.0", - "@aws-sdk/client-cloudformation": "^3.110.0", - "@aws-sdk/client-cloudwatch-logs": "^3.110.0", - "@aws-sdk/client-secrets-manager": "^3.110.0", - "@aws-sdk/client-ssm": "^3.110.0", - "aws-rfdk": "0.42.0" + "@aws-sdk/client-cloudformation": "^3.137.0", + "@aws-sdk/client-cloudwatch-logs": "^3.137.0", + "@aws-sdk/client-secrets-manager": "^3.137.0", + "@aws-sdk/client-ssm": "^3.137.0", + "aws-cdk-lib": "2.33.0", + "aws-rfdk": "1.0.0", + "constructs": "^10.0.0" }, "peerDependencies": { - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/core": "1.160.0", - "aws-rfdk": "0.42.0" + "aws-cdk-lib": "2.33.0", + "aws-rfdk": "1.0.0", + "constructs": "^10.0.0" }, "engines": { "node": ">= 14.15.0" diff --git a/lambda-layers/package.json b/lambda-layers/package.json index dd83771c1..7a66fee75 100644 --- a/lambda-layers/package.json +++ b/lambda-layers/package.json @@ -1,6 +1,6 @@ { "name": "lambda-layers", - "version": "0.42.0", + "version": "1.0.0", "private": false, "description": "Package containing scripts for building and publishing Lambda Layers", "main": "lib/index.js", @@ -30,9 +30,9 @@ "maturity": "stable", "devDependencies": { "@types/node": "^18.0.0", - "typescript": "~4.7.3" + "typescript": "~4.7.4" }, "dependencies": { - "aws-sdk": "^2.1155.0" + "aws-sdk": "^2.1184.0" } } diff --git a/lambda-layers/yarn.lock b/lambda-layers/yarn.lock index 01655c573..30c767721 100644 --- a/lambda-layers/yarn.lock +++ b/lambda-layers/yarn.lock @@ -7,10 +7,15 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== -aws-sdk@^2.1155.0: - version "2.1157.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1157.0.tgz#d00b5ea932439de38e19435b48a6a2b38aa7c805" - integrity sha512-30t+zhCECib8uaggd0Du8ifab4vtJjgVvNKxHWTpiLa3deTnM+0K7x3pwM99zxw0gLDxAUet/oURaoPJHwk/5Q== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sdk@^2.1184.0: + version "2.1203.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1203.0.tgz#03289662a1d05084b7f8db602136cbac963ff061" + integrity sha512-6HeVddh4HfsH6uXkadergui6cQW5BN2gxVFoxhGytD6lv15xrYgWALQ3iOfcmPg0OLafgnC5RAdFmyPnb7McVw== dependencies: buffer "4.9.2" events "1.1.1" @@ -19,6 +24,7 @@ aws-sdk@^2.1155.0: querystring "0.2.0" sax "1.2.1" url "0.10.3" + util "^0.12.4" uuid "8.0.0" xml2js "0.4.19" @@ -36,16 +42,260 @@ buffer@4.9.2: ieee754 "^1.1.4" isarray "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + events@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + ieee754@1.1.13, ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + isarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -56,6 +306,26 @@ jmespath@0.16.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -66,6 +336,20 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + sax@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" @@ -76,11 +360,48 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -typescript@~4.7.3: +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +typescript@~4.7.4: version "4.7.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + url@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" @@ -89,11 +410,46 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" +util@^0.12.4: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + uuid@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + xml2js@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" diff --git a/lerna.json b/lerna.json index 72ab2c57c..5c11b043c 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "npmClient": "yarn", "useWorkspaces": true, "rejectCycles": "true", - "version": "0.42.0" + "version": "1.0.0" } diff --git a/package.json b/package.json index 4fa25da48..2152dbd6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws-rfdk-project", - "version": "0.42.0", + "version": "1.0.0", "license": "Apache-2.0", "author": { "name": "Amazon Web Services", @@ -26,92 +26,22 @@ } }, "devDependencies": { - "@aws-cdk/assets": "1.160.0", - "@aws-cdk/aws-acmpca": "1.160.0", - "@aws-cdk/aws-apigateway": "1.160.0", - "@aws-cdk/aws-apigatewayv2": "1.160.0", - "@aws-cdk/aws-apigatewayv2-integrations": "1.160.0", - "@aws-cdk/aws-applicationautoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling-common": "1.160.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.160.0", - "@aws-cdk/aws-batch": "1.160.0", - "@aws-cdk/aws-certificatemanager": "1.160.0", - "@aws-cdk/aws-cloudformation": "1.160.0", - "@aws-cdk/aws-cloudfront": "1.160.0", - "@aws-cdk/aws-cloudwatch": "1.160.0", - "@aws-cdk/aws-cloudwatch-actions": "1.160.0", - "@aws-cdk/aws-codebuild": "1.160.0", - "@aws-cdk/aws-codecommit": "1.160.0", - "@aws-cdk/aws-codeguruprofiler": "1.160.0", - "@aws-cdk/aws-codepipeline": "1.160.0", - "@aws-cdk/aws-codestarnotifications": "1.160.0", - "@aws-cdk/aws-cognito": "1.160.0", - "@aws-cdk/aws-databrew": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-dynamodb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecr-assets": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-ecs-patterns": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-eks": "1.160.0", - "@aws-cdk/aws-elasticloadbalancing": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-events": "1.160.0", - "@aws-cdk/aws-events-targets": "1.160.0", - "@aws-cdk/aws-fsx": "1.160.0", - "@aws-cdk/aws-globalaccelerator": "1.160.0", - "@aws-cdk/aws-glue": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-kinesis": "1.160.0", - "@aws-cdk/aws-kinesisfirehose": "1.160.0", - "@aws-cdk/aws-kms": "1.160.0", - "@aws-cdk/aws-lambda": "1.160.0", - "@aws-cdk/aws-lambda-nodejs": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-route53-targets": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-sam": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/aws-servicediscovery": "1.160.0", - "@aws-cdk/aws-signer": "1.160.0", - "@aws-cdk/aws-sns": "1.160.0", - "@aws-cdk/aws-sns-subscriptions": "1.160.0", - "@aws-cdk/aws-sqs": "1.160.0", - "@aws-cdk/aws-ssm": "1.160.0", - "@aws-cdk/aws-stepfunctions": "1.160.0", - "@aws-cdk/aws-stepfunctions-tasks": "1.160.0", - "@aws-cdk/cloud-assembly-schema": "1.160.0", - "@aws-cdk/core": "1.160.0", - "@aws-cdk/custom-resources": "1.160.0", - "@aws-cdk/cx-api": "1.160.0", - "@aws-cdk/lambda-layer-awscli": "1.160.0", - "@aws-cdk/lambda-layer-kubectl": "1.160.0", - "@aws-cdk/lambda-layer-node-proxy-agent": "1.160.0", - "@aws-cdk/region-info": "1.160.0", + "@aws-sdk/client-ssm": "^3.137.0", + "@aws-sdk/client-cloudformation": "^3.137.0", + "@aws-sdk/client-cloudwatch-logs": "^3.137.0", + "@aws-sdk/client-secrets-manager": "^3.137.0", "@types/jest": "^27.5.2", - "@types/node": "^18.0.0", - "aws-cdk": "1.160.0", - "aws-sdk": "^2.1155.0", - "@aws-sdk/client-ssm": "^3.110.0", - "@aws-sdk/client-cloudformation": "^3.110.0", - "@aws-sdk/client-cloudwatch-logs": "^3.110.0", - "@aws-sdk/client-secrets-manager": "^3.110.0", - "constructs": "^3.3.69", - "fs-extra": "^9.1.0", + "@types/node": "^18.6.2", + "aws-cdk-lib": "2.33.0", + "aws-sdk": "^2.1184.0", + "constructs": "^10.0.0", + "fs-extra": "^10.1.0", "jest": "^27.5.1", - "jest-junit": "^13.2.0", - "jsii-diff": "^1.60.0", - "jsii-pacmak": "^1.60.0", - "lerna": "^5.1.4", - "nyc": "^15.1.0", + "jest-junit": "^14.0.0", + "lerna": "^5.4.3", "standard-version": "^9.5.0", - "ts-jest": "^27.1.5", - "typescript": "~4.7.3" + "ts-jest": "^28.0.8", + "typescript": "~4.7.4" }, "workspaces": { "packages": [ diff --git a/packages/aws-rfdk/.eslintrc.js b/packages/aws-rfdk/.eslintrc.js index 0947e9d86..433b1e5a8 100644 --- a/packages/aws-rfdk/.eslintrc.js +++ b/packages/aws-rfdk/.eslintrc.js @@ -1,2 +1,2 @@ -const baseConfig = require('../../tools/cdk-build-tools/config/eslintrc'); +const baseConfig = require('../../config/eslintrc'); module.exports = baseConfig; diff --git a/packages/aws-rfdk/docs/diagrams/README.md b/packages/aws-rfdk/docs/diagrams/README.md index a79dbca52..54c33d7b8 100644 --- a/packages/aws-rfdk/docs/diagrams/README.md +++ b/packages/aws-rfdk/docs/diagrams/README.md @@ -40,7 +40,7 @@ only process image URLs that begin with `/diagrams`. Putting this together, the in the `core` package would look: ```ts -import { Construct } from '@aws-cdk/core'; +import { Construct } from 'aws-cdk-lib'; /** * Documentation for MyConstruct diff --git a/packages/aws-rfdk/docs/upgrade/upgrading-0.27.md b/packages/aws-rfdk/docs/upgrade/upgrading-0.27.md index 93accceac..ab6891864 100644 --- a/packages/aws-rfdk/docs/upgrade/upgrading-0.27.md +++ b/packages/aws-rfdk/docs/upgrade/upgrading-0.27.md @@ -114,7 +114,7 @@ the root of the EFS file-system. Sample code: **TypeScript:** ```ts -import { AccessPoint, FileSystem } from '@aws-cdk/aws-efs'; +import { AccessPoint, FileSystem } from 'aws-cdk-lib/aws-efs'; const fileSystem = new FileSystem(scope, 'FileSystem', { // ... @@ -169,7 +169,7 @@ EFS file-system, you could do the following: **TypeScript:** ```ts -import { AccessPoint, FileSystem } from '@aws-cdk/aws-efs'; +import { AccessPoint, FileSystem } from 'aws-cdk-lib/aws-efs'; import { MountableEfs } from 'aws-rfdk'; import { Repository } from 'aws-rfdk/deadline'; diff --git a/packages/aws-rfdk/docs/upgrade/upgrading-0.38.md b/packages/aws-rfdk/docs/upgrade/upgrading-0.38.md index 57c302f67..0a6f12ddc 100644 --- a/packages/aws-rfdk/docs/upgrade/upgrading-0.38.md +++ b/packages/aws-rfdk/docs/upgrade/upgrading-0.38.md @@ -38,7 +38,7 @@ The below example code snippets demonstrate what each case above may look like:
Typescript (click to expand) ```ts -import { ApplicationProtocol } from '@aws-cdk/aws-elasticloadbalancingv2'; +import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { RenderQueue } from 'aws-rfdk/deadline'; new RenderQueue(this, 'RenderQueue', { diff --git a/packages/aws-rfdk/jest.config.js b/packages/aws-rfdk/jest.config.js index e0ae34902..bdc46125e 100644 --- a/packages/aws-rfdk/jest.config.js +++ b/packages/aws-rfdk/jest.config.js @@ -1,2 +1,2 @@ -const baseConfig = require('../../tools/cdk-build-tools/config/jest.config'); +const baseConfig = require('../../config/jest.config'); module.exports = baseConfig; diff --git a/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts b/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts index aa7c69ef9..b41d5fb2a 100644 --- a/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts +++ b/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts @@ -5,10 +5,11 @@ import * as path from 'path'; -import { IGrantable } from '@aws-cdk/aws-iam'; -import { Bucket } from '@aws-cdk/aws-s3'; -import { StringParameter } from '@aws-cdk/aws-ssm'; -import { Construct, Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { IGrantable } from 'aws-cdk-lib/aws-iam'; +import { Bucket } from 'aws-cdk-lib/aws-s3'; +import { StringParameter } from 'aws-cdk-lib/aws-ssm'; +import { Construct } from 'constructs'; import { IScriptHost, ScriptAsset } from './script-assets'; diff --git a/packages/aws-rfdk/lib/core/lib/cloudwatch-config-builder.ts b/packages/aws-rfdk/lib/core/lib/cloudwatch-config-builder.ts index 5f84c2b83..fbb18ca01 100644 --- a/packages/aws-rfdk/lib/core/lib/cloudwatch-config-builder.ts +++ b/packages/aws-rfdk/lib/core/lib/cloudwatch-config-builder.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {Duration} from '@aws-cdk/core'; +import {Duration} from 'aws-cdk-lib'; /** * Enum to describe the time zone property diff --git a/packages/aws-rfdk/lib/core/lib/deployment-instance.ts b/packages/aws-rfdk/lib/core/lib/deployment-instance.ts index 8dec37fdd..1ae8f4fac 100644 --- a/packages/aws-rfdk/lib/core/lib/deployment-instance.ts +++ b/packages/aws-rfdk/lib/core/lib/deployment-instance.ts @@ -3,11 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { + Duration, + Names, + Stack, + Tags, +} from 'aws-cdk-lib'; import { AutoScalingGroup, Signals, UpdatePolicy, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { AmazonLinuxGeneration, Connections, @@ -21,17 +27,11 @@ import { MachineImage, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { PolicyStatement, -} from '@aws-cdk/aws-iam'; -import { - Construct, - Duration, - Names, - Stack, - Tags, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; +import { Construct } from 'constructs'; import { CloudWatchConfigBuilder, diff --git a/packages/aws-rfdk/lib/core/lib/endpoint.ts b/packages/aws-rfdk/lib/core/lib/endpoint.ts index 708836f69..c23255c65 100644 --- a/packages/aws-rfdk/lib/core/lib/endpoint.ts +++ b/packages/aws-rfdk/lib/core/lib/endpoint.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { Token } from 'aws-cdk-lib'; import { Connections, IConnectable, Port, Protocol, -} from '@aws-cdk/aws-ec2'; -import { ApplicationProtocol } from '@aws-cdk/aws-elasticloadbalancingv2'; -import { Token } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; /** * Properties for constructing an {@link Endpoint} diff --git a/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts b/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts index 009e1f6d7..e3e3e1c24 100644 --- a/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts +++ b/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts @@ -4,26 +4,27 @@ */ import * as path from 'path'; -import { Alarm } from '@aws-cdk/aws-cloudwatch'; +import { Duration } from 'aws-cdk-lib'; +import { Alarm } from 'aws-cdk-lib/aws-cloudwatch'; import { Rule, RuleTargetInput, Schedule, -} from '@aws-cdk/aws-events'; -import { LambdaFunction } from '@aws-cdk/aws-events-targets'; -import { Effect, PolicyStatement } from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-events'; +import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets'; +import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam'; import { Code, Runtime, SingletonFunction, -} from '@aws-cdk/aws-lambda'; +} from 'aws-cdk-lib/aws-lambda'; import { ILogGroup, LogGroup, LogRetention, RetentionDays, -} from '@aws-cdk/aws-logs'; -import { Construct, Duration } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; /** * Properties for setting up an {@link ExportingLogGroup}. diff --git a/packages/aws-rfdk/lib/core/lib/health-monitor.ts b/packages/aws-rfdk/lib/core/lib/health-monitor.ts index 28be0dddb..1a7bb8530 100644 --- a/packages/aws-rfdk/lib/core/lib/health-monitor.ts +++ b/packages/aws-rfdk/lib/core/lib/health-monitor.ts @@ -4,38 +4,37 @@ */ import * as path from 'path'; +import { + Duration, + Names, + RemovalPolicy, +} from 'aws-cdk-lib'; import { ComparisonOperator, IAlarmAction, IMetric, MathExpression, TreatMissingData, -} from '@aws-cdk/aws-cloudwatch'; -import {SnsAction} from '@aws-cdk/aws-cloudwatch-actions'; +} from 'aws-cdk-lib/aws-cloudwatch'; +import {SnsAction} from 'aws-cdk-lib/aws-cloudwatch-actions'; import { IConnectable, ISecurityGroup, IVpc, Port, SubnetSelection, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ApplicationLoadBalancer, ApplicationTargetGroup, IApplicationLoadBalancerTarget, -} from '@aws-cdk/aws-elasticloadbalancingv2'; -import {IPolicy, IRole, Policy, ServicePrincipal} from '@aws-cdk/aws-iam'; -import {IKey, Key} from '@aws-cdk/aws-kms'; -import {Code, Runtime, SingletonFunction} from '@aws-cdk/aws-lambda'; -import {ITopic, Topic} from '@aws-cdk/aws-sns'; -import {LambdaSubscription} from '@aws-cdk/aws-sns-subscriptions'; -import { - Construct, - Duration, - IConstruct, - Names, - RemovalPolicy, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import {IPolicy, IRole, Policy, ServicePrincipal} from 'aws-cdk-lib/aws-iam'; +import {IKey, Key} from 'aws-cdk-lib/aws-kms'; +import {Code, Runtime, SingletonFunction} from 'aws-cdk-lib/aws-lambda'; +import {ITopic, Topic} from 'aws-cdk-lib/aws-sns'; +import {LambdaSubscription} from 'aws-cdk-lib/aws-sns-subscriptions'; +import { Construct, IConstruct } from 'constructs'; import {LoadBalancerFactory} from './load-balancer-manager'; import {tagConstruct} from './runtime-info'; @@ -378,7 +377,6 @@ export class HealthMonitor extends HealthMonitorBase { description: `This key is used to encrypt SNS messages for ${Names.uniqueId(this)}.`, enableKeyRotation: true, removalPolicy: RemovalPolicy.DESTROY, - trustAccountIdentities: true, }); // allow cloudwatch service to send encrypted messages diff --git a/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts b/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts index 1ead92770..e52ef8fe3 100644 --- a/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts +++ b/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts @@ -6,40 +6,40 @@ import * as crypto from 'crypto'; import { join } from 'path'; +import { + CustomResource, + Duration, + Names, + RemovalPolicy, + ResourceEnvironment, + Stack, + Tag, + Token, +} from 'aws-cdk-lib'; import { Certificate, ICertificate, -} from '@aws-cdk/aws-certificatemanager'; +} from 'aws-cdk-lib/aws-certificatemanager'; import { Metric, MetricOptions, -} from '@aws-cdk/aws-cloudwatch'; +} from 'aws-cdk-lib/aws-cloudwatch'; import { AttributeType, BillingMode, Table, TableEncryption, -} from '@aws-cdk/aws-dynamodb'; -import { PolicyStatement } from '@aws-cdk/aws-iam'; -import { IKey } from '@aws-cdk/aws-kms'; +} from 'aws-cdk-lib/aws-dynamodb'; +import { PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { IKey } from 'aws-cdk-lib/aws-kms'; import { Code, LayerVersion, Runtime, SingletonFunction, -} from '@aws-cdk/aws-lambda'; -import { ISecret } from '@aws-cdk/aws-secretsmanager'; -import { - Construct, - CustomResource, - Duration, - Names, - RemovalPolicy, - ResourceEnvironment, - Stack, - Tag, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; +import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct } from 'constructs'; import { ARNS } from '../../lambdas/lambdaLayerVersionArns'; import { IAcmImportCertProps } from '../../lambdas/nodejs/x509-certificate'; diff --git a/packages/aws-rfdk/lib/core/lib/load-balancer-manager.ts b/packages/aws-rfdk/lib/core/lib/load-balancer-manager.ts index 74c3f7242..ae69875ec 100644 --- a/packages/aws-rfdk/lib/core/lib/load-balancer-manager.ts +++ b/packages/aws-rfdk/lib/core/lib/load-balancer-manager.ts @@ -3,15 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {IVpc} from '@aws-cdk/aws-ec2'; +import {IVpc} from 'aws-cdk-lib/aws-ec2'; import { ApplicationListener, ApplicationLoadBalancer, ApplicationProtocol, ApplicationTargetGroup, Protocol, -} from '@aws-cdk/aws-elasticloadbalancingv2'; -import {Construct} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import { Construct } from 'constructs'; import { HealthCheckConfig, HealthMonitor, diff --git a/packages/aws-rfdk/lib/core/lib/log-group-factory.ts b/packages/aws-rfdk/lib/core/lib/log-group-factory.ts index d955d9951..1d0c418ee 100644 --- a/packages/aws-rfdk/lib/core/lib/log-group-factory.ts +++ b/packages/aws-rfdk/lib/core/lib/log-group-factory.ts @@ -8,8 +8,8 @@ import { LogGroup, LogRetention, RetentionDays, -} from '@aws-cdk/aws-logs'; -import { Construct } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; import { ExportingLogGroup } from './exporting-log-group'; /** diff --git a/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts b/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts index 3584a7f08..c9889e906 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts @@ -5,16 +5,16 @@ import * as path from 'path'; +import { + Stack, +} from 'aws-cdk-lib'; import { OperatingSystemType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; -import { - Construct, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; import { IScriptHost, diff --git a/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts b/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts index a8fe986ec..f44f95465 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts @@ -5,9 +5,14 @@ import * as path from 'path'; +import { + Duration, + Names, + Size, +} from 'aws-cdk-lib'; import { BlockDeviceVolume, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { AmazonLinuxGeneration, Connections, @@ -20,34 +25,28 @@ import { SubnetSelection, UserData, Volume, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { IGrantable, IPrincipal, IRole, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { IKey, -} from '@aws-cdk/aws-kms'; +} from 'aws-cdk-lib/aws-kms'; import { ARecord, IPrivateHostedZone, RecordTarget, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; +} from 'aws-cdk-lib/aws-s3-assets'; import { ISecret, Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Construct, - Duration, - IConstruct, - Names, - Size, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct, IConstruct } from 'constructs'; import { BlockVolumeFormat, @@ -607,7 +606,7 @@ export class MongoDbInstance extends Construct implements IMongoDb, IGrantable { instance.userData.addOnExitCommands( // Clean up the temporary RAM filesystem - 'test "${MONGO_SETUP_DIR} != "" && sudo umount "${MONGO_SETUP_DIR}', + 'test "${MONGO_SETUP_DIR}" != "" && sudo umount "${MONGO_SETUP_DIR}"', ); } diff --git a/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts b/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts index bb5284e54..7b09925b8 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts @@ -5,31 +5,31 @@ import * as path from 'path'; +import { + CustomResource, + Duration, + Names, + Stack, +} from 'aws-cdk-lib'; import { IVpc, Port, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Code, Function as LambdaFunction, LayerVersion, Runtime, -} from '@aws-cdk/aws-lambda'; +} from 'aws-cdk-lib/aws-lambda'; import { RetentionDays, -} from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-logs'; import { ISecret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Construct, - CustomResource, - Duration, - Names, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct } from 'constructs'; import { IMongoDb, diff --git a/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts b/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts index 52b5b0970..101fdf1a0 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts @@ -5,22 +5,21 @@ import * as path from 'path'; +import { + Stack, +} from 'aws-cdk-lib'; import { IVolume, OperatingSystemType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Effect, PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; -import { - Construct, - IConstruct, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-s3-assets'; +import { Construct, IConstruct } from 'constructs'; import { MountPermissionsHelper, diff --git a/packages/aws-rfdk/lib/core/lib/mountable-efs.ts b/packages/aws-rfdk/lib/core/lib/mountable-efs.ts index 85c6402dc..e3e573a0e 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-efs.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-efs.ts @@ -5,24 +5,23 @@ import * as path from 'path'; +import { + IResolvable, + Stack, + isResolvableObject, +} from 'aws-cdk-lib'; import { OperatingSystemType, Port, -} from '@aws-cdk/aws-ec2'; -import * as efs from '@aws-cdk/aws-efs'; +} from 'aws-cdk-lib/aws-ec2'; +import * as efs from 'aws-cdk-lib/aws-efs'; import { PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; -import { - Construct, - IConstruct, - IResolvable, - Stack, - isResolvableObject, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-s3-assets'; +import { Construct, IConstruct } from 'constructs'; import { MountPermissionsHelper, diff --git a/packages/aws-rfdk/lib/core/lib/mountable-filesystem.ts b/packages/aws-rfdk/lib/core/lib/mountable-filesystem.ts index b491d2ae0..062cc1c20 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-filesystem.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-filesystem.ts @@ -5,10 +5,8 @@ import { IConnectable, -} from '@aws-cdk/aws-ec2'; -import { - IConstruct, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { IConstruct } from 'constructs'; import { IScriptHost } from './script-assets'; diff --git a/packages/aws-rfdk/lib/core/lib/mountable-fsx-lustre.ts b/packages/aws-rfdk/lib/core/lib/mountable-fsx-lustre.ts index 8dd3d4ef2..e750949f9 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-fsx-lustre.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-fsx-lustre.ts @@ -4,21 +4,20 @@ */ import * as path from 'path'; +import { + Stack, +} from 'aws-cdk-lib'; import { OperatingSystemType, Port, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { LustreFileSystem, -} from '@aws-cdk/aws-fsx'; +} from 'aws-cdk-lib/aws-fsx'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; -import { - Construct, - IConstruct, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-s3-assets'; +import { Construct, IConstruct } from 'constructs'; import { MountPermissionsHelper, } from './mount-permissions-helper'; diff --git a/packages/aws-rfdk/lib/core/lib/pad-efs-storage.ts b/packages/aws-rfdk/lib/core/lib/pad-efs-storage.ts index c125f413f..7b9148c4d 100644 --- a/packages/aws-rfdk/lib/core/lib/pad-efs-storage.ts +++ b/packages/aws-rfdk/lib/core/lib/pad-efs-storage.ts @@ -4,25 +4,32 @@ */ import * as path from 'path'; +import { + Annotations, + Duration, + Size, + SizeRoundingBehavior, + Stack, +} from 'aws-cdk-lib'; import { ISecurityGroup, IVpc, SecurityGroup, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { IAccessPoint, -} from '@aws-cdk/aws-efs'; +} from 'aws-cdk-lib/aws-efs'; import { Code, FileSystem as LambdaFilesystem, Function as LambdaFunction, Runtime, -} from '@aws-cdk/aws-lambda'; +} from 'aws-cdk-lib/aws-lambda'; import { RetentionDays, -} from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-logs'; import { Choice, Condition, @@ -30,24 +37,17 @@ import { InputType, StateMachine, Succeed, -}from '@aws-cdk/aws-stepfunctions'; +}from 'aws-cdk-lib/aws-stepfunctions'; import { LambdaInvoke, -} from '@aws-cdk/aws-stepfunctions-tasks'; -import { - Annotations, - Construct, - Duration, - Size, - SizeRoundingBehavior, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-stepfunctions-tasks'; import { AwsSdkCall, AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId, -} from '@aws-cdk/custom-resources'; +} from 'aws-cdk-lib/custom-resources'; +import { Construct } from 'constructs'; import { tagConstruct, } from './runtime-info'; diff --git a/packages/aws-rfdk/lib/core/lib/runtime-info.ts b/packages/aws-rfdk/lib/core/lib/runtime-info.ts index d1e80df79..9d8aee009 100644 --- a/packages/aws-rfdk/lib/core/lib/runtime-info.ts +++ b/packages/aws-rfdk/lib/core/lib/runtime-info.ts @@ -6,9 +6,9 @@ import * as path from 'path'; import { - Construct, Tags, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { Construct } from 'constructs'; /** * The name of the tag used to associate the RFDK version and construct that deploys a given resources. diff --git a/packages/aws-rfdk/lib/core/lib/script-assets.ts b/packages/aws-rfdk/lib/core/lib/script-assets.ts index f6dbce28a..9c019ccf5 100644 --- a/packages/aws-rfdk/lib/core/lib/script-assets.ts +++ b/packages/aws-rfdk/lib/core/lib/script-assets.ts @@ -5,10 +5,10 @@ import * as path from 'path'; -import { OperatingSystemType, UserData } from '@aws-cdk/aws-ec2'; -import { IGrantable } from '@aws-cdk/aws-iam'; -import { Asset, AssetProps } from '@aws-cdk/aws-s3-assets'; -import { Construct } from '@aws-cdk/core'; +import { OperatingSystemType, UserData } from 'aws-cdk-lib/aws-ec2'; +import { IGrantable } from 'aws-cdk-lib/aws-iam'; +import { Asset, AssetProps } from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; enum ScriptExtension { '.sh' = OperatingSystemType.LINUX, diff --git a/packages/aws-rfdk/lib/core/lib/session-manager-helper.ts b/packages/aws-rfdk/lib/core/lib/session-manager-helper.ts index 05fd2ed13..fa2e2289e 100644 --- a/packages/aws-rfdk/lib/core/lib/session-manager-helper.ts +++ b/packages/aws-rfdk/lib/core/lib/session-manager-helper.ts @@ -6,7 +6,7 @@ import { IGrantable, PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; /** * This is a helper class meant to make it easier to use the AWS Systems Manager Session Manager diff --git a/packages/aws-rfdk/lib/core/lib/staticip-server.ts b/packages/aws-rfdk/lib/core/lib/staticip-server.ts index e2f314fbf..0edefbd69 100644 --- a/packages/aws-rfdk/lib/core/lib/staticip-server.ts +++ b/packages/aws-rfdk/lib/core/lib/staticip-server.ts @@ -4,13 +4,22 @@ */ import * as path from 'path'; +import { + CfnResource, + Duration, + Lazy, + Names, + Stack, + Tags, +} from 'aws-cdk-lib'; import { AutoScalingGroup, BlockDevice, CfnAutoScalingGroup, DefaultResult, LifecycleTransition, -} from '@aws-cdk/aws-autoscaling'; + Signals, +} from 'aws-cdk-lib/aws-autoscaling'; import { CfnNetworkInterface, Connections, @@ -22,7 +31,7 @@ import { OperatingSystemType, SubnetSelection, UserData, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Effect, IGrantable, @@ -31,30 +40,22 @@ import { PolicyStatement, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Code, Function as LambdaFunction, Runtime, -} from '@aws-cdk/aws-lambda'; +} from 'aws-cdk-lib/aws-lambda'; import { RetentionDays, -} from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-logs'; import { Topic, -} from '@aws-cdk/aws-sns'; +} from 'aws-cdk-lib/aws-sns'; import { LambdaSubscription, -} from '@aws-cdk/aws-sns-subscriptions'; -import { - CfnResource, - Construct, - Duration, - Lazy, - Names, - Stack, - Tags, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-sns-subscriptions'; +import { Construct } from 'constructs'; /** @@ -241,8 +242,7 @@ export class StaticPrivateIpServer extends Construct implements IConnectable, IG vpcSubnets: { subnets: [subnet] }, blockDevices: props.blockDevices, keyName: props.keyName, - resourceSignalCount: props.resourceSignalTimeout ? 1 : undefined, - resourceSignalTimeout: props.resourceSignalTimeout, + signals: props.resourceSignalTimeout ? Signals.waitForCount(1, { timeout: props.resourceSignalTimeout }) : undefined, role: props.role, securityGroup: props.securityGroup, userData: props.userData, diff --git a/packages/aws-rfdk/lib/core/lib/x509-certificate.ts b/packages/aws-rfdk/lib/core/lib/x509-certificate.ts index 3406a7789..42102f618 100644 --- a/packages/aws-rfdk/lib/core/lib/x509-certificate.ts +++ b/packages/aws-rfdk/lib/core/lib/x509-certificate.ts @@ -6,38 +6,37 @@ import * as crypto from 'crypto'; import { join } from 'path'; +import { + Annotations, + CustomResource, + Duration, + Names, + RemovalPolicy, + Stack, + Tag, + Token, +} from 'aws-cdk-lib'; import { AttributeType, BillingMode, Table, TableEncryption, -} from '@aws-cdk/aws-dynamodb'; +} from 'aws-cdk-lib/aws-dynamodb'; import { Grant, IGrantable, PolicyStatement, -} from '@aws-cdk/aws-iam'; -import { IKey } from '@aws-cdk/aws-kms'; +} from 'aws-cdk-lib/aws-iam'; +import { IKey } from 'aws-cdk-lib/aws-kms'; import { Code, Function as LambdaFunction, LayerVersion, Runtime, -} from '@aws-cdk/aws-lambda'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { ISecret, Secret } from '@aws-cdk/aws-secretsmanager'; -import { - Annotations, - Construct, - CustomResource, - Duration, - IConstruct, - Names, - RemovalPolicy, - Stack, - Tag, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { ISecret, Secret } from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct, IConstruct } from 'constructs'; import { ARNS } from '../../lambdas/lambdaLayerVersionArns'; import { IX509CertificateEncodePkcs12, IX509CertificateGenerate } from '../../lambdas/nodejs/x509-certificate'; diff --git a/packages/aws-rfdk/lib/core/test/asset-constants.ts b/packages/aws-rfdk/lib/core/test/asset-constants.ts index 5627b269a..5a5127398 100644 --- a/packages/aws-rfdk/lib/core/test/asset-constants.ts +++ b/packages/aws-rfdk/lib/core/test/asset-constants.ts @@ -3,25 +3,40 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { stringLike } from '@aws-cdk/assert'; - // ConfigureCloudWatchAgent.sh export const CWA_ASSET_LINUX = { - Bucket: 'AssetParametersf3261b0f6923b012a8fce5cd6984211bc48b9977844b3fa44229234dc6f21d43S3BucketCC60E56A', - Key: 'AssetParametersf3261b0f6923b012a8fce5cd6984211bc48b9977844b3fa44229234dc6f21d43S3VersionKey027288B6', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'f3261b0f6923b012a8fce5cd6984211bc48b9977844b3fa44229234dc6f21d43', }; // ConfigureCloudWatchAgent.ps1 export const CWA_ASSET_WINDOWS = { - Bucket: 'AssetParametersb3a03a74afa8a045b35e08f11a719544622172869cc031787f580407d665ee36S3BucketE3A6D532', - Key: 'AssetParametersb3a03a74afa8a045b35e08f11a719544622172869cc031787f580407d665ee36S3VersionKey0A26AF8C', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'b3a03a74afa8a045b35e08f11a719544622172869cc031787f580407d665ee36', }; // mountEbsBlockVolume.sh + metadataUtilities.sh + ec2-certificates.crt export const MOUNT_EBS_SCRIPT_LINUX = { - Bucket: stringLike('AssetParameters*S3BucketD97C6FDA'), + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '11325bc3262f331157129ec344f0be7fae82e28e86cab0cef04c47b428cd8ef5', +}; + +export const MOUNT_EFS_SCRIPT_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'df4591e2346578a80738105aa20aab9c8cee38098d62b4b9a595681c14b8e716', +}; + +export const MOUNT_FSX_SCRIPT_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '9afc7cd192aacbc562e018fb8f9c3848df6a247d43d2486ee91c0ded179e2774', }; export const INSTALL_MONGODB_3_6_SCRIPT_LINUX = { - Bucket: stringLike('AssetParameters*S3BucketAF54A815'), + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '80faba664ebb899d63d89c8fcea1d867475d1ddd28159f418b42af81197849e1', +}; + +export const MONGODB_3_6_CONFIGURATION_SCRIPTS = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '433ead41839a7d4dad68bf0149f907050caa6d95bb7b5b180e5ff21a5dad3c19', }; diff --git a/packages/aws-rfdk/lib/core/test/cloudwatch-agent.test.ts b/packages/aws-rfdk/lib/core/test/cloudwatch-agent.test.ts index 746e1ece6..4c2764815 100644 --- a/packages/aws-rfdk/lib/core/test/cloudwatch-agent.test.ts +++ b/packages/aws-rfdk/lib/core/test/cloudwatch-agent.test.ts @@ -3,11 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ +import {Stack} from 'aws-cdk-lib'; import { - expect as expectCDK, - haveResource, - haveResourceLike, -} from '@aws-cdk/assert'; + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, AmazonLinuxImage, @@ -18,8 +17,7 @@ import { Vpc, WindowsImage, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import {Stack} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { CloudWatchAgent, CloudWatchConfigBuilder, @@ -60,32 +58,10 @@ describe('CloudWatchAgent', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Type: 'String', Value: cloudWatchConfig, - })); - }); - - test('creates an asset', () => { - // GIVEN - const host = new Instance(stack, 'Instance', { - instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.LARGE), - machineImage: new AmazonLinuxImage({ - generation: AmazonLinuxGeneration.AMAZON_LINUX_2, - }), - vpc, }); - - // WHEN - new CloudWatchAgent(stack, 'testResource', { - cloudWatchConfig, - host, - }); - - // THEN - // Find an asset created by the CloudWatchAgentConfigResource - const asset = stack.node.metadataEntry.find(m => m.type === 'aws:cdk:asset'); - expect(asset).toBeDefined(); }); test('creates an IAM policy to access the SSM parameter, CDK asset bucket, and CloudWatch agent bucket', () => { @@ -105,7 +81,7 @@ describe('CloudWatchAgent', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -123,7 +99,7 @@ describe('CloudWatchAgent', () => { 'arn:', { Ref: 'AWS::Partition' }, ':s3:::', - { Ref: CWA_ASSET_LINUX.Bucket }, + { 'Fn::Sub': CWA_ASSET_LINUX.Bucket }, ], ], }, @@ -134,7 +110,7 @@ describe('CloudWatchAgent', () => { 'arn:', { Ref: 'AWS::Partition' }, ':s3:::', - { Ref: CWA_ASSET_LINUX.Bucket }, + { 'Fn::Sub': CWA_ASSET_LINUX.Bucket }, '/*', ], ], @@ -228,13 +204,13 @@ describe('CloudWatchAgent', () => { }, PolicyName: 'InstanceInstanceRoleDefaultPolicy4ACE9290', Roles: [ { Ref: 'InstanceInstanceRoleE9785DE5' } ], - })); + }); }); test.each([ - ["' -i ", undefined], - ["' -i ", true], - ["' ", false], + [' -i', undefined], + [' -i', true], + ['', false], ])('adds user data commands to fetch and execute the script (linux). installFlag: %s shouldInstallAgent: %p', (installFlag: string, shouldInstallAgent?: boolean) => { // GIVEN const host = new Instance(stack, 'Instance', { @@ -258,124 +234,9 @@ describe('CloudWatchAgent', () => { 'Fn::Join': [ '', [ - "#!/bin/bash\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - { Ref: CWA_ASSET_LINUX.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - installFlag, + `#!/bin/bash\nmkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { 'Fn::Sub': CWA_ASSET_LINUX.Bucket }, + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\nset -e\nchmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh'${installFlag} `, { Ref: 'AWS::Region' }, ' ', { Ref: 'StringParameter472EED0E' }, @@ -385,9 +246,9 @@ describe('CloudWatchAgent', () => { }); test.each([ - ["' -i ", undefined], - ["' -i ", true], - ["' ", false], + [' -i', undefined], + [' -i', true], + ['', false], ])('adds user data commands to fetch and execute the script (windows). installFlag: %s shouldInstallAgent: %p', (installFlag: string, shouldInstallAgent?: boolean) => { // GIVEN const host = new Instance(stack, 'Instance', { @@ -409,128 +270,13 @@ describe('CloudWatchAgent', () => { 'Fn::Join': [ '', [ - "mkdir (Split-Path -Path 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' ) -ea 0\nRead-S3Object -BucketName '", - { Ref: CWA_ASSET_WINDOWS.Bucket }, - "' -key '", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -file 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -ErrorAction Stop\n&'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - installFlag, + `mkdir (Split-Path -Path 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { 'Fn::Sub': CWA_ASSET_WINDOWS.Bucket }, + `' -key '${CWA_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n&'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1'${installFlag} `, { Ref: 'AWS::Region' }, ' ', { Ref: 'StringParameter472EED0E' }, - "\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "\"' -ErrorAction Stop }", + `\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }`, ], ], }); diff --git a/packages/aws-rfdk/lib/core/test/cloudwatch-config-builder.ts b/packages/aws-rfdk/lib/core/test/cloudwatch-config-builder.ts index 24f25e2ab..1233dc520 100644 --- a/packages/aws-rfdk/lib/core/test/cloudwatch-config-builder.ts +++ b/packages/aws-rfdk/lib/core/test/cloudwatch-config-builder.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {Duration} from '@aws-cdk/core'; +import {Duration} from 'aws-cdk-lib'; import { CloudWatchConfigBuilder, TimeZone, diff --git a/packages/aws-rfdk/lib/core/test/deployment-instance.test.ts b/packages/aws-rfdk/lib/core/test/deployment-instance.test.ts index d9a1d5739..603281b23 100644 --- a/packages/aws-rfdk/lib/core/test/deployment-instance.test.ts +++ b/packages/aws-rfdk/lib/core/test/deployment-instance.test.ts @@ -3,15 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as cdk from 'aws-cdk-lib'; import { - arrayWith, - countResources, - expect as expectCDK, - haveResourceLike, - ResourcePart, - stringLike, -} from '@aws-cdk/assert'; -import { CfnLaunchConfiguration } from '@aws-cdk/aws-autoscaling'; + Match, + Template, +} from 'aws-cdk-lib/assertions'; +import { CfnLaunchConfiguration } from 'aws-cdk-lib/aws-autoscaling'; import { AmazonLinuxGeneration, AmazonLinuxImage, @@ -21,19 +18,20 @@ import { SecurityGroup, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; -import * as iam from '@aws-cdk/aws-iam'; -import { ILogGroup } from '@aws-cdk/aws-logs'; -import { Bucket } from '@aws-cdk/aws-s3'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { StringParameter } from '@aws-cdk/aws-ssm'; -import * as cdk from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { ILogGroup } from 'aws-cdk-lib/aws-logs'; +import { Bucket } from 'aws-cdk-lib/aws-s3'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { StringParameter } from 'aws-cdk-lib/aws-ssm'; +import {Construct} from 'constructs'; import { DeploymentInstance, DeploymentInstanceProps, } from '../lib/deployment-instance'; import { resourceTagMatcher, testConstructTags } from './tag-helpers'; +import { resourcePropertiesCountIs } from './test-helper'; const DEFAULT_CONSTRUCT_ID = 'DeploymentInstance'; @@ -45,7 +43,7 @@ const DEFAULT_CONSTRUCT_ID = 'DeploymentInstance'; * * `.addExecuteFileCommand` */ class AmazonLinuxWithUserDataSpy extends AmazonLinuxImage { - public getImage(scope: cdk.Construct) { + public getImage(scope: Construct) { const result = super.getImage(scope); jest.spyOn(result.userData, 'addOnExitCommands'); jest.spyOn(result.userData, 'addExecuteFileCommand'); @@ -54,23 +52,18 @@ class AmazonLinuxWithUserDataSpy extends AmazonLinuxImage { } describe('DeploymentInstance', () => { - let app: cdk.App; - let depStack: cdk.Stack; - let stack: cdk.Stack; - let vpc: Vpc; - let target: DeploymentInstance; - - beforeAll(() => { - // GIVEN - app = new cdk.App(); - depStack = new cdk.Stack(app, 'DepStack'); - vpc = new Vpc(depStack, 'VPC'); - }); - describe('defaults', () => { + let app: cdk.App; + let depStack: cdk.Stack; + let vpc: Vpc; + let stack: cdk.Stack; + let target: DeploymentInstance; beforeAll(() => { // GIVEN + app = new cdk.App(); + depStack = new cdk.Stack(app, 'DepStack'); + vpc = new Vpc(depStack, 'VPC'); stack = new cdk.Stack(app, 'DefaultsStack'); target = new DeploymentInstance(stack, DEFAULT_CONSTRUCT_ID, { vpc, @@ -83,21 +76,21 @@ describe('DeploymentInstance', () => { // ASG makes these assertions linked test('deploys a single Auto-Scaling Group', () => { // THEN - expectCDK(stack).to(countResources('AWS::AutoScaling::AutoScalingGroup', 1)); + Template.fromStack(stack).resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 1); }); test('MaxSize is 1', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { MaxSize: '1', - })); + }); }); test('MinSize is 1', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { MinSize: '1', - })); + }); }); test('uses private subnets', () => { @@ -105,16 +98,16 @@ describe('DeploymentInstance', () => { const privateSubnetIDs = vpc.selectSubnets({ subnetType: SubnetType.PRIVATE_WITH_NAT }).subnetIds; // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - VPCZoneIdentifier: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + VPCZoneIdentifier: Match.arrayWith([ ...stack.resolve(privateSubnetIDs), - ), - })); + ]), + }); }); test('waits 15 minutes for one signal', () => { // THEN - expectCDK(stack).to(haveResourceLike( + Template.fromStack(stack).hasResource( 'AWS::AutoScaling::AutoScalingGroup', { CreationPolicy: { @@ -124,13 +117,12 @@ describe('DeploymentInstance', () => { }, }, }, - ResourcePart.CompleteDefinition, - )); + ); }); test('sets replacing update policy', () => { // THEN - expectCDK(stack).to(haveResourceLike( + Template.fromStack(stack).hasResource( 'AWS::AutoScaling::AutoScalingGroup', { UpdatePolicy: { @@ -142,8 +134,7 @@ describe('DeploymentInstance', () => { }, }, }, - ResourcePart.CompleteDefinition, - )); + ); }); test('uses Launch Configuration', () => { @@ -151,9 +142,9 @@ describe('DeploymentInstance', () => { const launchConfig = target.node.findChild('ASG').node.findChild('LaunchConfig') as CfnLaunchConfiguration; // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { LaunchConfigurationName: stack.resolve(launchConfig.ref), - })); + }); }); }); @@ -163,7 +154,7 @@ describe('DeploymentInstance', () => { // ASG makes these assertions linked test('deploys a single Launch Configuration', () => { // THEN - expectCDK(stack).to(countResources('AWS::AutoScaling::LaunchConfiguration', 1)); + Template.fromStack(stack).resourceCountIs('AWS::AutoScaling::LaunchConfiguration', 1); }); test('uses latest Amazon Linux machine image', () => { @@ -172,16 +163,16 @@ describe('DeploymentInstance', () => { const imageId: { Ref: string } = stack.resolve(amazonLinux.getImage(stack)).imageId; // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { ImageId: imageId, - })); + }); }); test('uses t3.small', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 't3.small', - })); + }); }); test('Uses created Security Group', () => { @@ -192,11 +183,11 @@ describe('DeploymentInstance', () => { ) as SecurityGroup; // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { SecurityGroups: [ stack.resolve(securityGroup.securityGroupId), ], - })); + }); }); test('depends on policy', () => { @@ -210,25 +201,24 @@ describe('DeploymentInstance', () => { ) as iam.CfnPolicy; // THEN - expectCDK(stack).to(haveResourceLike( + Template.fromStack(stack).hasResource( 'AWS::AutoScaling::LaunchConfiguration', { - DependsOn: arrayWith( + DependsOn: Match.arrayWith([ stack.resolve(policy.logicalId), - ), + ]), }, - ResourcePart.CompleteDefinition, - )); + ); }); }); describe('Security Group', () => { test('creates Security Group in the desired VPC', () => { // THEN - expectCDK(stack).to(countResources('AWS::EC2::SecurityGroup', 1)); - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroup', { + Template.fromStack(stack).resourceCountIs('AWS::EC2::SecurityGroup', 1); + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', { VpcId: stack.resolve(vpc.vpcId), - })); + }); }); }); @@ -247,11 +237,11 @@ describe('DeploymentInstance', () => { test('creates an instance profile', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::InstanceProfile', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::InstanceProfile', { Roles: [ { Ref: stack.getLogicalId(instanceRole) }, ], - })); + }); }); test('creates a role that can be assumed by EC2', () => { @@ -259,7 +249,7 @@ describe('DeploymentInstance', () => { const servicePrincipal = new iam.ServicePrincipal('ec2.amazonaws.com'); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Role', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { AssumeRolePolicyDocument: { Statement: [ { @@ -271,25 +261,25 @@ describe('DeploymentInstance', () => { }, ], }, - })); + }); }); test('can signal to CloudFormation', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 'cloudformation:SignalResource', Effect: 'Allow', Resource: { Ref: 'AWS::StackId' }, }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can write to the log group', () => { @@ -297,9 +287,9 @@ describe('DeploymentInstance', () => { const logGroup = target.node.findChild(`${DEFAULT_CONSTRUCT_ID}LogGroup`) as ILogGroup; // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 'logs:CreateLogStream', @@ -308,12 +298,12 @@ describe('DeploymentInstance', () => { Effect: 'Allow', Resource: stack.resolve(logGroup.logGroupArn), }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can fetch the CloudWatch Agent install script', () => { @@ -324,9 +314,9 @@ describe('DeploymentInstance', () => { ) as Asset; // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -339,12 +329,12 @@ describe('DeploymentInstance', () => { cloudWatchAgentScriptAsset.bucket.arnForObjects('*'), ]), }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can fetch the CloudWatch Agent configuration file SSM parameter', () => { @@ -355,9 +345,9 @@ describe('DeploymentInstance', () => { ) as StringParameter; // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 'ssm:DescribeParameters', @@ -368,12 +358,12 @@ describe('DeploymentInstance', () => { Effect: 'Allow', Resource: stack.resolve(cloudWatchConfigSsmParam.parameterArn), }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can fetch the CloudWatch Agent installer from S3', () => { @@ -381,9 +371,9 @@ describe('DeploymentInstance', () => { const cloudWatchAgentInstallerBucket = Bucket.fromBucketArn(depStack, 'CloudWatchAgentInstallerBucket', `arn:aws:s3:::amazoncloudwatch-agent-${stack.region}` ); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -396,12 +386,12 @@ describe('DeploymentInstance', () => { cloudWatchAgentInstallerBucket.arnForObjects('*'), ]), }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can fetch GPG installer from RFDK dependencies S3 bucket', () => { @@ -409,9 +399,9 @@ describe('DeploymentInstance', () => { const rfdkExternalDepsBucket = Bucket.fromBucketArn(depStack, 'RfdkExternalDependenciesBucket', `arn:aws:s3:::rfdk-external-dependencies-${stack.region}` ); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -424,19 +414,19 @@ describe('DeploymentInstance', () => { rfdkExternalDepsBucket.arnForObjects('*'), ]), }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('can scale the Auto-Scaling Group', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 'autoscaling:UpdateAutoScalingGroup', Condition: { @@ -453,12 +443,12 @@ describe('DeploymentInstance', () => { Effect: 'Allow', Resource: '*', }, - ), + ]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); }); @@ -468,33 +458,33 @@ describe('DeploymentInstance', () => { const logGroup = target.node.findChild(`${DEFAULT_CONSTRUCT_ID}LogGroup`) as ILogGroup; // THEN - expectCDK(stack).to(haveResourceLike('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Type: 'String', Value: { 'Fn::Join': [ '', - arrayWith( + Match.arrayWith([ '{"logs":{"logs_collected":{"files":{"collect_list":[{"log_group_name":"', stack.resolve(logGroup.logGroupName), - ), + ]), ], }, - })); + }); }); test('configures cloud-init log', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Type: 'String', Value: { 'Fn::Join': [ '', - arrayWith( - stringLike('*"log_stream_name":"cloud-init-output-{instance_id}","file_path":"/var/log/cloud-init-output.log",*'), - ), + Match.arrayWith([ + Match.stringLikeRegexp('.*"log_stream_name":"cloud-init-output-{instance_id}","file_path":"/var/log/cloud-init-output.log",.*'), + ]), ], }, - })); + }); }); }); @@ -520,13 +510,22 @@ describe('DeploymentInstance', () => { const matcher = resourceTagMatcher('AWS::AutoScaling::AutoScalingGroup', 'resourceLogicalId', cdk.Names.uniqueId(target)); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', matcher)); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', matcher); }); }); describe('User Data', () => { + let app: cdk.App; + let depStack: cdk.Stack; + let vpc: Vpc; + let stack: cdk.Stack; + let target: DeploymentInstance; + beforeAll(() => { // GIVEN + app = new cdk.App(); + depStack = new cdk.Stack(app, 'DepStack'); + vpc = new Vpc(depStack, 'VPC'); stack = new cdk.Stack(app, 'UserDataStack'); // WHEN @@ -582,6 +581,11 @@ describe('DeploymentInstance', () => { }); describe('Custom::LogRetention.LogGroupName', () => { + let app: cdk.App; + let depStack: cdk.Stack; + let vpc: Vpc; + let stack: cdk.Stack; + beforeEach(() => { // We need a clean construct tree, because the tests use the same construct ID app = new cdk.App(); @@ -634,19 +638,18 @@ describe('DeploymentInstance', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: expectedLogGroupName, - })); + }); }); }); - // GIVEN test('uses specified instance type', () => { // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'TestStack'); + const vpc = new Vpc(stack, 'VPC'); const instanceType = new InstanceType('c5.large'); - // We want an isolated stack to ensure expectCDK is only searching resources - // synthesized by the specific DeploymentInstance stack - stack = new cdk.Stack(app, 'InstanceTypeStack'); // WHEN new DeploymentInstance(stack, DEFAULT_CONSTRUCT_ID, { @@ -655,16 +658,19 @@ describe('DeploymentInstance', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: instanceType.toString(), - })); + }); }); test('uses specified security group', () => { // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'TestStack'); + const vpc = new Vpc(stack, 'VPC'); + const securityGroupId = 'securityGroupId'; - const securityGroup = SecurityGroup.fromSecurityGroupId(depStack, 'SecurityGroup', securityGroupId); - stack = new cdk.Stack(app, 'SecurityGroupStack'); + const securityGroup = SecurityGroup.fromSecurityGroupId(stack, 'SecurityGroup', securityGroupId); // WHEN new DeploymentInstance(stack, DEFAULT_CONSTRUCT_ID, { @@ -673,17 +679,26 @@ describe('DeploymentInstance', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - SecurityGroups: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + SecurityGroups: Match.arrayWith([ securityGroupId, - ), - })); + ]), + }); }); describe('.selfTermination = false', () => { + let app: cdk.App; + let depStack: cdk.Stack; + let vpc: Vpc; + let stack: cdk.Stack; + let target: DeploymentInstance; + beforeAll(() => { // GIVEN - stack = new cdk.Stack(app, 'SelfTerminationDisabledStack'); + app = new cdk.App(); + depStack = new cdk.Stack(app, 'DepStack'); + vpc = new Vpc(depStack, 'VPC'); + stack = new cdk.Stack(app, 'DefaultsStack'); // Spy on user data method calls const machineImage = new AmazonLinuxWithUserDataSpy(); @@ -712,33 +727,36 @@ describe('DeploymentInstance', () => { .node.findChild('InstanceRole') .node.defaultChild ) as iam.CfnRole; - - // THEN - expectCDK(stack).notTo(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: { - Statement: arrayWith( - { - Action: 'autoscaling:UpdateAutoScalingGroup', - Condition: { - // This tag is added by RFDK to scope down the permissions of the policy for least-privilege - StringEquals: { 'autoscaling:ResourceTag/resourceLogicalId': cdk.Names.uniqueId(target) }, + const matcher = Match.objectLike({ + Properties: { + PolicyDocument: { + Statement: Match.arrayWith([ + { + Action: 'autoscaling:UpdateAutoScalingGroup', + Condition: { + // This tag is added by RFDK to scope down the permissions of the policy for least-privilege + StringEquals: { 'autoscaling:ResourceTag/resourceLogicalId': cdk.Names.uniqueId(target) }, + }, + Effect: 'Allow', + Resource: '*', }, - Effect: 'Allow', - Resource: '*', - }, - // The instance determines its Auto-Scaling Group by reading the tag created on the instance by the EC2 - // Auto-Scaling service - { - Action: 'ec2:DescribeTags', - Effect: 'Allow', - Resource: '*', - }, - ), + // The instance determines its Auto-Scaling Group by reading the tag created on the instance by the EC2 + // Auto-Scaling service + { + Action: 'ec2:DescribeTags', + Effect: 'Allow', + Resource: '*', + }, + ]), + }, + Roles: [ + stack.resolve(instanceRole.ref), + ], }, - Roles: [ - stack.resolve(instanceRole.ref), - ], - })); + }); + + // THEN + resourcePropertiesCountIs(stack, 'AWS::IAM::Policy', matcher, 0); }); test('does not tag for self-termination', () => { @@ -746,18 +764,24 @@ describe('DeploymentInstance', () => { const matcher = resourceTagMatcher('AWS::AutoScaling::AutoScalingGroup', 'resourceLogicalId', cdk.Names.uniqueId(target)); // THEN - expectCDK(stack).notTo(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', matcher)); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', Match.not(matcher)); }); }); // GIVEN describe('.executionTimeout is specified', () => { + let app: cdk.App; + let depStack: cdk.Stack; + let vpc: Vpc; + let stack: cdk.Stack; const executionTimeout = cdk.Duration.minutes(30); beforeAll(() => { // GIVEN - // Use a clean stack to not pollute other stacks with resources - stack = new cdk.Stack(app, 'ExecutionTimeout'); + app = new cdk.App(); + depStack = new cdk.Stack(app, 'DepStack'); + vpc = new Vpc(depStack, 'VPC'); + stack = new cdk.Stack(app, 'DefaultsStack'); const deploymentInstanceProps: DeploymentInstanceProps = { vpc, executionTimeout, @@ -769,7 +793,7 @@ describe('DeploymentInstance', () => { // THEN test('AWS::AutoScaling::AutoScalingGroup creation policy signal timeout is set accordingly', () => { - expectCDK(stack).to(haveResourceLike( + Template.fromStack(stack).hasResource( 'AWS::AutoScaling::AutoScalingGroup', { CreationPolicy: { @@ -779,8 +803,7 @@ describe('DeploymentInstance', () => { }, }, }, - ResourcePart.CompleteDefinition, - )); + ); }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/endpoint.test.ts b/packages/aws-rfdk/lib/core/test/endpoint.test.ts index fa5af0314..d19eb2daa 100644 --- a/packages/aws-rfdk/lib/core/test/endpoint.test.ts +++ b/packages/aws-rfdk/lib/core/test/endpoint.test.ts @@ -3,7 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { expect as expectCDK, haveResource } from '@aws-cdk/assert'; +import { + Lazy, + Stack, + Token, +} from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; import { Connections, IConnectable, @@ -11,13 +16,8 @@ import { Protocol, SecurityGroup, Vpc, -} from '@aws-cdk/aws-ec2'; -import { ApplicationProtocol } from '@aws-cdk/aws-elasticloadbalancingv2'; -import { - Lazy, - Stack, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { ApplicationProtocol } from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { ApplicationEndpoint, @@ -214,7 +214,7 @@ describe('ConnectableApplicationEndpoint', () => { somethingConnectable.connections.allowTo(endpoint, Port.tcp(80), 'Connecting to endpoint'); // THEN - expectCDK(stack).to(haveResource('AWS::EC2::SecurityGroupIngress')); + Template.fromStack(stack).resourceCountIs('AWS::EC2::SecurityGroupIngress', 1); }); }); diff --git a/packages/aws-rfdk/lib/core/test/exporting-log-group.test.ts b/packages/aws-rfdk/lib/core/test/exporting-log-group.test.ts index 9dc599897..58add28d8 100644 --- a/packages/aws-rfdk/lib/core/test/exporting-log-group.test.ts +++ b/packages/aws-rfdk/lib/core/test/exporting-log-group.test.ts @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { expect as expectCDK, haveResource, haveResourceLike } from '@aws-cdk/assert'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { Bucket } from '@aws-cdk/aws-s3'; -import { Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { Bucket } from 'aws-cdk-lib/aws-s3'; import { ExportingLogGroup } from '../lib/exporting-log-group'; test('default exporting log group is created correctly', () => { @@ -23,7 +23,7 @@ test('default exporting log group is created correctly', () => { }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { ServiceToken: { 'Fn::GetAtt': [ 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A', @@ -32,8 +32,8 @@ test('default exporting log group is created correctly', () => { }, LogGroupName: 'logGroup', RetentionInDays: 3, - })); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -74,9 +74,9 @@ test('default exporting log group is created correctly', () => { }, ], }, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::CloudWatch::Alarm', { + Template.fromStack(stack).hasResourceProperties('AWS::CloudWatch::Alarm', { ComparisonOperator: 'GreaterThanOrEqualToThreshold', EvaluationPeriods: 1, Dimensions: [ @@ -92,9 +92,9 @@ test('default exporting log group is created correctly', () => { Period: 300, Statistic: 'Sum', Threshold: 1, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Events::Rule', { + Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { ScheduleExpression: 'rate(1 hour)', State: 'ENABLED', Targets: [ @@ -120,8 +120,8 @@ test('default exporting log group is created correctly', () => { }, }, ], - })); - expectCDK(stack).to(haveResource('AWS::Lambda::Function')); + }); + Template.fromStack(stack).resourceCountIs('AWS::Lambda::Function', 2); }); test('custom set retention is created correctly', () => { @@ -139,7 +139,7 @@ test('custom set retention is created correctly', () => { }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { ServiceToken: { 'Fn::GetAtt': [ 'LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A', @@ -148,8 +148,8 @@ test('custom set retention is created correctly', () => { }, LogGroupName: 'logGroup', RetentionInDays: 7, - })); - expectCDK(stack).to(haveResource('AWS::Lambda::Function')); - expectCDK(stack).to(haveResource('AWS::CloudWatch::Alarm')); - expectCDK(stack).to(haveResource('AWS::Events::Rule')); + }); + Template.fromStack(stack).resourceCountIs('AWS::Lambda::Function', 2); + Template.fromStack(stack).resourceCountIs('AWS::CloudWatch::Alarm', 1); + Template.fromStack(stack).resourceCountIs('AWS::Events::Rule', 1); }); diff --git a/packages/aws-rfdk/lib/core/test/health-monitor.test.ts b/packages/aws-rfdk/lib/core/test/health-monitor.test.ts index 769dc6ec3..ca71f3a70 100644 --- a/packages/aws-rfdk/lib/core/test/health-monitor.test.ts +++ b/packages/aws-rfdk/lib/core/test/health-monitor.test.ts @@ -4,26 +4,23 @@ */ import { - arrayWith, - countResources, - countResourcesLike, - deepObjectLike, - expect as expectCDK, - haveResource, - haveResourceLike, - not, - ABSENT, - notMatching, - stringLike, -} from '@aws-cdk/assert'; + App, + CfnElement, + Names, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AutoScalingGroup, CfnAutoScalingGroup, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { IMetric, Metric, -} from '@aws-cdk/aws-cloudwatch'; +} from 'aws-cdk-lib/aws-cloudwatch'; import { AmazonLinuxGeneration, AmazonLinuxImage, @@ -35,23 +32,17 @@ import { SecurityGroup, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; -import {IApplicationLoadBalancerTarget} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-ec2'; +import {IApplicationLoadBalancerTarget} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IPolicy, Policy, PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Key, -} from '@aws-cdk/aws-kms'; -import { - App, - CfnElement, - Construct, - Names, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-kms'; +import {Construct} from 'constructs'; import { HealthMonitor, @@ -60,6 +51,9 @@ import { import { testConstructTags, } from './tag-helpers'; +import { + resourcePropertiesCountIs, +} from './test-helper'; let app: App; let infraStack: Stack; @@ -130,8 +124,8 @@ describe('HealthMonitor', () => { vpc, }); // THEN - expectCDK(hmStack).notTo(haveResource('AWS::ElasticLoadBalancingV2::LoadBalancer')); - expectCDK(hmStack).to(haveResourceLike('AWS::KMS::Key', { + Template.fromStack(hmStack).resourceCountIs('AWS::ElasticLoadBalancingV2::LoadBalancer', 0); + Template.fromStack(hmStack).hasResourceProperties('AWS::KMS::Key', { KeyPolicy: { Statement: [ { @@ -172,8 +166,8 @@ describe('HealthMonitor', () => { }, Description: `This key is used to encrypt SNS messages for ${Names.uniqueId(healthMonitor)}.`, EnableKeyRotation: true, - })); - expectCDK(hmStack).to(haveResourceLike('AWS::SNS::TopicPolicy', { + }); + Template.fromStack(hmStack).hasResourceProperties('AWS::SNS::TopicPolicy', { PolicyDocument: { Statement: [ { @@ -194,17 +188,17 @@ describe('HealthMonitor', () => { Ref: hmStack.getLogicalId(healthMonitor.unhealthyFleetActionTopic.node.defaultChild as CfnElement), }, ], - })); - expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Topic', { + }); + Template.fromStack(hmStack).hasResourceProperties('AWS::SNS::Topic', { KmsMasterKeyId: { 'Fn::GetAtt': [ `${hmStack.getLogicalId(healthMonitor.node.findChild('SNSEncryptionKey').node.defaultChild as CfnElement)}`, 'Arn', ], }, - })); - expectCDK(hmStack).to(haveResource('AWS::Lambda::Function')); - expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Subscription', { + }); + Template.fromStack(hmStack).hasResourceProperties('AWS::Lambda::Function', {}); + Template.fromStack(hmStack).hasResourceProperties('AWS::SNS::Subscription', { Protocol: 'lambda', TopicArn: { Ref: `${infraStack.getLogicalId(healthMonitor.node.findChild('UnhealthyFleetTopic').node.defaultChild as CfnElement)}`, @@ -215,7 +209,7 @@ describe('HealthMonitor', () => { 'Arn', ], }, - })); + }); }); test('validating health monitor properties while passing a key', () => { @@ -225,13 +219,13 @@ describe('HealthMonitor', () => { encryptionKey: Key.fromKeyArn(hmStack, 'importedKey', 'arn:aws:kms:us-west-2:123456789012:key/testarn'), }); // THEN - expectCDK(hmStack).notTo(haveResource('AWS::ElasticLoadBalancingV2::LoadBalancer')); - expectCDK(hmStack).notTo(haveResource('AWS::KMS::Key')); - expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Topic', { + Template.fromStack(hmStack).resourceCountIs('AWS::ElasticLoadBalancingV2::LoadBalancer', 0); + Template.fromStack(hmStack).resourceCountIs('AWS::KMS::Key', 0); + Template.fromStack(hmStack).hasResourceProperties('AWS::SNS::Topic', { KmsMasterKeyId: 'arn:aws:kms:us-west-2:123456789012:key/testarn', - })); - expectCDK(hmStack).to(haveResource('AWS::Lambda::Function')); - expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Subscription', { + }); + Template.fromStack(hmStack).hasResourceProperties('AWS::Lambda::Function', {}); + Template.fromStack(hmStack).hasResourceProperties('AWS::SNS::Subscription', { Protocol: 'lambda', TopicArn: { Ref: `${infraStack.getLogicalId(healthMonitor.node.findChild('UnhealthyFleetTopic').node.defaultChild as CfnElement)}`, @@ -242,7 +236,7 @@ describe('HealthMonitor', () => { 'Arn', ], }, - })); + }); }); test('validating the target with default health config', () => { @@ -258,24 +252,24 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet, {}); // THEN - expectCDK(wfStack).to(haveResource('AWS::ElasticLoadBalancingV2::Listener')); - expectCDK(hmStack).notTo((haveResourceLike('AWS::EC2::SecurityGroup', { - SecurityGroupIngress: arrayWith(deepObjectLike({ + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', {}); + Template.fromStack(hmStack).hasResourceProperties('AWS::EC2::SecurityGroup', Match.not({ + SecurityGroupIngress: Match.arrayWith([{ CidrIp: '0.0.0.0/0', FromPort: 8081, IpProtocol: 'tcp', ToPort: 8081, - })), - }))); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + }]), + })); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { HealthCheckIntervalSeconds: 300, HealthCheckPort: '8081', HealthCheckProtocol: 'HTTP', Port: 8081, Protocol: 'HTTP', TargetType: 'instance', - })); - expectCDK(wfStack).to(haveResource('AWS::CloudWatch::Alarm')); + }); + Template.fromStack(wfStack).hasResourceProperties('AWS::CloudWatch::Alarm', {}); }); test('validating the target with custom health config', () => { @@ -292,16 +286,16 @@ describe('HealthMonitor', () => { }); // THEN - expectCDK(wfStack).to(haveResource('AWS::ElasticLoadBalancingV2::Listener')); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener' ,{}); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { HealthCheckIntervalSeconds: 300, HealthCheckPort: '7171', HealthCheckProtocol: 'HTTP', Port: 8081, Protocol: 'HTTP', TargetType: 'instance', - })); - expectCDK(wfStack).to(haveResource('AWS::CloudWatch::Alarm')); + }); + Template.fromStack(wfStack).hasResourceProperties('AWS::CloudWatch::Alarm', {}); }); test('2 ASG gets registered to same LB', () => { @@ -321,41 +315,40 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet2, {port: 7171}); // THEN - expectCDK(hmStack).to(countResourcesLike('AWS::ElasticLoadBalancingV2::LoadBalancer', 1, { - LoadBalancerAttributes: [ + resourcePropertiesCountIs(hmStack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'deletion_protection.enabled', Value: 'true', }, - ], + ]), Scheme: 'internal', - })); - expectCDK(wfStack).to(countResources('AWS::ElasticLoadBalancingV2::Listener', 2)); - expectCDK(wfStack).to(haveResource('AWS::ElasticLoadBalancingV2::Listener')); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + }, 1); + Template.fromStack(wfStack).resourceCountIs('AWS::ElasticLoadBalancingV2::Listener', 2); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { HealthCheckIntervalSeconds: 300, HealthCheckPort: '7171', HealthCheckProtocol: 'HTTP', Port: 8081, Protocol: 'HTTP', TargetType: 'instance', - })); - expectCDK(wfStack).to(haveResourceLike('AWS::CloudWatch::Alarm', { + }); + Template.fromStack(wfStack).hasResourceProperties('AWS::CloudWatch::Alarm', { ComparisonOperator: 'GreaterThanThreshold', EvaluationPeriods: 8, ActionsEnabled: true, DatapointsToAlarm: 8, Threshold: 0, TreatMissingData: 'notBreaching', - })); - expectCDK(wfStack).to(haveResourceLike('AWS::CloudWatch::Alarm', { + }); + Template.fromStack(wfStack).hasResourceProperties('AWS::CloudWatch::Alarm', { ComparisonOperator: 'GreaterThanThreshold', EvaluationPeriods: 1, ActionsEnabled: true, DatapointsToAlarm: 1, Threshold: 35, TreatMissingData: 'notBreaching', - })); + }); }); test('validating LB target limit', () => { @@ -381,21 +374,21 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet2, {}); // THEN - expectCDK(hmStack).to(countResourcesLike('AWS::ElasticLoadBalancingV2::LoadBalancer', 2, { - LoadBalancerAttributes: [ + resourcePropertiesCountIs(hmStack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'deletion_protection.enabled', Value: 'true', }, - ], + ]), Scheme: 'internal', Type: 'application', - })); - expectCDK(wfStack).to(countResources('AWS::ElasticLoadBalancingV2::Listener', 2)); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + }, 2); + Template.fromStack(wfStack).resourceCountIs('AWS::ElasticLoadBalancingV2::Listener', 2); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Port: 8081, Protocol: 'HTTP', - })); + }); }); test('validating LB listener limit', () => { @@ -422,21 +415,21 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet2, {}); // THEN - expectCDK(hmStack).to(countResourcesLike('AWS::ElasticLoadBalancingV2::LoadBalancer', 2, { - LoadBalancerAttributes: [ + resourcePropertiesCountIs(hmStack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'deletion_protection.enabled', Value: 'true', }, - ], + ]), Scheme: 'internal', Type: 'application', - })); - expectCDK(wfStack).to(countResources('AWS::ElasticLoadBalancingV2::Listener', 2)); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + }, 2); + Template.fromStack(wfStack).resourceCountIs('AWS::ElasticLoadBalancingV2::Listener', 2); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Port: 8081, Protocol: 'HTTP', - })); + }); }); test('validating target group limit per lb', () => { @@ -460,15 +453,15 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet2, {}); // THEN - expectCDK(hmStack).to(countResourcesLike('AWS::ElasticLoadBalancingV2::LoadBalancer', 2, { + resourcePropertiesCountIs(hmStack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { Scheme: 'internal', Type: 'application', - })); - expectCDK(wfStack).to(countResources('AWS::ElasticLoadBalancingV2::Listener', 2)); - expectCDK(wfStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + }, 2); + Template.fromStack(wfStack).resourceCountIs('AWS::ElasticLoadBalancingV2::Listener', 2); + Template.fromStack(wfStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Port: 8081, Protocol: 'HTTP', - })); + }); }); test('validating target limit exhaustion', () => { @@ -503,15 +496,17 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet, {}); // THEN - expectCDK(hmStack).to(not(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( - { - Key: 'deletion_protection.enabled', - Value: 'true', - }, - ), - Scheme: ABSENT, - Type: ABSENT, + Template.fromStack(hmStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', Match.not(Match.objectLike({ + Properties: { + LoadBalancerAttributes: Match.arrayWith([ + { + Key: 'deletion_protection.enabled', + Value: 'true', + }, + ]), + Scheme: Match.absent, + Type: Match.absent, + }, }))); }); @@ -527,14 +522,14 @@ describe('HealthMonitor', () => { healthMonitor.registerFleet(fleet, {}); // THEN - expectCDK(hmStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( + Template.fromStack(hmStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'routing.http.drop_invalid_header_fields.enabled', Value: 'true', }, - ), - })); + ]), + }); }); test('specifying a subnet', () => { @@ -553,19 +548,19 @@ describe('HealthMonitor', () => { // THEN // Make sure it has the public subnets - expectCDK(hmStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { + Template.fromStack(hmStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { Subnets: [ - {'Fn::ImportValue': stringLike('*PublicSubnet*')}, - {'Fn::ImportValue': stringLike('*PublicSubnet*')}, + {'Fn::ImportValue': Match.stringLikeRegexp('.*PublicSubnet.*')}, + {'Fn::ImportValue': Match.stringLikeRegexp('.*PublicSubnet.*')}, ], - })); + }); // Make sure the private subnets aren't present - expectCDK(hmStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { + Template.fromStack(hmStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { Subnets: [ - {'Fn::ImportValue': notMatching(stringLike('*PrivateSubnet*'))}, - {'Fn::ImportValue': notMatching(stringLike('*PrivateSubnet*'))}, + {'Fn::ImportValue': Match.not(Match.stringLikeRegexp('.*PrivateSubnet.*'))}, + {'Fn::ImportValue': Match.not(Match.stringLikeRegexp('.*PrivateSubnet.*'))}, ], - })); + }); }); test('specifying a security group', () => { @@ -584,13 +579,13 @@ describe('HealthMonitor', () => { // THEN // Make sure it has the security group - expectCDK(hmStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - SecurityGroups: arrayWith( + Template.fromStack(hmStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + SecurityGroups: Match.arrayWith([ hmStack.resolve(securityGroup.securityGroupId), - ), - })); + ]), + }); // HealthMonitor should not create its own security group - expectCDK(hmStack).notTo(haveResource('AWS::EC2::SecurityGroup')); + Template.fromStack(hmStack).resourceCountIs('AWS::EC2::SecurityGroup', 0); }); describe('tagging', () => { diff --git a/packages/aws-rfdk/lib/core/test/imported-acm-certificate.test.ts b/packages/aws-rfdk/lib/core/test/imported-acm-certificate.test.ts index 18fe3081f..9679d6b57 100644 --- a/packages/aws-rfdk/lib/core/test/imported-acm-certificate.test.ts +++ b/packages/aws-rfdk/lib/core/test/imported-acm-certificate.test.ts @@ -3,21 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { RemovalPolicy, Stack } from 'aws-cdk-lib'; import { - arrayWith, - expect as expectCDK, - haveResourceLike, - objectLike, - ResourcePart, - stringLike, -} from '@aws-cdk/assert'; + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Metric, Statistic, -} from '@aws-cdk/aws-cloudwatch'; -import { Table } from '@aws-cdk/aws-dynamodb'; -import { CfnSecret } from '@aws-cdk/aws-secretsmanager'; -import { RemovalPolicy, Stack } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-cloudwatch'; +import { Table } from 'aws-cdk-lib/aws-dynamodb'; +import { CfnSecret } from 'aws-cdk-lib/aws-secretsmanager'; import { ImportedAcmCertificate } from '../lib/imported-acm-certificate'; import { X509CertificatePem } from '../lib/x509-certificate'; @@ -48,7 +44,7 @@ describe('ImportedAcmCertificate', () => { test('creates Custom::RFDK_AcmImportedCertificate', () => { // THEN - expectCDK(stack).to(haveResourceLike('Custom::RFDK_AcmImportedCertificate', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_AcmImportedCertificate', { X509CertificatePem: { Cert: { 'Fn::GetAtt': [ @@ -77,53 +73,53 @@ describe('ImportedAcmCertificate', () => { Value: 'f4e2abf974443234fdb095fafcfa9ee2', }, ], - })); + }); }); describe('creates AWS::DynamoDB::Table for database', () => { test('with PhysicalID partition key', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::DynamoDB::Table', { - AttributeDefinitions: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::Table', { + AttributeDefinitions: Match.arrayWith([ { AttributeName: 'PhysicalId', AttributeType: 'S', }, - ), - KeySchema: arrayWith( + ]), + KeySchema: Match.arrayWith([ { AttributeName: 'PhysicalId', KeyType: 'HASH', }, - ), - })); + ]), + }); }); test('with CustomResource sort key', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::DynamoDB::Table', { - AttributeDefinitions: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::DynamoDB::Table', { + AttributeDefinitions: Match.arrayWith([ { AttributeName: 'CustomResource', AttributeType: 'S', }, - ), - KeySchema: arrayWith( + ]), + KeySchema: Match.arrayWith([ { AttributeName: 'CustomResource', KeyType: 'RANGE', }, - ), - })); + ]), + }); }); }); test('creates AWS::IAM::Policy', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ - { + Match.objectLike({ Action: [ 'dynamodb:BatchGetItem', 'dynamodb:GetRecords', @@ -136,12 +132,13 @@ describe('ImportedAcmCertificate', () => { 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', + 'dynamodb:DescribeTable', ], - }, - { + }), + Match.objectLike({ Action: 'dynamodb:DescribeTable', - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -152,8 +149,8 @@ describe('ImportedAcmCertificate', () => { 'Cert', ], }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -164,7 +161,7 @@ describe('ImportedAcmCertificate', () => { 'Key', ], }, - }, + }), { Action: [ 'secretsmanager:GetSecretValue', @@ -174,7 +171,7 @@ describe('ImportedAcmCertificate', () => { Ref: certPassphraseID, }, }, - { + Match.objectLike({ Action: [ 'acm:AddTagsToCertificate', 'acm:ImportCertificate', @@ -185,35 +182,35 @@ describe('ImportedAcmCertificate', () => { }, }, Resource: '*', - }, - { + }), + Match.objectLike({ Action: [ 'acm:DeleteCertificate', 'acm:DescribeCertificate', 'acm:GetCertificate', ], Resource: '*', - }, + }), ], }, - })); + }); }); describe('custom resource lambda function', () => { test('uses correct handler', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'x509-certificate.importCert', - })); + }); }); test('uses RFDK lambda layer', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { - Layers: arrayWith( - stringLike('arn:aws:lambda:us-west-2:224375009292:layer:openssl-al2:*'), - ), - })); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Layers: Match.arrayWith([ + Match.stringLikeRegexp('arn:aws:lambda:us-west-2:224375009292:layer:openssl-al2:.*'), + ]), + }); }); test('sets DATABASE environment variable', () => { @@ -221,30 +218,30 @@ describe('ImportedAcmCertificate', () => { const table = importedAcmCertificate.node.findChild('Table') as Table; // THEN - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Environment: { - Variables: objectLike({ + Variables: Match.objectLike({ DATABASE: stack.resolve(table.tableName), }), }, - })); + }); }); }); describe('applyRemovalPolicy', () => { test('default RemovalPolicy is Delete', () => { - expectCDK(stack).to(haveResourceLike('Custom::RFDK_AcmImportedCertificate', { + Template.fromStack(stack).hasResource('Custom::RFDK_AcmImportedCertificate', { DeletionPolicy: 'Delete', UpdateReplacePolicy: 'Delete', - }, ResourcePart.CompleteDefinition)); + }); }); test('Different policy can be applied', () => { importedAcmCertificate.applyRemovalPolicy(RemovalPolicy.RETAIN); - expectCDK(stack).to(haveResourceLike('Custom::RFDK_AcmImportedCertificate', { + Template.fromStack(stack).hasResource('Custom::RFDK_AcmImportedCertificate', { DeletionPolicy: 'Retain', UpdateReplacePolicy: 'Retain', - }, ResourcePart.CompleteDefinition)); + }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/log-group-factory.test.ts b/packages/aws-rfdk/lib/core/test/log-group-factory.test.ts index dc3c21e77..97e1c1570 100644 --- a/packages/aws-rfdk/lib/core/test/log-group-factory.test.ts +++ b/packages/aws-rfdk/lib/core/test/log-group-factory.test.ts @@ -3,9 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { expect as expectCDK, haveResourceLike } from '@aws-cdk/assert'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; import { LogGroupFactory } from '../lib/log-group-factory'; describe('log group', () => { @@ -16,11 +19,11 @@ describe('log group', () => { LogGroupFactory.createOrFetch(stack, 'TestId', 'testLogGroup'); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'testLogGroup', RetentionInDays: 3, - })); - expectCDK(stack).notTo(haveResourceLike('AWS::Lambda::Function', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', Match.not({ Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', @@ -39,11 +42,11 @@ describe('log group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'prefix-testLogGroup', RetentionInDays: 3, - })); - expectCDK(stack).notTo(haveResourceLike('AWS::Lambda::Function', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', Match.not({ Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', @@ -62,11 +65,11 @@ describe('log group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'testLogGroup', RetentionInDays: 7, - })); - expectCDK(stack).notTo(haveResourceLike('AWS::Lambda::Function', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', Match.not({ Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', @@ -87,26 +90,26 @@ describe('exporting log group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'testLogGroup', RetentionInDays: 3, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', 'Arn', ], }, - })); - expectCDK(stack).to(haveResourceLike('AWS::Events::Rule', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { Targets: [ { Input: '{\"BucketName\":\"test-bucket\",\"ExportFrequencyInHours\":1,\"LogGroupName\":\"testLogGroup\",\"RetentionInHours\":72}', }, ], - })); + }); }); test('created correctly with prefix', () => { @@ -119,27 +122,27 @@ describe('exporting log group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'prefix-testLogGroup', RetentionInDays: 3, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', 'Arn', ], }, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Events::Rule', { + Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { Targets: [ { Input: '{\"BucketName\":\"test-bucket\",\"ExportFrequencyInHours\":1,\"LogGroupName\":\"prefix-testLogGroup\",\"RetentionInHours\":72}', }, ], - })); + }); }); test('created correctly with custom retention', () => { @@ -152,26 +155,26 @@ describe('exporting log group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: 'testLogGroup', RetentionInDays: 7, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Role: { 'Fn::GetAtt': [ 'LogGroupExporter6382448ce4b242e9b14fa0a9ccdb198eServiceRoleB67C808B', 'Arn', ], }, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::Events::Rule', { + Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { Targets: [ { Input: '{\"BucketName\":\"test-bucket\",\"ExportFrequencyInHours\":1,\"LogGroupName\":\"testLogGroup\",\"RetentionInHours\":168}', }, ], - })); + }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/mongodb-installer.test.ts b/packages/aws-rfdk/lib/core/test/mongodb-installer.test.ts index d0447cd92..14cf19c1b 100644 --- a/packages/aws-rfdk/lib/core/test/mongodb-installer.test.ts +++ b/packages/aws-rfdk/lib/core/test/mongodb-installer.test.ts @@ -4,9 +4,12 @@ */ import { - expect as cdkExpect, - haveResourceLike, -} from '@aws-cdk/assert'; + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, Instance, @@ -14,10 +17,7 @@ import { MachineImage, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import { - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { MongoDbInstaller, @@ -28,9 +28,6 @@ import { import { INSTALL_MONGODB_3_6_SCRIPT_LINUX, } from './asset-constants'; -import { - escapeTokenRegex, -} from './token-regex-helpers'; describe('Test MongoDbInstaller', () => { let stack: Stack; @@ -85,10 +82,9 @@ Please set the userSsplAcceptance property to USER_ACCEPTS_SSPL to signify your // WHEN installer.installOnLinuxInstance(instance); - const userData = instance.userData.render(); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -109,7 +105,7 @@ Please set the userSsplAcceptance property to USER_ACCEPTS_SSPL to signify your }, ':s3:::', { - Ref: INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, }, ], ], @@ -124,7 +120,7 @@ Please set the userSsplAcceptance property to USER_ACCEPTS_SSPL to signify your }, ':s3:::', { - Ref: INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, }, '/*', ], @@ -134,12 +130,24 @@ Please set the userSsplAcceptance property to USER_ACCEPTS_SSPL to signify your }, ], }, - })); - // Make sure we download the mountEFS script asset bundle - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; - expect(userData).toMatch(new RegExp(escapeTokenRegex(s3Copy))); - // Make sure we execute the script with the correct args - expect(userData).toMatch(new RegExp(escapeTokenRegex('bash /tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}'))); + }); + // Make sure we download and run the mongo install script + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `#!/bin/bash\nmkdir -p $(dirname '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + }, + `/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh' '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh'\nbash /tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh`, + ], + ], + }, + }, + }); }); test('assert Linux-only', () => { @@ -179,14 +187,28 @@ Please set the userSsplAcceptance property to USER_ACCEPTS_SSPL to signify your // WHEN installer1.installOnLinuxInstance(instance); installer2.installOnLinuxInstance(instance); - const userData = instance.userData.render(); - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; - const regex = new RegExp(escapeTokenRegex(s3Copy), 'g'); - const matches = userData.match(regex) ?? []; // THEN // The source of the asset copy should be identical from installer1 & installer2 - expect(matches).toHaveLength(2); - expect(matches[0]).toBe(matches[1]); + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + Match.arrayWith([ + `#!/bin/bash\nmkdir -p $(dirname '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + }, + `/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh' '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh'\nbash /tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh\nmkdir -p $(dirname '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + }, + `/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh' '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh'\nbash /tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh`, + ]), + ], + }, + }, + }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts b/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts index 816ec91f0..7bac46d59 100644 --- a/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts +++ b/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts @@ -4,42 +4,38 @@ */ import { - arrayWith, - countResources, - expect as cdkExpect, - haveResource, - haveResourceLike, - objectLike, -} from '@aws-cdk/assert'; + App, + Names, + Size, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { InstanceType, SecurityGroup, SubnetType, Volume, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Key, -} from '@aws-cdk/aws-kms'; +} from 'aws-cdk-lib/aws-kms'; import { RetentionDays, -} from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-logs'; import { PrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - App, - Names, - Size, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { MongoDbInstance, @@ -49,14 +45,11 @@ import { } from '../lib'; import { - CWA_ASSET_LINUX, + CWA_ASSET_LINUX, INSTALL_MONGODB_3_6_SCRIPT_LINUX, MONGODB_3_6_CONFIGURATION_SCRIPTS, MOUNT_EBS_SCRIPT_LINUX, } from './asset-constants'; import { testConstructTags, } from './tag-helpers'; -import { - escapeTokenRegex, -} from './token-regex-helpers'; describe('Test MongoDbInstance', () => { let app: App; @@ -106,23 +99,23 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResource('AWS::AutoScaling::AutoScalingGroup')); - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 1); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 'r5.large', - BlockDeviceMappings: arrayWith( - objectLike({ - Ebs: objectLike({ + BlockDeviceMappings: Match.arrayWith([ + Match.objectLike({ + Ebs: Match.objectLike({ Encrypted: true, }), }), - ), - })); + ]), + }); - cdkExpect(stack).to(haveResourceLike('AWS::Route53::RecordSet', { + Template.fromStack(stack).hasResourceProperties('AWS::Route53::RecordSet', { Name: hostname + '.' + zoneName + '.', - })); + }); - cdkExpect(stack).to(haveResourceLike('AWS::SecretsManager::Secret', { + Template.fromStack(stack).hasResourceProperties('AWS::SecretsManager::Secret', { Description: `Admin credentials for the MongoDB database ${Names.uniqueId(instance)}`, GenerateSecretString: { ExcludeCharacters: '\"()$\'', @@ -133,21 +126,28 @@ describe('Test MongoDbInstance', () => { RequireEachIncludedType: true, SecretStringTemplate: '{\"username\":\"admin\"}', }, - })); + }); - cdkExpect(stack).to(haveResourceLike('AWS::EC2::Volume', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Volume', { Encrypted: true, - Tags: arrayWith( - objectLike({ + Tags: Match.arrayWith([ + Match.objectLike({ Key: 'VolumeGrantAttach-6238D22B12', Value: '6238d22b121db8094cb816e2a49d2b61', }), - ), - })); + ]), + }); - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: objectLike({ - Statement: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ + { + Action: 'cloudformation:SignalResource', + Effect: 'Allow', + Resource: { + Ref: 'AWS::StackId', + }, + }, { Action: [ 'logs:CreateLogStream', @@ -200,7 +200,7 @@ describe('Test MongoDbInstance', () => { }, ':s3:::', { - Ref: CWA_ASSET_LINUX.Bucket, + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, }, ], ], @@ -215,7 +215,7 @@ describe('Test MongoDbInstance', () => { }, ':s3:::', { - Ref: CWA_ASSET_LINUX.Bucket, + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, }, '/*', ], @@ -223,6 +223,38 @@ describe('Test MongoDbInstance', () => { }, ], }, + { + Action: [ + 'ssm:DescribeParameters', + 'ssm:GetParameters', + 'ssm:GetParameter', + 'ssm:GetParameterHistory', + ], + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':ssm:', + { + Ref: 'AWS::Region', + }, + ':', + { + Ref: 'AWS::AccountId', + }, + ':parameter/', + { + Ref: Match.stringLikeRegexp('^MongoDbInstanceStringParameter.*'), + }, + ], + ], + }, + }, { Action: [ 'secretsmanager:GetSecretValue', @@ -269,7 +301,7 @@ describe('Test MongoDbInstance', () => { ], Effect: 'Allow', Resource: { - Ref: 'ServerCertPassphraseE4C3CB38', + Ref: Match.stringLikeRegexp('^ServerCertPassphrase.*'), }, }, { @@ -279,114 +311,169 @@ describe('Test MongoDbInstance', () => { ], Effect: 'Allow', Resource: { - Ref: 'MongoDbInstanceAdminUser54147F2B', + Ref: Match.stringLikeRegexp('^MongoDbInstanceAdminUser.*'), }, }, - - ), + ]), }), - })); + }); - cdkExpect(stack).to(haveResourceLike('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: '/renderfarm/MongoDbInstance', - })); + }); const cloudInitLogPath = '/var/log/cloud-init-output.log'; const cloudInitLogPrefix = 'cloud-init-output'; const mongoLogPath = '/var/log/mongodb/mongod.log'; const mongoLogPrefix = 'MongoDB'; - cdkExpect(stack).to(haveResourceLike('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Description: 'config file for Repository logs config', - Value: objectLike({ - 'Fn::Join': arrayWith( - arrayWith( - '\",\"log_stream_name\":\"' + cloudInitLogPrefix + '-{instance_id}\",\"file_path\":\"' + cloudInitLogPath + '\",' + + Value: { + 'Fn::Join': [ + '', + Match.arrayWith([ + `\",\"log_stream_name\":\"${cloudInitLogPrefix}-{instance_id}\",\"file_path\":\"${cloudInitLogPath}\",` + '\"timezone\":\"Local\"},{\"log_group_name\":\"', - '\",\"log_stream_name\":\"' + mongoLogPrefix + '-{instance_id}\",\"file_path\":\"' + mongoLogPath + '\"' + + `\",\"log_stream_name\":\"${mongoLogPrefix}-{instance_id}\",\"file_path\":\"${mongoLogPath}\"` + ',\"timezone\":\"Local\"}]}},\"log_stream_name\":\"DefaultLogStream-{instance_id}\",\"force_flush_interval\":15}}', - ), - ), - }), - })); - - const userData = instance.userData.render(); - const token = '${Token[TOKEN.\\d+]}'; - - // Make sure we add signal on exit - const exitTrap = '#!/bin/bash\n' + - 'function exitTrap(){\n' + - 'exitCode=$?\n' + - '/opt/aws/bin/cfn-signal --stack Stack --resource MongoDbInstanceServerAsgASG2643AD1D --region ' + token + - ' -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n' + - 'test \"${MONGO_SETUP_DIR} != \"\" && sudo umount \"${MONGO_SETUP_DIR}\n' + - '}'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(exitTrap))); - - const callExitTrap = 'trap exitTrap EXIT'; - expect(userData).toMatch(new RegExp(callExitTrap)); - - const settings = 'set -xefuo pipefail'; - expect(userData).toMatch(new RegExp(settings)); - - const createTempDir = 'mkdir -p $\\(dirname \'/tmp/' + token + token + '\'\\)\n'; - const s3Copy = 'aws s3 cp \'s3://' + token + '/' + token + token + '\' \'/tmp/' + token + token + '\'\n'; - - // CloudWatch Agent - const setE = 'set -e\n'; - const setChmod = 'chmod \\+x \'/tmp/' + token + token + '\'\n'; - const execute = '\'/tmp/' + token + token + '\' -i ${Token[AWS.Region.\\d+]} ' + token + '\n'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(createTempDir + s3Copy + setE + setChmod + execute))); - - // Make sure we mount EBS volume - const mount = 'TMPDIR=$\\(mktemp -d\\)\n' + - 'pushd \"$TMPDIR\"\n' + - 'unzip /tmp/' + token + token + '\n' + - 'bash ./mountEbsBlockVolume.sh ' + token + ' xfs /var/lib/mongo rw \"\"\n' + - 'popd\n' + - 'rm -f /tmp/' + token + token; - expect(userData).toMatch(new RegExp(escapeTokenRegex(createTempDir + s3Copy + mount))); - - // install mongodb - const bashCmd = 'bash /tmp/' + token + token; - expect(userData).toMatch(new RegExp(escapeTokenRegex(createTempDir + s3Copy + bashCmd))); - - // configureMongoDb - const monogdbConfig = 'which mongod && test -f /etc/mongod.conf\n' + - 'sudo service mongod stop\n' + - 'MONGO_SETUP_DIR=$\\(mktemp -d\\)\n' + - 'mkdir -p \"${MONGO_SETUP_DIR}\"\n' + - 'sudo mount -t tmpfs -o size=50M tmpfs \"${MONGO_SETUP_DIR}\"\n' + - 'pushd \"${MONGO_SETUP_DIR}\"\n' + - 'unzip /tmp/' + token + token + '\n' + - 'cp /etc/mongod.conf .'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(createTempDir + s3Copy + monogdbConfig))); - - // Getting the server certificate - const serverCertCmd = 'bash serverCertFromSecrets.sh \\"' + token + '\\" \\"' + token + '\\" \\"' + token + '\\" \\"' + token + '\\"'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(serverCertCmd))); - - // set mongodb certificates and credentials - const monogdbCredentials = 'sudo mkdir -p /etc/mongod_certs\n' + - 'sudo mv ./ca.crt ./key.pem /etc/mongod_certs\n' + - 'sudo chown root.mongod -R /etc/mongod_certs/\n' + - 'sudo chmod 640 -R /etc/mongod_certs/\n' + - 'sudo chmod 750 /etc/mongod_certs/\n' + - 'sudo chown mongod.mongod -R /var/lib/mongo\n' + - 'bash ./setMongoLimits.sh\n' + - 'bash ./setStoragePath.sh \"/var/lib/mongo\"\n' + - 'bash ./setMongoNoAuth.sh\n' + - 'sudo service mongod start\n' + - 'bash ./setAdminCredentials.sh \"' + token + '\"'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(monogdbCredentials))); - - // Setup for live deployment, and start mongod - const startMongo = 'sudo service mongod stop\n' + - 'bash ./setLiveConfiguration.sh\n' + - 'sudo systemctl enable mongod\n' + - 'sudo service mongod start\n' + - 'popd'; - expect(userData).toMatch(new RegExp(escapeTokenRegex(startMongo))); + ]), + ], + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + Match.arrayWith([ + // Make sure we add signal on exit + '#!/bin/bash\n' + + 'function exitTrap(){\n' + + 'exitCode=$?\n' + + '/opt/aws/bin/cfn-signal --stack Stack --resource MongoDbInstanceServerAsgASG2643AD1D --region ', + { + Ref: 'AWS::Region', + }, + ' -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n' + + 'test "${MONGO_SETUP_DIR}" != "" && sudo umount "${MONGO_SETUP_DIR}"\n' + + '}\n' + + // Set up the exit trap + 'trap exitTrap EXIT\n' + + // Script settings + 'set -xefuo pipefail\n' + + // Setup CloudWatch agent + `mkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\n` + + 'aws s3 cp \'s3://', + { + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, + }, + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh' -i `, + { + Ref: 'AWS::Region', + }, + ' ', + { + Ref: Match.stringLikeRegexp('^MongoDbInstanceStringParameter.*'), + }, + // Make sure we mount the EBS Volume + `\nmkdir -p $(dirname '/tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip')\n` + + 'aws s3 cp \'s3://', + { + 'Fn::Sub': MOUNT_EBS_SCRIPT_LINUX.Bucket, + }, + `/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip' '/tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip'\n` + + 'TMPDIR=$(mktemp -d)\n' + + 'pushd "$TMPDIR"\n' + + `unzip /tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip\n` + + 'bash ./mountEbsBlockVolume.sh ', + { + Ref: Match.stringLikeRegexp('^MongoDbInstanceMongoDbData.*'), + }, + ' xfs /var/lib/mongo rw ""\n' + + 'popd\n' + + `rm -f /tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip\n` + + // Install MongoDB + `mkdir -p $(dirname '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh')\n` + + 'aws s3 cp \'s3://', + { + 'Fn::Sub': INSTALL_MONGODB_3_6_SCRIPT_LINUX.Bucket, + }, + `/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh' '/tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh'\n` + + `bash /tmp/${INSTALL_MONGODB_3_6_SCRIPT_LINUX.Key}.sh\n` + + // Fetching the MongoDB configuration scripts + `mkdir -p $(dirname '/tmp/${MONGODB_3_6_CONFIGURATION_SCRIPTS.Key}.zip')\n` + + 'aws s3 cp \'s3://', + { + 'Fn::Sub': MONGODB_3_6_CONFIGURATION_SCRIPTS.Bucket, + }, + `/${MONGODB_3_6_CONFIGURATION_SCRIPTS.Key}.zip' '/tmp/${MONGODB_3_6_CONFIGURATION_SCRIPTS.Key}.zip'\n` + + // Configure MongoDB + 'which mongod && test -f /etc/mongod.conf\n' + + 'sudo service mongod stop\n' + + 'MONGO_SETUP_DIR=$(mktemp -d)\n' + + 'mkdir -p "${MONGO_SETUP_DIR}"\n' + + 'sudo mount -t tmpfs -o size=50M tmpfs "${MONGO_SETUP_DIR}"\n' + + 'pushd "${MONGO_SETUP_DIR}"\n' + + `unzip /tmp/${MONGODB_3_6_CONFIGURATION_SCRIPTS.Key}.zip\n` + + 'cp /etc/mongod.conf .\n' + + // Getting the server certificate + 'bash serverCertFromSecrets.sh \"', + { + 'Fn::GetAtt': [ + 'ServerCert', + 'Cert', + ], + }, + '" "', + { + 'Fn::GetAtt': [ + 'ServerCert', + 'CertChain', + ], + }, + '" "', + { + 'Fn::GetAtt': [ + 'ServerCert', + 'Key', + ], + }, + '" "', + { + Ref: Match.stringLikeRegexp('^ServerCertPassphrase.*'), + }, + '"\n' + + // Set mongodb certificates and credentials + 'sudo mkdir -p /etc/mongod_certs\n' + + 'sudo mv ./ca.crt ./key.pem /etc/mongod_certs\n' + + 'sudo chown root.mongod -R /etc/mongod_certs/\n' + + 'sudo chmod 640 -R /etc/mongod_certs/\n' + + 'sudo chmod 750 /etc/mongod_certs/\n' + + 'sudo chown mongod.mongod -R /var/lib/mongo\n' + + 'bash ./setMongoLimits.sh\n' + + 'bash ./setStoragePath.sh "/var/lib/mongo"\n' + + 'bash ./setMongoNoAuth.sh\n' + + 'sudo service mongod start\n' + + 'bash ./setAdminCredentials.sh \"', + { + Ref: Match.stringLikeRegexp('^MongoDbInstanceAdminUser.*'), + }, + '"\n' + + // Setup for live deployment, and start mongod + 'sudo service mongod stop\n' + + 'bash ./setLiveConfiguration.sh\n' + + 'sudo systemctl enable mongod\n' + + 'sudo service mongod start\n' + + 'popd', + ]), + ], + }, + }, + }); // Make sure all the required public members are set expect(instance.version).toBe(version); @@ -449,9 +536,9 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: expectedInstanceType, - })); + }); }); test('allowing ssh connection with key name', () => { @@ -472,9 +559,9 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { KeyName: expectedKeyName, - })); + }); }); test('using custom admin user works correctly', () => { @@ -530,7 +617,7 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(countResources('AWS::EC2::SecurityGroup', 1)); + Template.fromStack(stack).resourceCountIs('AWS::EC2::SecurityGroup', 1); }); test('setting role works correctly', () => { @@ -581,7 +668,7 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(countResources('AWS::EC2::Volume', 1)); + Template.fromStack(stack).resourceCountIs('AWS::EC2::Volume', 1); }); test('setting custom encryption key for data volume works correctly', () => { @@ -609,14 +696,14 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::EC2::Volume', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Volume', { Encrypted: true, - KmsKeyId: objectLike({ - 'Fn::GetAtt': arrayWith( + KmsKeyId: Match.objectLike({ + 'Fn::GetAtt': Match.arrayWith([ 'Key961B73FD', - ), + ]), }), - })); + }); }); test('setting custom size for data volume works correctly', () => { @@ -641,9 +728,9 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::EC2::Volume', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Volume', { Size: volumeSize, - })); + }); }); test('setting LogGroup bucket name enables export to S3', () => { @@ -665,11 +752,11 @@ describe('Test MongoDbInstance', () => { }, }); - cdkExpect(stack).to(haveResource('AWS::Events::Rule', { - Targets: arrayWith(objectLike({ + Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { + Targets: Match.arrayWith([Match.objectLike({ Input: '{\"BucketName\":\"' + bucketName + '\",\"ExportFrequencyInHours\":1,\"LogGroupName\":\"/renderfarm/MongoDbInstance\",\"RetentionInHours\":72}', - })), - })); + })]), + }); }); test.each([ @@ -695,9 +782,9 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: testPrefix + id, - })); + }); }); test('is created with correct LogGroup retention', () => { @@ -720,9 +807,9 @@ describe('Test MongoDbInstance', () => { }); // THEN - cdkExpect(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: retention, - })); + }); }); test('adds security group', () => { @@ -745,9 +832,9 @@ describe('Test MongoDbInstance', () => { instance.addSecurityGroup(securityGroup); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - SecurityGroups: arrayWith(stack.resolve(securityGroup.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + SecurityGroups: Match.arrayWith([stack.resolve(securityGroup.securityGroupId)]), + }); }); testConstructTags({ diff --git a/packages/aws-rfdk/lib/core/test/mongodb-post-install.test.ts b/packages/aws-rfdk/lib/core/test/mongodb-post-install.test.ts index 85e165493..83cb4d2f4 100644 --- a/packages/aws-rfdk/lib/core/test/mongodb-post-install.test.ts +++ b/packages/aws-rfdk/lib/core/test/mongodb-post-install.test.ts @@ -4,24 +4,22 @@ */ import { - expect as cdkExpect, - haveResource, - haveResourceLike, - ResourcePart, -} from '@aws-cdk/assert'; + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { PrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { ISecret, Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { MongoDbUsers, @@ -112,7 +110,7 @@ describe('MongoDbPostInstall', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'mongodb.configureMongo', Environment: { Variables: { @@ -138,12 +136,12 @@ describe('MongoDbPostInstall', () => { }, ], }, - })); + }); // Lambda role can get the required secrets. - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: [ + Statement: Match.arrayWith([ { Action: [ 'secretsmanager:GetSecretValue', @@ -183,11 +181,11 @@ describe('MongoDbPostInstall', () => { Effect: 'Allow', Resource: pwUser2Arn, }, - ], + ]), }, - })); + }); - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_MongoDbPostInstallSetup', { + Template.fromStack(stack).hasResource('Custom::RFDK_MongoDbPostInstallSetup', { Properties: { Connection: { Hostname: 'mongodb.testZone.internal', @@ -222,7 +220,7 @@ describe('MongoDbPostInstall', () => { 'MongoPostInstallLambdaServiceRoleDefaultPolicy8B1C1CE8', 'MongoPostInstallLambdaServiceRoleCD03B9B9', ], - }, ResourcePart.CompleteDefinition)); + }); }); test('created correctly: only password users', () => { @@ -240,7 +238,7 @@ describe('MongoDbPostInstall', () => { // THEN // Lambda role can get the required secrets. - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -284,9 +282,9 @@ describe('MongoDbPostInstall', () => { }, ], }, - })); + }); - cdkExpect(stack).to(haveResource('Custom::RFDK_MongoDbPostInstallSetup', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_MongoDbPostInstallSetup', { Connection: { Hostname: 'mongodb.testZone.internal', Port: '27017', @@ -304,7 +302,7 @@ describe('MongoDbPostInstall', () => { pwUser1Arn, pwUser2Arn, ], - })); + }); }); test('created correctly: only x509 users', () => { @@ -321,7 +319,7 @@ describe('MongoDbPostInstall', () => { }); // THEN - cdkExpect(stack).to(haveResource('Custom::RFDK_MongoDbPostInstallSetup', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_MongoDbPostInstallSetup', { Connection: { Hostname: 'mongodb.testZone.internal', Port: '27017', @@ -345,7 +343,7 @@ describe('MongoDbPostInstall', () => { Roles: x509User2.roles, }, ], - })); + }); }); test('use selected subnets', () => { @@ -364,7 +362,7 @@ describe('MongoDbPostInstall', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'mongodb.configureMongo', VpcConfig: { SubnetIds: [ @@ -373,7 +371,7 @@ describe('MongoDbPostInstall', () => { }, ], }, - })); + }); }); test('assert bad x509 role', () => { diff --git a/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts b/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts index 570ffd7f7..98bf3befb 100644 --- a/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts +++ b/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts @@ -4,9 +4,13 @@ */ import { - expect as cdkExpect, - haveResourceLike, -} from '@aws-cdk/assert'; + Size, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, Instance, @@ -15,11 +19,7 @@ import { Volume, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import { - Size, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { BlockVolumeFormat, @@ -69,9 +69,9 @@ describe('Test MountableBlockVolume', () => { // THEN // Make sure the instance role has the correct permissions to get & run the script - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: [ + Statement: Match.arrayWith([ { Effect: 'Allow', Action: 'ec2:DescribeVolumes', @@ -149,7 +149,7 @@ describe('Test MountableBlockVolume', () => { }, ':s3:::', { - Ref: MOUNT_EBS_SCRIPT_LINUX.Bucket, + 'Fn::Sub': MOUNT_EBS_SCRIPT_LINUX.Bucket, }, ], ], @@ -164,7 +164,7 @@ describe('Test MountableBlockVolume', () => { }, ':s3:::', { - Ref: MOUNT_EBS_SCRIPT_LINUX.Bucket, + 'Fn::Sub': MOUNT_EBS_SCRIPT_LINUX.Bucket, }, '/*', ], @@ -172,14 +172,14 @@ describe('Test MountableBlockVolume', () => { }, ], }, - ], + ]), }, - })); + }); // Make sure we download the mountEFS script asset bundle - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip' '/tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip'`; expect(userData).toMatch(new RegExp(escapeTokenRegex(s3Copy))); - expect(userData).toMatch(new RegExp(escapeTokenRegex('unzip /tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}'))); - // Make sure we execute the script with the correct args + expect(userData).toMatch(new RegExp(escapeTokenRegex(`unzip /tmp/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip`))); + // Make sure we run the script with the correct args expect(userData).toMatch(new RegExp(escapeTokenRegex('bash ./mountEbsBlockVolume.sh ${Token[TOKEN.\\d+]} xfs /mnt/fs rw'))); }); @@ -300,7 +300,7 @@ describe('Test MountableBlockVolume', () => { location: '/mnt/fs', }); const userData = instance.userData.render(); - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_EBS_SCRIPT_LINUX.Key}.zip'`; const regex = new RegExp(escapeTokenRegex(s3Copy), 'g'); const matches = userData.match(regex) ?? []; diff --git a/packages/aws-rfdk/lib/core/test/mountable-efs.test.ts b/packages/aws-rfdk/lib/core/test/mountable-efs.test.ts index 2be862a15..9e2babacc 100644 --- a/packages/aws-rfdk/lib/core/test/mountable-efs.test.ts +++ b/packages/aws-rfdk/lib/core/test/mountable-efs.test.ts @@ -4,11 +4,15 @@ */ import { - arrayWith, - expect as cdkExpect, - haveResourceLike, - objectLike, -} from '@aws-cdk/assert'; + Arn, + App, + CfnResource, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, Instance, @@ -16,14 +20,8 @@ import { MachineImage, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import * as efs from '@aws-cdk/aws-efs'; -import { - Arn, - App, - CfnResource, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as efs from 'aws-cdk-lib/aws-efs'; import { MountableEfs, @@ -34,6 +32,9 @@ import { MountPermissionsHelper, } from '../lib/mount-permissions-helper'; +import { + MOUNT_EFS_SCRIPT_LINUX, +} from './asset-constants'; import { escapeTokenRegex, } from './token-regex-helpers'; @@ -71,7 +72,7 @@ describe('Test MountableEFS', () => { // THEN // Make sure the instance has been granted ingress to the EFS's security group - cdkExpect(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 2049, ToPort: 2049, @@ -87,11 +88,11 @@ describe('Test MountableEFS', () => { 'GroupId', ], }, - })); + }); // Make sure we download the mountEfs script asset bundle - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_EFS_SCRIPT_LINUX.Key}.zip' '/tmp/${MOUNT_EFS_SCRIPT_LINUX.Key}.zip'`; expect(userData).toMatch(new RegExp(escapeTokenRegex(s3Copy))); - expect(userData).toMatch(new RegExp(escapeTokenRegex('unzip /tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}'))); + expect(userData).toMatch(new RegExp(escapeTokenRegex(`unzip /tmp/${MOUNT_EFS_SCRIPT_LINUX.Key}.zip`))); // Make sure we execute the script with the correct args expect(userData).toMatch(new RegExp(escapeTokenRegex('bash ./mountEfs.sh ${Token[TOKEN.\\d+]} /mnt/efs/fs1 false rw'))); }); @@ -216,9 +217,9 @@ describe('Test MountableEFS', () => { }); test('grants IAM access point permissions', () => { - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: objectLike({ - Statement: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ { Action: expectedActions.length === 1 ? expectedActions[0] : expectedActions, Condition: { @@ -229,14 +230,14 @@ describe('Test MountableEFS', () => { Effect: 'Allow', Resource: stack.resolve((efsFS.node.defaultChild as efs.CfnFileSystem).attrArn), }, - ), + ]), Version: '2012-10-17', }), - Roles: arrayWith( + Roles: Match.arrayWith([ // The Policy construct micro-optimizes the reference to a role in the same stack using its logical ID stack.resolve((instance.role.node.defaultChild as CfnResource).ref), - ), - })); + ]), + }); }); }); }); @@ -278,7 +279,7 @@ describe('Test MountableEFS', () => { location: '/mnt/efs/fs1', }); const userData = instance.userData.render(); - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_EFS_SCRIPT_LINUX.Key}.zip'`; const regex = new RegExp(escapeTokenRegex(s3Copy), 'g'); const matches = userData.match(regex) ?? []; @@ -326,20 +327,20 @@ describe('Test MountableEFS', () => { if (accessPoint) { expectedResources.push(stack.resolve(accessPoint?.accessPointArn)); } - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: objectLike({ - Statement: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ { Action: 'elasticfilesystem:DescribeMountTargets', Effect: 'Allow', Resource: expectedResources.length == 1 ? expectedResources[0] : expectedResources, }, - ), + ]), }), - Roles: arrayWith( + Roles: Match.arrayWith([ stack.resolve((instance.role.node.defaultChild as CfnResource).ref), - ), - })); + ]), + }); }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/mountable-fsx-lustre.test.ts b/packages/aws-rfdk/lib/core/test/mountable-fsx-lustre.test.ts index 53e67219e..a522c4753 100644 --- a/packages/aws-rfdk/lib/core/test/mountable-fsx-lustre.test.ts +++ b/packages/aws-rfdk/lib/core/test/mountable-fsx-lustre.test.ts @@ -4,9 +4,12 @@ */ import { - expect as cdkExpect, - haveResourceLike, -} from '@aws-cdk/assert'; + App, + Stack, +} from 'aws-cdk-lib'; +import { + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, Instance, @@ -15,18 +18,17 @@ import { SecurityGroup, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import * as fsx from '@aws-cdk/aws-fsx'; -import { - App, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import * as fsx from 'aws-cdk-lib/aws-fsx'; import { MountableFsxLustre, MountPermissions, } from '../lib'; +import { + MOUNT_FSX_SCRIPT_LINUX, +} from './asset-constants'; import { escapeTokenRegex, } from './token-regex-helpers'; @@ -81,17 +83,17 @@ describe('MountableFsxLustre', () => { // THEN // Make sure the instance has been granted ingress to the FSxL's security group - cdkExpect(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 988, ToPort: 1023, SourceSecurityGroupId: stack.resolve(instanceSecurityGroup.securityGroupId), GroupId: stack.resolve(fsSecurityGroup.securityGroupId), - })); + }); // Make sure we download the mountFsxLustre script asset bundle - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_FSX_SCRIPT_LINUX.Key}.zip' '/tmp/${MOUNT_FSX_SCRIPT_LINUX.Key}.zip'`; expect(userData).toMatch(new RegExp(escapeTokenRegex(s3Copy))); - expect(userData).toMatch(new RegExp(escapeTokenRegex('unzip /tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}'))); + expect(userData).toMatch(new RegExp(escapeTokenRegex(`unzip /tmp/${MOUNT_FSX_SCRIPT_LINUX.Key}.zip`))); // Make sure we install the Lustre client expect(userData).toMatch('bash ./installLustreClient.sh'); // Make sure we execute the script with the correct args @@ -172,7 +174,7 @@ describe('MountableFsxLustre', () => { location: '/mnt/fsx/fs1', }); const userData = instance.userData.render(); - const s3Copy = 'aws s3 cp \'s3://${Token[TOKEN.\\d+]}/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\''; + const s3Copy = `aws s3 cp 's3://\${Token[TOKEN.\\d+]}/${MOUNT_FSX_SCRIPT_LINUX.Key}.zip'`; const regex = new RegExp(escapeTokenRegex(s3Copy), 'g'); const matches = userData.match(regex) ?? []; diff --git a/packages/aws-rfdk/lib/core/test/pad-efs-storage.test.ts b/packages/aws-rfdk/lib/core/test/pad-efs-storage.test.ts index 32eb23ee4..90d8024f1 100644 --- a/packages/aws-rfdk/lib/core/test/pad-efs-storage.test.ts +++ b/packages/aws-rfdk/lib/core/test/pad-efs-storage.test.ts @@ -4,28 +4,27 @@ */ import { - arrayWith, - expect as cdkExpect, - haveResourceLike, - ResourcePart, -} from '@aws-cdk/assert'; + App, + CfnElement, + Size, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { SecurityGroup, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { AccessPoint, FileSystem as EfsFileSystem, -} from '@aws-cdk/aws-efs'; +} from 'aws-cdk-lib/aws-efs'; import { Function as LambdaFunction, -} from '@aws-cdk/aws-lambda'; -import { - App, - CfnElement, - Size, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; import { PadEfsStorage, } from '../lib/pad-efs-storage'; @@ -70,7 +69,7 @@ describe('Test PadEfsStorage', () => { const padFilesystem = pad.node.findChild('PadFilesystem') as LambdaFunction; // THEN - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { Properties: { FileSystemConfigs: [ { @@ -93,9 +92,9 @@ describe('Test PadEfsStorage', () => { ], }, }, - DependsOn: arrayWith(stack.getLogicalId(accessPoint.node.defaultChild as CfnElement)), - }, ResourcePart.CompleteDefinition)); - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + DependsOn: Match.arrayWith([stack.getLogicalId(accessPoint.node.defaultChild as CfnElement)]), + }); + Template.fromStack(stack).hasResource('AWS::Lambda::Function', { Properties: { FileSystemConfigs: [ { @@ -118,8 +117,8 @@ describe('Test PadEfsStorage', () => { ], }, }, - DependsOn: arrayWith(stack.getLogicalId(accessPoint.node.defaultChild as CfnElement)), - }, ResourcePart.CompleteDefinition)); + DependsOn: Match.arrayWith([stack.getLogicalId(accessPoint.node.defaultChild as CfnElement)]), + }); const lambdaRetryCatch = { Retry: [ @@ -141,7 +140,7 @@ describe('Test PadEfsStorage', () => { }, ], }; - cdkExpect(stack).to(haveResourceLike('AWS::StepFunctions::StateMachine', { + Template.fromStack(stack).hasResourceProperties('AWS::StepFunctions::StateMachine', { DefinitionString: stack.resolve(JSON.stringify({ StartAt: 'QueryDiskUsage', States: { @@ -217,9 +216,9 @@ describe('Test PadEfsStorage', () => { }, }, })), - })); + }); - cdkExpect(stack).to(haveResourceLike('Custom::AWS', { + Template.fromStack(stack).hasResourceProperties('Custom::AWS', { Create: { 'Fn::Join': [ '', @@ -252,7 +251,7 @@ describe('Test PadEfsStorage', () => { ], ], }, - })); + }); }); test('Set desiredPadding', () => { @@ -265,20 +264,20 @@ describe('Test PadEfsStorage', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::AWS', { + Template.fromStack(stack).hasResourceProperties('Custom::AWS', { Create: { 'Fn::Join': [ '', - arrayWith(`","input":"{\\"desiredPadding\\":${desiredPadding}}"}}`), + Match.arrayWith([`","input":"{\\"desiredPadding\\":${desiredPadding}}"}}`]), ], }, Update: { 'Fn::Join': [ '', - arrayWith(`","input":"{\\"desiredPadding\\":${desiredPadding}}"}}`), + Match.arrayWith([`","input":"{\\"desiredPadding\\":${desiredPadding}}"}}`]), ], }, - })); + }); }); test('Throws on bad desiredPadding', () => { @@ -290,14 +289,7 @@ describe('Test PadEfsStorage', () => { }); // THEN - expect(pad.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:error', - data: 'Failed to round desiredSize to an integer number of GiB. The size must be in GiB.', - }), - ]), - ); + Annotations.fromStack(stack).hasError(`/${pad.node.path}`, 'Failed to round desiredSize to an integer number of GiB. The size must be in GiB.'); }); test('Provide SecurityGroup', () => { @@ -315,18 +307,18 @@ describe('Test PadEfsStorage', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'pad-efs-storage.getDiskUsage', VpcConfig: { SecurityGroupIds: [ stack.resolve(sg.securityGroupId) ], }, - })); - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'pad-efs-storage.padFilesystem', VpcConfig: { SecurityGroupIds: [ stack.resolve(sg.securityGroupId) ], }, - })); + }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/script-assets.test.ts b/packages/aws-rfdk/lib/core/test/script-assets.test.ts index b82797f8d..f8dd9c45a 100644 --- a/packages/aws-rfdk/lib/core/test/script-assets.test.ts +++ b/packages/aws-rfdk/lib/core/test/script-assets.test.ts @@ -5,7 +5,11 @@ import * as path from 'path'; -import { expect as expectCDK, haveResource } from '@aws-cdk/assert'; +import { Stack } from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxImage, Instance, @@ -15,8 +19,7 @@ import { Vpc, WindowsImage, WindowsVersion, -} from '@aws-cdk/aws-ec2'; -import { Stack } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { ScriptAsset } from '../lib/script-assets'; @@ -54,9 +57,9 @@ describe('executeScriptAsset', () => { asset.executeOn({ host: instance }); // THEN - expectCDK(stack).to(haveResource('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: [ + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -72,7 +75,7 @@ describe('executeScriptAsset', () => { 'arn:', { Ref: 'AWS::Partition' }, ':s3:::', - { Ref: bucketKey }, + { 'Fn::Sub': bucketKey }, ], ], }, @@ -83,19 +86,19 @@ describe('executeScriptAsset', () => { 'arn:', { Ref: 'AWS::Partition' }, ':s3:::', - { Ref: bucketKey }, + { 'Fn::Sub': bucketKey }, '/*', ], ], }, ], }, - ], + ]), Version: '2012-10-17', }, PolicyName: 'instInstanceRoleDefaultPolicyCB9E402C', Roles: [ { Ref: 'instInstanceRoleFE783FB1' } ], - })); + }); }); test('downloads and executes script for linux', () => { @@ -116,135 +119,22 @@ describe('executeScriptAsset', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::EC2::Instance', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { UserData: { 'Fn::Base64': { 'Fn::Join': [ '', [ - "#!/bin/bash\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - { Ref: CWA_ASSET_LINUX.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, + `#!/bin/bash\nmkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, }, - "' arg1", + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\nset -e\nchmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh' arg1`, ], ], }, }, - })); + }); }); test('downloads and executes script for windows', () => { @@ -265,134 +155,22 @@ describe('executeScriptAsset', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::EC2::Instance', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { UserData: { 'Fn::Base64': { 'Fn::Join': [ '', [ - "mkdir (Split-Path -Path 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' ) -ea 0\nRead-S3Object -BucketName '", - { Ref: CWA_ASSET_WINDOWS.Bucket }, - "' -key '", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -file 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -ErrorAction Stop\n&'C:/temp/", + `mkdir (Split-Path -Path 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], + 'Fn::Sub': CWA_ASSET_WINDOWS.Bucket, }, - "' arg1\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "\"' -ErrorAction Stop }", + `' -key '${CWA_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' arg1\nif (!$?) { Write-Error 'Failed to execute the file "C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1"' -ErrorAction Stop }`, ], ], }, }, - })); + }); }); }); diff --git a/packages/aws-rfdk/lib/core/test/sessions-manager-helper.test.ts b/packages/aws-rfdk/lib/core/test/sessions-manager-helper.test.ts index cb9d2eb6e..108ed67bd 100644 --- a/packages/aws-rfdk/lib/core/test/sessions-manager-helper.test.ts +++ b/packages/aws-rfdk/lib/core/test/sessions-manager-helper.test.ts @@ -3,13 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { CfnElement, Stack } from 'aws-cdk-lib'; import { - expect as expectCDK, - haveResourceLike, -} from '@aws-cdk/assert'; + Template, +} from 'aws-cdk-lib/assertions'; import { AutoScalingGroup, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { AmazonLinuxImage, Instance, @@ -17,8 +17,7 @@ import { InstanceSize, InstanceType, Vpc, -} from '@aws-cdk/aws-ec2'; -import { CfnElement, Stack } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import { SessionManagerHelper } from '../lib'; @@ -42,7 +41,7 @@ test('Grant SSM permissions to Instance', () => { const instanceRole = stack.getLogicalId(instance.role.node.defaultChild as CfnElement); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -59,7 +58,7 @@ test('Grant SSM permissions to Instance', () => { ], }, Roles: [{ Ref: instanceRole }], - })); + }); }); test('Grant SSM permissions to ASG', () => { @@ -72,7 +71,7 @@ test('Grant SSM permissions to ASG', () => { const asgRole = stack.getLogicalId(asg.role.node.defaultChild as CfnElement); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -89,5 +88,5 @@ test('Grant SSM permissions to ASG', () => { ], }, Roles: [{ Ref: asgRole }], - })); + }); }); diff --git a/packages/aws-rfdk/lib/core/test/staticip-server.test.ts b/packages/aws-rfdk/lib/core/test/staticip-server.test.ts index f0a6564b3..505e06d74 100644 --- a/packages/aws-rfdk/lib/core/test/staticip-server.test.ts +++ b/packages/aws-rfdk/lib/core/test/staticip-server.test.ts @@ -4,27 +4,23 @@ */ import { - arrayWith, - countResources, - countResourcesLike, - expect as cdkExpect, - haveResourceLike, - objectLike, - ResourcePart, -} from '@aws-cdk/assert'; + App, + Duration, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, InstanceType, MachineImage, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; -import { - App, - Duration, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; import {StaticPrivateIpServer} from '../lib'; +import {resourcePropertiesCountIs} from './test-helper'; describe('Test StaticIpServer', () => { let stack: Stack; @@ -45,58 +41,68 @@ describe('Test StaticIpServer', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResource('AWS::AutoScaling::AutoScalingGroup', { Properties: { MinSize: '1', MaxSize: '1', - LifecycleHookSpecificationList: arrayWith(objectLike({ - DefaultResult: 'ABANDON', - HeartbeatTimeout: 120, - LifecycleHookName: 'NewStaticPrivateIpServer', - LifecycleTransition: 'autoscaling:EC2_INSTANCE_LAUNCHING', - NotificationMetadata: { - 'Fn::Join': arrayWith([ - '{\"eniId\":\"', - { - Ref: 'InstanceEniA230F5FE', - }, - '\"}', - ]), - }, - })), - Tags: arrayWith({ + LifecycleHookSpecificationList: Match.arrayWith([ + Match.objectLike({ + DefaultResult: 'ABANDON', + HeartbeatTimeout: 120, + LifecycleHookName: 'NewStaticPrivateIpServer', + LifecycleTransition: 'autoscaling:EC2_INSTANCE_LAUNCHING', + NotificationMetadata: { + 'Fn::Join': [ + '', + Match.arrayWith([ + '{"eniId":"', + { + Ref: 'InstanceEniA230F5FE', + }, + '"}', + ]), + ], + }, + }), + ]), + Tags: Match.arrayWith([{ Key: 'RfdkStaticPrivateIpServerGrantConditionKey', PropagateAtLaunch: true, Value: 'StackNameAttachEniToInstance83a5dca5db544aa485d28d419cdf85ceF20CDF73', - }), + }]), }, - DependsOn: arrayWith( + DependsOn: Match.arrayWith([ 'AttachEniToInstance83a5dca5db544aa485d28d419cdf85ceAttachEniNotificationTopicc8b1e9a6783c4954b191204dd5e3b9e0695D3E7F', // The SNS Topic Subscription; this is key. 'InstanceEniA230F5FE', // The NetWorkInterface. Also key. - ), - }, ResourcePart.CompleteDefinition)); + ]), + UpdatePolicy: { + AutoScalingScheduledAction: { + IgnoreUnmodifiedGroupSizeProperties: true, + }, + }, + }); - cdkExpect(stack).to(haveResourceLike('AWS::EC2::NetworkInterface', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::NetworkInterface', { Description: 'Static ENI for StackName/Instance', - GroupSet: arrayWith({ + GroupSet: Match.arrayWith([{ 'Fn::GetAtt': [ 'InstanceAsgInstanceSecurityGroup2DB1DA8B', 'GroupId', ], - }), - })); + }]), + }); - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'index.handler', Runtime: 'nodejs16.x', Description: 'Created by RFDK StaticPrivateIpServer to process instance launch lifecycle events in stack \'StackName\'. This lambda attaches an ENI to newly launched instances.', - })); + }); - cdkExpect(stack).to(haveResourceLike('AWS::SNS::Topic', { + Template.fromStack(stack).hasResourceProperties('AWS::SNS::Topic', { DisplayName: 'For RFDK instance-launch notifications for stack \'StackName\'', - })); + }); - cdkExpect(stack).to(haveResourceLike('AWS::SNS::Subscription', { + Template.fromStack(stack).hasResourceProperties('AWS::SNS::Subscription', { Protocol: 'lambda', TopicArn: { Ref: 'AttachEniNotificationTopicc8b1e9a6783c4954b191204dd5e3b9e0F5D22665', @@ -107,13 +113,13 @@ describe('Test StaticIpServer', () => { 'Arn', ], }, - })); + }); // The Lambda's policy should allow ENI attachment & condition-limited CompleteLifecycle. - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( - objectLike({ + Statement: Match.arrayWith([ + Match.objectLike({ Action: 'autoscaling:CompleteLifecycleAction', Effect: 'Allow', Condition: { @@ -142,7 +148,7 @@ describe('Test StaticIpServer', () => { ], }, }), - objectLike({ + Match.objectLike({ Effect: 'Allow', Action: [ 'ec2:DescribeNetworkInterfaces', @@ -150,14 +156,15 @@ describe('Test StaticIpServer', () => { ], Resource: '*', }), - ), + ]), }, - })); + }); // Count singleton objects - cdkExpect(stack).to(countResources('AWS::Lambda::Function', 2)); // Log retention & event handler. - cdkExpect(stack).to(countResources('AWS::SNS::Topic', 1)); - cdkExpect(stack).to(countResourcesLike('AWS::IAM::Role', 1, { + Template.fromStack(stack).resourceCountIs('AWS::Lambda::Function', 2); // Log retention & event handler. + Template.fromStack(stack).resourceCountIs('AWS::SNS::Topic', 1); + + resourcePropertiesCountIs(stack, 'AWS::IAM::Role', { AssumeRolePolicyDocument: { Statement: [ { @@ -169,8 +176,8 @@ describe('Test StaticIpServer', () => { }, ], }, - })); - cdkExpect(stack).to(countResourcesLike('AWS::IAM::Policy', 1, { + }, 1); + resourcePropertiesCountIs(stack, 'AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -182,7 +189,7 @@ describe('Test StaticIpServer', () => { }, ], }, - })); + }, 1); }); test('creates singleton resources', () => { @@ -200,18 +207,18 @@ describe('Test StaticIpServer', () => { // THEN // Make sure both ASGs are tagged to allow CompleteLifeCycle by the singleton lambda. - cdkExpect(stack).to(countResourcesLike('AWS::AutoScaling::AutoScalingGroup', 2, { - Tags: arrayWith({ + resourcePropertiesCountIs(stack, 'AWS::AutoScaling::AutoScalingGroup', { + Tags: Match.arrayWith([{ Key: 'RfdkStaticPrivateIpServerGrantConditionKey', PropagateAtLaunch: true, Value: 'StackNameAttachEniToInstance83a5dca5db544aa485d28d419cdf85ceF20CDF73', - }), - })); + }]), + }, 2); // Count singleton objects - cdkExpect(stack).to(countResources('AWS::Lambda::Function', 2)); // Log retention & event handler. - cdkExpect(stack).to(countResources('AWS::SNS::Topic', 1)); - cdkExpect(stack).to(countResourcesLike('AWS::IAM::Role', 1, { + Template.fromStack(stack).resourceCountIs('AWS::Lambda::Function', 2); // Log retention & event handler. + Template.fromStack(stack).resourceCountIs('AWS::SNS::Topic', 1); + resourcePropertiesCountIs(stack, 'AWS::IAM::Role', { AssumeRolePolicyDocument: { Statement: [ { @@ -223,7 +230,7 @@ describe('Test StaticIpServer', () => { }, ], }, - })); + }, 1); }); test('throw exception when no available subnets', () => { @@ -251,14 +258,14 @@ describe('Test StaticIpServer', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResource('AWS::AutoScaling::AutoScalingGroup', { CreationPolicy: { ResourceSignal: { Count: 1, Timeout: 'PT12H', }, }, - }, ResourcePart.CompleteDefinition)); + }); expect(() => { new StaticPrivateIpServer(stack, 'InstanceFail', { vpc, diff --git a/packages/aws-rfdk/lib/core/test/tag-helpers.ts b/packages/aws-rfdk/lib/core/test/tag-helpers.ts index 2a7f70de3..dcb24b3a6 100644 --- a/packages/aws-rfdk/lib/core/test/tag-helpers.ts +++ b/packages/aws-rfdk/lib/core/test/tag-helpers.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { - arrayWith, - countResourcesLike, - expect as expectCDK, -} from '@aws-cdk/assert'; import { Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + Match, +} from 'aws-cdk-lib/assertions'; + +import { resourcePropertiesCountIs } from './test-helper'; /** * The name of the tag that RFDK is expected to use @@ -67,18 +67,18 @@ export function resourceTagMatcher(resourceType: string, tagName: string, tagVal }; } else if (resourceType === 'AWS::AutoScaling::AutoScalingGroup') { return { - Tags: arrayWith({ + Tags: Match.arrayWith([{ Key: tagName, PropagateAtLaunch: true, Value: tagValue, - }), + }]), }; } else { return { - Tags: arrayWith({ + Tags: Match.arrayWith([{ Key: tagName, Value: tagValue, - }), + }]), }; } } @@ -137,6 +137,6 @@ export function testConstructTags(args: TestConstructTagsArgs) { const stack = createConstruct(); // THEN - expectCDK(stack).to(countResourcesLike(resourceType, expectedCount, expectedProps)); + resourcePropertiesCountIs(stack, resourceType, expectedProps, expectedCount); }); } \ No newline at end of file diff --git a/packages/aws-rfdk/lib/core/test/test-helper.ts b/packages/aws-rfdk/lib/core/test/test-helper.ts new file mode 100644 index 000000000..1b30c1b95 --- /dev/null +++ b/packages/aws-rfdk/lib/core/test/test-helper.ts @@ -0,0 +1,20 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; + + +// CDKv2's assertion module doesn't have a Template.resourcePropertiesCountIs that would count +// the number of resources with the given properties. We add that here. +export function resourcePropertiesCountIs(stack: Stack, type: string, props: any, count: number): void { + const resources = Template.fromStack(stack).findResources(type, Match.objectLike({ Properties: props })); + expect(Object.keys(resources)).toHaveLength(count); +} \ No newline at end of file diff --git a/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts b/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts index 9c491bc90..8e29e1df0 100644 --- a/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts +++ b/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts @@ -4,19 +4,20 @@ */ import { - anything, - expect as expectCDK, - haveResource, - haveResourceLike, - InspectionFailure, -} from '@aws-cdk/assert'; + Lazy, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; -import { Key } from '@aws-cdk/aws-kms'; -import { CfnSecret } from '@aws-cdk/aws-secretsmanager'; -import { Stack } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; +import { Key } from 'aws-cdk-lib/aws-kms'; +import { CfnSecret } from 'aws-cdk-lib/aws-secretsmanager'; import { X509CertificatePem, @@ -31,33 +32,32 @@ test('Generate cert', () => { const cert = new X509CertificatePem(stack, 'Cert', { subject, }); - const certPassphraseID = stack.getLogicalId(cert.passphrase.node.defaultChild as CfnSecret); // Expect the custom resource for cert generation - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509Generator', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { DistinguishedName: { CN: 'testCN', O: 'AWS', OU: 'Thinkbox', }, - })); + }); // Cannot have a CertificateValidFor property if not given one. Adding one // would cause existing certificates to be re-generated on re-deploy, and thus // risk breaking customer's setups. - expectCDK(stack).notTo(haveResourceLike('Custom::RFDK_X509Generator', { - CertificateValidFor: anything(), + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', Match.not({ + CertificateValidFor: Match.anyValue(), })); // Expect the resource for converting to PKCS #12 not to be created - expectCDK(stack).notTo(haveResource('Custom::RFDK_X509_PKCS12')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509_PKCS12', 0); // Expect the DynamoDB table used for custom resource tracking - expectCDK(stack).to(haveResource('AWS::DynamoDB::Table')); - // Expect a Secret used to store the cert - expectCDK(stack).to(haveResource('AWS::SecretsManager::Secret')); + Template.fromStack(stack).resourceCountIs('AWS::DynamoDB::Table', 1); + // Expect a Secret used to store the cert passphrase + Template.fromStack(stack).resourceCountIs('AWS::SecretsManager::Secret', 1); // Expect a policy that can interact with DynamoDB and SecretsManager - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: [ - { + Statement: Match.arrayWith([ + Match.objectLike({ Action: [ 'dynamodb:BatchGetItem', 'dynamodb:GetRecords', @@ -70,21 +70,22 @@ test('Generate cert', () => { 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', + 'dynamodb:DescribeTable', ], - }, - { + }), + Match.objectLike({ Action: 'dynamodb:DescribeTable', - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', ], Resource: { - Ref: certPassphraseID, + Ref: Match.stringLikeRegexp('^CertPassphrase.*'), }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:CreateSecret', 'secretsmanager:DeleteSecret', @@ -96,43 +97,31 @@ test('Generate cert', () => { 'secretsmanager:ResourceTag/X509SecretGrant-F53F5427': 'f53f5427b2e9eb4739661fcc0b249b6e', }, }, - }, - ], + }), + ]), }, - })); + }); // Expect no KMS key for encryption - expectCDK(stack).notTo(haveResource('AWS::KMS::Key')); + Template.fromStack(stack).resourceCountIs('AWS::KMS::Key', 0); // Expect Lambda for doing the cert generation to use the generate() handler and openssl layer - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', (props: any, error: InspectionFailure): boolean => { - if (!props.Handler || props.Handler !== 'x509-certificate.generate') { - error.failureReason = 'x509-certificate.generate handler not found'; - error.resource = props.Handler; - return false; - } - // Our test for the correct openssl lambda layer does not include the version, so we use a filter - // function to do a partial match - const filterOpensslArn = (value: string) => { - return value.toString().includes('arn:aws:lambda:us-west-2:224375009292:layer:openssl-al2:'); - }; - if (!props.Layers - || !Array.isArray(props.Layers) - || Array.of(props.Layers).filter(filterOpensslArn).length === 0) { - error.failureReason = 'openssl Lambda Layer missing'; - error.resource = props.Layers; - return false; - } - if (!props.Environment - || !props.Environment.Variables - || !props.Environment.Variables.DATABASE) { - error.failureReason = 'DATABASE environment variable not set'; - error.resource = props.Environment?.Variables?.DATABASE; - return false; - } - return true; - })); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { + Handler: 'x509-certificate.generate', + Layers: Match.arrayWith([ + Match.stringLikeRegexp('^arn:aws:lambda:us-west-2:224375009292:layer:openssl-al2:.*'), + ]), + Environment: { + Variables: { + DATABASE: { + Ref: Match.stringLikeRegexp('^CertTable.*'), + }, + }, + }, + }); // Should not be any errors. - expect(cert.node.metadataEntry.length).toBe(0); + Annotations.fromStack(stack).hasNoInfo(`/${cert.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoWarning(`/${cert.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoError(`/${cert.node.path}`, Match.anyValue()); }); test('Generate cert, all options set', () => { @@ -144,19 +133,16 @@ test('Generate cert, all options set', () => { }; const encryptionKey = new Key(stack, 'Key'); const signingCertificate = new X509CertificatePem(stack, 'SigningCert', { subject }); - const signingCertPassphraseID = stack.getLogicalId(signingCertificate.passphrase.node.defaultChild as CfnSecret); - const cert = new X509CertificatePem(stack, 'Cert', { + new X509CertificatePem(stack, 'Cert', { subject, encryptionKey, signingCertificate, validFor: 3000, }); - const certPassphraseID = stack.getLogicalId(cert.passphrase.node.defaultChild as CfnSecret); - // Expect the custom resource for cert generation - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509Generator', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { DistinguishedName: { CN: 'testCN', O: 'testO', @@ -176,25 +162,19 @@ test('Generate cert, all options set', () => { ], }, Passphrase: { - Ref: signingCertPassphraseID, + Ref: Match.stringLikeRegexp('^SigningCertPassphrase.*'), }, CertChain: '', }, CertificateValidFor: '3000', - })); + }); // Expect the resource for converting to PKCS #12 not to be created - expectCDK(stack).notTo(haveResource('Custom::RFDK_X509_PKCS12')); - // Expect the DynamoDB table used for custom resource tracking - expectCDK(stack).to(haveResource('AWS::DynamoDB::Table')); - // Expect a Secret used to store the cert - expectCDK(stack).to(haveResource('AWS::SecretsManager::Secret')); - // Expect a KMS key for encryption - expectCDK(stack).to(haveResource('AWS::KMS::Key')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509_PKCS12', 0); // Expect a policy that can interact with DynamoDB and SecretsManager for the signing cert's custom resource - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: [ - { + Statement: Match.arrayWith([ + Match.objectLike({ Action: [ 'dynamodb:BatchGetItem', 'dynamodb:GetRecords', @@ -207,28 +187,29 @@ test('Generate cert, all options set', () => { 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', + 'dynamodb:DescribeTable', ], - }, - { + }), + Match.objectLike({ Action: 'dynamodb:DescribeTable', - }, - { + }), + Match.objectLike({ Action: [ 'kms:Encrypt', 'kms:ReEncrypt*', 'kms:GenerateDataKey*', ], - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', ], Resource: { - Ref: certPassphraseID, + Ref: Match.stringLikeRegexp('^CertPassphrase.*'), }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:CreateSecret', 'secretsmanager:DeleteSecret', @@ -240,8 +221,8 @@ test('Generate cert, all options set', () => { 'secretsmanager:ResourceTag/X509SecretGrant-B2B09A60': 'b2b09a6086e87fe14005f4e0b800e4f0', }, }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -252,8 +233,8 @@ test('Generate cert, all options set', () => { 'Cert', ], }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -264,8 +245,8 @@ test('Generate cert, all options set', () => { 'Key', ], }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -273,15 +254,15 @@ test('Generate cert, all options set', () => { Resource: { Ref: 'SigningCertPassphrase42F0BC4F', }, - }, - ], + }), + ]), }, - })); + }); // Expect a policy that can interact with DynamoDB and SecretsManager for the cert's custom resource - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: { - Statement: [ - { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ + Match.objectLike({ Action: [ 'dynamodb:BatchGetItem', 'dynamodb:GetRecords', @@ -294,21 +275,22 @@ test('Generate cert, all options set', () => { 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', + 'dynamodb:DescribeTable', ], - }, - { + }), + Match.objectLike({ Action: 'dynamodb:DescribeTable', - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', ], Resource: { - Ref: signingCertPassphraseID, + Ref: Match.stringLikeRegexp('^SigningCertPassphrase.*'), }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:CreateSecret', 'secretsmanager:DeleteSecret', @@ -320,14 +302,14 @@ test('Generate cert, all options set', () => { 'secretsmanager:ResourceTag/X509SecretGrant-BA0FA489': 'ba0fa4898b2088c5b25f15075f605300', }, }, - }, - ], - }, - })); + }), + ]), + }), + }); // Expect Lambda for doing the cert generation to use the generate() handler - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'x509-certificate.generate', - })); + }); }); test('Grant cert read', () => { @@ -344,15 +326,15 @@ test('Grant cert read', () => { cert.grantCertRead(grantable); // Expect the custom resource to be created - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509Generator', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { DistinguishedName: { CN: 'testCN', O: 'AWS', OU: 'Thinkbox', }, - })); + }); // Expect the grantCertRead() to add this policy - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -370,12 +352,12 @@ test('Grant cert read', () => { }, ], }, - })); + }); // Expect the grantCertRead() not to add this full read policy - expectCDK(stack).notTo(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', Match.not({ PolicyDocument: { - Statement: [ - { + Statement: Match.arrayWith([ + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { @@ -384,8 +366,8 @@ test('Grant cert read', () => { 'Cert', ], }, - }, - { + }), + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { @@ -394,19 +376,19 @@ test('Grant cert read', () => { 'Key', ], }, - }, - { + }), + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { Ref: certPassphraseID, }, - }, - ], + }), + ]), }, })); // Expect the PKCS #12 generator not to be created - expectCDK(stack).notTo(haveResource('Custom::RFDK_X509_PKCS12')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509_PKCS12', 0); }); test('Grant full read', () => { @@ -423,18 +405,18 @@ test('Grant full read', () => { cert.grantFullRead(grantable); // Expect the custom resource to be created - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509Generator', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { DistinguishedName: { CN: 'testCN', O: 'AWS', OU: 'Thinkbox', }, - })); + }); // Expect the grantFullRead() to add this policy - expectCDK(stack).notTo(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', Match.not({ PolicyDocument: { - Statement: [ - { + Statement: Match.arrayWith([ + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { @@ -443,8 +425,8 @@ test('Grant full read', () => { 'Cert', ], }, - }, - { + }), + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { @@ -453,19 +435,19 @@ test('Grant full read', () => { 'Key', ], }, - }, - { + }), + Match.objectLike({ Action: 'secretsmanager:GetSecretValue', Effect: 'Allow', Resource: { Ref: certPassphraseID, }, - }, - ], + }), + ]), }, })); // Expect the PKCS #12 generator not to be created - expectCDK(stack).notTo(haveResource('Custom::RFDK_X509_PKCS12')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509_PKCS12', 0); }); test('Validating expiry', () => { @@ -480,24 +462,28 @@ test('Validating expiry', () => { }); // THEN - expect(cert.node.metadataEntry.length).toBe(1); + Annotations.fromStack(stack).hasError(`/${cert.node.path}`, 'Certificates must be valid for at least one day.'); }); test('Validating expiry with token', () => { // GIVEN const stack = new Stack(undefined, 'Stack', { env: { region: 'us-west-2' } }); const subject = { cn: 'testCN' }; - // A numeric CDK token (see: https://docs.aws.amazon.com/cdk/latest/guide/tokens.html#tokens_number) - const CDK_NUMERIC_TOKEN = -1.8881545897087626e+289; // WHEN const cert = new X509CertificatePem(stack, 'Cert', { subject, - validFor: CDK_NUMERIC_TOKEN, + validFor: Lazy.number({ + produce() { + return 0; + }, + }), }); // THEN - expect(cert.node.metadataEntry.length).toBe(0); + Annotations.fromStack(stack).hasNoInfo(`/${cert.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoWarning(`/${cert.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoError(`/${cert.node.path}`, Match.anyValue()); }); test('Convert to PKCS #12', () => { @@ -510,7 +496,7 @@ test('Convert to PKCS #12', () => { const pkcs12CertPassphraseID = stack.getLogicalId(pkcs12Cert.passphrase.node.defaultChild as CfnSecret); // Expect the PKCS #12 custom resource - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509_PKCS12', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509_PKCS12', { Passphrase: { Ref: 'CertPkcs12Passphrase1E3DF360', }, @@ -541,11 +527,11 @@ test('Convert to PKCS #12', () => { Ref: certPassphraseID, }, }, - })); + }); // Expect the source certificate (custom resource) - expectCDK(stack).to(haveResource('Custom::RFDK_X509Generator')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509Generator', 1); // Expect the PKCS #12 to have a password secret - expectCDK(stack).to(haveResourceLike('AWS::SecretsManager::Secret', { + Template.fromStack(stack).hasResourceProperties('AWS::SecretsManager::Secret', { Description: 'Passphrase for the private key of the X509Certificate CertPkcs12', GenerateSecretString: { ExcludeCharacters: '"()$\'', @@ -554,12 +540,12 @@ test('Convert to PKCS #12', () => { PasswordLength: 24, RequireEachIncludedType: true, }, - })); + }); // Expect the PKCS #12 resource to have a policy with access to the X.509 resource - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: { - Statement: [ - { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ + Match.objectLike({ Action: [ 'dynamodb:BatchGetItem', 'dynamodb:GetRecords', @@ -572,12 +558,13 @@ test('Convert to PKCS #12', () => { 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', + 'dynamodb:DescribeTable', ], - }, - { + }), + Match.objectLike({ Action: 'dynamodb:DescribeTable', - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -585,8 +572,8 @@ test('Convert to PKCS #12', () => { Resource: { Ref: pkcs12CertPassphraseID, }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:CreateSecret', 'secretsmanager:DeleteSecret', @@ -598,8 +585,8 @@ test('Convert to PKCS #12', () => { 'secretsmanager:ResourceTag/X509SecretGrant-71090F78': '71090f7809ce64f7c970cb645d4d473c', }, }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -611,8 +598,8 @@ test('Convert to PKCS #12', () => { 'Cert', ], }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -624,8 +611,8 @@ test('Convert to PKCS #12', () => { 'Key', ], }, - }, - { + }), + Match.objectLike({ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -634,16 +621,16 @@ test('Convert to PKCS #12', () => { Resource: { Ref: certPassphraseID, }, - }, - ], - }, - })); + }), + ]), + }), + }); // Expect no KMS key - expectCDK(stack).notTo(haveResource('AWS::KMS::Key')); + Template.fromStack(stack).resourceCountIs('AWS::KMS::Key', 0); // Expect the Lambda for converting the PEM to PKCS 12 - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'x509-certificate.convert', - })); + }); }); test('Convert to PKCS #12, use KMS', () => { @@ -659,7 +646,7 @@ test('Convert to PKCS #12, use KMS', () => { }); // Expect the PKCS #12 custom resource - expectCDK(stack).to(haveResourceLike('Custom::RFDK_X509_PKCS12', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509_PKCS12', { Passphrase: { Ref: 'CertPkcs12Passphrase1E3DF360', }, @@ -690,11 +677,11 @@ test('Convert to PKCS #12, use KMS', () => { Ref: certPassphraseID, }, }, - })); + }); // Expect the source certificate (custom resource) - expectCDK(stack).to(haveResource('Custom::RFDK_X509Generator')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509Generator', 1); // Expect the PKCS #12 to have a password secret - expectCDK(stack).to(haveResourceLike('AWS::SecretsManager::Secret', { + Template.fromStack(stack).hasResourceProperties('AWS::SecretsManager::Secret', { Description: 'Passphrase for the private key of the X509Certificate CertPkcs12', GenerateSecretString: { ExcludeCharacters: '"()$\'', @@ -703,11 +690,11 @@ test('Convert to PKCS #12, use KMS', () => { PasswordLength: 24, RequireEachIncludedType: true, }, - })); + }); // Expect a KMS key for encryption - expectCDK(stack).to(haveResource('AWS::KMS::Key')); + Template.fromStack(stack).resourceCountIs('AWS::KMS::Key', 1); // Expect the Lambda for converting the PEM to PKCS #12 - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'x509-certificate.convert', - })); + }); }); diff --git a/packages/aws-rfdk/lib/deadline/README.md b/packages/aws-rfdk/lib/deadline/README.md index 07d05fa5c..d5956bc4a 100644 --- a/packages/aws-rfdk/lib/deadline/README.md +++ b/packages/aws-rfdk/lib/deadline/README.md @@ -199,11 +199,11 @@ The following example outlines how to construct a `RenderQueue`: const version = new VersionQuery(stack, 'Version', { version: '1.2.3.4', }); -const images = new ThinkboxDockerImages(stack, 'Images', { - version: version, - // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - // of the AWS Thinkbox End User License Agreement - userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, +const images = new ThinkboxDockerImages(stack, 'Image', { + version, + // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + // of the AWS Customer Agreement and AWS Intellectual Property License. + userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, }); const repository = new Repository(stack, 'Repository', { /* ...*/}); @@ -566,10 +566,11 @@ simplifies using these images. --- -_**Note:** Deadline is licensed under the terms of the -[AWS Thinkbox End User License Agreement](https://www.awsthinkbox.com/end-user-license-agreement). Users of -`ThinkboxDockerImages` must explicitly signify their acceptance of the terms of the AWS Thinkbox EULA through -`userAwsThinkboxEulaAcceptance` property. By default, `userAwsThinkboxEulaAcceptance` is set to rejection._ +_**Note:** By downloading or using the Deadline software, you agree to the [AWS Customer Agreement](https://aws.amazon.com/agreement/) + and [AWS Intellectual Property License](https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + is AWS Content as defined in those Agreements. Users of `ThinkboxDockerImages` must explicitly signify their acceptance of these terms + through the `userAwsCustomerAgreementAndIpLicenseAcceptance` property. By default, `userAwsCustomerAgreementAndIpLicenseAcceptance` is + set to reject these terms._ --- @@ -578,10 +579,10 @@ To use it, simply create one: ```ts // This will provide Docker container images for the latest Deadline release -const images = new ThinkboxDockerImages(scope, 'Images', { - // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - // of the AWS Thinkbox End User License Agreement - userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, +const images = new ThinkboxDockerImages(stack, 'Image', { + // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + // of the AWS Customer Agreement and AWS Intellectual Property License. + userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, }); ``` @@ -594,12 +595,13 @@ const version = new VersionQuery(scope, 'Version', { }); // This will provide Docker container images for the specified version of Deadline -const images = new ThinkboxDockerImages(scope, 'Images', { - version: version, - // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - // of the AWS Thinkbox End User License Agreement - userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, +const images = new ThinkboxDockerImages(stack, 'Image', { + version, + // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + // of the AWS Customer Agreement and AWS Intellectual Property License. + userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, }); + ``` To use these images, you can use the expressive methods or provide the instance directly to downstream constructs: @@ -648,13 +650,14 @@ The following example outlines how to construct `UsageBasedLicensing`: ```ts const version = new VersionQuery(stack, 'Version', '1.2.3.4'); -const images = new ThinkboxDockerImages(stack, 'Images', { - version: version, - // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - // of the AWS Thinkbox End User License Agreement - userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, +const images = new ThinkboxDockerImages(stack, 'Image', { + version, + // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + // of the AWS Customer Agreement and AWS Intellectual Property License. + userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, }); + const ubl = new UsageBasedLicensing(stack, 'UsageBasedLicensing', { vpc: vpc, renderQueue: renderQueue, diff --git a/packages/aws-rfdk/lib/deadline/lib/configure-spot-event-plugin.ts b/packages/aws-rfdk/lib/deadline/lib/configure-spot-event-plugin.ts index beaf22b74..2c1abd348 100644 --- a/packages/aws-rfdk/lib/deadline/lib/configure-spot-event-plugin.ts +++ b/packages/aws-rfdk/lib/deadline/lib/configure-spot-event-plugin.ts @@ -5,31 +5,31 @@ import * as path from 'path'; +import { + Annotations, + CustomResource, + Duration, + IResolvable, + Lazy, + Stack, +} from 'aws-cdk-lib'; import { IVpc, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Role, Policy, PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Code, Function as LambdaFunction, Runtime, -} from '@aws-cdk/aws-lambda'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { - Annotations, - Construct, - CustomResource, - Duration, - IResolvable, - Lazy, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; import { PluginSettings, @@ -123,15 +123,15 @@ export enum SpotEventPluginPreJobTaskMode { export enum SpotEventPluginDisplayInstanceStatus { DISABLED = 'Disabled', EXTRA_INFO_0 = 'ExtraInfo0', - EXTRA_INFO_1 = 'ExtraInfo0', - EXTRA_INFO_2 = 'ExtraInfo0', - EXTRA_INFO_3 = 'ExtraInfo0', - EXTRA_INFO_4 = 'ExtraInfo0', - EXTRA_INFO_5 = 'ExtraInfo0', - EXTRA_INFO_6 = 'ExtraInfo0', - EXTRA_INFO_7 = 'ExtraInfo0', - EXTRA_INFO_8 = 'ExtraInfo0', - EXTRA_INFO_9 = 'ExtraInfo0', + EXTRA_INFO_1 = 'ExtraInfo1', + EXTRA_INFO_2 = 'ExtraInfo2', + EXTRA_INFO_3 = 'ExtraInfo3', + EXTRA_INFO_4 = 'ExtraInfo4', + EXTRA_INFO_5 = 'ExtraInfo5', + EXTRA_INFO_6 = 'ExtraInfo6', + EXTRA_INFO_7 = 'ExtraInfo7', + EXTRA_INFO_8 = 'ExtraInfo8', + EXTRA_INFO_9 = 'ExtraInfo9', } /** @@ -275,8 +275,8 @@ export interface ConfigureSpotEventPluginProps { * * ```ts * import { App, Stack, Vpc } from '@aws-rfdk/core'; - * import { InstanceClass, InstanceSize, InstanceType } from '@aws-cdk/aws-ec2'; - * import { AwsThinkboxEulaAcceptance, ConfigureSpotEventPlugin, RenderQueue, Repository, SpotEventPluginFleet, ThinkboxDockerImages, VersionQuery } from '@aws-rfdk/deadline'; + * import { InstanceClass, InstanceSize, InstanceType } from 'aws-cdk-lib/aws-ec2'; + * import { AwsCustomerAgreementAndIpLicenseAcceptance, ConfigureSpotEventPlugin, RenderQueue, Repository, SpotEventPluginFleet, ThinkboxDockerImages, VersionQuery } from '@aws-rfdk/deadline'; * const app = new App(); * const stack = new Stack(app, 'Stack'); * const vpc = new Vpc(stack, 'Vpc'); @@ -285,9 +285,9 @@ export interface ConfigureSpotEventPluginProps { * }); * const images = new ThinkboxDockerImages(stack, 'Image', { * version, - * // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - * // of the AWS Thinkbox End User License Agreement - * userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, + * // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + * // of the AWS Customer Agreement and AWS Intellectual Property License. + * userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, * }); * const repository = new Repository(stack, 'Repository', { * vpc, diff --git a/packages/aws-rfdk/lib/deadline/lib/database-connection.ts b/packages/aws-rfdk/lib/deadline/lib/database-connection.ts index 2021f41d8..b0c9bdcf0 100644 --- a/packages/aws-rfdk/lib/deadline/lib/database-connection.ts +++ b/packages/aws-rfdk/lib/deadline/lib/database-connection.ts @@ -4,31 +4,31 @@ */ import * as path from 'path'; +import { + Annotations, + Stack, +} from 'aws-cdk-lib'; import { CfnDBCluster, CfnDBInstance, DatabaseCluster, IDatabaseCluster, -} from '@aws-cdk/aws-docdb'; +} from 'aws-cdk-lib/aws-docdb'; import { IConnectable, ISecurityGroup, OperatingSystemType, Port, Volume, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { IGrantable, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { ISecret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Annotations, - Construct, - IConstruct, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct, IConstruct } from 'constructs'; + import { IMongoDb, IX509CertificatePkcs12, diff --git a/packages/aws-rfdk/lib/deadline/lib/host-ref.ts b/packages/aws-rfdk/lib/deadline/lib/host-ref.ts index 7c7c230f0..8968334b5 100644 --- a/packages/aws-rfdk/lib/deadline/lib/host-ref.ts +++ b/packages/aws-rfdk/lib/deadline/lib/host-ref.ts @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {IConnectable} from '@aws-cdk/aws-ec2'; -import {IConstruct} from '@aws-cdk/core'; +import {IConnectable} from 'aws-cdk-lib/aws-ec2'; +import {IConstruct} from 'constructs'; import {IScriptHost} from '../../core'; /** diff --git a/packages/aws-rfdk/lib/deadline/lib/render-queue-ref.ts b/packages/aws-rfdk/lib/deadline/lib/render-queue-ref.ts index 410d469cf..8f870ab06 100644 --- a/packages/aws-rfdk/lib/deadline/lib/render-queue-ref.ts +++ b/packages/aws-rfdk/lib/deadline/lib/render-queue-ref.ts @@ -3,34 +3,34 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { Duration } from 'aws-cdk-lib'; import { ICertificate, -} from '@aws-cdk/aws-certificatemanager'; +} from 'aws-cdk-lib/aws-certificatemanager'; import { InstanceType, ISecurityGroup, IVpc, SubnetSelection, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ContainerImage, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ApplicationProtocol, -} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IGrantable, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { IPrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { IBucket, -} from '@aws-cdk/aws-s3'; +} from 'aws-cdk-lib/aws-s3'; import { ISecret, -} from '@aws-cdk/aws-secretsmanager'; -import { Duration } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { IX509CertificatePem, LogGroupFactoryProps, diff --git a/packages/aws-rfdk/lib/deadline/lib/render-queue.ts b/packages/aws-rfdk/lib/deadline/lib/render-queue.ts index 291757522..3546c55dc 100644 --- a/packages/aws-rfdk/lib/deadline/lib/render-queue.ts +++ b/packages/aws-rfdk/lib/deadline/lib/render-queue.ts @@ -6,14 +6,17 @@ import { join, } from 'path'; +import { + Stack, +} from 'aws-cdk-lib'; import { AutoScalingGroup, BlockDeviceVolume, UpdatePolicy, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { ICertificate, -} from '@aws-cdk/aws-certificatemanager'; +} from 'aws-cdk-lib/aws-certificatemanager'; import { Connections, IConnectable, @@ -23,7 +26,7 @@ import { Port, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Cluster, ContainerImage, @@ -32,36 +35,32 @@ import { PlacementConstraint, Scope, UlimitName, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ApplicationLoadBalancedEc2Service, -} from '@aws-cdk/aws-ecs-patterns'; +} from 'aws-cdk-lib/aws-ecs-patterns'; import { ApplicationListener, ApplicationLoadBalancer, ApplicationProtocol, ApplicationTargetGroup, CfnTargetGroup, -} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IGrantable, IPrincipal, ManagedPolicy, PolicyStatement, ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { ILogGroup, -} from '@aws-cdk/aws-logs'; -import { IHostedZone, IPrivateHostedZone, PrivateHostedZone } from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-logs'; +import { IHostedZone, IPrivateHostedZone, PrivateHostedZone } from 'aws-cdk-lib/aws-route53'; import { ISecret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Construct, - IConstruct, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct, IConstruct } from 'constructs'; import { ECSConnectOptions, @@ -447,7 +446,7 @@ export class RenderQueue extends RenderQueueBase implements IGrantable { // We want the volume to be encrypted. The default AMI size is 30-GiB. volume: BlockDeviceVolume.ebs(30, { encrypted: true }), }], - updateType: undefined, // Workaround -- See: https://github.com/aws/aws-cdk/issues/11581 + ...{ updateType: undefined }, // Workaround -- See: https://github.com/aws/aws-cdk/issues/11581 updatePolicy: UpdatePolicy.rollingUpdate(), // addCapacity doesn't specifically take a securityGroup, but it passes on its properties to the ASG it creates, // so this security group will get applied there @@ -523,7 +522,7 @@ export class RenderQueue extends RenderQueueBase implements IGrantable { this.pattern = new ApplicationLoadBalancedEc2Service(this, 'AlbEc2ServicePattern', { certificate: this.clientCert, cluster: this.cluster, - desiredCount: this.renderQueueSize?.desired, + desiredCount: this.renderQueueSize?.desired ?? minCapacity, domainZone, domainName: loadBalancerFQDN, listenerPort: externalPortNumber, @@ -629,22 +628,25 @@ export class RenderQueue extends RenderQueueBase implements IGrantable { // Tag deployed resources with RFDK meta-data tagConstruct(this); - } - - protected onValidate(): string[] { - const validationErrors = []; - // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if - // a resource in another stack is referencing it. - if (this.version instanceof VersionQuery) { - const versionStack = Stack.of(this.version); - const thisStack = Stack.of(this); - if (versionStack != thisStack) { - validationErrors.push('A VersionQuery can not be supplied from a different stack'); - } - } - - return validationErrors; + const thisConstruct = this; + this.node.addValidation({ + validate(): string[] { + const validationErrors = []; + + // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if + // a resource in another stack is referencing it. + if (thisConstruct.version instanceof VersionQuery) { + const versionStack = Stack.of(thisConstruct.version); + const thisStack = Stack.of(thisConstruct); + if (versionStack != thisStack) { + validationErrors.push('A VersionQuery can not be supplied from a different stack'); + } + } + + return validationErrors; + }, + }); } /** @@ -976,6 +978,7 @@ export class RenderQueue extends RenderQueueBase implements IGrantable { securityGroup: this.backendConnections.securityGroups[0], vpc: this.props.vpc, vpcSubnets: this.props.vpcSubnets ?? RenderQueue.DEFAULT_VPC_SUBNETS_OTHER, + logGroupProps: this.props.logGroupProps, }); } else if (deploymentInstanceNode instanceof DeploymentInstance) { return deploymentInstanceNode; diff --git a/packages/aws-rfdk/lib/deadline/lib/repository.ts b/packages/aws-rfdk/lib/deadline/lib/repository.ts index 901cf32cb..c2474be7d 100644 --- a/packages/aws-rfdk/lib/deadline/lib/repository.ts +++ b/packages/aws-rfdk/lib/deadline/lib/repository.ts @@ -8,17 +8,27 @@ import { pathToFileURL, } from 'url'; +import { + Annotations, + Duration, + RemovalPolicy, + Names, + Size, + Stack, + Tags, + Token, +} from 'aws-cdk-lib'; import { AutoScalingGroup, Signals, UpdatePolicy, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { CfnDBInstance, DatabaseCluster, CfnDBCluster, ClusterParameterGroup, -} from '@aws-cdk/aws-docdb'; +} from 'aws-cdk-lib/aws-docdb'; import { AmazonLinuxGeneration, AmazonLinuxImage, @@ -30,37 +40,26 @@ import { OperatingSystemType, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { MountPoint, TaskDefinition, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { FileSystem as EfsFileSystem, LifecyclePolicy as EfsLifecyclePolicy, -} from '@aws-cdk/aws-efs'; +} from 'aws-cdk-lib/aws-efs'; import { PolicyStatement, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Asset, -} from '@aws-cdk/aws-s3-assets'; +} from 'aws-cdk-lib/aws-s3-assets'; import { ISecret, Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - Annotations, - Construct, - Duration, - IConstruct, - RemovalPolicy, - Names, - Size, - Stack, - Tags, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct, IConstruct } from 'constructs'; import { CloudWatchAgent, CloudWatchConfigBuilder, @@ -783,22 +782,25 @@ export class Repository extends Construct implements IRepository { // Tag deployed resources with RFDK meta-data tagConstruct(this); - } - protected onValidate(): string[] { - const validationErrors = []; - - // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if - // a resource in another stack is referencing it. - if (this.version instanceof VersionQuery) { - const versionStack = Stack.of(this.version); - const thisStack = Stack.of(this); - if (versionStack != thisStack) { - validationErrors.push('A VersionQuery can not be supplied from a different stack'); - } - } - - return validationErrors; + const thisConstruct = this; + this.node.addValidation({ + validate(): string[] { + const validationErrors = []; + + // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if + // a resource in another stack is referencing it. + if (thisConstruct.version instanceof VersionQuery) { + const versionStack = Stack.of(thisConstruct.version); + const thisStack = Stack.of(thisConstruct); + if (versionStack != thisStack) { + validationErrors.push('A VersionQuery can not be supplied from a different stack'); + } + } + + return validationErrors; + }, + }); } /** diff --git a/packages/aws-rfdk/lib/deadline/lib/rq-connection.ts b/packages/aws-rfdk/lib/deadline/lib/rq-connection.ts index e62e58704..d31e9b493 100644 --- a/packages/aws-rfdk/lib/deadline/lib/rq-connection.ts +++ b/packages/aws-rfdk/lib/deadline/lib/rq-connection.ts @@ -5,10 +5,10 @@ import * as path from 'path'; -import { OperatingSystemType } from '@aws-cdk/aws-ec2'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { ISecret } from '@aws-cdk/aws-secretsmanager'; -import { Stack } from '@aws-cdk/core'; +import { Stack } from 'aws-cdk-lib'; +import { OperatingSystemType } from 'aws-cdk-lib/aws-ec2'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; import { ConnectableApplicationEndpoint } from '../../core'; diff --git a/packages/aws-rfdk/lib/deadline/lib/secrets-management-ref.ts b/packages/aws-rfdk/lib/deadline/lib/secrets-management-ref.ts index 5f93229fa..2d93ca2d7 100644 --- a/packages/aws-rfdk/lib/deadline/lib/secrets-management-ref.ts +++ b/packages/aws-rfdk/lib/deadline/lib/secrets-management-ref.ts @@ -6,8 +6,8 @@ import { IVpc, SubnetSelection, -} from '@aws-cdk/aws-ec2'; -import { Construct } from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { Construct } from 'constructs'; /** * Deadline Secrets Management roles. diff --git a/packages/aws-rfdk/lib/deadline/lib/secrets-management.ts b/packages/aws-rfdk/lib/deadline/lib/secrets-management.ts index ab3a774c3..beced9f3d 100644 --- a/packages/aws-rfdk/lib/deadline/lib/secrets-management.ts +++ b/packages/aws-rfdk/lib/deadline/lib/secrets-management.ts @@ -5,16 +5,16 @@ import * as path from 'path'; -import { SelectedSubnets } from '@aws-cdk/aws-ec2'; -import { PolicyStatement } from '@aws-cdk/aws-iam'; -import { ISecret } from '@aws-cdk/aws-secretsmanager'; import { - Construct, Lazy, Stack, Fn, Annotations, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { SelectedSubnets } from 'aws-cdk-lib/aws-ec2'; +import { PolicyStatement } from 'aws-cdk-lib/aws-iam'; +import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct } from 'constructs'; import { IRepository, diff --git a/packages/aws-rfdk/lib/deadline/lib/spot-event-plugin-fleet.ts b/packages/aws-rfdk/lib/deadline/lib/spot-event-plugin-fleet.ts index af8f407f9..929ae6499 100644 --- a/packages/aws-rfdk/lib/deadline/lib/spot-event-plugin-fleet.ts +++ b/packages/aws-rfdk/lib/deadline/lib/spot-event-plugin-fleet.ts @@ -3,9 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { + Annotations, + Expiration, + Stack, + TagManager, + Tags, + TagType, +} from 'aws-cdk-lib'; import { BlockDevice, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { Connections, EbsDeviceVolumeType, @@ -23,7 +31,7 @@ import { SubnetSelection, SubnetType, UserData, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { CfnInstanceProfile, IGrantable, @@ -32,16 +40,8 @@ import { ManagedPolicy, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; -import { - Annotations, - Construct, - Expiration, - Stack, - TagManager, - Tags, - TagType, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; +import { Construct } from 'constructs'; import { IScriptHost, LogGroupFactoryProps, diff --git a/packages/aws-rfdk/lib/deadline/lib/stage.ts b/packages/aws-rfdk/lib/deadline/lib/stage.ts index 3fdbe77db..6ef842b35 100644 --- a/packages/aws-rfdk/lib/deadline/lib/stage.ts +++ b/packages/aws-rfdk/lib/deadline/lib/stage.ts @@ -6,8 +6,8 @@ import * as fs from 'fs'; import * as path from 'path'; -import { DockerImageAsset } from '@aws-cdk/aws-ecr-assets'; -import { Construct } from '@aws-cdk/core'; +import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets'; +import { Construct } from 'constructs'; import { IVersion, diff --git a/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-images.ts b/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-images.ts index 562e2017d..b0c2d1921 100644 --- a/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-images.ts +++ b/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-images.ts @@ -6,23 +6,23 @@ import { randomBytes } from 'crypto'; import * as path from 'path'; +import { + CustomResource, + Duration, + Stack, + Token, +} from 'aws-cdk-lib'; import { ContainerImage, RepositoryImage, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { Code, SingletonFunction, Runtime, -} from '@aws-cdk/aws-lambda'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { - Construct, - CustomResource, - Duration, - Stack, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; import { IVersion, @@ -33,23 +33,24 @@ import { } from '.'; /** - * Choices for signifying the user's stance on the terms of the AWS Thinkbox End-User License Agreement (EULA). - * See: https://www.awsthinkbox.com/end-user-license-agreement + * The ThinkboxDockerImages will install Deadline onto one or more EC2 instances. + * + * By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + * and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + * is AWS Content as defined in those Agreements. + * + * This enum is used to signify acceptance or rejection of these terms. */ -export enum AwsThinkboxEulaAcceptance { +export enum AwsCustomerAgreementAndIpLicenseAcceptance { /** - * The user signifies their explicit rejection of the tems of the AWS Thinkbox EULA. - * - * See: https://www.awsthinkbox.com/end-user-license-agreement + * The user signifies their explicit rejection of the terms. */ - USER_REJECTS_AWS_THINKBOX_EULA = 0, + USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE = 0, /** - * The user signifies their explicit acceptance of the terms of the AWS Thinkbox EULA. - * - * See: https://www.awsthinkbox.com/end-user-license-agreement + * The user signifies their explicit acceptance of the terms. */ - USER_ACCEPTS_AWS_THINKBOX_EULA = 1, + USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE = 1, } /** @@ -63,12 +64,16 @@ export interface ThinkboxDockerImagesProps { readonly version?: IVersion; /** - * Deadline is licensed under the terms of the AWS Thinkbox End-User License Agreement (see: https://www.awsthinkbox.com/end-user-license-agreement). - * Users of ThinkboxDockerImages must explicitly signify their acceptance of the terms of the AWS Thinkbox EULA through this - * property before the {@link ThinkboxDockerImages} will be allowed to deploy Deadline. + * The ThinkboxDockerImages will install Deadline onto one or more EC2 instances. + * + * By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) + * and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline + * is AWS Content as defined in those Agreements. + * + * Use this property to indicate whether you accept or reject these terms. */ - // Developer note: It is a legal requirement that the default be USER_REJECTS_AWS_THINKBOX_EULA. - readonly userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance; + // Developer note: It is a legal requirement that the default be USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE. + readonly userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; } /** @@ -101,7 +106,7 @@ export interface ThinkboxDockerImagesProps { * * ```ts * import { App, Stack, Vpc } from '@aws-rfdk/core'; - * import { AwsThinkboxEulaAcceptance, RenderQueue, Repository, ThinkboxDockerImages, VersionQuery } from '@aws-rfdk/deadline'; + * import { AwsCustomerAgreementAndIpLicenseAcceptance, RenderQueue, Repository, ThinkboxDockerImages, VersionQuery } from '@aws-rfdk/deadline'; * const app = new App(); * const stack = new Stack(app, 'Stack'); * const vpc = new Vpc(stack, 'Vpc'); @@ -110,9 +115,9 @@ export interface ThinkboxDockerImagesProps { * }); * const images = new ThinkboxDockerImages(stack, 'Image', { * version, - * // Change this to AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA to accept the terms - * // of the AWS Thinkbox End User License Agreement - * userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA, + * // Change this to AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to accept the terms + * // of the AWS Customer Agreement and AWS Intellectual Property License. + * userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE, * }); * const repository = new Repository(stack, 'Repository', { * vpc, @@ -127,27 +132,21 @@ export interface ThinkboxDockerImagesProps { */ export class ThinkboxDockerImages extends Construct { /** - * The AWS Thinkbox licensing message that is presented to the user if they create an instance of - * this class without explicitly accepting the AWS Thinkbox EULA. + * The Deadline licensing message that is presented to the user if they create an instance of + * this class without explicitly accepting the AWS Content Agreement and AWS Intellectual Property License. * * Note to developers: The text of this string is a legal requirement, and must not be altered - * witout approval. + * without approval. */ - private static readonly AWS_THINKBOX_EULA_MESSAGE: string = ` + private static readonly AWS_CONTENT_NOTICE: string = ` The ThinkboxDockerImages will install Deadline onto one or more EC2 instances. -Deadline is provided by AWS Thinkbox under the AWS Thinkbox End User License -Agreement (EULA). By installing Deadline, you are agreeing to the terms of this -license. Follow the link below to read the terms of the AWS Thinkbox EULA. +By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) +and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline +is AWS Content as defined in those Agreements. -https://www.awsthinkbox.com/end-user-license-agreement - -By using the ThinkboxDockerImages to install Deadline you agree to the terms of -the AWS Thinkbox EULA. - -Please set the userAwsThinkboxEulaAcceptance property to -USER_ACCEPTS_AWS_THINKBOX_EULA to signify your acceptance of the terms of the -AWS Thinkbox EULA. +Please set the userAcceptsAwsCustomerAgreementAndIpLicense property to +USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to signify your acceptance of these terms. `; /** @@ -179,14 +178,14 @@ AWS Thinkbox EULA. private readonly ecrBaseURI: string; /** - * Whether the user has accepted the AWS Thinkbox EULA + * Whether the user has accepted the terms of the AWS Content Agreement and AWS Intellectual Property License. */ - private readonly userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance; + private readonly userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; constructor(scope: Construct, id: string, props: ThinkboxDockerImagesProps) { super(scope, id); - this.userAwsThinkboxEulaAcceptance = props.userAwsThinkboxEulaAcceptance; + this.userAwsCustomerAgreementAndIpLicenseAcceptance = props.userAwsCustomerAgreementAndIpLicenseAcceptance; this.version = props?.version; const lambdaCode = Code.fromAsset(path.join(__dirname, '..', '..', 'lambdas', 'nodejs')); @@ -217,26 +216,30 @@ AWS Thinkbox EULA. this.remoteConnectionServer = this.ecrImageForRecipe(ThinkboxManagedDeadlineDockerRecipes.REMOTE_CONNECTION_SERVER); this.licenseForwarder = this.ecrImageForRecipe(ThinkboxManagedDeadlineDockerRecipes.LICENSE_FORWARDER); - } - protected onValidate() { - const errors: string[] = []; - - // Users must accept the AWS Thinkbox EULA to use the container images - if (this.userAwsThinkboxEulaAcceptance !== AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA) { - errors.push(ThinkboxDockerImages.AWS_THINKBOX_EULA_MESSAGE); - } - - // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if - // a resource in another stack is referencing it. - if (this.version instanceof VersionQuery) { - const versionStack = Stack.of(this.version); - const thisStack = Stack.of(this); - if (versionStack != thisStack) { - errors.push('A VersionQuery can not be supplied from a different stack'); - } - } - return errors; + const thisConstruct = this; + this.node.addValidation({ + validate(): string[] { + const errors: string[] = []; + + // Users must accept the AWS Customer Agreement and AWS Intellectual Property License to use the container images + if (thisConstruct.userAwsCustomerAgreementAndIpLicenseAcceptance !== + AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE) { + errors.push(ThinkboxDockerImages.AWS_CONTENT_NOTICE); + } + + // Using the output of VersionQuery across stacks can cause issues. CloudFormation stack outputs cannot change if + // a resource in another stack is referencing it. + if (thisConstruct.version instanceof VersionQuery) { + const versionStack = Stack.of(thisConstruct.version); + const thisStack = Stack.of(thisConstruct); + if (versionStack != thisStack) { + errors.push('A VersionQuery can not be supplied from a different stack'); + } + } + return errors; + }, + }); } private ecrImageForRecipe(recipe: ThinkboxManagedDeadlineDockerRecipes): RepositoryImage { diff --git a/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-recipes.ts b/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-recipes.ts index a19cfa4f4..3e437a15f 100644 --- a/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-recipes.ts +++ b/packages/aws-rfdk/lib/deadline/lib/thinkbox-docker-recipes.ts @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { DockerImageAsset } from '@aws-cdk/aws-ecr-assets'; -import { ContainerImage } from '@aws-cdk/aws-ecs'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { Construct } from '@aws-cdk/core'; +import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets'; +import { ContainerImage } from 'aws-cdk-lib/aws-ecs'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; import { Installer, diff --git a/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts b/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts index e7e07f83f..15db1cb45 100644 --- a/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts +++ b/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts @@ -3,10 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { + Annotations, +} from 'aws-cdk-lib'; import { AutoScalingGroup, BlockDeviceVolume, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { IConnectable, InstanceClass, @@ -17,7 +20,7 @@ import { Port, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { CfnService, Cluster, @@ -29,16 +32,13 @@ import { PlacementConstraint, TaskDefinition, UlimitName, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { IGrantable, IPrincipal, -} from '@aws-cdk/aws-iam'; -import { ISecret } from '@aws-cdk/aws-secretsmanager'; -import { - Annotations, - Construct, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; +import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; +import { Construct } from 'constructs'; import { SecretsManagementRegistrationStatus, diff --git a/packages/aws-rfdk/lib/deadline/lib/version-query.ts b/packages/aws-rfdk/lib/deadline/lib/version-query.ts index fad726784..9471361d1 100644 --- a/packages/aws-rfdk/lib/deadline/lib/version-query.ts +++ b/packages/aws-rfdk/lib/deadline/lib/version-query.ts @@ -6,21 +6,21 @@ import { randomBytes } from 'crypto'; import { join } from 'path'; +import { + CustomResource, + Duration, + Token, +} from 'aws-cdk-lib'; import { Code, SingletonFunction, Runtime, -} from '@aws-cdk/aws-lambda'; -import { RetentionDays } from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-lambda'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; import { Bucket, -} from '@aws-cdk/aws-s3'; -import { - Construct, - CustomResource, - Duration, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-s3'; +import { Construct } from 'constructs'; import { IVersionProviderResourceProperties, diff --git a/packages/aws-rfdk/lib/deadline/lib/version-ref.ts b/packages/aws-rfdk/lib/deadline/lib/version-ref.ts index 064944f80..c589f758f 100644 --- a/packages/aws-rfdk/lib/deadline/lib/version-ref.ts +++ b/packages/aws-rfdk/lib/deadline/lib/version-ref.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { IBucket } from '@aws-cdk/aws-s3'; +import { IBucket } from 'aws-cdk-lib/aws-s3'; import { Version } from './version'; /** diff --git a/packages/aws-rfdk/lib/deadline/lib/wait-for-stable-service.ts b/packages/aws-rfdk/lib/deadline/lib/wait-for-stable-service.ts index 546458961..f71a2d1fe 100644 --- a/packages/aws-rfdk/lib/deadline/lib/wait-for-stable-service.ts +++ b/packages/aws-rfdk/lib/deadline/lib/wait-for-stable-service.ts @@ -6,7 +6,11 @@ import { randomBytes } from 'crypto'; import * as path from 'path'; -import { Ec2Service } from '@aws-cdk/aws-ecs'; +import { + CustomResource, + Duration, +} from 'aws-cdk-lib'; +import { Ec2Service } from 'aws-cdk-lib/aws-ecs'; import { Effect, ManagedPolicy, @@ -14,18 +18,14 @@ import { PolicyStatement, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { Code, Function as LambdaFunction, Runtime, -} from '@aws-cdk/aws-lambda'; -import { RetentionDays } from '@aws-cdk/aws-logs'; -import { - Construct, - CustomResource, - Duration, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-lambda'; +import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { Construct } from 'constructs'; import { WaitForStableServiceResourceProps } from '../../lambdas/nodejs/wait-for-stable-service'; /** diff --git a/packages/aws-rfdk/lib/deadline/lib/worker-configuration.ts b/packages/aws-rfdk/lib/deadline/lib/worker-configuration.ts index f001bf810..f8771143e 100644 --- a/packages/aws-rfdk/lib/deadline/lib/worker-configuration.ts +++ b/packages/aws-rfdk/lib/deadline/lib/worker-configuration.ts @@ -6,13 +6,13 @@ import * as path from 'path'; import { - OperatingSystemType, -} from '@aws-cdk/aws-ec2'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { - Construct, Duration, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + OperatingSystemType, +} from 'aws-cdk-lib/aws-ec2'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; import { CloudWatchAgent, CloudWatchConfigBuilder, diff --git a/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts b/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts index 5b229babe..3501fc90d 100644 --- a/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts +++ b/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts @@ -4,14 +4,18 @@ */ import * as path from 'path'; +import { + Annotations, + Duration, +} from 'aws-cdk-lib'; import { AutoScalingGroup, BlockDevice, CfnAutoScalingGroup, HealthCheck, Signals, -} from '@aws-cdk/aws-autoscaling'; -import {IMetric, Metric} from '@aws-cdk/aws-cloudwatch'; +} from 'aws-cdk-lib/aws-autoscaling'; +import {IMetric, Metric} from 'aws-cdk-lib/aws-cloudwatch'; import { Connections, IConnectable, @@ -24,8 +28,9 @@ import { Port, SubnetSelection, SubnetType, -} from '@aws-cdk/aws-ec2'; -import {IApplicationLoadBalancerTarget} from '@aws-cdk/aws-elasticloadbalancingv2'; + UserData, +} from 'aws-cdk-lib/aws-ec2'; +import {IApplicationLoadBalancerTarget} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { IGrantable, IPolicy, @@ -33,13 +38,8 @@ import { IRole, Policy, PolicyStatement, -} from '@aws-cdk/aws-iam'; -import { - Annotations, - Construct, - Duration, - IConstruct, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; +import { Construct, IConstruct } from 'constructs'; import { HealthCheckConfig, @@ -224,6 +224,15 @@ export interface WorkerInstanceFleetProps extends WorkerSettings { */ readonly blockDevices?: BlockDevice[]; + /** + * The specific UserData to use. + * + * The UserData will be mutated by this construct and may be mutated afterwards as well. + * + * @default A UserData object appropriate for the MachineImage's Operating System is created. + */ + readonly userData?: UserData; + /** * An optional provider of user data commands to be injected at various points during the Worker configuration lifecycle. * You can provide a subclass of InstanceUserDataProvider with the methods overridden as desired. @@ -456,6 +465,7 @@ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { role: props.role, spotPrice: props.spotPrice?.toString(), blockDevices: props.blockDevices, + userData: props.userData, }); this.targetCapacity = parseInt((this.fleet.node.defaultChild as CfnAutoScalingGroup).maxSize, 10); diff --git a/packages/aws-rfdk/lib/deadline/test/asset-constants.ts b/packages/aws-rfdk/lib/deadline/test/asset-constants.ts index d7fb7e023..008f35d9f 100644 --- a/packages/aws-rfdk/lib/deadline/test/asset-constants.ts +++ b/packages/aws-rfdk/lib/deadline/test/asset-constants.ts @@ -3,1174 +3,64 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO: Properly import from aws-rfdk. Not ideal -// to use a relative path here. -import { stringLike } from '@aws-cdk/assert'; -import { - CWA_ASSET_LINUX, - CWA_ASSET_WINDOWS, -} from '../../core/test/asset-constants'; - -export { - CWA_ASSET_LINUX, - CWA_ASSET_WINDOWS, +// configureRespositoryDirectConnect.sh +export const CONFIG_REPO_DIRECT_CONNECT_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'c4ee7f2045a95cb6858f1fdf35253ca27103511dffd97ac97dfe2a8aae85d7fc', }; // configureWorker.sh export const CONFIG_WORKER_ASSET_LINUX = { - Bucket: 'AssetParameters1cfdffe73bb016717ba1f43d64fe528af27b3784f524a97bb36533a6e6d057ffS3Bucket9FBDD688', - Key: 'AssetParameters1cfdffe73bb016717ba1f43d64fe528af27b3784f524a97bb36533a6e6d057ffS3VersionKey02A3157B', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '1cfdffe73bb016717ba1f43d64fe528af27b3784f524a97bb36533a6e6d057ff', }; // configureWorker.ps1 export const CONFIG_WORKER_ASSET_WINDOWS = { - Bucket: 'AssetParametersa10d67420c8758e35d8dae5fa406c7acb92b1bd40924167d5564aa0037b4a980S3Bucket953E30DC', - Key: 'AssetParametersa10d67420c8758e35d8dae5fa406c7acb92b1bd40924167d5564aa0037b4a980S3VersionKeyAFB97BD6', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'a10d67420c8758e35d8dae5fa406c7acb92b1bd40924167d5564aa0037b4a980', +}; + +// configureWorkerHealthCheck.sh +export const CONFIG_WORKER_HEALTHCHECK_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '3e16ffda458a50d2a032ef783202a85bf4677f19b92a38d3605d6cd750879f75', +}; + +// configureWorkerHealthCheck.ps1 +export const CONFIG_WORKER_HEALTHCHECK_WINDOWS = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '8b91f35e39a1b222c8ef7ab0e30da88713339023ac547dc7894f5ea60833df97', +}; + + +export const CONFIG_WORKER_PORT_ASSET_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'a10d67420c8758e35d8dae5fa406c7acb92b1bd40924167d5564aa0037b4a980', }; export const CONFIG_WORKER_PORT_ASSET_WINDOWS = { - Bucket: 'AssetParameters3227efc256da3ae31791b7c80e1532cac975116846f179f118a20843e0c2ee80S3Bucket6583BE37', - Key: 'AssetParameters3227efc256da3ae31791b7c80e1532cac975116846f179f118a20843e0c2ee80S3VersionKey6C80977B', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '3227efc256da3ae31791b7c80e1532cac975116846f179f118a20843e0c2ee80', }; -// installDeadlineRepository.sh -export const INSTALL_REPOSITORY_ASSET_LINUX = { - Bucket: stringLike('AssetParameters*S3Bucket8EB24E17'), +// getSecretToFile.sh +export const GET_SECRET_TO_FILE_SCRIPT_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: '2245b375c979246094a6a47007b55e51f117e987be5de9791c0799cddc3f1c2e', }; -// test.file -export const TEST_ASSET = { - Bucket: stringLike('AssetParameters*S3Bucket5D5509D9'), - Key: stringLike('AssetParameters*S3VersionKeyF19FF080'), +// installDeadlineRepository.sh +export const INSTALL_REPOSITORY_ASSET_LINUX = { + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', }; // installRepostitoryDirectConnection export const REPO_DC_ASSET = { - Bucket: stringLike('AssetParameters*S3Bucket87338EBD'), - Key: stringLike('AssetParameters*S3VersionKeyB7FF7B3C'), + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', }; export const RQ_CONNECTION_ASSET = { - Bucket: 'AssetParametersb61797635329f0b0ec0b710b31d49f0e41c1936849266d8a9aed82e1616c9077S3Bucket4D5EEE4A', - Key: 'AssetParametersb61797635329f0b0ec0b710b31d49f0e41c1936849266d8a9aed82e1616c9077S3VersionKey9B7B46A0', + Bucket: 'cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}', + Key: 'b61797635329f0b0ec0b710b31d49f0e41c1936849266d8a9aed82e1616c9077', }; - -export function linuxCloudWatchScriptBoilerplate(scriptParams: string) { - return [ - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - { - Ref: CWA_ASSET_LINUX.Bucket, - }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' -i ", - { - Ref: 'AWS::Region', - }, - ' ', - { - Ref: 'ConfigStringParameterC2BE550F', - }, - "\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "'\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - {Ref: CONFIG_WORKER_ASSET_LINUX.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\' \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\'\n' + - 'set -e\n' + - 'chmod +x \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\'\n\'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - scriptParams, - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - ]; -} - -export function linuxConfigureWorkerScriptBoilerplate(scriptParams: string) { - return [ - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "'\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - {Ref: CONFIG_WORKER_ASSET_LINUX.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\' \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\'\n' + - 'set -e\n' + - 'chmod +x \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\'\n\'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - scriptParams, - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - ]; -} - -export function windowsCloudWatchScriptBoilerplate(scriptParams: string) { - return [ - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' ) -ea 0\nRead-S3Object -BucketName '", - { Ref: CWA_ASSET_WINDOWS.Bucket }, - "' -key '", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -file 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -ErrorAction Stop\n&'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' -i ", - { Ref: 'AWS::Region' }, - ' ', - { Ref: 'ConfigStringParameterC2BE550F' }, - "\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "\"' -ErrorAction Stop }\nmkdir (Split-Path -Path 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' ) -ea 0\nRead-S3Object -BucketName \'', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket}, - '\' -key \'', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' -file \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' -ErrorAction Stop\nmkdir (Split-Path -Path 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' ) -ea 0\nRead-S3Object -BucketName '", - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket}, - "' -key '", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' -file 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' -ErrorAction Stop\n&\'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - scriptParams, - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - '\nif (!$?) { Write-Error \'Failed to execute the file \"C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - ]; -} - -export function windowsConfigureWorkerScriptBoilerplate(scriptParams: string) { - return [ - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' ) -ea 0\nRead-S3Object -BucketName \'', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket}, - '\' -key \'', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' -file \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' -ErrorAction Stop\nmkdir (Split-Path -Path 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' ) -ea 0\nRead-S3Object -BucketName '", - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket}, - "' -key '", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - "' -file 'C:/temp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - '\' -ErrorAction Stop\n&\'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - scriptParams, - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - '\nif (!$?) { Write-Error \'Failed to execute the file \"C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}, - ], - }, - ], - }, - ]; -} diff --git a/packages/aws-rfdk/lib/deadline/test/configure-spot-event-plugin.test.ts b/packages/aws-rfdk/lib/deadline/test/configure-spot-event-plugin.test.ts index 947c81041..bc907032a 100644 --- a/packages/aws-rfdk/lib/deadline/test/configure-spot-event-plugin.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/configure-spot-event-plugin.test.ts @@ -4,14 +4,16 @@ */ import { - expect as cdkExpect, - countResources, - haveResourceLike, - objectLike, - arrayWith, - countResourcesLike, - ABSENT, -} from '@aws-cdk/assert'; + App, + Duration, + Expiration, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { GenericWindowsImage, InstanceClass, @@ -19,18 +21,12 @@ import { InstanceType, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ContainerImage, -} from '@aws-cdk/aws-ecs'; -import { ManagedPolicy } from '@aws-cdk/aws-iam'; -import { PrivateHostedZone } from '@aws-cdk/aws-route53'; -import { - App, - Duration, - Expiration, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ecs'; +import { ManagedPolicy } from 'aws-cdk-lib/aws-iam'; +import { PrivateHostedZone } from 'aws-cdk-lib/aws-route53'; import { X509CertificatePem } from '../../core'; import { tagFields } from '../../core/lib/runtime-info'; import { @@ -51,6 +47,8 @@ import { SpotEventPluginFleet, } from '../lib/spot-event-plugin-fleet'; +import { resourcePropertiesCountIs } from './test-helper'; + describe('ConfigureSpotEventPlugin', () => { let stack: Stack; let vpc: Vpc; @@ -116,8 +114,8 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - spotPluginConfigurations: objectLike({ + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + spotPluginConfigurations: Match.objectLike({ AWSInstanceStatus: 'Disabled', DeleteInterruptedSlaves: false, DeleteTerminatedSlaves: false, @@ -130,7 +128,7 @@ describe('ConfigureSpotEventPlugin', () => { State: 'Global Enabled', StrictHardCap: false, }), - }))); + })); }); test('with custom spot event plugin properties', () => { @@ -160,8 +158,8 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - spotPluginConfigurations: objectLike({ + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + spotPluginConfigurations: Match.objectLike({ AWSInstanceStatus: 'ExtraInfo0', DeleteInterruptedSlaves: true, DeleteTerminatedSlaves: true, @@ -174,7 +172,7 @@ describe('ConfigureSpotEventPlugin', () => { State: 'Disabled', StrictHardCap: true, }), - }))); + })); }); test('without spot fleets', () => { @@ -185,9 +183,9 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', { - spotFleetRequestConfigurations: ABSENT, - })); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', { + spotFleetRequestConfigurations: Match.absent(), + }); }); test('provides RQ connection parameters to custom resource', () => { @@ -201,13 +199,13 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - connection: objectLike({ + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + connection: Match.objectLike({ hostname: stack.resolve(renderQueue.endpoint.hostname), port: stack.resolve(renderQueue.endpoint.portAsString()), protocol: stack.resolve(renderQueue.endpoint.applicationProtocol.toString()), }), - }))); + })); }); test('with default spot fleet request configuration', () => { @@ -222,33 +220,33 @@ describe('ConfigureSpotEventPlugin', () => { const rfdkTag = tagFields(fleet); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', { spotFleetRequestConfigurations: { [groupName]: { AllocationStrategy: 'lowestPrice', IamFleetRole: stack.resolve(fleet.fleetRole.roleArn), - LaunchTemplateConfigs: [ - { + LaunchTemplateConfigs: Match.arrayWith([ + Match.objectLike({ LaunchTemplateSpecification: { Version: '$Latest', LaunchTemplateId: stack.resolve(fleet.launchTemplate.launchTemplateId), }, - }, - ], - TagSpecifications: arrayWith( - objectLike({ + }), + ]), + TagSpecifications: Match.arrayWith([ + Match.objectLike({ ResourceType: 'spot-fleet-request', - Tags: arrayWith( + Tags: Match.arrayWith([ { Key: rfdkTag.name, Value: rfdkTag.value, }, - ), + ]), }), - ), + ]), }, }, - })); + }); }); test('adds policies to the render queue', () => { @@ -262,14 +260,14 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(countResourcesLike('AWS::IAM::Role', 1, { - ManagedPolicyArns: arrayWith( + resourcePropertiesCountIs(stack, 'AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineSpotEventPluginAdminPolicy').managedPolicyArn), stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineResourceTrackerAdminPolicy').managedPolicyArn), - ), - })); + ]), + }, 1); - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -298,7 +296,7 @@ describe('ConfigureSpotEventPlugin', () => { Roles: [{ Ref: 'RQRCSTaskTaskRole00DC9B43', }], - })); + }); }); test('adds resource tracker policy even if rt disabled', () => { @@ -315,11 +313,11 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Role', { - ManagedPolicyArns: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineResourceTrackerAdminPolicy').managedPolicyArn), - ), - })); + ]), + }); }); test.each([ @@ -334,18 +332,18 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - spotFleetRequestConfigurations: ABSENT, - }))); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + spotFleetRequestConfigurations: Match.absent(), + })); - cdkExpect(stack).notTo(haveResourceLike('AWS::IAM::Role', { - ManagedPolicyArns: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', Match.not({ + ManagedPolicyArns: Match.arrayWith([ stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineSpotEventPluginAdminPolicy').managedPolicyArn), stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineResourceTrackerAdminPolicy').managedPolicyArn), - ), + ]), })); - cdkExpect(stack).notTo(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', Match.not({ PolicyDocument: { Statement: [ { @@ -401,13 +399,13 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - spotFleetRequestConfigurations: objectLike({ - [groupName]: objectLike({ + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + spotFleetRequestConfigurations: Match.objectLike({ + [groupName]: Match.objectLike({ ValidUntil: validUntil.date.toISOString(), }), }), - }))); + })); }); }); @@ -468,7 +466,7 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(countResources('Custom::RFDK_ConfigureSpotEventPlugin', 2)); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_ConfigureSpotEventPlugin', 2); }); test('throws with not supported render queue', () => { @@ -568,7 +566,7 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Statement: [ { @@ -586,7 +584,7 @@ describe('ConfigureSpotEventPlugin', () => { Ref: 'ConfigureSpotEventPluginConfiguratorServiceRole341B4735', }, ], - })); + }); }); test('creates a custom resource with connection', () => { @@ -600,14 +598,14 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('Custom::RFDK_ConfigureSpotEventPlugin', objectLike({ - connection: objectLike({ + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_ConfigureSpotEventPlugin', Match.objectLike({ + connection: Match.objectLike({ hostname: stack.resolve(renderQueueWithTls.endpoint.hostname), port: stack.resolve(renderQueueWithTls.endpoint.portAsString()), protocol: stack.resolve(renderQueueWithTls.endpoint.applicationProtocol.toString()), caCertificateArn: stack.resolve((renderQueueWithTls as RenderQueue).certChain!.secretArn), }), - }))); + })); }); }); @@ -648,14 +646,14 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - cdkExpect(stack).to(haveResourceLike('AWS::Lambda::Function', { + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'configure-spot-event-plugin.configureSEP', VpcConfig: { SubnetIds: [ stack.resolve(vpc.privateSubnets[0].subnetId), ], }, - })); + }); }); describe('throws with wrong deadline version', () => { @@ -781,10 +779,10 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - expect(fleet.node.metadataEntry).toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', - })); + Annotations.fromStack(stack).hasWarning( + `/${fleet.node.path}`, + 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', + ); }); test('a fleet with vpcSubnets specified => does not warn about dedicated subnets', () => { @@ -813,10 +811,7 @@ describe('ConfigureSpotEventPlugin', () => { }); // THEN - expect(fleet.node.metadataEntry).not.toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: expect.stringMatching(/dedicated subnet/i), - })); + Annotations.fromStack(stack).hasNoWarning(`/${fleet.node.path}`, Match.stringLikeRegexp('.*dedicated subnet.*')); }); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/database-connection.test.ts b/packages/aws-rfdk/lib/deadline/test/database-connection.test.ts index 897a241ea..6adea5605 100644 --- a/packages/aws-rfdk/lib/deadline/test/database-connection.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/database-connection.test.ts @@ -4,16 +4,21 @@ */ import { - expect as expectCDK, - haveResource, - haveResourceLike, - ResourcePart, -} from '@aws-cdk/assert'; + Duration, + Resource, + ResourceEnvironment, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { DatabaseCluster, Endpoint, IDatabaseCluster, -} from '@aws-cdk/aws-docdb'; +} from 'aws-cdk-lib/aws-docdb'; import { AmazonLinuxGeneration, Connections, @@ -27,26 +32,20 @@ import { Volume, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { AccountRootPrincipal, Role, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { IPrivateHostedZone, PrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { Secret, SecretAttachmentTargetProps, -} from '@aws-cdk/aws-secretsmanager'; -import { - Construct, - Duration, - Resource, - ResourceEnvironment, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; +import {Construct} from 'constructs'; import * as sinon from 'sinon'; import { @@ -63,6 +62,10 @@ import { DatabaseConnection, } from '../lib'; +import { + GET_SECRET_TO_FILE_SCRIPT_LINUX, +} from './asset-constants'; + describe('DocumentDB', () => { let stack: Stack; let vpc: Vpc; @@ -105,7 +108,7 @@ describe('DocumentDB', () => { connection.grantRead(role); // THEN - expectCDK(stack).to(haveResource('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Version: '2012-10-17', Statement: [{ @@ -117,7 +120,7 @@ describe('DocumentDB', () => { Resource: {Ref: 'DbClusterSecretAttachment4201A1ED'}, }], }, - })); + }); }); test('addInstallerDBArgs defines required elements', () => { @@ -150,7 +153,7 @@ describe('DocumentDB', () => { connection.allowConnectionsFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: { 'Fn::GetAtt': [ @@ -170,7 +173,7 @@ describe('DocumentDB', () => { 'Port', ], }, - })); + }); }); test('add child dependency', () => { @@ -186,12 +189,12 @@ describe('DocumentDB', () => { connection.addChildDependency(instance); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { DependsOn: [ 'DbClusterInstance155835CE5', 'InstanceInstanceRoleE9785DE5', ], - }, ResourcePart.CompleteDefinition)); + }); }); test('add child dependency to attributes', () => { @@ -218,11 +221,11 @@ describe('DocumentDB', () => { connection.addChildDependency(instance); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { DependsOn: [ 'InstanceInstanceRoleE9785DE5', ], - }, ResourcePart.CompleteDefinition)); + }); }); test('add child dependency throws when cluster implementation changed', () => { @@ -306,13 +309,11 @@ describe('DocumentDB', () => { connection.addSecurityGroup(securityGroup); // THEN - expect(fakeDatabase.node.metadataEntry).toEqual(expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: expect.stringMatching(new RegExp(`Failed to add the following security groups to ${fakeDatabase.node.id}: .*\\. ` + - 'The \\"database\\" property passed to this class is not an instance of AWS CDK\'s DocumentDB cluster construct.')), - }), - ])); + Annotations.fromStack(stack).hasWarning( + `/${fakeDatabase.node.path}`, + Match.stringLikeRegexp(`Failed to add the following security groups to ${fakeDatabase.node.id}: .*\\. ` + + 'The \\"database\\" property passed to this class is not an instance of AWS CDK\'s DocumentDB cluster construct.'), + ); }); // This test can be removed once the following CDK PR is merged: @@ -329,13 +330,11 @@ describe('DocumentDB', () => { connection.addSecurityGroup(securityGroup); // THEN - expect(database.node.metadataEntry).toEqual(expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: expect.stringMatching(new RegExp(`Failed to add the following security groups to ${database.node.id}: .*\\. ` + - 'The internal implementation of AWS CDK\'s DocumentDB cluster construct has changed.')), - }), - ])); + Annotations.fromStack(stack).hasWarning( + `/${database.node.path}`, + Match.stringLikeRegexp(`Failed to add the following security groups to ${database.node.id}: .*\\. ` + + 'The internal implementation of AWS CDK\'s DocumentDB cluster construct has changed.'), + ); }); test('Document DB connection is pointed to correct construct', () => { @@ -380,7 +379,9 @@ describe('DocumentDB Version Checks', () => { DatabaseConnection.forDocDB({database, login: database.secret!}); // THEN - expect(database.node.metadataEntry.length).toBe(0); + Annotations.fromStack(stack).hasNoInfo(`/${database.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoWarning(`/${database.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoError(`/${database.node.path}`, Match.anyValue()); }); test('When from attributes', () => { @@ -403,7 +404,9 @@ describe('DocumentDB Version Checks', () => { const databaseConnection = DatabaseConnection.forDocDB({database, login: secret}); // THEN - expect(database.node.metadataEntry.length).toBe(0); + Annotations.fromStack(stack).hasNoInfo(`/${database.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoWarning(`/${database.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoError(`/${database.node.path}`, Match.anyValue()); expect(databaseConnection.databaseConstruct).toBeUndefined(); }); @@ -431,13 +434,9 @@ describe('DocumentDB Version Checks', () => { DatabaseConnection.forDocDB({database, login: database.secret!}); // THEN - expect(database.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:error', - data: 'engineVersion must be 3.6.0 to be compatible with Deadline', - }), - ]), + Annotations.fromStack(stack).hasError( + `/${database.node.path}`, + 'engineVersion must be 3.6.0 to be compatible with Deadline', ); }); @@ -466,13 +465,9 @@ describe('DocumentDB Version Checks', () => { DatabaseConnection.forDocDB({database, login: database.secret!}); // THEN - expect(database.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:error', - data: 'engineVersion must be 3.6.0 to be compatible with Deadline', - }), - ]), + Annotations.fromStack(stack).hasError( + `/${database.node.path}`, + 'engineVersion must be 3.6.0 to be compatible with Deadline', ); }); }); @@ -534,7 +529,7 @@ describe('MongoDB', () => { connection.grantRead(role); // THEN - expectCDK(stack).to(haveResource('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { Version: '2012-10-17', Statement: [ @@ -563,7 +558,7 @@ describe('MongoDB', () => { }, ], }, - })); + }); }); test('addInstallerDBArgs defines required elements', () => { @@ -581,7 +576,7 @@ describe('MongoDB', () => { // THEN const token = '${Token[TOKEN.\\d+]}'; - expect(userData).toMatch(new RegExp(escapeTokenRegex('\'/tmp/' + token + token + '\' ' + token + ' /opt/Thinkbox/certs/mongo_client.pfx'))); + expect(userData).toMatch(new RegExp(escapeTokenRegex(`'/tmp/${GET_SECRET_TO_FILE_SCRIPT_LINUX.Key}.sh' ${token} /opt/Thinkbox/certs/mongo_client.pfx`))); expect(userData).toContain('configure_database_installation_args(){\n'); expect(userData).toContain('\nexport -f configure_database_installation_args'); expect(userData).toContain('{ set +x; } 2>/dev/null'); @@ -607,7 +602,7 @@ describe('MongoDB', () => { // THEN const token = '${Token[TOKEN.\\d+]}'; - expect(userData).toMatch(new RegExp(escapeTokenRegex('\'/tmp/' + token + token + '\' ' + token + ' /opt/Thinkbox/certs/mongo_client.pfx'))); + expect(userData).toMatch(new RegExp(escapeTokenRegex(`'/tmp/${GET_SECRET_TO_FILE_SCRIPT_LINUX.Key}.sh' ${token} /opt/Thinkbox/certs/mongo_client.pfx`))); expect(userData).toContain('configure_deadline_database(){\n'); expect(userData).toContain('\nexport -f configure_deadline_database'); expect(userData).toContain('{ set +x; } 2>/dev/null'); @@ -635,7 +630,7 @@ describe('MongoDB', () => { connection.allowConnectionsFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 27017, ToPort: 27017, @@ -651,7 +646,7 @@ describe('MongoDB', () => { 'GroupId', ], }, - })); + }); }); test('add child dependency', () => { @@ -667,12 +662,12 @@ describe('MongoDB', () => { connection.addChildDependency(instance); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { DependsOn: [ 'InstanceInstanceRoleE9785DE5', 'MongoDbServerAsgASG47B3D94E', ], - }, ResourcePart.CompleteDefinition)); + }); }); test('asserts linux-only', () => { diff --git a/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts b/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts index 76c7bd68f..5ebf64a8c 100644 --- a/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts @@ -4,25 +4,21 @@ */ import { - ABSENT, - arrayWith, - countResources, - countResourcesLike, - deepObjectLike, - expect as expectCDK, - haveResource, - haveResourceLike, - not, - objectLike, - ResourcePart, - SynthUtils, -} from '@aws-cdk/assert'; + App, + CfnElement, + CustomResource, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { CfnLaunchConfiguration, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { Certificate, -} from '@aws-cdk/aws-certificatemanager'; +} from 'aws-cdk-lib/aws-certificatemanager'; import { AmazonLinuxGeneration, AmazonLinuxImage, @@ -38,40 +34,35 @@ import { SubnetType, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ContainerImage, Ec2TaskDefinition, TaskDefinition, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ApplicationProtocol, -} from '@aws-cdk/aws-elasticloadbalancingv2'; +} from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import { AccountRootPrincipal, Role, -} from '@aws-cdk/aws-iam'; +} from 'aws-cdk-lib/aws-iam'; import { PrivateHostedZone, -} from '@aws-cdk/aws-route53'; +} from 'aws-cdk-lib/aws-route53'; import { Bucket, -} from '@aws-cdk/aws-s3'; +} from 'aws-cdk-lib/aws-s3'; import { CfnSecret, Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - App, - CfnElement, - CustomResource, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { ImportedAcmCertificate, X509CertificatePem, } from '../..'; +import { DeploymentInstance } from '../../core/lib/deployment-instance'; import { testConstructTags, } from '../../core/test/tag-helpers'; @@ -91,6 +82,9 @@ import { SecretsManagementIdentityRegistration } from '../lib/secrets-management import { RQ_CONNECTION_ASSET, } from './asset-constants'; +import { + resourcePropertiesCountIs, +} from './test-helper'; describe('RenderQueue', () => { let app: App; @@ -100,423 +94,491 @@ describe('RenderQueue', () => { let rcsImage: ContainerImage; let images: RenderQueueImages; - let repository: Repository; let version: IVersion; let renderQueueVersion: IVersion; - let renderQueueCommon: RenderQueue; - // GIVEN beforeEach(() => { app = new App(); dependencyStack = new Stack(app, 'DepStack'); vpc = new Vpc(dependencyStack, 'Vpc'); version = new VersionQuery(dependencyStack, 'Version'); - repository = new Repository(dependencyStack, 'Repo', { - version, - vpc, - }); + stack = new Stack(app, 'Stack'); rcsImage = ContainerImage.fromAsset(__dirname); images = { remoteConnectionServer: rcsImage, }; renderQueueVersion = new VersionQuery(stack, 'Version'); - renderQueueCommon = new RenderQueue(stack, 'RenderQueueCommon', { - images, - repository, - version: renderQueueVersion, - vpc, - }); }); afterEach(() => { jest.resetAllMocks(); }); - test('creates cluster', () => { - // THEN - expectCDK(stack).to(haveResource('AWS::ECS::Cluster')); - }); + describe('basic', () => { + let repository: Repository; + let renderQueue: RenderQueue; - test('creates service', () => { - // THEN - expectCDK(stack).to(haveResource('AWS::ECS::Service')); - }); + beforeEach(() => { + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); + renderQueue = new RenderQueue(stack, 'RenderQueue', { + images, + repository, + version: renderQueueVersion, + vpc, + }); + }); - test('creates task definition', () => { - // THEN - expectCDK(stack).to(haveResource('AWS::ECS::TaskDefinition')); - }); + test('creates cluster', () => { + // THEN + Template.fromStack(stack).resourceCountIs('AWS::ECS::Cluster', 1); + }); - test('closed ingress by default', () => { - // THEN - expectCDK(stack).notTo(haveResource('AWS::EC2::SecurityGroup', { - // The openListener=true option would create an ingress rule in the listener's SG. - // make sure that we don't have that. - SecurityGroupIngress: arrayWith(objectLike({})), - })); - }); + test('creates service', () => { + // THEN + Template.fromStack(stack).resourceCountIs('AWS::ECS::Service', 1); + }); - test('creates load balancer with default values', () => { - // THEN - expectCDK(stack).to(countResourcesLike('AWS::ElasticLoadBalancingV2::LoadBalancer', 1, { - LoadBalancerAttributes: [ - { - Key: 'deletion_protection.enabled', - Value: 'true', - }, - ], - Scheme: 'internal', - })); - }); + test('creates task definition', () => { + // THEN + Template.fromStack(stack).resourceCountIs('AWS::ECS::TaskDefinition', 1); + }); - test('creates a log group with default prefix of "/renderfarm/"', () => { - // THEN - expectCDK(stack).to(haveResourceLike('Custom::LogRetention', { - LogGroupName: '/renderfarm/RenderQueueCommon', - RetentionInDays: 3, - })); - }); + test('closed ingress by default', () => { + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', Match.not({ + // The openListener=true option would create an ingress rule in the listener's SG. + // make sure that we don't have that. + // DDN - intentionally broke + SecurityGroupIngress: Match.anyValue(), + })); + }); - test('configure the container log driver', () => { - // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { - ContainerDefinitions: [ - objectLike({ - LogConfiguration: { - LogDriver: 'awslogs', - Options: { - 'awslogs-group': { - 'Fn::GetAtt': [ - 'RenderQueueCommonLogGroupWrapperA0EF7057', - 'LogGroupName', - ], + test('creates load balancer with default values', () => { + // THEN + resourcePropertiesCountIs(stack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ + { + Key: 'deletion_protection.enabled', + Value: 'true', + }, + ]), + Scheme: 'internal', + }, 1); + }); + + test('creates a log group with default prefix of "/renderfarm/"', () => { + // THEN + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { + LogGroupName: '/renderfarm/RenderQueue', + RetentionInDays: 3, + }); + }); + + test('configure the container log driver', () => { + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: [ + Match.objectLike({ + LogConfiguration: { + LogDriver: 'awslogs', + Options: { + 'awslogs-group': { + 'Fn::GetAtt': [ + Match.stringLikeRegexp('^RenderQueueLogGroupWrapper.*'), + 'LogGroupName', + ], + }, + 'awslogs-stream-prefix': 'RCS', + 'awslogs-region': { Ref: 'AWS::Region' }, }, - 'awslogs-stream-prefix': 'RCS', - 'awslogs-region': { Ref: 'AWS::Region' }, }, - }, - }), - ], - })); - }); + }), + ], + }); + }); - test('child dependencies added', () => { - // GIVEN - const host = new Instance(stack, 'Host', { - vpc, - instanceType: InstanceType.of( - InstanceClass.R4, - InstanceSize.LARGE, - ), - machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), + test('child dependencies added', () => { + // GIVEN + const host = new Instance(stack, 'Host', { + vpc, + instanceType: InstanceType.of( + InstanceClass.R4, + InstanceSize.LARGE, + ), + machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), + }); + + // WHEN + renderQueue.addChildDependency(host); + + // THEN + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { + DependsOn: Match.arrayWith([ + 'RenderQueueAlbEc2ServicePatternService5B6692FB', + 'RenderQueueLBPublicListenerBBF15D5F', + 'RenderQueueRCSTaskA9AE70D3', + 'RenderQueueWaitForStableService4B92A8D2', + ]), + }); }); - // WHEN - renderQueueCommon.addChildDependency(host); + describe('renderQueueSize.min', () => { + describe('defaults to 1', () => { + function assertSpecifiesMinSize(stackToAssert: Stack) { + Template.fromStack(stackToAssert).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + MinSize: '1', + }); + } - // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::Instance', { - DependsOn: arrayWith( - 'RenderQueueCommonLBPublicListener935F5635', - 'RenderQueueCommonRCSTask2A4D5EA5', - 'RenderQueueCommonAlbEc2ServicePatternService42BEFF4C', - 'RenderQueueCommonWaitForStableServiceDB53E266', - ), - }, ResourcePart.CompleteDefinition)); - }); + test('renderQueueSize unspecified', () => { + // THEN + assertSpecifiesMinSize(stack); + }); - describe('renderQueueSize.min', () => { - describe('defaults to 1', () => { - function assertSpecifiesMinSize(stackToAssert: Stack) { - expectCDK(stackToAssert).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - MinSize: '1', - })); - } + test('renderQueueSize.min unspecified', () => { + // GIVEN + const isolatedStack = new Stack(app, 'IsolatedStack'); - test('renderQueueSize unspecified', () => { - // THEN - assertSpecifiesMinSize(stack); + // WHEN + new RenderQueue(isolatedStack, 'RenderQueue', { + images, + repository, + version: new VersionQuery(isolatedStack, 'Version'), + vpc, + renderQueueSize: {}, + }); + + // THEN + assertSpecifiesMinSize(isolatedStack); + }); }); - test('renderQueueSize.min unspecified', () => { + // Asserts that at least one RCS container and ASG instance must be created. + test('throws error when minimum size is 0', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); + const props: RenderQueueProps = { + images, + repository, + version: renderQueueVersion, + vpc, + renderQueueSize: { + min: 0, + }, + }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', { + expect(() => { + new RenderQueue(stack, 'RenderQueueTest', props); + }) + // THEN + .toThrow('renderQueueSize.min capacity must be at least 1: got 0'); + }); + + // Deadline before 10.1.10 requires that successive API requests are serviced by a single RCS. + test('validates Deadline pre 10.1.10 has min value of at most 1', () => { + // GIVEN + const min = 2; + const newStack = new Stack(app, 'NewStack'); + const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); + const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: versionOld, vpc, - renderQueueSize: {}, - }); + renderQueueSize: { + min, + }, + }; + // WHEN + expect(() => { + new RenderQueue(newStack, 'RenderQueueTest', props); + }) // THEN - assertSpecifiesMinSize(isolatedStack); + .toThrow(`renderQueueSize.min for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${min}`); }); - }); - // Asserts that at least one RCS container and ASG instance must be created. - test('throws error when minimum size is 0', () => { - // GIVEN - const props: RenderQueueProps = { - images, - repository, - version: renderQueueVersion, - vpc, - renderQueueSize: { - min: 0, - }, - }; + // Asserts that when the renderQueueSize.min prop is specified, the underlying ASG's min property is set accordingly. + test.each([ + [1], + [2], + [10], + ])('configures minimum number of ASG instances to %d', (min: number) => { + // GIVEN + const isolatedStack = new Stack(app, 'IsolatedStack'); + const props: RenderQueueProps = { + images, + repository, + version: new VersionQuery(isolatedStack, 'Version'), + vpc, + renderQueueSize: { + min, + }, + }; + + // WHEN + new RenderQueue(isolatedStack, 'RenderQueue', props); - // WHEN - expect(() => { - new RenderQueue(stack, 'RenderQueue', props); - }) // THEN - .toThrow('renderQueueSize.min capacity must be at least 1: got 0'); + Template.fromStack(isolatedStack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + MinSize: min.toString(), + }); + }); }); - // Deadline before 10.1.10 requires that successive API requests are serviced by a single RCS. - test('validates Deadline pre 10.1.10 has min value of at most 1', () => { - // GIVEN - const min = 2; - const newStack = new Stack(app, 'NewStack'); - const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); - const props: RenderQueueProps = { - images, - repository, - version: versionOld, - vpc, - renderQueueSize: { - min, - }, - }; + describe('renderQueueSize.max', () => { + describe('defaults to 1', () => { + function assertSpecifiesMaxSize(stackToAssert: Stack) { + Template.fromStack(stackToAssert).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + MaxSize: '1', + }); + } - // WHEN - expect(() => { - new RenderQueue(newStack, 'RenderQueue', props); - }) - // THEN - .toThrow(`renderQueueSize.min for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${min}`); - }); + test('renderQueueSize unspecified', () => { + // THEN + assertSpecifiesMaxSize(stack); + }); - // Asserts that when the renderQueueSize.min prop is specified, the underlying ASG's min property is set accordingly. - test.each([ - [1], - [2], - [10], - ])('configures minimum number of ASG instances to %d', (min: number) => { - // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - const props: RenderQueueProps = { - images, - repository, - version: new VersionQuery(isolatedStack, 'Version'), - vpc, - renderQueueSize: { - min, - }, - }; + test('renderQueueSize.max unspecified', () => { + // GIVEN + const isolatedStack = new Stack(app, 'IsolatedStack'); - // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + // WHEN + new RenderQueue(isolatedStack, 'RenderQueue', { + images, + repository, + version: new VersionQuery(isolatedStack, 'Version'), + vpc, + renderQueueSize: {}, + }); - // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - MinSize: min.toString(), - })); - }); - }); + // THEN + assertSpecifiesMaxSize(isolatedStack); + }); + }); - describe('renderQueueSize.max', () => { - describe('defaults to 1', () => { - function assertSpecifiesMaxSize(stackToAssert: Stack) { - expectCDK(stackToAssert).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - MaxSize: '1', - })); - } + // Deadline before 10.1.10 requires that successive API requests are serviced by a single RCS. + test('validates Deadline pre 10.1.10 has max value of at most 1', () => { + // GIVEN + const max = 2; + const newStack = new Stack(app, 'NewStack'); + const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); + const props: RenderQueueProps = { + images, + repository, + version: versionOld, + vpc, + renderQueueSize: { + max, + }, + }; - test('renderQueueSize unspecified', () => { + // WHEN + expect(() => { + new RenderQueue(newStack, 'RenderQueue', props); + }) // THEN - assertSpecifiesMaxSize(stack); + .toThrow(`renderQueueSize.max for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${max}`); }); - test('renderQueueSize.max unspecified', () => { + // Asserts that when the renderQueueSize.max prop is specified, the underlying ASG's max property is set accordingly. + test.each([ + [1], + [2], + [10], + ])('configures maximum number of ASG instances to %d', (max: number) => { // GIVEN const isolatedStack = new Stack(app, 'IsolatedStack'); - - // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', { + const props: RenderQueueProps = { images, repository, version: new VersionQuery(isolatedStack, 'Version'), vpc, - renderQueueSize: {}, - }); + renderQueueSize: { + max, + }, + }; + + // WHEN + new RenderQueue(isolatedStack, 'RenderQueue', props); // THEN - assertSpecifiesMaxSize(isolatedStack); + Template.fromStack(isolatedStack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + MaxSize: max.toString(), + }); }); }); - // Deadline before 10.1.10 requires that successive API requests are serviced by a single RCS. - test('validates Deadline pre 10.1.10 has max value of at most 1', () => { - // GIVEN - const max = 2; - const newStack = new Stack(app, 'NewStack'); - const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); - const props: RenderQueueProps = { - images, - repository, - version: versionOld, - vpc, - renderQueueSize: { - max, - }, - }; + describe('renderQueueSize.desired', () => { + describe('defaults', () => { + test('unset ASG desired', () => { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + DesiredCapacity: Match.absent(), + }); + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { + DesiredCount: 1, + }); + }); + }); - // WHEN - expect(() => { - new RenderQueue(newStack, 'RenderQueue', props); - }) - // THEN - .toThrow(`renderQueueSize.max for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${max}`); - }); + test('validates Deadline pre 10.1.10 has desired value of at most 1', () => { + // GIVEN + const desired = 2; + const newStack = new Stack(app, 'NewStack'); + const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); + const props: RenderQueueProps = { + images, + repository, + version: versionOld, + vpc, + renderQueueSize: { + desired, + }, + }; - // Asserts that when the renderQueueSize.max prop is specified, the underlying ASG's max property is set accordingly. - test.each([ - [1], - [2], - [10], - ])('configures maximum number of ASG instances to %d', (max: number) => { - // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - const props: RenderQueueProps = { - images, - repository, - version: new VersionQuery(isolatedStack, 'Version'), - vpc, - renderQueueSize: { - max, - }, - }; + // WHEN + expect(() => { + new RenderQueue(newStack, 'RenderQueue', props); + }) + // THEN + .toThrow(`renderQueueSize.desired for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${desired}`); + }); - // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + test.each([ + [1], + [2], + [10], + ])('is specified to %d', (desired: number) => { + // GIVEN + const isolatedStack = new Stack(app, 'IsolatedStack'); + const props: RenderQueueProps = { + images, + repository, + version: new VersionQuery(isolatedStack, 'Version'), + vpc, + renderQueueSize: { + desired, + }, + }; + + // WHEN + new RenderQueue(isolatedStack, 'RenderQueue', props); - // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - MaxSize: max.toString(), - })); + // THEN + Template.fromStack(isolatedStack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + DesiredCapacity: desired.toString(), + }); + // THEN + Template.fromStack(isolatedStack).hasResourceProperties('AWS::ECS::Service', { + DesiredCount: desired, + }); + }); }); - }); - describe('renderQueueSize.desired', () => { - describe('defaults', () => { - test('unset ASG desired', () => { - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - DesiredCapacity: ABSENT, - })); - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { - DesiredCount: 1, - })); + test('creates WaitForStableService by default', () => { + // THEN + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_WaitForStableService', { + cluster: stack.resolve(renderQueue.cluster.clusterArn), + // eslint-disable-next-line dot-notation + services: [stack.resolve(renderQueue['pattern'].service.serviceArn)], }); }); - test('validates Deadline pre 10.1.10 has desired value of at most 1', () => { - // GIVEN - const desired = 2; - const newStack = new Stack(app, 'NewStack'); - const versionOld = new VersionQuery(newStack, 'VersionOld', {version: '10.1.9'}); - const props: RenderQueueProps = { - images, - repository, - version: versionOld, - vpc, - renderQueueSize: { - desired, + test('Does not enable filesystem cache by default', () => { + resourcePropertiesCountIs(stack, 'AWS::AutoScaling::LaunchConfiguration', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + Match.arrayWith([ + Match.stringLikeRegexp('.*# RenderQueue file caching enabled.*'), + ]), + ], + }, }, - }; + }, 0); + }); - // WHEN - expect(() => { - new RenderQueue(newStack, 'RenderQueue', props); - }) - // THEN - .toThrow(`renderQueueSize.desired for Deadline version less than 10.1.10.0 cannot be greater than 1 - got ${desired}`); + test('runs as RCS user', () => { + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([ + Match.objectLike({ User: '1000:1000' }), + ]), + }); }); - test.each([ - [1], - [2], - [10], - ])('is specified to %d', (desired: number) => { + test('.backendConnections is associated with ASG security group rules', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - const props: RenderQueueProps = { - images, - repository, - version: new VersionQuery(isolatedStack, 'Version'), + const instance = new Instance(dependencyStack, 'BackendConnectionInstance', { + instanceType: InstanceType.of(InstanceClass.T3, InstanceSize.MICRO), + machineImage: MachineImage.latestAmazonLinux(), vpc, - renderQueueSize: { - desired, - }, - }; + }); + const portNumber = 5555; + const port = Port.tcp(portNumber); + const asgSecurityGroup = renderQueue.asg.connections.securityGroups[0]; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + renderQueue.backendConnections.allowFrom(instance, port); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - DesiredCapacity: desired.toString(), - })); - // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ECS::Service', { - DesiredCount: desired, - })); + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { + IpProtocol: 'tcp', + Description: `from ${instance.connections.securityGroups[0].uniqueId}:${portNumber}`, + GroupId: stack.resolve(asgSecurityGroup.securityGroupId), + SourceSecurityGroupId: stack.resolve(instance.connections.securityGroups[0].securityGroupId), + FromPort: portNumber, + ToPort: portNumber, + }); }); }); describe('trafficEncryption', () => { describe('defaults', () => { - let isolatedStack: Stack; + let repository: Repository; beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: {}, }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }); // THEN test('to HTTPS internally between ALB and RCS', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { Protocol: 'HTTPS', Port: 4433, - })); + }); }); test('to HTTPS externally between clients and ALB', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Protocol: 'HTTPS', Port: 4433, - })); + }); }); }); describe('when interalProtocol is HTTPS', () => { - let isolatedStack: Stack; + let repository: Repository; let renderQueue: RenderQueue; let caCertPemLogicalId: string; let caCertPkcsLogicalId: string; @@ -524,11 +586,14 @@ describe('RenderQueue', () => { beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { internalProtocol: ApplicationProtocol.HTTPS, @@ -536,43 +601,43 @@ describe('RenderQueue', () => { }; // WHEN - renderQueue = new RenderQueue(isolatedStack, 'RenderQueue', props); + renderQueue = new RenderQueue(stack, 'RenderQueue', props); - caCertPemLogicalId = isolatedStack.getLogicalId( + caCertPemLogicalId = stack.getLogicalId( renderQueue.node.findChild('TlsCaCertPem').node.defaultChild as CfnElement, ); const caCertPkcs = renderQueue.node.findChild('TlsRcsCertBundle'); const caCertPkcsPassphrase = caCertPkcs.node.findChild('Passphrase'); - caCertPkcsLogicalId = isolatedStack.getLogicalId(caCertPkcs.node.defaultChild as CfnElement); - caCertPkcsPassphraseLogicalId = isolatedStack.getLogicalId(caCertPkcsPassphrase.node.defaultChild as CfnElement); + caCertPkcsLogicalId = stack.getLogicalId(caCertPkcs.node.defaultChild as CfnElement); + caCertPkcsPassphraseLogicalId = stack.getLogicalId(caCertPkcsPassphrase.node.defaultChild as CfnElement); }); // THEN test('ALB connects with HTTPS to port 4433', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { Protocol: 'HTTPS', Port: 4433, - })); + }); }); test('creates RCS cert', () => { - expectCDK(isolatedStack).to(haveResourceLike('Custom::RFDK_X509Generator', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { ServiceToken: { - 'Fn::GetAtt': arrayWith('Arn'), + 'Fn::GetAtt': Match.arrayWith(['Arn']), }, DistinguishedName: { CN: 'renderfarm.local' }, Secret: { - NamePrefix: 'IsolatedStack/RenderQueue/TlsCaCertPem', + NamePrefix: 'Stack/RenderQueue/TlsCaCertPem', }, - })); + }); }); test('grants read access to secrets containing the certs and passphrase', () => { const taskDef = renderQueue.node.findChild('RCSTask') as TaskDefinition; - const taskRoleLogicalId = isolatedStack.getLogicalId((taskDef.taskRole as Role).node.defaultChild as CfnElement); - expectCDK(isolatedStack).to(haveResourceLike('AWS::IAM::Policy', { + const taskRoleLogicalId = stack.getLogicalId((taskDef.taskRole as Role).node.defaultChild as CfnElement); + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 'secretsmanager:GetSecretValue', @@ -607,60 +672,61 @@ describe('RenderQueue', () => { Effect: 'Allow', Resource: { Ref: caCertPkcsPassphraseLogicalId }, }, - ), + ]), Version: '2012-10-17', }, - Roles: arrayWith({ Ref: taskRoleLogicalId }), - })); + Roles: Match.arrayWith([{ Ref: taskRoleLogicalId }]), + }); }); test('configures environment variables for cert secret URIs', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith(deepObjectLike({ - Environment: arrayWith( - { - Name: 'RCS_TLS_CA_CERT_URI', - Value: { - 'Fn::GetAtt': [ - caCertPemLogicalId, - 'Cert', - ], + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([ + Match.objectLike({ + Environment: Match.arrayWith([ + { + Name: 'RCS_TLS_CA_CERT_URI', + Value: { + 'Fn::GetAtt': [ + caCertPemLogicalId, + 'Cert', + ], + }, }, - }, - { - Name: 'RCS_TLS_CERT_URI', - Value: { - 'Fn::GetAtt': [ - caCertPkcsLogicalId, - 'Cert', - ], + { + Name: 'RCS_TLS_CERT_URI', + Value: { + 'Fn::GetAtt': [ + caCertPkcsLogicalId, + 'Cert', + ], + }, }, - }, - { - Name: 'RCS_TLS_CERT_PASSPHRASE_URI', - Value: { Ref: caCertPkcsPassphraseLogicalId }, - }, - ), - })), - })); + { + Name: 'RCS_TLS_CERT_PASSPHRASE_URI', + Value: { Ref: caCertPkcsPassphraseLogicalId }, + }, + ]), + }), + ]), + }); }); }); describe('when internal protocol is HTTP', () => { - let isolatedStack: Stack; + let repository: Repository; beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - const nonSmRepository = new Repository(dependencyStack, 'NonSMRepository', { + repository = new Repository(dependencyStack, 'NonSMRepository', { vpc, version, secretsManagementSettings: { enabled: false }, }); const props: RenderQueueProps = { images, - repository: nonSmRepository, - version: new VersionQuery(isolatedStack, 'Version'), + repository: repository, + version: renderQueueVersion, vpc, trafficEncryption: { internalProtocol: ApplicationProtocol.HTTP, @@ -669,39 +735,45 @@ describe('RenderQueue', () => { }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }); // THEN test('no certs are created', () => { - expectCDK(isolatedStack).notTo(haveResource('Custom::RFDK_X509Generator')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_X509Generator', 0); }); test('ALB connects with HTTP to port 8080', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { Protocol: 'HTTP', Port: 8080, - })); + }); }); }); describe('externalProtocol is HTTPS', () => { - let isolatedStack: Stack; + let repository: Repository; const CERT_ARN = 'certarn'; const CA_ARN = 'arn:aws:secretsmanager:123456789012:secret:ca/arn'; const ZONE_NAME = 'renderfarm.local'; beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + // Cannot have secrets management unless external TLS is enabled on the RQ, + // so we disable it to allow for testing. + secretsManagementSettings: { enabled: false }, + }); + const zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { @@ -716,30 +788,30 @@ describe('RenderQueue', () => { }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }); test('sets the listener port to 4433', () => { // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Port: 4433, - })); + }); }); test('sets the listener protocol to HTTPS', () => { // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Protocol: 'HTTPS', - })); + }); }); test('configures the ALB listener to use the specified ACM certificate', () => { - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Protocol: 'HTTPS', - Certificates: arrayWith({ + Certificates: Match.arrayWith([{ CertificateArn: CERT_ARN, - }), - })); + }]), + }); }); test('raises an error when a cert is specified without a hosted zone', () => { @@ -759,7 +831,7 @@ describe('RenderQueue', () => { // WHEN expect(() => { - new RenderQueue(stack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueueTest', props); }) // THEN .toThrow(/The hostname for the render queue must be defined if supplying your own certificates./); @@ -767,7 +839,7 @@ describe('RenderQueue', () => { test('raises an error when a cert is specified without a hostname', () => { // GIVEN - const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZoneNoName', { + const zone = new PrivateHostedZone(stack, 'RenderQueueZoneNoName', { vpc, zoneName: ZONE_NAME, }); @@ -788,7 +860,7 @@ describe('RenderQueue', () => { // WHEN expect(() => { - new RenderQueue(stack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueueTest', props); }) // THEN .toThrow(/A hostname must be supplied if a certificate is supplied, with the common name of the certificate matching the hostname \+ domain name/); @@ -797,40 +869,42 @@ describe('RenderQueue', () => { describe('externalProtocol is HTTPS importing cert', () => { describe('passing cases', () => { - let isolatedStack: Stack; + let repository: Repository; let zone: PrivateHostedZone; const ZONE_NAME = 'renderfarm.local'; const HOSTNAME = 'server'; beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + repository = new Repository(dependencyStack, 'NonSMRepository', { + vpc, + version, + // Cannot have secrets management unless external TLS is enabled on the RQ, + // so we disable it to allow for testing. + secretsManagementSettings: { enabled: false }, + }); + + zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); - const caCert = new X509CertificatePem(isolatedStack, 'CaCert', { + const caCert = new X509CertificatePem(stack, 'CaCert', { subject: { cn: `ca.${ZONE_NAME}`, }, }); - const serverCert = new X509CertificatePem(isolatedStack, 'ServerCert', { + const serverCert = new X509CertificatePem(stack, 'ServerCert', { subject: { cn: `${HOSTNAME}.${ZONE_NAME}`, }, signingCertificate: caCert, }); - const nonSmRepository = new Repository(dependencyStack, 'NonSMRepository', { - vpc, - version, - secretsManagementSettings: { enabled: false }, - }); const props: RenderQueueProps = { images, - repository: nonSmRepository, - version: new VersionQuery(isolatedStack, 'Version'), + repository, + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { @@ -845,26 +919,26 @@ describe('RenderQueue', () => { }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }); test('sets the listener port to 4433', () => { // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Port: 4433, - })); + }); }); test('sets the listener protocol to HTTPS', () => { // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Protocol: 'HTTPS', - })); + }); }); test('Imports Cert to ACM', () => { // THEN - expectCDK(isolatedStack).to(haveResourceLike('Custom::RFDK_AcmImportedCertificate', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_AcmImportedCertificate', { X509CertificatePem: { Cert: { 'Fn::GetAtt': [ @@ -888,7 +962,7 @@ describe('RenderQueue', () => { ], }, }, - })); + }); }); }); @@ -897,13 +971,16 @@ describe('RenderQueue', () => { const ZONE_NAME = 'renderfarm.local'; const HOSTNAME = 'server'; // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); + const zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); - const rootCert = new X509CertificatePem(isolatedStack, 'RootCert', { + const rootCert = new X509CertificatePem(stack, 'RootCert', { subject: { cn: `ca.${ZONE_NAME}`, }, @@ -912,7 +989,7 @@ describe('RenderQueue', () => { const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { @@ -928,7 +1005,7 @@ describe('RenderQueue', () => { // WHEN expect(() => { - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }) // THEN .toThrow(/Provided rfdkCertificate does not contain a certificate chain/); @@ -938,12 +1015,15 @@ describe('RenderQueue', () => { test('Creates default RFDK cert if no cert given', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { @@ -951,66 +1031,69 @@ describe('RenderQueue', () => { }, }; - const rq = new RenderQueue(isolatedStack, 'RenderQueue', props); + const rq = new RenderQueue(stack, 'RenderQueue', props); - const rootCa = rq.node.findChild('RootCA').node.defaultChild as X509CertificatePem; + const rootCa = rq.node.findChild('RootCA') as X509CertificatePem; const rootCaGen = rootCa.node.defaultChild as CustomResource; - const rfdkCert = rq.node.findChild('RenderQueuePemCert').node.defaultChild as X509CertificatePem; + const rfdkCert = rq.node.findChild('RenderQueuePemCert') as X509CertificatePem; const rfdkCertGen = rfdkCert.node.defaultChild as CustomResource; - const acmCert = rq.node.findChild('AcmCert').node.defaultChild as ImportedAcmCertificate; + const acmCert = rq.node.findChild('AcmCert') as ImportedAcmCertificate; - expectCDK(isolatedStack).to(haveResourceLike('Custom::RFDK_X509Generator', { - Passphrase: isolatedStack.resolve(rootCa.passphrase), - })); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { + Passphrase: stack.resolve(rootCa.passphrase.secretArn), + }); - expectCDK(isolatedStack).to(haveResourceLike('Custom::RFDK_X509Generator', { - Passphrase: isolatedStack.resolve(rfdkCert.passphrase), + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_X509Generator', { + Passphrase: stack.resolve(rfdkCert.passphrase.secretArn), SigningCertificate: { - Cert: isolatedStack.resolve(rootCaGen.getAtt('Cert')), - Key: isolatedStack.resolve(rootCaGen.getAtt('Key')), - Passphrase: isolatedStack.resolve(rootCa.passphrase), + Cert: stack.resolve(rootCaGen.getAtt('Cert')), + Key: stack.resolve(rootCaGen.getAtt('Key')), + Passphrase: stack.resolve(rootCa.passphrase.secretArn), CertChain: '', }, - })); + }); - expectCDK(isolatedStack).to(countResources('Custom::RFDK_AcmImportedCertificate', 1)); - expectCDK(isolatedStack).to(haveResourceLike('Custom::RFDK_AcmImportedCertificate', { + Template.fromStack(stack).resourceCountIs('Custom::RFDK_AcmImportedCertificate', 1); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_AcmImportedCertificate', { X509CertificatePem: { - Cert: isolatedStack.resolve(rfdkCertGen.getAtt('Cert')), - Key: isolatedStack.resolve(rfdkCertGen.getAtt('Key')), - Passphrase: isolatedStack.resolve(rfdkCert.passphrase), - CertChain: isolatedStack.resolve(rfdkCertGen.getAtt('CertChain')), + Cert: stack.resolve(rfdkCertGen.getAtt('Cert')), + Key: stack.resolve(rfdkCertGen.getAtt('Key')), + Passphrase: stack.resolve(rfdkCert.passphrase.secretArn), + CertChain: stack.resolve(rfdkCertGen.getAtt('CertChain')), }, - })); + }); - expectCDK(isolatedStack).to(countResources('AWS::ElasticLoadBalancingV2::Listener', 1)); - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::Listener', { + Template.fromStack(stack).resourceCountIs('AWS::ElasticLoadBalancingV2::Listener', 1); + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::Listener', { Certificates: [ { - CertificateArn: isolatedStack.resolve(acmCert.certificateArn), + CertificateArn: stack.resolve(acmCert.certificateArn), }, ], - })); + }); }); test('Throws if given ACM cert and RFDK Cert', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); const ZONE_NAME = 'renderfarm.local'; const CERT_ARN = 'certArn'; const CA_ARN = 'arn:aws:secretsmanager:123456789012:secret:ca/arn'; - const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); + const zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); - const caCert = new X509CertificatePem(isolatedStack, 'CaCert', { + const caCert = new X509CertificatePem(stack, 'CaCert', { subject: { cn: `ca.${ZONE_NAME}`, }, }); - const serverCert = new X509CertificatePem(isolatedStack, 'ServerCert', { + const serverCert = new X509CertificatePem(stack, 'ServerCert', { subject: { cn: `server.${ZONE_NAME}`, }, @@ -1020,12 +1103,12 @@ describe('RenderQueue', () => { const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { - acmCertificate: Certificate.fromCertificateArn(isolatedStack, 'Certificate', CERT_ARN), - acmCertificateChain: Secret.fromSecretPartialArn(isolatedStack, 'CA_Cert', CA_ARN), + acmCertificate: Certificate.fromCertificateArn(stack, 'Certificate', CERT_ARN), + acmCertificateChain: Secret.fromSecretPartialArn(stack, 'CA_Cert', CA_ARN), rfdkCertificate: serverCert, }, }, @@ -1036,7 +1119,7 @@ describe('RenderQueue', () => { // WHEN expect(() => { - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }) // THEN .toThrow(/Exactly one of externalTLS.acmCertificate and externalTLS.rfdkCertificate must be provided when using externalTLS/); @@ -1044,12 +1127,16 @@ describe('RenderQueue', () => { test('Throws if ACM Cert is given without a cert chain', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); const HOSTNAME = 'renderqueue'; const ZONE_NAME = 'renderfarm.local'; const CERT_ARN = 'certArn'; - const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); + + const zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); @@ -1057,11 +1144,11 @@ describe('RenderQueue', () => { const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { - acmCertificate: Certificate.fromCertificateArn(isolatedStack, 'Certificate', CERT_ARN), + acmCertificate: Certificate.fromCertificateArn(stack, 'Certificate', CERT_ARN), }, }, hostname: { @@ -1072,7 +1159,7 @@ describe('RenderQueue', () => { // WHEN expect(() => { - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }) // THEN .toThrow(/externalTLS.acmCertificateChain must be provided when using externalTLS.acmCertificate./); @@ -1081,27 +1168,29 @@ describe('RenderQueue', () => { describe('Client Connection', () => { describe('externalProtocol is http', () => { - let isolatedStack: Stack; + let repository: Repository; + let renderQueue: RenderQueue; let zone: PrivateHostedZone; const ZONE_NAME = 'renderfarm.local'; - let rq: RenderQueue; beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { - vpc, - zoneName: ZONE_NAME, - }); - const nonSmRepository = new Repository(dependencyStack, 'NonSMRepository', { + repository = new Repository(dependencyStack, 'NonSMRepository', { vpc, version, + // Cannot have secrets management unless external TLS is enabled on the RQ, + // so we disable it to allow for testing. secretsManagementSettings: { enabled: false }, }); + zone = new PrivateHostedZone(stack, 'RenderQueueZone', { + vpc, + zoneName: ZONE_NAME, + }); + const props: RenderQueueProps = { images, - repository: nonSmRepository, - version: new VersionQuery(isolatedStack, 'Version'), + repository, + version: renderQueueVersion, vpc, hostname: { zone, @@ -1110,223 +1199,115 @@ describe('RenderQueue', () => { }; // WHEN - rq = new RenderQueue(isolatedStack, 'RenderQueue', props); + renderQueue = new RenderQueue(stack, 'RenderQueue', props); }); test('ECS can connect', () => { - // WHEN - const hosts = [new Instance(isolatedStack, 'Host', { - vpc, - instanceType: InstanceType.of( - InstanceClass.R4, - InstanceSize.LARGE, - ), - machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), - })]; - const role = new Role(isolatedStack, 'Role', {assumedBy: new AccountRootPrincipal()}); - - const env = rq.configureClientECS({ - hosts, - grantee: role, - }); - - // THEN - expect(env).toHaveProperty('RENDER_QUEUE_URI'); - expect(env.RENDER_QUEUE_URI).toMatch(/http:\/\/.*:8080$/); - - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { - IpProtocol: 'tcp', - ToPort: 8080, - SourceSecurityGroupId: { - 'Fn::GetAtt': [ - isolatedStack.getLogicalId(hosts[0].connections.securityGroups[0].node.defaultChild as CfnElement), - 'GroupId', - ], - }, - })); - - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::Instance', { - DependsOn: arrayWith( - 'RenderQueueLBPublicListenerBBF15D5F', - 'RenderQueueRCSTaskA9AE70D3', - ), - }, ResourcePart.CompleteDefinition)); - }); - - test('Linux Instance can connect', () => { - // WHEN - const host = new Instance(isolatedStack, 'Host', { - vpc, - instanceType: InstanceType.of( - InstanceClass.R4, - InstanceSize.LARGE, - ), - machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), - }); - - rq.configureClientInstance({ - host, - }); - - // THEN - const userData = isolatedStack.resolve(host.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - "#!/bin/bash\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - { Ref: RQ_CONNECTION_ASSET.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\'\n' + - 'if [ -f \"/etc/profile.d/deadlineclient.sh\" ]; then\n' + - ' source \"/etc/profile.d/deadlineclient.sh\"\n' + - 'fi\n' + - '"${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - `" --render-queue "http://renderqueue.${ZONE_NAME}:8080" \n` + - 'rm -f "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, + // WHEN + const hosts = [new Instance(stack, 'Host', { + vpc, + instanceType: InstanceType.of( + InstanceClass.R4, + InstanceSize.LARGE, + ), + machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), + })]; + const role = new Role(stack, 'Role', {assumedBy: new AccountRootPrincipal()}); + + const env = renderQueue.configureClientECS({ + hosts, + grantee: role, + }); + + // THEN + expect(env).toHaveProperty('RENDER_QUEUE_URI'); + expect(env.RENDER_QUEUE_URI).toMatch(/http:\/\/.*:8080$/); + + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { + IpProtocol: 'tcp', + ToPort: 8080, + SourceSecurityGroupId: { + 'Fn::GetAtt': [ + stack.getLogicalId(hosts[0].connections.securityGroups[0].node.defaultChild as CfnElement), + 'GroupId', + ], + }, + }); + + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { + DependsOn: Match.arrayWith([ + 'RenderQueueLBPublicListenerBBF15D5F', + 'RenderQueueRCSTaskA9AE70D3', + ]), + }); + }); + + test('Linux Instance can connect', () => { + // WHEN + const host = new Instance(stack, 'Host', { + vpc, + instanceType: InstanceType.of( + InstanceClass.R4, + InstanceSize.LARGE, + ), + machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), + }); + + renderQueue.configureClientInstance({ + host, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + `mkdir -p $(dirname '/tmp/${RQ_CONNECTION_ASSET.Key}.py')\n` + + 'aws s3 cp \'s3://', { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket, }, + `/${RQ_CONNECTION_ASSET.Key}.py' '/tmp/${RQ_CONNECTION_ASSET.Key}.py'\n` + + 'if [ -f "/etc/profile.d/deadlineclient.sh" ]; then\n' + + ' source "/etc/profile.d/deadlineclient.sh"\n' + + 'fi\n' + + `"\${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "http://renderqueue.${ZONE_NAME}:8080" \n` + + `rm -f "/tmp/${RQ_CONNECTION_ASSET.Key}.py"\n` + + 'if service --status-all | grep -q "Deadline 10 Launcher"; then\n' + + ' service deadline10launcher restart\n' + + 'fi', ], - }, - '"\n' + - 'if service --status-all | grep -q "Deadline 10 Launcher"; then\n' + - ' service deadline10launcher restart\n' + - 'fi', - ], - ], + ], + }, + }, }); // Make sure we execute the script with the correct args - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 8080, SourceSecurityGroupId: { 'Fn::GetAtt': [ - isolatedStack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), + stack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), 'GroupId', ], }, - })); + }); - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::Instance', { - DependsOn: arrayWith( + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { + DependsOn: Match.arrayWith([ 'RenderQueueLBPublicListenerBBF15D5F', 'RenderQueueRCSTaskA9AE70D3', - ), - }, ResourcePart.CompleteDefinition)); + ]), + }); }); test('Windows Instance can connect', () => { // WHEN - const host = new Instance(isolatedStack, 'Host', { + const host = new Instance(stack, 'Host', { vpc, instanceType: InstanceType.of( InstanceClass.R4, @@ -1335,174 +1316,63 @@ describe('RenderQueue', () => { machineImage: MachineImage.latestWindows( WindowsVersion.WINDOWS_SERVER_2019_ENGLISH_CORE_BASE), }); - rq.configureClientInstance({ + renderQueue.configureClientInstance({ host, }); // THEN - const userData = isolatedStack.resolve(host.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' ) -ea 0\n` + + 'Read-S3Object -BucketName \'', { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' ) -ea 0\n' + - 'Read-S3Object -BucketName \'', - { Ref: RQ_CONNECTION_ASSET.Bucket }, - '\' -key \'', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' -file \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' -ErrorAction Stop\n' + - '$ErrorActionPreference = "Stop"\n' + - '$DEADLINE_PATH = (get-item env:"DEADLINE_PATH").Value\n' + - '& "$DEADLINE_PATH/deadlinecommand.exe" -executeScriptNoGui "C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - `" --render-queue "http://renderqueue.${ZONE_NAME}:8080" 2>&1\n` + - 'Remove-Item -Path "C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket, }, + `' -key '${RQ_CONNECTION_ASSET.Key}.py' -file 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' -ErrorAction Stop\n` + + '$ErrorActionPreference = "Stop"\n' + + '$DEADLINE_PATH = (get-item env:"DEADLINE_PATH").Value\n' + + `& "$DEADLINE_PATH/deadlinecommand.exe" -executeScriptNoGui "C:/temp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "http://renderqueue.${ZONE_NAME}:8080" 2>&1\n` + + `Remove-Item -Path "C:/temp/${RQ_CONNECTION_ASSET.Key}.py"\n` + + 'If (Get-Service "deadline10launcherservice" -ErrorAction SilentlyContinue) {\n' + + ' Restart-Service "deadline10launcherservice"\n' + + '} Else {\n' + + ' & "$DEADLINE_PATH/deadlinelauncher.exe" -shutdownall 2>&1\n' + + ' & "$DEADLINE_PATH/deadlinelauncher.exe" -nogui 2>&1\n' + + '}', ], - }, - '"\n' + - 'If (Get-Service "deadline10launcherservice" -ErrorAction SilentlyContinue) {\n' + - ' Restart-Service "deadline10launcherservice"\n' + - '} Else {\n' + - ' & "$DEADLINE_PATH/deadlinelauncher.exe" -shutdownall 2>&1\n' + - ' & "$DEADLINE_PATH/deadlinelauncher.exe" -nogui 2>&1\n' + - '}', - ], - ], + ], + }, + }, }); // Make sure we execute the script with the correct args - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 8080, SourceSecurityGroupId: { 'Fn::GetAtt': [ - isolatedStack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), + stack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), 'GroupId', ], }, - })); + }); - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::Instance', { - DependsOn: arrayWith( + Template.fromStack(stack).hasResource('AWS::EC2::Instance', { + DependsOn: Match.arrayWith([ 'RenderQueueLBPublicListenerBBF15D5F', 'RenderQueueRCSTaskA9AE70D3', - ), - }, ResourcePart.CompleteDefinition)); + ]), + }); }); }); describe('externalProtocol is https', () => { - let isolatedStack: Stack; let zone: PrivateHostedZone; - let rq: RenderQueue; + let renderQueue: RenderQueue; const HOSTNAME = 'renderqueue'; const ZONE_NAME = 'renderfarm.local'; const CERT_ARN = 'arn:a:b:c:dcertarn'; @@ -1510,15 +1380,18 @@ describe('RenderQueue', () => { beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); + zone = new PrivateHostedZone(stack, 'RenderQueueZone', { vpc, zoneName: ZONE_NAME, }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, hostname: { hostname: HOSTNAME, @@ -1533,12 +1406,12 @@ describe('RenderQueue', () => { }; // WHEN - rq = new RenderQueue(isolatedStack, 'RenderQueue', props); + renderQueue = new RenderQueue(stack, 'RenderQueue', props); }); test('ECS can connect', () => { // WHEN - const hosts = [new Instance(isolatedStack, 'Host', { + const hosts = [new Instance(stack, 'Host', { vpc, instanceType: InstanceType.of( InstanceClass.R4, @@ -1546,9 +1419,9 @@ describe('RenderQueue', () => { ), machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), })]; - const role = new Role(isolatedStack, 'Role', {assumedBy: new AccountRootPrincipal()}); + const role = new Role(stack, 'Role', {assumedBy: new AccountRootPrincipal()}); - const env = rq.configureClientECS({ + const env = renderQueue.configureClientECS({ hosts, grantee: role, }); @@ -1558,21 +1431,21 @@ describe('RenderQueue', () => { expect(env.RENDER_QUEUE_URI).toMatch(/https:\/\/.*:4433$/); expect(env).toHaveProperty('RENDER_QUEUE_TLS_CA_CERT_URI', CA_ARN); - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 4433, SourceSecurityGroupId: { 'Fn::GetAtt': [ - isolatedStack.getLogicalId(hosts[0].connections.securityGroups[0].node.defaultChild as CfnElement), + stack.getLogicalId(hosts[0].connections.securityGroups[0].node.defaultChild as CfnElement), 'GroupId', ], }, - })); + }); }); test('Linux Instance can connect', () => { // WHEN - const host = new Instance(isolatedStack, 'Host', { + const host = new Instance(stack, 'Host', { vpc, instanceType: InstanceType.of( InstanceClass.R4, @@ -1581,162 +1454,54 @@ describe('RenderQueue', () => { machineImage: MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }), }); - rq.configureClientInstance({ + renderQueue.configureClientInstance({ host, }); // THEN - const userData = isolatedStack.resolve(host.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - "#!/bin/bash\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - { Ref: RQ_CONNECTION_ASSET.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\'\n' + - 'if [ -f \"/etc/profile.d/deadlineclient.sh\" ]; then\n' + - ' source \"/etc/profile.d/deadlineclient.sh\"\n' + - 'fi\n' + - '"${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - `" --render-queue "https://renderqueue.${ZONE_NAME}:4433" --tls-ca "${CA_ARN}"\n` + - 'rm -f "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + `mkdir -p $(dirname '/tmp/${RQ_CONNECTION_ASSET.Key}.py')\n` + + 'aws s3 cp \'s3://', { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket, }, + `/${RQ_CONNECTION_ASSET.Key}.py' '/tmp/${RQ_CONNECTION_ASSET.Key}.py'\n` + + 'if [ -f "/etc/profile.d/deadlineclient.sh" ]; then\n' + + ' source "/etc/profile.d/deadlineclient.sh"\n' + + 'fi\n' + + `"\${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "https://renderqueue.${ZONE_NAME}:4433" --tls-ca "${CA_ARN}"\n` + + `rm -f "/tmp/${RQ_CONNECTION_ASSET.Key}.py"\n` + + 'if service --status-all | grep -q "Deadline 10 Launcher"; then\n' + + ' service deadline10launcher restart\n' + + 'fi', ], - }, - '"\n' + - 'if service --status-all | grep -q "Deadline 10 Launcher"; then\n' + - ' service deadline10launcher restart\n' + - 'fi', - ], - ], + ], + }, + }, }); // Make sure we execute the script with the correct args - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 4433, SourceSecurityGroupId: { 'Fn::GetAtt': [ - isolatedStack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), + stack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), 'GroupId', ], }, - })); + }); }); test('Windows Instance can connect', () => { // WHEN - const host = new Instance(isolatedStack, 'Host', { + const host = new Instance(stack, 'Host', { vpc, instanceType: InstanceType.of( InstanceClass.R4, @@ -1745,160 +1510,49 @@ describe('RenderQueue', () => { machineImage: MachineImage.latestWindows( WindowsVersion.WINDOWS_SERVER_2019_ENGLISH_CORE_BASE), }); - rq.configureClientInstance({ + renderQueue.configureClientInstance({ host, }); // THEN - const userData = isolatedStack.resolve(host.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' ) -ea 0\n' + - 'Read-S3Object -BucketName \'', - { Ref: RQ_CONNECTION_ASSET.Bucket }, - '\' -key \'', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' -file \'C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\' -ErrorAction Stop\n' + - '$ErrorActionPreference = "Stop"\n' + - '$DEADLINE_PATH = (get-item env:"DEADLINE_PATH").Value\n' + - '& "$DEADLINE_PATH/deadlinecommand.exe" -executeScriptNoGui "C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - `" --render-queue "https://renderqueue.${ZONE_NAME}:4433" --tls-ca \"${CA_ARN}\" 2>&1\n` + - 'Remove-Item -Path "C:/temp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' ) -ea 0\n` + + 'Read-S3Object -BucketName \'', { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket, }, + `' -key '${RQ_CONNECTION_ASSET.Key}.py' -file 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' -ErrorAction Stop\n$ErrorActionPreference = "Stop"\n` + + '$DEADLINE_PATH = (get-item env:"DEADLINE_PATH").Value\n' + + `& "$DEADLINE_PATH/deadlinecommand.exe" -executeScriptNoGui "C:/temp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "https://renderqueue.${ZONE_NAME}:4433" --tls-ca "${CA_ARN}" 2>&1\n` + + `Remove-Item -Path "C:/temp/${RQ_CONNECTION_ASSET.Key}.py"\n` + + 'If (Get-Service "deadline10launcherservice" -ErrorAction SilentlyContinue) {\n' + + ' Restart-Service "deadline10launcherservice"\n' + + '} Else {\n' + + ' & "$DEADLINE_PATH/deadlinelauncher.exe" -shutdownall 2>&1\n' + + ' & "$DEADLINE_PATH/deadlinelauncher.exe" -nogui 2>&1\n' + + '}', ], - }, - '"\n' + - 'If (Get-Service "deadline10launcherservice" -ErrorAction SilentlyContinue) {\n' + - ' Restart-Service "deadline10launcherservice"\n' + - '} Else {\n' + - ' & "$DEADLINE_PATH/deadlinelauncher.exe" -shutdownall 2>&1\n' + - ' & "$DEADLINE_PATH/deadlinelauncher.exe" -nogui 2>&1\n' + - '}', - ], - ], + ], + }, + }, }); // Make sure we execute the script with the correct args - expectCDK(isolatedStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 4433, SourceSecurityGroupId: { 'Fn::GetAtt': [ - isolatedStack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), + stack.getLogicalId(host.connections.securityGroups[0].node.defaultChild as CfnElement), 'GroupId', ], }, - })); + }); }); }); }); @@ -1915,11 +1569,14 @@ describe('RenderQueue', () => { availabilityZone: 'us-west-2b', }), ]; - const isolatedStack = new Stack(app, 'IsolatedStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, vpcSubnets: { subnets, @@ -1930,134 +1587,144 @@ describe('RenderQueue', () => { }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); - expectCDK(isolatedStack).to(haveResource('AWS::AutoScaling::AutoScalingGroup', { - VPCZoneIdentifier: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + VPCZoneIdentifier: Match.arrayWith([ 'SubnetID1', 'SubnetID2', - ), - })); - expectCDK(isolatedStack).to(haveResource('AWS::ElasticLoadBalancingV2::LoadBalancer', { + ]), + }); + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { Subnets: [ 'SubnetID1', 'SubnetID2', ], - })); + }); }); test('can specify instance type', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, instanceType: InstanceType.of(InstanceClass.C5, InstanceSize.LARGE), repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 'c5.large', - })); + }); }); test('no deletion protection', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, deletionProtection: false, }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); // THEN - expectCDK(isolatedStack).to(not(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( + resourcePropertiesCountIs(stack, 'AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'deletion_protection.enabled', Value: 'true', }, - ), - Scheme: ABSENT, - Type: ABSENT, - }))); + ]), + Scheme: Match.absent(), + Type: Match.absent(), + }, 0); }); test('drop invalid http header fields enabled', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'routing.http.drop_invalid_header_fields.enabled', Value: 'true', }, - ), - })); + ]), + }); }); describe('hostname', () => { // GIVEN const zoneName = 'mydomain.local'; + let repository: Repository; - describe('not specified, with no TLS', () => { - let isolatedStack: Stack; + beforeEach(() => { + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + // Cannot have secrets management unless external TLS is enabled on the RQ, + // so we disable it to allow for testing. + secretsManagementSettings: { enabled: false }, + }); + }); + describe('not specified, with no TLS', () => { beforeEach(() => { // GIVEN - isolatedStack = new Stack(app, 'IsolatedStack'); - const nonSmRepository = new Repository(dependencyStack, 'NonSMRepository', { - vpc, - version, - secretsManagementSettings: { enabled: false }, - }); const props: RenderQueueProps = { images, - repository: nonSmRepository, - trafficEncryption: { externalTLS: { enabled: false } }, - version: new VersionQuery(isolatedStack, 'Version'), + repository, + version: renderQueueVersion, vpc, + trafficEncryption: { externalTLS: { enabled: false } }, }; // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', props); + new RenderQueue(stack, 'RenderQueue', props); }); // THEN test('does not create a record set', () => { - expectCDK(isolatedStack).notTo(haveResource('AWS::Route53::RecordSet')); + Template.fromStack(stack).resourceCountIs('AWS::Route53::RecordSet', 0); }); }); test('not specified, with TLS', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, trafficEncryption: { externalTLS: { @@ -2065,20 +1732,19 @@ describe('RenderQueue', () => { }, }; - const renderQueue = new RenderQueue(isolatedStack, 'RenderQueue', props); + const renderQueue = new RenderQueue(stack, 'RenderQueue', props); - expectCDK(isolatedStack).to(haveResource('AWS::Route53::RecordSet', { + Template.fromStack(stack).hasResourceProperties('AWS::Route53::RecordSet', { Name: 'renderqueue.aws-rfdk.com.', Type: 'A', - AliasTarget: objectLike({ - HostedZoneId: isolatedStack.resolve(renderQueue.loadBalancer.loadBalancerCanonicalHostedZoneId), + AliasTarget: Match.objectLike({ + HostedZoneId: stack.resolve(renderQueue.loadBalancer.loadBalancerCanonicalHostedZoneId), }), - })); + }); }); describe('specified with zone but no hostname', () => { let zone: PrivateHostedZone; - let isolatedStack: Stack; let renderQueue: RenderQueue; beforeEach(() => { @@ -2087,11 +1753,10 @@ describe('RenderQueue', () => { vpc, zoneName, }); - isolatedStack = new Stack(app, 'IsolatedStack'); const props: RenderQueueProps = { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, hostname: { zone, @@ -2099,7 +1764,7 @@ describe('RenderQueue', () => { }; // WHEN - renderQueue = new RenderQueue(isolatedStack, 'RenderQueue', props); + renderQueue = new RenderQueue(stack, 'RenderQueue', props); }); // THEN @@ -2107,10 +1772,10 @@ describe('RenderQueue', () => { const loadBalancerLogicalId = dependencyStack.getLogicalId( renderQueue.loadBalancer.node.defaultChild as CfnElement, ); - expectCDK(isolatedStack).to(haveResource('AWS::Route53::RecordSet', { + Template.fromStack(stack).hasResourceProperties('AWS::Route53::RecordSet', { Name: `renderqueue.${zoneName}.`, Type: 'A', - AliasTarget: objectLike({ + AliasTarget: Match.objectLike({ HostedZoneId: { 'Fn::GetAtt': [ loadBalancerLogicalId, @@ -2118,7 +1783,7 @@ describe('RenderQueue', () => { ], }, }), - })); + }); }); }); @@ -2132,16 +1797,10 @@ describe('RenderQueue', () => { zoneName, }); const hostname = 'testrq'; - const isolatedStack = new Stack(app, 'IsolatedStack'); - const nonSmRepository = new Repository(dependencyStack, 'NonSMRepository', { - vpc, - version, - secretsManagementSettings: { enabled: false }, - }); const props: RenderQueueProps = { images, - repository: nonSmRepository, - version: new VersionQuery(isolatedStack, 'Version'), + repository, + version: renderQueueVersion, vpc, hostname: { hostname, @@ -2153,16 +1812,16 @@ describe('RenderQueue', () => { }; // WHEN - const renderQueue = new RenderQueue(isolatedStack, 'RenderQueue', props); + const renderQueue = new RenderQueue(stack, 'RenderQueue', props); // THEN const loadBalancerLogicalId = dependencyStack.getLogicalId( renderQueue.loadBalancer.node.defaultChild as CfnElement, ); - expectCDK(isolatedStack).to(haveResource('AWS::Route53::RecordSet', { + Template.fromStack(stack).hasResourceProperties('AWS::Route53::RecordSet', { Name: `${hostname}.${zoneName}.`, Type: 'A', - AliasTarget: objectLike({ + AliasTarget: Match.objectLike({ HostedZoneId: { 'Fn::GetAtt': [ loadBalancerLogicalId, @@ -2170,7 +1829,7 @@ describe('RenderQueue', () => { ], }, }), - })); + }); }); test.each([ @@ -2209,11 +1868,8 @@ describe('RenderQueue', () => { describe('Access Logs', () => { let isolatedStack: Stack; - let isolatedVpc: Vpc; - let isolatedRepository: Repository; - let isolatedVersion: IVersion; - let isolatedimages: RenderQueueImages; - + let repository: Repository; + let renderQueueProps: RenderQueueProps; let accessBucket: Bucket; beforeEach(() => { @@ -2223,29 +1879,29 @@ describe('RenderQueue', () => { region: 'us-east-1', }, }); - isolatedVpc = new Vpc(isolatedStack, 'Vpc'); - isolatedVersion = new VersionQuery(isolatedStack, 'Version'); - - isolatedRepository = new Repository(isolatedStack, 'Repo', { - version: isolatedVersion, - vpc: isolatedVpc, - }); - - isolatedimages = { + const localVpc = new Vpc(isolatedStack, 'Vpc'); + const localVersion = new VersionQuery(isolatedStack, 'Version'); + const localImages = { remoteConnectionServer: rcsImage, }; + repository = new Repository(isolatedStack, 'Repo', { + version: localVersion, + vpc: localVpc, + }); accessBucket = new Bucket(isolatedStack, 'AccessBucket'); - + renderQueueProps = { + images: localImages, + repository, + version: localVersion, + vpc: localVpc, + }; }); test('enabling access logs sets attributes and policies', () => { // GIVEN const props: RenderQueueProps = { - images: isolatedimages, - repository: isolatedRepository, - version: isolatedVersion, - vpc: isolatedVpc, + ...renderQueueProps, accessLogs: { destinationBucket: accessBucket, }, @@ -2255,8 +1911,8 @@ describe('RenderQueue', () => { new RenderQueue(isolatedStack, 'RenderQueue', props); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( + Template.fromStack(isolatedStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'access_logs.s3.enabled', Value: 'true', @@ -2267,15 +1923,15 @@ describe('RenderQueue', () => { Ref: 'AccessBucketE2803D76', }, }, - ), - })); + ]), + }); - expectCDK(isolatedStack).to(haveResourceLike('AWS::S3::BucketPolicy', { + Template.fromStack(isolatedStack).hasResourceProperties('AWS::S3::BucketPolicy', { Bucket: { Ref: 'AccessBucketE2803D76', }, PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 's3:PutObject', Condition: { @@ -2317,7 +1973,11 @@ describe('RenderQueue', () => { }, { Action: [ - 's3:PutObject*', + 's3:PutObject', + 's3:PutObjectLegalHold', + 's3:PutObjectRetention', + 's3:PutObjectTagging', + 's3:PutObjectVersionTagging', 's3:Abort*', ], Effect: 'Allow', @@ -2354,18 +2014,45 @@ describe('RenderQueue', () => { ], }, }, - ), + { + Action: 's3:PutObject', + Condition: { + StringEquals: { + 's3:x-amz-acl': 'bucket-owner-full-control', + }, + }, + Effect: 'Allow', + Principal: { + Service: 'delivery.logs.amazonaws.com', + }, + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'AccessBucketE2803D76', + 'Arn', + ], + }, + '/AWSLogs/', + { + Ref: 'AWS::AccountId', + }, + '/*', + ], + ], + }, + }, + ]), }, - })); + }); }); test('enabling access logs works with prefix', () => { // GIVEN const props: RenderQueueProps = { - images: isolatedimages, - repository: isolatedRepository, - version: isolatedVersion, - vpc: isolatedVpc, + ...renderQueueProps, accessLogs: { destinationBucket: accessBucket, prefix: 'PREFIX_STRING', @@ -2376,8 +2063,8 @@ describe('RenderQueue', () => { new RenderQueue(isolatedStack, 'RenderQueue', props); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - LoadBalancerAttributes: arrayWith( + Template.fromStack(isolatedStack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + LoadBalancerAttributes: Match.arrayWith([ { Key: 'access_logs.s3.enabled', Value: 'true', @@ -2392,15 +2079,15 @@ describe('RenderQueue', () => { Key: 'access_logs.s3.prefix', Value: 'PREFIX_STRING', }, - ), - })); + ]), + }); - expectCDK(isolatedStack).to(haveResourceLike('AWS::S3::BucketPolicy', { + Template.fromStack(isolatedStack).hasResourceProperties('AWS::S3::BucketPolicy', { Bucket: { Ref: 'AccessBucketE2803D76', }, PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 's3:PutObject', Condition: { @@ -2442,7 +2129,11 @@ describe('RenderQueue', () => { }, { Action: [ - 's3:PutObject*', + 's3:PutObject', + 's3:PutObjectLegalHold', + 's3:PutObjectRetention', + 's3:PutObjectTagging', + 's3:PutObjectVersionTagging', 's3:Abort*', ], Effect: 'Allow', @@ -2479,13 +2170,61 @@ describe('RenderQueue', () => { ], }, }, - ), + { + Action: 's3:PutObject', + Condition: { + StringEquals: { + 's3:x-amz-acl': 'bucket-owner-full-control', + }, + }, + Effect: 'Allow', + Principal: { + Service: 'delivery.logs.amazonaws.com', + }, + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'AccessBucketE2803D76', + 'Arn', + ], + }, + '/PREFIX_STRING/AWSLogs/', + { + Ref: 'AWS::AccountId', + }, + '/*', + ], + ], + }, + }, + ]), }, - })); + }); }); }); describe('tagging', () => { + let repository: Repository; + + beforeEach(() => { + repository = new Repository(dependencyStack, 'NonSMRepository', { + vpc, + version, + }); + const props: RenderQueueProps = { + images, + repository, + version: renderQueueVersion, + vpc, + }; + + // WHEN + new RenderQueue(stack, 'RenderQueue', props); + }); + testConstructTags({ constructName: 'RenderQueue', createConstruct: () => { @@ -2509,13 +2248,31 @@ describe('RenderQueue', () => { }); describe('SEP Policies', () => { + let repository: Repository; + let renderQueue: RenderQueue; + + beforeEach(() => { + // GIVEN + repository = new Repository(dependencyStack, 'NonSMRepository', { + vpc, + version, + }); + const props: RenderQueueProps = { + images, + repository, + version: renderQueueVersion, + vpc, + }; + renderQueue = new RenderQueue(stack, 'RenderQueue', props); + }); + test('with resource tracker', () => { // WHEN - renderQueueCommon.addSEPPolicies(); + renderQueue.addSEPPolicies(); // THEN - expectCDK(stack).to(countResourcesLike('AWS::IAM::Role', 1, { - ManagedPolicyArns: arrayWith( + resourcePropertiesCountIs(stack, 'AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ { 'Fn::Join': [ '', @@ -2540,17 +2297,17 @@ describe('RenderQueue', () => { ], ], }, - ), - })); + ]), + }, 1); }); test('no resource tracker', () => { // WHEN - renderQueueCommon.addSEPPolicies(false); + renderQueue.addSEPPolicies(false); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Role', { - ManagedPolicyArns: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ { 'Fn::Join': [ '', @@ -2563,10 +2320,10 @@ describe('RenderQueue', () => { ], ], }, - ), - })); - expectCDK(stack).notTo(haveResourceLike('AWS::IAM::Role', { - ManagedPolicyArns: arrayWith( + ]), + }); + resourcePropertiesCountIs(stack, 'AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ { 'Fn::Join': [ '', @@ -2579,25 +2336,21 @@ describe('RenderQueue', () => { ], ], }, - ), - })); + ]), + }, 0); }); }); - test('creates WaitForStableService by default', () => { - // THEN - expectCDK(stack).to(haveResourceLike('Custom::RFDK_WaitForStableService', { - cluster: stack.resolve(renderQueueCommon.cluster.clusterArn), - // eslint-disable-next-line dot-notation - services: [stack.resolve(renderQueueCommon['pattern'].service.serviceArn)], - })); - }); - describe('Security Groups', () => { + let repository: Repository; let backendSecurityGroup: SecurityGroup; let frontendSecurityGroup: SecurityGroup; beforeEach(() => { + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); backendSecurityGroup = new SecurityGroup(stack, 'ASGSecurityGroup', { vpc }); frontendSecurityGroup = new SecurityGroup(stack, 'LBSecurityGroup', { vpc }); }); @@ -2675,42 +2428,45 @@ describe('RenderQueue', () => { // THEN // Existing LoadBalancer security groups shouldn't have the ingress rule added - expectCDK(stack).notTo(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + resourcePropertiesCountIs(stack, 'AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 22, ToPort: 22, GroupId: stack.resolve(frontendSecurityGroup.securityGroupId), SourceSecurityGroupId: stack.resolve(peerSecurityGroup.securityGroupId), - })); + }, 0); // Existing AutoScalingGroup security groups shouldn't have the ingress rule added - expectCDK(stack).notTo(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + resourcePropertiesCountIs(stack, 'AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 22, ToPort: 22, GroupId: stack.resolve(backendSecurityGroup.securityGroupId), SourceSecurityGroupId: stack.resolve(peerSecurityGroup.securityGroupId), - })); + }, 0); }); function assertSecurityGroupsWereAdded(securityGroups: RenderQueueSecurityGroups) { if (securityGroups.backend !== undefined) { - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - SecurityGroups: arrayWith(stack.resolve(securityGroups.backend.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + SecurityGroups: Match.arrayWith([stack.resolve(securityGroups.backend.securityGroupId)]), + }); } if (securityGroups.frontend !== undefined) { - expectCDK(stack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', { - SecurityGroups: arrayWith(stack.resolve(securityGroups.frontend.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::ElasticLoadBalancingV2::LoadBalancer', { + SecurityGroups: Match.arrayWith([stack.resolve(securityGroups.frontend.securityGroupId)]), + }); } } }); test('validates VersionQuery is not in a different stack', () => { // GIVEN - const newStack = new Stack(app, 'NewStack'); + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); // WHEN - new RenderQueue(newStack, 'RenderQueueNew', { + new RenderQueue(stack, 'RenderQueue', { images, repository, version, @@ -2719,32 +2475,24 @@ describe('RenderQueue', () => { // WHEN function synth() { - SynthUtils.synthesize(newStack); + app.synth(); } // THEN expect(synth).toThrow('A VersionQuery can not be supplied from a different stack'); }); - test('Does not enable filesystem cache by default', () => { - expectCDK(stack).notTo(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - UserData: { - 'Fn::Base64': { - 'Fn::Join': arrayWith(arrayWith(' >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config\nyum install -yq awscli unzip\n# RenderQueue file caching enabled\nmkdir -p $(dirname \'/tmp/')), - }, - }, - })); - }); - test('Enables filesystem cache if required', () => { // GIVEN - const isolatedStack = new Stack(app, 'IsolatedStack'); - + const repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + }); // WHEN - new RenderQueue(isolatedStack, 'RenderQueue', { + new RenderQueue(stack, 'RenderQueue', { images, repository, - version: new VersionQuery(isolatedStack, 'Version'), + version: renderQueueVersion, vpc, enableLocalFileCaching: true, }); @@ -2753,28 +2501,32 @@ describe('RenderQueue', () => { // Note: If this test breaks/fails, then it is probable that the // 'Does not enable filesystem cache by default' test above will also require // updating/fixing. - expectCDK(isolatedStack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { UserData: { 'Fn::Base64': { - 'Fn::Join': arrayWith(arrayWith(' >> /etc/ecs/ecs.config\nsudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP\nsudo service iptables save\necho ECS_AWSVPC_BLOCK_IMDS=true >> /etc/ecs/ecs.config\nyum install -yq awscli unzip\n# RenderQueue file caching enabled\nmkdir -p $(dirname \'/tmp/')), + 'Fn::Join': [ + '', + Match.arrayWith([ + Match.stringLikeRegexp('.*# RenderQueue file caching enabled.*'), + ]), + ], }, }, - })); - }); - - test('runs as RCS user', () => { - // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith( - objectLike({ User: '1000:1000' }), - ), - })); + }); }); describe('Secrets Management', () => { + let repository: Repository; let rqSecretsManagementProps: RenderQueueProps; beforeEach(() => { + repository = new Repository(dependencyStack, 'Repo', { + version, + vpc, + secretsManagementSettings: { + enabled: true, + }, + }); rqSecretsManagementProps = { vpc, images, @@ -2850,19 +2602,19 @@ describe('RenderQueue', () => { const rq = new RenderQueue(stack, 'SecretsManagementRenderQueue', rqSecretsManagementProps); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { - PolicyDocument: objectLike({ - Statement: arrayWith({ + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([{ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', ], Effect: 'Allow', Resource: stack.resolve((repository.secretsManagementSettings.credentials!.node.defaultChild as CfnSecret).ref), - }), + }]), }), Roles: [stack.resolve((rq.node.tryFindChild('RCSTask') as Ec2TaskDefinition).taskRole.roleName)], - })); + }); }); test('defines secrets management credentials environment variable', () => { @@ -2870,14 +2622,18 @@ describe('RenderQueue', () => { new RenderQueue(stack, 'SecretsManagementRenderQueue', rqSecretsManagementProps); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith(objectLike({ - Environment: arrayWith({ - Name: 'RCS_SM_CREDENTIALS_URI', - Value: stack.resolve((repository.secretsManagementSettings.credentials!.node.defaultChild as CfnSecret).ref), + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([ + Match.objectLike({ + Environment: Match.arrayWith([ + { + Name: 'RCS_SM_CREDENTIALS_URI', + Value: stack.resolve((repository.secretsManagementSettings.credentials!.node.defaultChild as CfnSecret).ref), + }, + ]), }), - })), - })); + ]), + }); }); test('creates and mounts docker volume for deadline key pairs', () => { @@ -2885,53 +2641,89 @@ describe('RenderQueue', () => { new RenderQueue(stack, 'SecretsManagementRenderQueue', rqSecretsManagementProps); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith(objectLike({ - MountPoints: arrayWith({ - ContainerPath: '/home/ec2-user/.config/.mono/keypairs', - ReadOnly: false, - SourceVolume: 'deadline-user-keypairs', + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([ + Match.objectLike({ + MountPoints: Match.arrayWith([ + { + ContainerPath: '/home/ec2-user/.config/.mono/keypairs', + ReadOnly: false, + SourceVolume: 'deadline-user-keypairs', + }, + ]), }), - })), - Volumes: arrayWith({ - DockerVolumeConfiguration: { - Autoprovision: true, - Driver: 'local', - Scope: 'shared', + ]), + Volumes: Match.arrayWith([ + { + DockerVolumeConfiguration: { + Autoprovision: true, + Driver: 'local', + Scope: 'shared', + }, + Name: 'deadline-user-keypairs', }, - Name: 'deadline-user-keypairs', - }), - })); + ]), + }); }); test('DeploymentInstance uses specified backend security group', () => { // GIVEN const backendSecurityGroupId = 'backend-sg-id'; const backendSecurityGroup = SecurityGroup.fromSecurityGroupId(stack, 'BackendSG', backendSecurityGroupId); - rqSecretsManagementProps = { + + // WHEN + const renderQueue = new RenderQueue(stack, 'SecretsManagementRenderQueue', { ...rqSecretsManagementProps, securityGroups: { backend: backendSecurityGroup, }, + }); + // Force creation of the DeploymentInstance + // eslint-disable-next-line dot-notation + renderQueue['deploymentInstance']; + + // THEN + const deploymentInstance = renderQueue.node.findChild('ConfigureRepository') as DeploymentInstance; + expect(deploymentInstance.connections.securityGroups[0].securityGroupId).toEqual(backendSecurityGroupId); + }); + + test('DeploymentInstance uses RQ\'s log group prefix', () => { + // GIVEN + rqSecretsManagementProps = { + ...rqSecretsManagementProps, + logGroupProps: { + logGroupPrefix: '/customPrefix/', + }, }; // WHEN - const renderQueue = new RenderQueue(stack, 'SecretsManagementRenderQueue', rqSecretsManagementProps); + const renderQueue = new RenderQueue(stack, 'SecretsManagementRenderQueue', { + ...rqSecretsManagementProps, + logGroupProps: { + logGroupPrefix: '/customPrefix/', + }, + }); + // Force creation of the DeploymentInstance + // eslint-disable-next-line dot-notation + renderQueue['deploymentInstance']; // THEN - // eslint-disable-next-line dot-notation - expect(renderQueue['deploymentInstance'].connections.securityGroups[0].securityGroupId).toEqual(backendSecurityGroupId); + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { + LogGroupName: '/customPrefix/ConfigureRepository', + }); }); test('DeploymentInstance uses implicitly created backend security group', () => { // WHEN const renderQueue = new RenderQueue(stack, 'SecretsManagementRenderQueue', rqSecretsManagementProps); + // Force creation of the DeploymentInstance + // eslint-disable-next-line dot-notation + renderQueue['deploymentInstance']; // THEN - // eslint-disable-next-line dot-notation - expect(renderQueue['deploymentInstance'].connections.securityGroups[0]).toBe(renderQueue.backendConnections.securityGroups[0]); - // eslint-disable-next-line dot-notation - expect(renderQueue['deploymentInstance'].connections.securityGroups[0]).toBe(renderQueue.asg.connections.securityGroups[0]); + const deploymentInstance = renderQueue.node.findChild('ConfigureRepository') as DeploymentInstance; + expect(deploymentInstance.connections.securityGroups[0]).toBe(renderQueue.backendConnections.securityGroups[0]); + expect(deploymentInstance.connections.securityGroups[0]).toBe(renderQueue.asg.connections.securityGroups[0]); }); describe('client calls .configureSecretsManagementAutoRegistration()', () => { @@ -2995,38 +2787,14 @@ describe('RenderQueue', () => { test('deployment instance is created using specified subnets', () => { // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { LaunchConfigurationName: stack.resolve(launchConfiguration.ref), - VPCZoneIdentifier: arrayWith( + VPCZoneIdentifier: Match.arrayWith([ ...RQ_SUBNET_IDS, - ), - })); + ]), + }); }); }); }); - test('.backendConnections is associated with ASG security group rules', () => { - // GIVEN - const instance = new Instance(dependencyStack, 'BackendConnectionInstance', { - instanceType: InstanceType.of(InstanceClass.T3, InstanceSize.MICRO), - machineImage: MachineImage.latestAmazonLinux(), - vpc, - }); - const portNumber = 5555; - const port = Port.tcp(portNumber); - const asgSecurityGroup = renderQueueCommon.asg.connections.securityGroups[0]; - - // WHEN - renderQueueCommon.backendConnections.allowFrom(instance, port); - - // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { - IpProtocol: 'tcp', - Description: `from ${instance.connections.securityGroups[0].uniqueId}:${portNumber}`, - GroupId: stack.resolve(asgSecurityGroup.securityGroupId), - SourceSecurityGroupId: stack.resolve(instance.connections.securityGroups[0].securityGroupId), - FromPort: portNumber, - ToPort: portNumber, - })); - }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/repository.test.ts b/packages/aws-rfdk/lib/deadline/test/repository.test.ts index 7bc8e3d26..3b375c45f 100644 --- a/packages/aws-rfdk/lib/deadline/test/repository.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/repository.test.ts @@ -4,16 +4,20 @@ */ import { - arrayWith, - countResourcesLike, - expect as expectCDK, - haveResource, - haveResourceLike, - ResourcePart, - SynthUtils, -} from '@aws-cdk/assert'; -import {AutoScalingGroup} from '@aws-cdk/aws-autoscaling'; -import {DatabaseCluster} from '@aws-cdk/aws-docdb'; + App, + CfnElement, + Duration, + Names, + RemovalPolicy, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; +import {AutoScalingGroup} from 'aws-cdk-lib/aws-autoscaling'; +import {DatabaseCluster} from 'aws-cdk-lib/aws-docdb'; import { AmazonLinuxGeneration, Instance, @@ -28,34 +32,26 @@ import { SubnetType, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { AccessPoint, CfnFileSystem, FileSystem as EfsFileSystem, -} from '@aws-cdk/aws-efs'; -import { CfnRole } from '@aws-cdk/aws-iam'; -import { Bucket } from '@aws-cdk/aws-s3'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { Secret } from '@aws-cdk/aws-secretsmanager'; -import { - App, - CfnElement, - Duration, - Names, - RemovalPolicy, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-efs'; +import { CfnRole } from 'aws-cdk-lib/aws-iam'; +import { Bucket } from 'aws-cdk-lib/aws-s3'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; import { MountableEfs, } from '../../core'; +import { + CWA_ASSET_LINUX, +} from '../../core/test/asset-constants'; import { testConstructTags, } from '../../core/test/tag-helpers'; -import { - CWA_ASSET_LINUX, -} from '../../deadline/test/asset-constants'; import { DatabaseConnection, IVersion, @@ -65,8 +61,12 @@ import { PlatformInstallers, } from '../lib'; import { + CONFIG_REPO_DIRECT_CONNECT_LINUX, REPO_DC_ASSET, } from './asset-constants'; +import { + resourcePropertiesCountIs, +} from './test-helper'; let app: App; let stack: Stack; @@ -145,7 +145,7 @@ test('repository installer instance is created correctly', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResource('AWS::AutoScaling::AutoScalingGroup', { Properties: { MaxSize: '1', MinSize: '1', @@ -172,15 +172,15 @@ test('repository installer instance is created correctly', () => { IgnoreUnmodifiedGroupSizeProperties: true, }, }, - DependsOn: [ + DependsOn: Match.arrayWith([ 'repositoryInstallerDocumentDatabaseInstance11A6F8C8E', - ], - }, ResourcePart.CompleteDefinition)); - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + ]), + }); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 't3.large', - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 2049, ToPort: 2049, @@ -196,7 +196,7 @@ test('repository installer instance is created correctly', () => { 'GroupId', ], }, - })); + }); }); test('repository installer honors vpcSubnet', () => { @@ -217,9 +217,9 @@ test('repository installer honors vpcSubnet', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { VPCZoneIdentifier: isolatedSubnetIds, - })); + }); }); test('repository installer security groups created correctly', () => { @@ -230,7 +230,7 @@ test('repository installer security groups created correctly', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 2049, ToPort: 2049, @@ -246,8 +246,8 @@ test('repository installer security groups created correctly', () => { 'GroupId', ], }, - })); - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: { 'Fn::GetAtt': [ @@ -273,7 +273,7 @@ test('repository installer security groups created correctly', () => { 'GroupId', ], }, - })); + }); }); /* @@ -314,9 +314,9 @@ test('repository installer iam permissions: db secret access', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith({ + Statement: Match.arrayWith([{ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', @@ -325,9 +325,10 @@ test('repository installer iam permissions: db secret access', () => { Resource: { Ref: 'repositoryInstallerDocumentDatabaseSecretAttachment29753B7C', }, - }), + }]), }, - })); + PolicyName: Match.stringLikeRegexp('^repositoryInstallerInstanceRoleDefaultPolicy.*'), + }); }); test('repository installer iam permissions: installer get', () => { @@ -338,9 +339,9 @@ test('repository installer iam permissions: installer get', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -348,7 +349,7 @@ test('repository installer iam permissions: installer get', () => { 's3:List*', ], Effect: 'Allow', - Resource: arrayWith( + Resource: Match.arrayWith([ { 'Fn::Join': [ '', @@ -359,7 +360,7 @@ test('repository installer iam permissions: installer get', () => { }, ':s3:::', { - Ref: CWA_ASSET_LINUX.Bucket, + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, }, ], ], @@ -374,17 +375,18 @@ test('repository installer iam permissions: installer get', () => { }, ':s3:::', { - Ref: CWA_ASSET_LINUX.Bucket, + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, }, '/*', ], ], }, - ), + ]), }, - ), + ]), }, - })); + PolicyName: Match.stringLikeRegexp('^repositoryInstallerInstanceRoleDefaultPolicy.*'), + }); }); test('default repository installer log group created correctly', () => { @@ -395,10 +397,10 @@ test('default repository installer log group created correctly', () => { }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: 3, LogGroupName: '/renderfarm/repositoryInstaller', - })); + }); }); test('repository installer logs all required files', () => { @@ -412,7 +414,7 @@ test('repository installer logs all required files', () => { // The CloudWatchAgent stores the agent configuration in an SSM Parameter. Check it for the required setup. // Note: This would be better implemented using the tools in: https://github.com/aws/aws-cdk/pull/8444 // but that is not yet available. - expectCDK(stack).to(haveResourceLike('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Type: 'String', Value: { 'Fn::Join': [ @@ -426,7 +428,7 @@ test('repository installer logs all required files', () => { ], ], }, - })); + }); }); test('repository mounts repository filesystem', () => { @@ -458,9 +460,9 @@ test.each([ }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBCluster', { + Template.fromStack(stack).hasResource('AWS::DocDB::DBCluster', { DeletionPolicy: expected, - }, ResourcePart.CompleteDefinition)); + }); }); test.each([ @@ -478,9 +480,9 @@ test.each([ }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EFS::FileSystem', { + Template.fromStack(stack).hasResource('AWS::EFS::FileSystem', { DeletionPolicy: expected, - }, ResourcePart.CompleteDefinition)); + }); }); test('repository warns if removal policy for filesystem when filesystem provided', () => { @@ -507,13 +509,9 @@ test('repository warns if removal policy for filesystem when filesystem provided }); // THEN - expect(repo.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'RemovalPolicy for filesystem will not be applied since a filesystem is not being created by this construct', - }), - ]), + Annotations.fromStack(stack).hasWarning( + `/${repo.node.path}`, + 'RemovalPolicy for filesystem will not be applied since a filesystem is not being created by this construct', ); }); @@ -545,13 +543,9 @@ test('repository warns if removal policy for database when database provided', ( }); // THEN - expect(repo.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'RemovalPolicy for database will not be applied since a database is not being created by this construct', - }), - ]), + Annotations.fromStack(stack).hasWarning( + `/${repo.node.path}`, + Match.stringLikeRegexp('RemovalPolicy for database will not be applied since a database is not being created by this construct.*'), ); }); @@ -575,19 +569,19 @@ test('repository creates deadlineDatabase if none provided', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::DocDB::DBCluster')); - expectCDK(stack).to(haveResource('AWS::DocDB::DBInstance')); - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBCluster', { + Template.fromStack(stack).resourceCountIs('AWS::DocDB::DBCluster', 1); + Template.fromStack(stack).resourceCountIs('AWS::DocDB::DBInstance', 1); + Template.fromStack(stack).hasResourceProperties('AWS::DocDB::DBCluster', { EnableCloudwatchLogsExports: [ 'audit' ], - }, ResourcePart.Properties)); - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBClusterParameterGroup', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::DocDB::DBClusterParameterGroup', { Parameters: { audit_logs: 'enabled', }, - }, ResourcePart.Properties)); - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBInstance', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::DocDB::DBInstance', { AutoMinorVersionUpgrade: true, - })); + }); }); test('disabling Audit logging does not enable Cloudwatch audit logs', () => { @@ -611,15 +605,15 @@ test('disabling Audit logging does not enable Cloudwatch audit logs', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::DocDB::DBCluster')); - expectCDK(stack).notTo(haveResourceLike('AWS::DocDB::DBCluster', { - EnableCloudwatchLogsExports: [ 'audit' ], - }, ResourcePart.Properties)); - expectCDK(stack).notTo(haveResourceLike('AWS::DocDB::DBClusterParameterGroup', { + Template.fromStack(stack).resourceCountIs('AWS::DocDB::DBCluster', 1); + resourcePropertiesCountIs(stack, 'AWS::DocDB::DBCluster', { + EnableCloudwatchLogsExports: Match.arrayWith([ 'audit' ]), + }, 0); + resourcePropertiesCountIs(stack, 'AWS::DocDB::DBClusterParameterGroup', { Parameters: { audit_logs: 'enabled', }, - }, ResourcePart.Properties)); + }, 0); }); test('repository warns if databaseAuditLogging defined and database is specified', () => { @@ -654,14 +648,7 @@ test('repository warns if databaseAuditLogging defined and database is specified 'Please ensure that the Database provided is configured correctly.'; // THEN - expect(repo.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: warningMsg, - }), - ]), - ); + Annotations.fromStack(stack).hasWarning(`/${repo.node.path}`, warningMsg); }); test('honors subnet specification', () => { @@ -691,14 +678,14 @@ test('honors subnet specification', () => { }); // THEN - expectCDK(isolatedStack).to(haveResourceLike('AWS::DocDB::DBSubnetGroup', { + Template.fromStack(isolatedStack).hasResourceProperties('AWS::DocDB::DBSubnetGroup', { SubnetIds: [ 'SubnetID1', 'SubnetID2', ], - })); - expectCDK(isolatedStack).to(haveResourceLike('AWS::EFS::MountTarget', { SubnetId: 'SubnetID1' })); - expectCDK(isolatedStack).to(haveResourceLike('AWS::EFS::MountTarget', { SubnetId: 'SubnetID2' })); + }); + Template.fromStack(isolatedStack).hasResourceProperties('AWS::EFS::MountTarget', { SubnetId: 'SubnetID1' }); + Template.fromStack(isolatedStack).hasResourceProperties('AWS::EFS::MountTarget', { SubnetId: 'SubnetID2' }); }); test('repository honors database instance count', () => { @@ -713,9 +700,9 @@ test('repository honors database instance count', () => { }); // THEN - expectCDK(stack).to(countResourcesLike('AWS::DocDB::DBInstance', instanceCount, { + resourcePropertiesCountIs(stack, 'AWS::DocDB::DBInstance', { AutoMinorVersionUpgrade: true, - })); + }, instanceCount); }); test('repository honors database retention period', () => { @@ -732,9 +719,9 @@ test('repository honors database retention period', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBCluster', { + Template.fromStack(stack).hasResourceProperties('AWS::DocDB::DBCluster', { BackupRetentionPeriod: period, - })); + }); }); test('warns if both retention period and database provided', () => { @@ -765,13 +752,9 @@ test('warns if both retention period and database provided', () => { }); // THEN - expect(repo.node.metadataEntry).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'Backup retention for database will not be applied since a database is not being created by this construct', - }), - ]), + Annotations.fromStack(stack).hasWarning( + `/${repo.node.path}`, + 'Backup retention for database will not be applied since a database is not being created by this construct', ); }); @@ -807,8 +790,8 @@ test('repository creates filesystem if none provided', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::EFS::FileSystem')); - expectCDK(stack).to(haveResource('AWS::EFS::MountTarget')); + Template.fromStack(stack).resourceCountIs('AWS::EFS::FileSystem', 1); + Template.fromStack(stack).resourceCountIs('AWS::EFS::MountTarget', 2); expect(repo.node.tryFindChild('PadEfsStorage')).toBeDefined(); expect(repo.node.findChild('FileSystem').node.tryFindChild('PaddingAccessPoint')).toBeDefined(); }); @@ -845,14 +828,14 @@ test('repository instance is created with user defined timeout', () => { }); // THEN - expectCDK(stack).to(haveResource('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResource('AWS::AutoScaling::AutoScalingGroup', { CreationPolicy: { ResourceSignal: { Count: 1, Timeout: 'PT30M', }, }, - }, ResourcePart.CompleteDefinition)); + }); }); test('repository instance is created with correct installer path version', () => { @@ -884,9 +867,9 @@ test.each([ }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: testPrefix + id, - })); + }); }); test('validate instance self-termination', () => { @@ -902,9 +885,9 @@ test('validate instance self-termination', () => { const asgLogicalIdToken = escapeTokenRegex('${Token[Stack.repositoryInstaller.Installer.ASG.LogicalID.\\d+]}'); const expectedString = `function exitTrap\\(\\)\\{\nexitCode=\\$\\?\nsleep 1m\nTOKEN=\\$\\(curl -X PUT "http:\\/\\/169\\.254\\.169\\.254\\/latest\\/api\\/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 30" 2> \\/dev\\/null\\)\nINSTANCE="\\$\\(curl -s -H "X-aws-ec2-metadata-token: \\$TOKEN" http:\\/\\/169\\.254\\.169\\.254\\/latest\\/meta-data\\/instance-id 2> \\/dev\\/null\\)"\nASG="\\$\\(aws --region ${regionToken} ec2 describe-tags --filters "Name=resource-id,Values=\\$\\{INSTANCE\\}" "Name=key,Values=aws:autoscaling:groupName" --query "Tags\\[0\\]\\.Value" --output text\\)"\naws --region ${regionToken} autoscaling update-auto-scaling-group --auto-scaling-group-name \\$\\{ASG\\} --min-size 0 --max-size 0 --desired-capacity 0\n\\/opt\\/aws\\/bin\\/cfn-signal --stack ${stack.stackName} --resource ${asgLogicalIdToken} --region ${regionToken} -e \\$exitCode \\|\\| echo 'Failed to send Cloudformation Signal'\n\\}`; expect((repo.node.defaultChild as AutoScalingGroup).userData.render()).toMatch(new RegExp(expectedString)); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 'autoscaling:UpdateAutoScalingGroup', Condition: { @@ -920,9 +903,9 @@ test('validate instance self-termination', () => { Effect: 'Allow', Resource: '*', }, - ), + ]), }, - })); + }); }); test('repository configure client instance', () => { @@ -962,25 +945,24 @@ test('repository configure client instance', () => { expect(userData).toMatch(/.*export -f configure_deadline_database.*/); // Make sure we call the configureRepositoryDirectConnect script with appropriate argument. - const regex = new RegExp(escapeTokenRegex('\'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \\"/mnt/repository/DeadlineRepository\\"')); - expect(userData).toMatch(regex); + expect(userData).toContain(`'/tmp/${CONFIG_REPO_DIRECT_CONNECT_LINUX.Key}.sh' "/mnt/repository/DeadlineRepository"`); // Assert the IAM instance profile is given read access to the database credentials secret - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith({ + Statement: Match.arrayWith([{ Action: [ 'secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret', ], Effect: 'Allow', Resource: stack.resolve(db.secret!.secretArn), - }), + }]), }, Roles: [ stack.resolve(instanceRole.ref), ], - })); + }); }); test('configureClientInstance uses singleton for repo config script', () => { @@ -1015,9 +997,9 @@ test('configureClientInstance uses singleton for repo config script', () => { // THEN // Make sure that both instances have access to the same Asset for the configureRepositoryDirectConnect script - expectCDK(stack).to(countResourcesLike('AWS::IAM::Policy', 2, { - PolicyDocument: { - Statement: arrayWith( + resourcePropertiesCountIs(stack, 'AWS::IAM::Policy', { + PolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ { Effect: 'Allow', Action: [ @@ -1036,7 +1018,7 @@ test('configureClientInstance uses singleton for repo config script', () => { }, ':s3:::', { - Ref: REPO_DC_ASSET.Bucket, + 'Fn::Sub': REPO_DC_ASSET.Bucket, }, ], ], @@ -1051,7 +1033,7 @@ test('configureClientInstance uses singleton for repo config script', () => { }, ':s3:::', { - Ref: REPO_DC_ASSET.Bucket, + 'Fn::Sub': REPO_DC_ASSET.Bucket, }, '/*', ], @@ -1059,9 +1041,10 @@ test('configureClientInstance uses singleton for repo config script', () => { }, ], }, - ), - }, - })); + ]), + }), + PolicyName: Match.stringLikeRegexp('Instance[1-2]InstanceRoleDefaultPolicy.*'), + }, 2); }); test('windows client cannot direct connect to repository', () => { @@ -1132,9 +1115,9 @@ describe('Security Groups', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::DocDB::DBCluster', { - VpcSecurityGroupIds: arrayWith(stack.resolve(repositorySecurityGroup.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::DocDB::DBCluster', { + VpcSecurityGroupIds: Match.arrayWith([stack.resolve(repositorySecurityGroup.securityGroupId)]), + }); }); }); @@ -1153,9 +1136,9 @@ describe('Security Groups', () => { // THEN // The EFS construct adds the security group to each mount target, and one mount target is generated per subnet. const numMountTargets = vpc.selectSubnets().subnets.length; - expectCDK(stack).to(countResourcesLike('AWS::EFS::MountTarget', numMountTargets, { - SecurityGroups: arrayWith(stack.resolve(repositorySecurityGroup.securityGroupId)), - })); + resourcePropertiesCountIs(stack, 'AWS::EFS::MountTarget', { + SecurityGroups: Match.arrayWith([stack.resolve(repositorySecurityGroup.securityGroupId)]), + }, numMountTargets); }); }); @@ -1172,9 +1155,9 @@ describe('Security Groups', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - SecurityGroups: arrayWith(stack.resolve(repositorySecurityGroup.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + SecurityGroups: Match.arrayWith([stack.resolve(repositorySecurityGroup.securityGroupId)]), + }); }); }); @@ -1191,7 +1174,7 @@ test('validates VersionQuery is not in a different stack', () => { // WHEN function synth() { - SynthUtils.synthesize(newStack); + app.synth(); } // THEN @@ -1207,14 +1190,14 @@ test('creates an EFS AccessPoint when no filesystem is supplied', () => { // THEN const efsResource = (repo.node.findChild('FileSystem') as CfnElement).node.defaultChild as CfnFileSystem; - expectCDK(stack).to(haveResource('AWS::EFS::AccessPoint', { + Template.fromStack(stack).hasResourceProperties('AWS::EFS::AccessPoint', { FileSystemId: stack.resolve(efsResource.ref), PosixUser: { Gid: '0', Uid: '0', }, RootDirectory: {}, - })); + }); }); test('throws an error if supplied a MountableEfs with no Access Point', () => { @@ -1291,7 +1274,9 @@ test('imports repository settings', () => { // THEN const installerGroup = repository.node.tryFindChild('Installer') as AutoScalingGroup; - expect(installerGroup.userData.render()).toContain(`aws s3 cp '${repositorySettings.s3ObjectUrl}'`); + // Note: The repostory settings is the js file that this compiles in to. The hash for that is fragile in that any + // change to this file will change it. So, we search for an s3 cp of a js file (this is the only one). + expect(installerGroup.userData.render()).toMatch(new RegExp('aws s3 cp \'s3://[^\']+/[a-f0-9]+.js\'')); }); test('IMountableLinuxFilesystem.usesUserPosixPermissions() = true changes ownership of repository files', () => { diff --git a/packages/aws-rfdk/lib/deadline/test/secrets-management.test.ts b/packages/aws-rfdk/lib/deadline/test/secrets-management.test.ts index 3122f398f..9ef3039f6 100644 --- a/packages/aws-rfdk/lib/deadline/test/secrets-management.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/secrets-management.test.ts @@ -3,14 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as fs from 'fs'; - import { - arrayWith, - expect as expectCDK, - haveResourceLike, - SynthUtils, -} from '@aws-cdk/assert'; + App, + Fn, + Resource, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { ExecuteFileOptions, IVpc, @@ -20,16 +23,10 @@ import { SubnetType, UserData, Vpc, -} from '@aws-cdk/aws-ec2'; -import { CfnRole } from '@aws-cdk/aws-iam'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { - App, - Construct, - Fn, - Resource, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ec2'; +import { CfnRole } from 'aws-cdk-lib/aws-iam'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; import { DeploymentInstance, DeploymentInstanceProps } from '../../core/lib/deployment-instance'; @@ -79,12 +76,6 @@ class MockDeploymentInstance extends DeploymentInstance { return this.mockUserData; } } - -function writeSynthedTemplate(stack: Stack, outputFile: string) { - const template = SynthUtils.synthesize(stack).template; - fs.writeFileSync(outputFile, JSON.stringify(template, null, 2), { encoding: 'utf8' }); -} - const DEADLINE_CLIENT_SUBNET_NAME = 'DeadlineClient'; const RENDER_QUEUE_ALB_SUBNET_NAME = 'RenderQueueALB'; @@ -101,12 +92,6 @@ describe('SecretsManagementIdentityRegistration', () => { let renderQueueSubnets: SelectedSubnets; let target: SecretsManagementIdentityRegistration; - // @ts-ignore - function writeSynthedTemplates() { - writeSynthedTemplate(deploymentInstanceStack, 'deployment-instance-stack.json'); - writeSynthedTemplate(stack, 'secrets-management-stack.json'); - } - beforeEach(() => { app = new App(); dependencyStack = new Stack(app, 'DependencyStack'); @@ -173,9 +158,9 @@ describe('SecretsManagementIdentityRegistration', () => { createTarget(); // THEN - expectCDK(deploymentInstanceStack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(deploymentInstanceStack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -183,17 +168,17 @@ describe('SecretsManagementIdentityRegistration', () => { 's3:List*', ], Effect: 'Allow', - Resource: arrayWith(...deploymentInstanceStack.resolve([ + Resource: Match.arrayWith([...deploymentInstanceStack.resolve([ version.linuxInstallers.client.s3Bucket.bucketArn, version.linuxInstallers.client.s3Bucket.arnForObjects(version.linuxInstallers.client.objectKey), - ])), + ])]), }, - ), + ]), }, Roles: [ deploymentInstanceStack.resolve(deploymentInstanceRole.ref), ], - })); + }); }); test('downloads and executes Client installer', () => { @@ -235,18 +220,18 @@ describe('SecretsManagementIdentityRegistration', () => { createTarget(); // THEN - expectCDK(deploymentInstanceStack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(deploymentInstanceStack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: 'ec2:DescribeSubnets', Effect: 'Allow', Resource: '*', }, - ), + ]), }, Roles: [stack.resolve(deploymentInstanceRole.ref)], - })); + }); }); test('configures direct repository connection', () => { @@ -265,9 +250,9 @@ describe('SecretsManagementIdentityRegistration', () => { createTarget(); // THEN - expectCDK(deploymentInstanceStack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(deploymentInstanceStack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 'secretsmanager:GetSecretValue', @@ -276,12 +261,12 @@ describe('SecretsManagementIdentityRegistration', () => { Effect: 'Allow', Resource: deploymentInstanceStack.resolve(repository.secretsManagementSettings.credentials!.secretArn), }, - ), + ]), }, Roles: [ deploymentInstanceStack.resolve(deploymentInstanceRole.ref), ], - })); + }); }); describe('Identity registration settings script', () => { @@ -295,9 +280,9 @@ describe('SecretsManagementIdentityRegistration', () => { const identityRegistrationSettingsScript = getIdentityRegistrationSettingsScript(); // THEN - expectCDK(deploymentInstanceStack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(deploymentInstanceStack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 's3:GetObject*', @@ -310,10 +295,10 @@ describe('SecretsManagementIdentityRegistration', () => { identityRegistrationSettingsScript.bucket.arnForObjects('*'), ]), }, - ), + ]), }, Roles: [deploymentInstanceStack.resolve(deploymentInstanceRole.ref)], - })); + }); }); test('DeploymentInstance downloads script', () => { @@ -595,10 +580,10 @@ describe('SecretsManagementIdentityRegistration', () => { vpcSubnets, }); - expect(dependent.node.metadataEntry).toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: `Deadline Secrets Management is enabled on the Repository and VPC subnets of the Render Queue match the subnets of ${dependent.node.path}. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components`, - })); + Annotations.fromStack(stack).hasWarning( + `/${dependent.node.path}`, + `Deadline Secrets Management is enabled on the Repository and VPC subnets of the Render Queue match the subnets of ${dependent.node.path}. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components`, + ); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/spot-event-plugin-fleet.test.ts b/packages/aws-rfdk/lib/deadline/test/spot-event-plugin-fleet.test.ts index 59287de7f..3bca35ef3 100644 --- a/packages/aws-rfdk/lib/deadline/test/spot-event-plugin-fleet.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/spot-event-plugin-fleet.test.ts @@ -8,18 +8,20 @@ /* eslint-disable dot-notation */ import { - arrayWith, - countResources, - countResourcesLike, - expect as expectCDK, - haveResource, - haveResourceLike, - objectLike, -} from '@aws-cdk/assert'; + App, + CfnElement, + Stack, + Tags, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { BlockDeviceVolume, EbsDeviceVolumeType, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { GenericLinuxImage, InstanceClass, @@ -31,23 +33,16 @@ import { SubnetSelection, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { AssetImage, ContainerImage, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ManagedPolicy, Role, ServicePrincipal, -} from '@aws-cdk/aws-iam'; -import { ArtifactMetadataEntryType } from '@aws-cdk/cloud-assembly-schema'; -import { - App, - CfnElement, - Stack, - Tags, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; import { tagFields } from '../../core/lib/runtime-info'; import { escapeTokenRegex, @@ -64,6 +59,7 @@ import { SpotFleetAllocationStrategy, SpotFleetResourceType, } from '../lib'; +import { resourcePropertiesCountIs } from './test-helper'; let app: App; let stack: Stack; @@ -128,7 +124,7 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.securityGroups).toBeDefined(); expect(fleet.securityGroups.length).toBe(1); - expectCDK(spotFleetStack).to(countResources('AWS::EC2::SecurityGroup', 1)); + Template.fromStack(spotFleetStack).resourceCountIs('AWS::EC2::SecurityGroup', 1); }); test('allows connection to the render queue', () => { @@ -143,11 +139,11 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: parseInt(renderQueue.endpoint.portAsString(), 10), SourceSecurityGroupId: spotFleetStack.resolve(fleet.connections.securityGroups[0].securityGroupId), - })); + }); }); test('creates a spot fleet instance role', () => { @@ -163,9 +159,9 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.fleetInstanceRole).toBeDefined(); - expectCDK(spotFleetStack).to(haveResourceLike('AWS::IAM::Role', { - AssumeRolePolicyDocument: objectLike({ - Statement: [objectLike({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::IAM::Role', { + AssumeRolePolicyDocument: Match.objectLike({ + Statement: [Match.objectLike({ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: { @@ -173,10 +169,10 @@ describe('SpotEventPluginFleet', () => { }, })], }), - ManagedPolicyArns: arrayWith( + ManagedPolicyArns: Match.arrayWith([ spotFleetStack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineSpotEventPluginWorkerPolicy').managedPolicyArn), - ), - })); + ]), + }); }); test('creates an instance profile', () => { @@ -192,11 +188,11 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.instanceProfile).toBeDefined(); - expectCDK(spotFleetStack).to(haveResourceLike('AWS::IAM::InstanceProfile', { - Roles: arrayWith({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::IAM::InstanceProfile', { + Roles: Match.arrayWith([{ Ref: spotFleetStack.getLogicalId(fleet.fleetInstanceRole.node.defaultChild as CfnElement), - }), - })); + }]), + }); }); test('creates a spot fleet role', () => { @@ -212,9 +208,9 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.fleetRole).toBeDefined(); - expectCDK(spotFleetStack).to(haveResourceLike('AWS::IAM::Role', { - AssumeRolePolicyDocument: objectLike({ - Statement: [objectLike({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::IAM::Role', { + AssumeRolePolicyDocument: Match.objectLike({ + Statement: [Match.objectLike({ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: { @@ -222,10 +218,10 @@ describe('SpotEventPluginFleet', () => { }, })], }), - ManagedPolicyArns: arrayWith( + ManagedPolicyArns: Match.arrayWith([ spotFleetStack.resolve(ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonEC2SpotFleetTaggingRole').managedPolicyArn), - ), - })); + ]), + }); }); test('adds group names to user data', () => { @@ -259,14 +255,14 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.tags).toBeDefined(); - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::SecurityGroup', { - Tags: arrayWith( - objectLike({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::SecurityGroup', { + Tags: Match.arrayWith([ + Match.objectLike({ Key: rfdkTag.name, Value: rfdkTag.value, }), - ), - })); + ]), + }); }); test('uses default LogGroup prefix %s', () => { @@ -283,10 +279,10 @@ describe('SpotEventPluginFleet', () => { maxCapacity, }); - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: 3, LogGroupName: '/renderfarm/' + id, - })); + }); }); test('sets default allocation strategy', () => { @@ -407,17 +403,21 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::LaunchTemplate', { - LaunchTemplateData: objectLike({ - TagSpecifications: arrayWith({ - ResourceType: 'instance', - Tags: arrayWith({ - Key: 'DeadlineTrackedAWSResource', - Value: 'SpotEventPlugin', - }), - }), + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::LaunchTemplate', { + LaunchTemplateData: Match.objectLike({ + TagSpecifications: Match.arrayWith([ + { + ResourceType: 'instance', + Tags: Match.arrayWith([ + { + Key: 'DeadlineTrackedAWSResource', + Value: 'SpotEventPlugin', + }, + ]), + }, + ]), }), - })); + }); }); test('adds multiple fleet security groups to launch template', () => { @@ -439,11 +439,11 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::LaunchTemplate', { - LaunchTemplateData: objectLike({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::LaunchTemplate', { + LaunchTemplateData: Match.objectLike({ SecurityGroupIds: securityGroups.map(sg => spotFleetStack.resolve(sg.securityGroupId)), }), - })); + }); }); test('adds fleet tags to launch template', () => { @@ -465,17 +465,19 @@ describe('SpotEventPluginFleet', () => { Tags.of(fleet).add(tag.key, tag.value); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::LaunchTemplate', { - LaunchTemplateData: objectLike({ - TagSpecifications: arrayWith({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::LaunchTemplate', { + LaunchTemplateData: Match.objectLike({ + TagSpecifications: Match.arrayWith([{ ResourceType: SpotFleetResourceType.INSTANCE.toString(), - Tags: arrayWith({ - Key: tag.key, - Value: tag.value, - }), - }), + Tags: Match.arrayWith([ + { + Key: tag.key, + Value: tag.value, + }, + ]), + }]), }), - })); + }); }); }); @@ -519,7 +521,7 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).notTo(haveResource('AWS::EC2::SecurityGroup')); + Template.fromStack(spotFleetStack).resourceCountIs('AWS::EC2::SecurityGroup', 0); expect(fleet.securityGroups.length).toBe(1); expect(fleet.securityGroups).toContainEqual(sg); }); @@ -548,7 +550,7 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).notTo(haveResource('AWS::EC2::SecurityGroup')); + Template.fromStack(spotFleetStack).resourceCountIs('AWS::EC2::SecurityGroup', 0); expect(fleet.securityGroups.length).toBe(2); expect(fleet.securityGroups).toContainEqual(sg1); expect(fleet.securityGroups).toContainEqual(sg2); @@ -601,20 +603,22 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.fleetInstanceRole).toBe(spotFleetInstanceRole); - expectCDK(spotFleetStack).to(countResourcesLike('AWS::IAM::Role', 1, { - AssumeRolePolicyDocument: objectLike({ - Statement: [objectLike({ - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ec2.amazonaws.com', - }, - })], + resourcePropertiesCountIs(spotFleetStack, 'AWS::IAM::Role', { + AssumeRolePolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ + Match.objectLike({ + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'ec2.amazonaws.com', + }, + }), + ]), }), - ManagedPolicyArns: arrayWith( + ManagedPolicyArns: Match.arrayWith([ spotFleetStack.resolve(ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineSpotEventPluginWorkerPolicy').managedPolicyArn), - ), - })); + ]), + }, 1); }); test('throws if provided spot fleet instance role is not from the same stack', () => { @@ -668,20 +672,22 @@ describe('SpotEventPluginFleet', () => { // THEN expect(fleet.fleetRole).toBe(fleetRole); - expectCDK(spotFleetStack).notTo(haveResourceLike('AWS::IAM::Role', { - AssumeRolePolicyDocument: objectLike({ - Statement: [objectLike({ - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'spotfleet.amazonaws.com', - }, - })], + resourcePropertiesCountIs(spotFleetStack, 'AWS::IAM::Role', { + AssumeRolePolicyDocument: Match.objectLike({ + Statement: Match.arrayWith([ + Match.objectLike({ + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'spotfleet.amazonaws.com', + }, + }), + ]), }), - ManagedPolicyArns: arrayWith( + ManagedPolicyArns: Match.arrayWith([ stack.resolve(ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonEC2SpotFleetTaggingRole').managedPolicyArn), - ), - })); + ]), + }, 0); }); test('tags resources deployed by CDK', () => { @@ -701,14 +707,14 @@ describe('SpotEventPluginFleet', () => { Tags.of(fleet).add(tagName, tagValue); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::SecurityGroup', { - Tags: arrayWith( - objectLike({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::SecurityGroup', { + Tags: Match.arrayWith([ + Match.objectLike({ Key: tagName, Value: tagValue, }), - ), - })); + ]), + }); }); test('uses provided subnets', () => { @@ -895,10 +901,10 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: 3, LogGroupName: testPrefix + id, - })); + }); }); test('adds tag indicating resource tracker is not enabled', () => { @@ -914,17 +920,19 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expectCDK(spotFleetStack).to(haveResourceLike('AWS::EC2::LaunchTemplate', { - LaunchTemplateData: objectLike({ - TagSpecifications: arrayWith({ + Template.fromStack(spotFleetStack).hasResourceProperties('AWS::EC2::LaunchTemplate', { + LaunchTemplateData: Match.objectLike({ + TagSpecifications: Match.arrayWith([{ ResourceType: 'instance', - Tags: arrayWith({ - Key: 'DeadlineResourceTracker', - Value: 'SpotEventPlugin', - }), - }), + Tags: Match.arrayWith([ + { + Key: 'DeadlineResourceTracker', + Value: 'SpotEventPlugin', + }, + ]), + }]), }), - })); + }); }); }); @@ -947,7 +955,7 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlFrom(Peer.ipv4('127.0.0.1/24')); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', { SecurityGroupEgress: [{ CidrIp: '0.0.0.0/0' }], SecurityGroupIngress: [ { @@ -958,7 +966,7 @@ describe('SpotEventPluginFleet', () => { ToPort: fromPort + maxWorkersPerHost, }, ], - })); + }); }); test('to CIDR', () => { @@ -979,7 +987,7 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlTo(Peer.ipv4('127.0.0.1/24')); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', { SecurityGroupEgress: [{ CidrIp: '0.0.0.0/0' }], SecurityGroupIngress: [ { @@ -990,7 +998,7 @@ describe('SpotEventPluginFleet', () => { ToPort: fromPort + maxWorkersPerHost, }, ], - })); + }); }); test('from SecurityGroup', () => { @@ -1012,12 +1020,12 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: fromPort, IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: fromPort + maxWorkersPerHost, - })); + }); }); test('to SecurityGroup', () => { @@ -1039,12 +1047,12 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlTo(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: fromPort, IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: fromPort + maxWorkersPerHost, - })); + }); }); test('from other stack', () => { @@ -1069,12 +1077,12 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: fromPort, IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: fromPort + maxWorkersPerHost, - })); + }); }); test('to other stack', () => { @@ -1099,12 +1107,12 @@ describe('SpotEventPluginFleet', () => { fleet.allowRemoteControlTo(securityGroup); // THEN - expectCDK(otherStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(otherStack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: fromPort, IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: fromPort + maxWorkersPerHost, - })); + }); }); }); @@ -1171,8 +1179,10 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.ERROR); - expect(fleet.node.metadataEntry[0].data).toMatch(/Did not find any subnets matching/); + Annotations.fromStack(spotFleetStack).hasError( + `/${fleet.node.path}`, + Match.stringLikeRegexp('Did not find any subnets matching.*'), + ); }); }); @@ -1296,8 +1306,10 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch('being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'); + Annotations.fromStack(spotFleetStack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'), + ); }); test('No Warnings if Encrypted BlockDevices Provided', () => { @@ -1318,7 +1330,9 @@ describe('SpotEventPluginFleet', () => { }); //THEN - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(spotFleetStack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); test('Warnings if non-Encrypted BlockDevices Provided', () => { @@ -1341,8 +1355,10 @@ describe('SpotEventPluginFleet', () => { }); //THEN - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch(`The BlockDevice \"${DEVICE_NAME}\" on the spot-fleet ${id} is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`); + Annotations.fromStack(spotFleetStack).hasWarning( + `/${fleet.node.path}`, + `The BlockDevice \"${DEVICE_NAME}\" on the spot-fleet ${id} is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`, + ); }); test('Warnings for BlockDevices without encryption specified', () => { @@ -1365,8 +1381,10 @@ describe('SpotEventPluginFleet', () => { }); //THEN - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch(`The BlockDevice \"${DEVICE_NAME}\" on the spot-fleet ${id} is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`); + Annotations.fromStack(spotFleetStack).hasWarning( + `/${fleet.node.path}`, + `The BlockDevice \"${DEVICE_NAME}\" on the spot-fleet ${id} is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`, + ); }); test('No warnings for Ephemeral blockDeviceVolumes', () => { @@ -1387,7 +1405,9 @@ describe('SpotEventPluginFleet', () => { }); //THEN - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(spotFleetStack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); test('No warnings for Suppressed blockDeviceVolumes', () => { @@ -1408,7 +1428,9 @@ describe('SpotEventPluginFleet', () => { }); //THEN - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(spotFleetStack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(spotFleetStack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); test('throws if block devices without iops and wrong volume type', () => { @@ -1472,8 +1494,10 @@ describe('SpotEventPluginFleet', () => { }); // THEN - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch('iops will be ignored without volumeType: EbsDeviceVolumeType.IO1'); + Annotations.fromStack(stack).hasWarning( + `/${fleet.node.path}`, + 'iops will be ignored without volumeType: EbsDeviceVolumeType.IO1', + ); }); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/stage.test.ts b/packages/aws-rfdk/lib/deadline/test/stage.test.ts index 7c9c14980..109f225b9 100644 --- a/packages/aws-rfdk/lib/deadline/test/stage.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/stage.test.ts @@ -6,15 +6,14 @@ import * as fs from 'fs'; import * as path from 'path'; -import { - expect as expectCDK, - haveResourceLike, - stringLike, -} from '@aws-cdk/assert'; import { App, Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Manifest, @@ -298,7 +297,7 @@ describe('Stage', () => { test('creates DockerImageAssets from existing recipes', () => { jest.resetModules(); const mockDockerImageAssetConstructor = jest.fn(); - jest.mock('@aws-cdk/aws-ecr-assets', () => { + jest.mock('aws-cdk-lib/aws-ecr-assets', () => { class DockerImageAsset { constructor(...args: [any]) { @@ -398,10 +397,10 @@ describe('Stage', () => { // WHEN stage.getVersion(stack, 'Version'); - expectCDK(stack).to(haveResourceLike('Custom::RFDK_DEADLINE_INSTALLERS', { - forceRun: stringLike('*'), + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_DEADLINE_INSTALLERS', { + forceRun: Match.anyValue(), versionString: '10.1.9', - })); + }); }); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/test-helper.ts b/packages/aws-rfdk/lib/deadline/test/test-helper.ts new file mode 100644 index 000000000..1b30c1b95 --- /dev/null +++ b/packages/aws-rfdk/lib/deadline/test/test-helper.ts @@ -0,0 +1,20 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; + + +// CDKv2's assertion module doesn't have a Template.resourcePropertiesCountIs that would count +// the number of resources with the given properties. We add that here. +export function resourcePropertiesCountIs(stack: Stack, type: string, props: any, count: number): void { + const resources = Template.fromStack(stack).findResources(type, Match.objectLike({ Properties: props })); + expect(Object.keys(resources)).toHaveLength(count); +} \ No newline at end of file diff --git a/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-images.test.ts b/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-images.test.ts index 27771b463..26b7c789c 100644 --- a/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-images.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-images.test.ts @@ -4,28 +4,24 @@ */ import { - arrayWith, - expect as expectCDK, - haveResource, - objectLike, - stringLike, - SynthUtils, -} from '@aws-cdk/assert'; + App, + CustomResource, + Stack, + Token, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Compatibility, ContainerDefinition, ContainerImage, TaskDefinition, -} from '@aws-cdk/aws-ecs'; -import { - App, - CustomResource, - Stack, - Token, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ecs'; import { - AwsThinkboxEulaAcceptance, + AwsCustomerAgreementAndIpLicenseAcceptance, IVersion, RenderQueueImages, ThinkboxDockerImages, @@ -38,48 +34,42 @@ describe('ThinkboxDockerRecipes', () => { let app: App; let stack: Stack; let images: ThinkboxDockerImages; - let userAwsThinkboxEulaAcceptance: AwsThinkboxEulaAcceptance; + let userAwsCustomerAgreementAndIpLicenseAcceptance: AwsCustomerAgreementAndIpLicenseAcceptance; describe('defaults', () => { beforeEach(() => { // GIVEN app = new App(); stack = new Stack(app, 'Stack'); - userAwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_ACCEPTS_AWS_THINKBOX_EULA; + userAwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; // WHEN images = new ThinkboxDockerImages(stack, 'Images', { - userAwsThinkboxEulaAcceptance, + userAwsCustomerAgreementAndIpLicenseAcceptance, }); }); - test('fails validation when EULA is not accepted', () =>{ + test('fails validation when terms are not accepted', () =>{ // GIVEN const newStack = new Stack(app, 'NewStack'); const expectedError = ` The ThinkboxDockerImages will install Deadline onto one or more EC2 instances. -Deadline is provided by AWS Thinkbox under the AWS Thinkbox End User License -Agreement (EULA). By installing Deadline, you are agreeing to the terms of this -license. Follow the link below to read the terms of the AWS Thinkbox EULA. - -https://www.awsthinkbox.com/end-user-license-agreement - -By using the ThinkboxDockerImages to install Deadline you agree to the terms of -the AWS Thinkbox EULA. +By downloading or using the Deadline software, you agree to the AWS Customer Agreement (https://aws.amazon.com/agreement/) +and AWS Intellectual Property License (https://aws.amazon.com/legal/aws-ip-license-terms/). You acknowledge that Deadline +is AWS Content as defined in those Agreements. -Please set the userAwsThinkboxEulaAcceptance property to -USER_ACCEPTS_AWS_THINKBOX_EULA to signify your acceptance of the terms of the -AWS Thinkbox EULA. +Please set the userAcceptsAwsCustomerAgreementAndIpLicense property to +USER_ACCEPTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE to signify your acceptance of these terms. `; - userAwsThinkboxEulaAcceptance = AwsThinkboxEulaAcceptance.USER_REJECTS_AWS_THINKBOX_EULA; + userAwsCustomerAgreementAndIpLicenseAcceptance = AwsCustomerAgreementAndIpLicenseAcceptance.USER_REJECTS_AWS_CUSTOMER_AGREEMENT_AND_IP_LICENSE; new ThinkboxDockerImages(newStack, 'Images', { - userAwsThinkboxEulaAcceptance, + userAwsCustomerAgreementAndIpLicenseAcceptance, }); // WHEN function synth() { - SynthUtils.synthesize(newStack); + app.synth(); } // THEN @@ -88,9 +78,9 @@ AWS Thinkbox EULA. test('creates Custom::RFDK_ECR_PROVIDER', () => { // THEN - expectCDK(stack).to(haveResource('Custom::RFDK_EcrProvider', { - ForceRun: stringLike('*'), - })); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_EcrProvider', { + ForceRun: Match.anyValue(), + }); }); describe('provides container images for', () => { @@ -127,11 +117,11 @@ AWS Thinkbox EULA. }); // THEN - expectCDK(taskDefStack).to(haveResource('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith(objectLike({ + Template.fromStack(taskDefStack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([Match.objectLike({ Image: taskDefStack.resolve(expectedImage), - })), - })); + })]), + }); }); }); @@ -184,7 +174,7 @@ AWS Thinkbox EULA. // WHEN images = new ThinkboxDockerImages(stack, 'Images', { version, - userAwsThinkboxEulaAcceptance, + userAwsCustomerAgreementAndIpLicenseAcceptance, }); }); @@ -222,11 +212,11 @@ AWS Thinkbox EULA. }); // THEN - expectCDK(taskDefStack).to(haveResource('AWS::ECS::TaskDefinition', { - ContainerDefinitions: arrayWith(objectLike({ + Template.fromStack(taskDefStack).hasResourceProperties('AWS::ECS::TaskDefinition', { + ContainerDefinitions: Match.arrayWith([Match.objectLike({ Image: taskDefStack.resolve(expectedImage), - })), - })); + })]), + }); }); }); @@ -235,12 +225,12 @@ AWS Thinkbox EULA. const newStack = new Stack(app, 'NewStack'); new ThinkboxDockerImages(newStack, 'Images', { version, - userAwsThinkboxEulaAcceptance, + userAwsCustomerAgreementAndIpLicenseAcceptance, }); // WHEN function synth() { - SynthUtils.synthesize(newStack); + app.synth(); } // THEN diff --git a/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-recipes.test.ts b/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-recipes.test.ts index 7e2e55791..2d920fbd8 100644 --- a/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-recipes.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/thinkbox-docker-recipes.test.ts @@ -5,18 +5,16 @@ import * as path from 'path'; -import { - expect as expectCDK, - haveResource, - haveResourceLike, - stringLike, -} from '@aws-cdk/assert'; -import { DockerImageAsset } from '@aws-cdk/aws-ecr-assets'; -import { Asset } from '@aws-cdk/aws-s3-assets'; import { App, Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; +import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets'; +import { Asset } from 'aws-cdk-lib/aws-s3-assets'; import { DeadlineDockerRecipes, @@ -150,10 +148,10 @@ describe('ThinkboxDockerRecipes', () => { // WHEN recipes.version; - expectCDK(stack).to(haveResourceLike('Custom::RFDK_DEADLINE_INSTALLERS', { - forceRun: stringLike('*'), + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_DEADLINE_INSTALLERS', { + forceRun: Match.anyValue(), versionString: RELEASE_VERSION_STRING, - })); + }); }); test('does not create a VersionQuery when not referenced', () => { @@ -162,7 +160,7 @@ describe('ThinkboxDockerRecipes', () => { stage, }); - expectCDK(stack).notTo(haveResource('Custom::RFDK_DEADLINE_INSTALLERS')); + Template.fromStack(stack).resourceCountIs('Custom::RFDK_DEADLINE_INSTALLERS', 0); }); test('.linuxInstallers.client creates an Asset using the client installer', () => { diff --git a/packages/aws-rfdk/lib/deadline/test/usage-based-licensing.test.ts b/packages/aws-rfdk/lib/deadline/test/usage-based-licensing.test.ts index 92bfd4870..b62a1259a 100644 --- a/packages/aws-rfdk/lib/deadline/test/usage-based-licensing.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/usage-based-licensing.test.ts @@ -4,12 +4,15 @@ */ import { - arrayWith, - expect as expectCDK, - haveResource, - haveResourceLike, - stringLike, -} from '@aws-cdk/assert'; + App, + CfnElement, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { GenericWindowsImage, IVpc, @@ -17,26 +20,21 @@ import { SubnetSelection, SubnetType, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { DockerImageAsset, -} from '@aws-cdk/aws-ecr-assets'; +} from 'aws-cdk-lib/aws-ecr-assets'; import { CfnService, ContainerImage, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ILogGroup, -} from '@aws-cdk/aws-logs'; +} from 'aws-cdk-lib/aws-logs'; import { ISecret, Secret, -} from '@aws-cdk/aws-secretsmanager'; -import { - App, - CfnElement, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-secretsmanager'; import { testConstructTags, @@ -133,10 +131,9 @@ describe('UsageBasedLicensing', () => { }); // THEN - expect(ubl.node.metadataEntry).not.toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: expect.stringMatching(/dedicated subnet/i), - })); + Annotations.fromStack(stack).hasNoInfo(`/${ubl.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoWarning(`/${ubl.node.path}`, Match.anyValue()); + Annotations.fromStack(stack).hasNoError(`/${ubl.node.path}`, Match.anyValue()); }); test('vpcSubnets not specified => emits warning about dedicated subnets', () => { @@ -144,10 +141,10 @@ describe('UsageBasedLicensing', () => { const ubl = createUbl(); // THEN - expect(ubl.node.metadataEntry).toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', - })); + Annotations.fromStack(stack).hasWarning( + `/${ubl.node.path}`, + 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', + ); }); describe('configures auto registration', () => { @@ -197,7 +194,7 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Cluster')); + Template.fromStack(stack).resourceCountIs('AWS::ECS::Cluster', 1); }); describe('creates an ASG', () => { @@ -206,18 +203,18 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { MinSize: '1', MaxSize: '1', VPCZoneIdentifier: [ { - 'Fn::ImportValue': stringLike(`${dependencyStack.stackName}:ExportsOutputRefVPCPrivateSubnet1Subnet*`), + 'Fn::ImportValue': Match.stringLikeRegexp(`${dependencyStack.stackName}:ExportsOutputRefVPCPrivateSubnet1Subnet.*`), }, { - 'Fn::ImportValue': stringLike(`${dependencyStack.stackName}:ExportsOutputRefVPCPrivateSubnet2Subnet*`), + 'Fn::ImportValue': Match.stringLikeRegexp(`${dependencyStack.stackName}:ExportsOutputRefVPCPrivateSubnet2Subnet.*`), }, ], - })); + }); }); test('capacity can be specified', () => { @@ -227,10 +224,10 @@ describe('UsageBasedLicensing', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { MinSize: '2', MaxSize: '2', - })); + }); }); test('gives write access to log group', () => { @@ -242,24 +239,24 @@ describe('UsageBasedLicensing', () => { const asgRoleLogicalId = Stack.of(ubl).getLogicalId(ubl.asg.role.node.defaultChild as CfnElement); // THEN - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { - Action: arrayWith( + Action: Match.arrayWith([ 'logs:CreateLogStream', 'logs:PutLogEvents', - ), + ]), Effect: 'Allow', Resource: stack.resolve(logGroup.logGroupArn), }, - ), + ]), Version: '2012-10-17', }, - Roles: arrayWith( + Roles: Match.arrayWith([ { Ref: asgRoleLogicalId }, - ), - })); + ]), + }); }); test('uses the supplied security group', () => { @@ -272,9 +269,9 @@ describe('UsageBasedLicensing', () => { createUbl({ securityGroup }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { - SecurityGroups: arrayWith(stack.resolve(securityGroup.securityGroupId)), - })); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + SecurityGroups: Match.arrayWith([stack.resolve(securityGroup.securityGroupId)]), + }); }); }); @@ -284,9 +281,9 @@ describe('UsageBasedLicensing', () => { const ubl = createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { Cluster: { Ref: stack.getLogicalId(ubl.cluster.node.defaultChild as CfnElement) }, - })); + }); }); describe('DesiredCount', () => { @@ -295,9 +292,9 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { DesiredCount: 1, - })); + }); }); test('can be specified', () => { @@ -308,9 +305,9 @@ describe('UsageBasedLicensing', () => { createUbl({ desiredCount }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { DesiredCount: desiredCount, - })); + }); }); }); @@ -319,9 +316,9 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { LaunchType: 'EC2', - })); + }); }); test('sets distinct instance placement constraint', () => { @@ -329,11 +326,11 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { - PlacementConstraints: arrayWith( + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { + PlacementConstraints: Match.arrayWith([ { Type: 'distinctInstance' }, - ), - })); + ]), + }); }); test('uses the task definition', () => { @@ -341,9 +338,9 @@ describe('UsageBasedLicensing', () => { const ubl = createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { TaskDefinition: { Ref: stack.getLogicalId(ubl.service.taskDefinition.node.defaultChild as CfnElement) }, - })); + }); }); test('with the correct deployment configuration', () => { @@ -351,12 +348,12 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::Service', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::Service', { DeploymentConfiguration: { MaximumPercent: 100, MinimumHealthyPercent: 0, }, - })); + }); }); }); @@ -366,13 +363,13 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { Name: 'LicenseForwarderContainer', }, ], - })); + }); }); test('container is marked essential', () => { @@ -380,13 +377,13 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { Essential: true, }, ], - })); + }); }); test('with increased ulimits', () => { @@ -394,7 +391,7 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { Ulimits: [ @@ -411,7 +408,7 @@ describe('UsageBasedLicensing', () => { ], }, ], - })); + }); }); test('with awslogs log driver', () => { @@ -419,7 +416,7 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { LogConfiguration: { @@ -432,7 +429,7 @@ describe('UsageBasedLicensing', () => { }, }, ], - })); + }); }); test('configures UBL certificates', () => { @@ -443,15 +440,15 @@ describe('UsageBasedLicensing', () => { const taskRoleLogicalId = Stack.of(ubl).getLogicalId(ubl.service.taskDefinition.taskRole.node.defaultChild as CfnElement); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { - Environment: arrayWith( + Environment: Match.arrayWith([ { Name: 'UBL_CERTIFICATES_URI', Value: certificateSecret.secretArn, }, - ), + ]), }, ], TaskRoleArn: { @@ -460,11 +457,11 @@ describe('UsageBasedLicensing', () => { 'Arn', ], }, - })); + }); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', { PolicyDocument: { - Statement: arrayWith( + Statement: Match.arrayWith([ { Action: [ 'secretsmanager:GetSecretValue', @@ -473,13 +470,13 @@ describe('UsageBasedLicensing', () => { Effect: 'Allow', Resource: certificateSecret.secretArn, }, - ), + ]), Version: '2012-10-17', }, Roles: [ { Ref: Stack.of(ubl).getLogicalId(ubl.service.taskDefinition.taskRole.node.defaultChild as CfnElement) }, ], - })); + }); }); test('uses host networking', () => { @@ -487,9 +484,9 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { NetworkMode: 'host', - })); + }); }); test('is marked EC2 compatible only', () => { @@ -497,9 +494,9 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { RequiresCompatibilities: [ 'EC2' ], - })); + }); }); }); @@ -519,9 +516,9 @@ describe('UsageBasedLicensing', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { VPCZoneIdentifier: publicSubnetIds, - })); + }); }); test.each([ @@ -539,9 +536,9 @@ describe('UsageBasedLicensing', () => { }); // THEN - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { LogGroupName: testPrefix + id, - })); + }); }); describe('license limits', () => { @@ -555,18 +552,18 @@ describe('UsageBasedLicensing', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { - Environment: arrayWith( + Environment: Match.arrayWith([ { Name: 'UBL_LIMITS', Value: 'maya:10;vray:10', }, - ), + ]), }, ], - })); + }); }); test.each([ @@ -586,7 +583,7 @@ describe('UsageBasedLicensing', () => { ['RedShift', UsageBasedLicense.forRedShift(10), [5054, 7054]], ['Vray', UsageBasedLicense.forVray(10), [30306]], ['Yeti', UsageBasedLicense.forYeti(10), [5053, 7053]], - ])('Test open port for license type %s', (_licenseName: string, license: UsageBasedLicense, ports: number[]) => { + ])('open port for license type %s', (_licenseName: string, license: UsageBasedLicense, ports: number[]) => { // GIVEN const ubl = createUbl(); const workerStack = new Stack(app, 'WorkerStack', { env }); @@ -606,14 +603,14 @@ describe('UsageBasedLicensing', () => { // THEN ports.forEach( port => { - expectCDK(workerStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(workerStack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: port, GroupId: { - 'Fn::ImportValue': stringLike(`${Stack.of(ubl).stackName}:ExportsOutputFnGetAttUBLClusterASGInstanceSecurityGroup*`), + 'Fn::ImportValue': Match.stringLikeRegexp(`${Stack.of(ubl).stackName}:ExportsOutputFnGetAttUBLClusterASGInstanceSecurityGroup.*`), }, SourceSecurityGroupId: 'sg-123456789', - })); + }); }); }); @@ -634,13 +631,13 @@ describe('UsageBasedLicensing', () => { const ubl = createUbl(); const ublSecurityGroup = ubl.connections.securityGroups[0]; - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 4433, ToPort: 4433, GroupId: stack.resolve(renderQueueSecurityGroup.securityGroupId), SourceSecurityGroupId: stack.resolve(ublSecurityGroup.securityGroupId), - })); + }); }); test('adds ingress rule from RenderQueue ASG to UsageBasedLicensing ASG', () => { @@ -651,13 +648,13 @@ describe('UsageBasedLicensing', () => { const ubl = createUbl(); const ublSecurityGroup = ubl.connections.securityGroups[0]; - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', FromPort: 17004, ToPort: 17004, GroupId: stack.resolve(ublSecurityGroup.securityGroupId), SourceSecurityGroupId: stack.resolve(renderQueueSecurityGroup.securityGroupId), - })); + }); }); test('sets RENDER_QUEUE_URI environment variable', () => { @@ -665,18 +662,18 @@ describe('UsageBasedLicensing', () => { createUbl(); // THEN - expectCDK(stack).to(haveResourceLike('AWS::ECS::TaskDefinition', { + Template.fromStack(stack).hasResourceProperties('AWS::ECS::TaskDefinition', { ContainerDefinitions: [ { - Environment: arrayWith( + Environment: Match.arrayWith([ { Name: 'RENDER_QUEUE_URI', Value: stack.resolve(`${renderQueue.endpoint.applicationProtocol.toLowerCase()}://${renderQueue.endpoint.socketAddress}`), }, - ), + ]), }, ], - })); + }); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/version-query.test.ts b/packages/aws-rfdk/lib/deadline/test/version-query.test.ts index aa0b158af..29e16ab10 100644 --- a/packages/aws-rfdk/lib/deadline/test/version-query.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/version-query.test.ts @@ -3,17 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { - ABSENT, - expect as expectCDK, - haveResourceLike, - stringLike, -} from '@aws-cdk/assert'; import { App, CustomResource, Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { Installer, @@ -25,11 +23,11 @@ test('VersionQuery constructor full version', () => { const stack = new Stack(app, 'Stack'); new VersionQuery(stack, 'VersionQuery', { version: '10.1.9.2'}); - expectCDK(stack).to(haveResourceLike('Custom::RFDK_DEADLINE_INSTALLERS', { - forceRun: ABSENT, + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_DEADLINE_INSTALLERS', { + forceRun: Match.absent(), versionString: '10.1.9.2', - })); - expectCDK(stack).to(haveResourceLike('AWS::IAM::Role', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { AssumeRolePolicyDocument: { Statement: [ { @@ -55,17 +53,17 @@ test('VersionQuery constructor full version', () => { ], }, ], - })); - expectCDK(stack).to(haveResourceLike('AWS::Lambda::Function', { + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Function', { Handler: 'version-provider.handler', Role: { 'Fn::GetAtt': [ - stringLike('SingletonLambda*ServiceRole*'), + Match.stringLikeRegexp('SingletonLambda.*ServiceRole.*'), 'Arn', ], }, Runtime: 'nodejs16.x', - })); + }); }); test('VersionQuery constructor no versionString', () => { @@ -73,10 +71,10 @@ test('VersionQuery constructor no versionString', () => { const stack = new Stack(app, 'Stack'); new VersionQuery(stack, 'VersionQuery'); - expectCDK(stack).to(haveResourceLike('Custom::RFDK_DEADLINE_INSTALLERS', { - forceRun: stringLike('*'), - versionString: ABSENT, - })); + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_DEADLINE_INSTALLERS', { + forceRun: Match.anyValue(), + versionString: Match.absent(), + }); }); test.each([ @@ -88,10 +86,10 @@ test.each([ const stack = new Stack(app, 'Stack'); new VersionQuery(stack, 'VersionQuery', { version }); - expectCDK(stack).to(haveResourceLike('Custom::RFDK_DEADLINE_INSTALLERS', { + Template.fromStack(stack).hasResourceProperties('Custom::RFDK_DEADLINE_INSTALLERS', { versionString: version, - forceRun: stringLike('*'), - })); + forceRun: Match.anyValue(), + }); }); describe('VersionQuery.linuxInstallers', () => { diff --git a/packages/aws-rfdk/lib/deadline/test/wait-for-stable-service.test.ts b/packages/aws-rfdk/lib/deadline/test/wait-for-stable-service.test.ts index 7155a780c..67e846b26 100644 --- a/packages/aws-rfdk/lib/deadline/test/wait-for-stable-service.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/wait-for-stable-service.test.ts @@ -4,34 +4,32 @@ */ import { - arrayWith, - countResourcesLike, - expect as cdkExpect, - haveResourceLike, - objectLike, -} from '@aws-cdk/assert'; + App, + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { InstanceClass, InstanceSize, InstanceType, SubnetType, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { Cluster, ContainerImage, Ec2Service, Ec2TaskDefinition, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ManagedPolicy, -} from '@aws-cdk/aws-iam'; -import { - App, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-iam'; import { WaitForStableService, } from '../lib/wait-for-stable-service'; +import { resourcePropertiesCountIs } from './test-helper'; describe('WaitForStableService', () => { let app: App; @@ -70,10 +68,10 @@ describe('WaitForStableService', () => { }); // THEN - cdkExpect(isolatedStack).to(haveResourceLike('Custom::RFDK_WaitForStableService', { + Template.fromStack(isolatedStack).hasResourceProperties('Custom::RFDK_WaitForStableService', { cluster: isolatedStack.resolve(cluster.clusterArn), services: [isolatedStack.resolve(service.serviceArn)], - })); + }); }); test('creates lambda correctly', () => { @@ -82,7 +80,7 @@ describe('WaitForStableService', () => { service, }); - cdkExpect(isolatedStack).to(countResourcesLike('AWS::Lambda::Function', 1, { + resourcePropertiesCountIs(isolatedStack, 'AWS::Lambda::Function', { Handler: 'wait-for-stable-service.wait', Environment: { Variables: { @@ -91,7 +89,7 @@ describe('WaitForStableService', () => { }, Runtime: 'nodejs16.x', Timeout: 900, - })); + }, 1); }); test('adds policies to the lambda role', () => { @@ -101,22 +99,22 @@ describe('WaitForStableService', () => { }); // THEN - cdkExpect(isolatedStack).to(haveResourceLike('AWS::IAM::Role', { - ManagedPolicyArns: arrayWith( + Template.fromStack(isolatedStack).hasResourceProperties('AWS::IAM::Role', { + ManagedPolicyArns: Match.arrayWith([ isolatedStack.resolve(ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole').managedPolicyArn), - ), + ]), Policies: [{ - PolicyDocument: objectLike({ + PolicyDocument: Match.objectLike({ Statement: [{ Action: 'ecs:DescribeServices', Effect: 'Allow', - Resource: arrayWith( + Resource: Match.arrayWith([ isolatedStack.resolve(cluster.clusterArn), isolatedStack.resolve(service.serviceArn), - ), + ]), }], }), }], - })); + }); }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/worker-configuration.test.ts b/packages/aws-rfdk/lib/deadline/test/worker-configuration.test.ts index 20a0d75f9..15861eb81 100644 --- a/packages/aws-rfdk/lib/deadline/test/worker-configuration.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/worker-configuration.test.ts @@ -6,10 +6,12 @@ /* eslint-disable dot-notation */ import { - expect as expectCDK, - haveResource, - haveResourceLike, -} from '@aws-cdk/assert'; + Stack, +} from 'aws-cdk-lib'; +import { + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { AmazonLinuxGeneration, Instance, @@ -19,19 +21,20 @@ import { SecurityGroup, Vpc, WindowsVersion, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { ContainerImage, -} from '@aws-cdk/aws-ecs'; +} from 'aws-cdk-lib/aws-ecs'; import { ILogGroup, -} from '@aws-cdk/aws-logs'; -import { - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-logs'; import { LogGroupFactoryProps, } from '../../core/lib'; +import { + CWA_ASSET_LINUX, + CWA_ASSET_WINDOWS, +} from '../../core/test/asset-constants'; import { RenderQueue, Repository, @@ -40,10 +43,10 @@ import { WorkerInstanceConfiguration, } from '../lib'; import { - linuxConfigureWorkerScriptBoilerplate, - linuxCloudWatchScriptBoilerplate, - windowsConfigureWorkerScriptBoilerplate, - windowsCloudWatchScriptBoilerplate, + CONFIG_WORKER_ASSET_LINUX, + CONFIG_WORKER_ASSET_WINDOWS, + CONFIG_WORKER_PORT_ASSET_LINUX, + CONFIG_WORKER_PORT_ASSET_WINDOWS, } from './asset-constants'; describe('Test WorkerInstanceConfiguration for Linux', () => { @@ -66,18 +69,32 @@ describe('Test WorkerInstanceConfiguration for Linux', () => { new WorkerInstanceConfiguration(stack, 'Config', { worker: instance, }); - const userData = stack.resolve(instance.userData.render()); - - // // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - '#!/bin/bash\nmkdir -p $(dirname \'/tmp/', - ...linuxConfigureWorkerScriptBoilerplate( - `\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/`), - ], - ], + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, + ], + ], + }, + }, }); }); @@ -91,17 +108,32 @@ describe('Test WorkerInstanceConfiguration for Linux', () => { listenerPort: otherListenerPort, }, }); - const userData = stack.resolve(instance.userData.render()); - - // // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - '#!/bin/bash\nmkdir -p $(dirname \'/tmp/', - ...linuxConfigureWorkerScriptBoilerplate(`\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${otherListenerPort} /tmp/`), - ], - ], + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${otherListenerPort} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, + ], + ], + }, + }, }); }); @@ -115,18 +147,32 @@ describe('Test WorkerInstanceConfiguration for Linux', () => { region: 'r1', }, }); - const userData = stack.resolve(instance.userData.render()); - - // // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - '#!/bin/bash\nmkdir -p $(dirname \'/tmp/', - ...linuxConfigureWorkerScriptBoilerplate( - `\' \'g1,g2\' \'p1,p2\' \'r1\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/`), - ], - ], + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' 'g1,g2' 'p1,p2' 'r1' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, + ], + ], + }, + }, }); }); @@ -141,23 +187,48 @@ describe('Test WorkerInstanceConfiguration for Linux', () => { worker: instance, cloudWatchLogSettings: logGroupProps, }); - const logGroup = config.node.findChild('ConfigLogGroupWrapper'); - const logGroupName = stack.resolve((logGroup as ILogGroup).logGroupName); - const userData = stack.resolve(instance.userData.render()); + const logGroup = config.node.findChild('ConfigLogGroup') as ILogGroup; + const logGroupName = stack.resolve(logGroup.logGroupName); // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - '#!/bin/bash\nmkdir -p $(dirname \'/tmp/', - ...linuxCloudWatchScriptBoilerplate( - `\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/`), - ], - ], + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `#!/bin/bash\nmkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CWA_ASSET_LINUX.Bucket, + }, + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\nset -e\nchmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh' -i `, + { + Ref: 'AWS::Region', + }, + ' ', + { + Ref: Match.stringLikeRegexp('^ConfigStringParameter.*'), + }, + `\nmkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket, + }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, + ], + ], + }, + }, }); - expectCDK(stack).to(haveResource('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Value: { 'Fn::Join': [ '', @@ -172,7 +243,7 @@ describe('Test WorkerInstanceConfiguration for Linux', () => { ], ], }, - })); + }); }); }); @@ -196,19 +267,30 @@ describe('Test WorkerInstanceConfiguration for Windows', () => { new WorkerInstanceConfiguration(stack, 'Config', { worker: instance, }); - const userData = stack.resolve(instance.userData.render()); // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - ...windowsConfigureWorkerScriptBoilerplate( - `\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/`), - '\"\' -ErrorAction Stop }', - ], - ], + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -file 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -ErrorAction Stop\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py\n` + + `if (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }`, + ], + ], + }, + }, }); }); @@ -222,19 +304,30 @@ describe('Test WorkerInstanceConfiguration for Windows', () => { region: 'r1', }, }); - const userData = stack.resolve(instance.userData.render()); // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - ...windowsConfigureWorkerScriptBoilerplate( - `\' \'g1,g2\' \'p1,p2\' \'r1\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/`), - '\"\' -ErrorAction Stop }', - ], - ], + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -file 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -ErrorAction Stop\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' 'g1,g2' 'p1,p2' 'r1' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py\n` + + `if (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }`, + ], + ], + }, + }, }); }); @@ -247,19 +340,30 @@ describe('Test WorkerInstanceConfiguration for Windows', () => { listenerPort: otherListenerPort, }, }); - const userData = stack.resolve(instance.userData.render()); // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - ...windowsConfigureWorkerScriptBoilerplate( - `\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${otherListenerPort} C:/temp/`), - '\"\' -ErrorAction Stop }', - ], - ], + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -file 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -ErrorAction Stop\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${otherListenerPort} C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py\n` + + `if (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }`, + ], + ], + }, + }, }); }); @@ -274,24 +378,48 @@ describe('Test WorkerInstanceConfiguration for Windows', () => { worker: instance, cloudWatchLogSettings: logGroupProps, }); - const logGroup = config.node.findChild('ConfigLogGroupWrapper'); - const logGroupName = stack.resolve((logGroup as ILogGroup).logGroupName); - const userData = stack.resolve(instance.userData.render()); + const logGroup = config.node.findChild('ConfigLogGroup') as ILogGroup; + const logGroupName = stack.resolve(logGroup.logGroupName); // THEN - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - 'mkdir (Split-Path -Path \'C:/temp/', - ...windowsCloudWatchScriptBoilerplate( - `\' \'\' \'\' \'\' \'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}\' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/`), - '\"\' -ErrorAction Stop }', - ], - ], + Template.fromStack(stack).hasResourceProperties('AWS::EC2::Instance', { + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + `mkdir (Split-Path -Path 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CWA_ASSET_WINDOWS.Bucket, + }, + `' -key '${CWA_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n&'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -i `, + { + Ref: 'AWS::Region', + }, + ' ', + { + Ref: Match.stringLikeRegexp('^ConfigStringParameter.*'), + }, + `\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -file 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -ErrorAction Stop\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket, + }, + `' -key '${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py\n` + + `if (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }`, + ], + ], + }, + }, }); - expectCDK(stack).to(haveResource('AWS::SSM::Parameter', { + Template.fromStack(stack).hasResourceProperties('AWS::SSM::Parameter', { Value: { 'Fn::Join': [ '', @@ -306,7 +434,7 @@ describe('Test WorkerInstanceConfiguration for Windows', () => { ], ], }, - })); + }); }); }); @@ -355,12 +483,12 @@ describe('Test WorkerInstanceConfiguration connect to RenderQueue', () => { // THEN // Open-box testing. We know that we invoked the connection method on the // render queue if the security group for the instance has an ingress rule to the RQ. - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 8080, SourceSecurityGroupId: instanceSGId, GroupId: renderQueueSGId, - })); + }); }); test('For Windows', () => { @@ -382,11 +510,11 @@ describe('Test WorkerInstanceConfiguration connect to RenderQueue', () => { // THEN // Open-box testing. We know that we invoked the connection method on the // render queue if the security group for the instance has an ingress rule to the RQ. - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: 8080, SourceSecurityGroupId: instanceSGId, GroupId: renderQueueSGId, - })); + }); }); }); \ No newline at end of file diff --git a/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts b/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts index 69ca51df4..4d02714d1 100644 --- a/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts @@ -6,16 +6,18 @@ /* eslint-disable dot-notation */ import { - ABSENT, - expect as expectCDK, - haveResource, - haveResourceLike, - objectLike, - ResourcePart, -} from '@aws-cdk/assert'; + App, + CfnElement, + Stack, +} from 'aws-cdk-lib'; +import { + Annotations, + Match, + Template, +} from 'aws-cdk-lib/assertions'; import { BlockDeviceVolume, -} from '@aws-cdk/aws-autoscaling'; +} from 'aws-cdk-lib/aws-autoscaling'; import { GenericLinuxImage, GenericWindowsImage, @@ -26,28 +28,24 @@ import { Peer, SecurityGroup, SubnetType, + UserData, Vpc, -} from '@aws-cdk/aws-ec2'; +} from 'aws-cdk-lib/aws-ec2'; import { AssetImage, ContainerImage, -} from '@aws-cdk/aws-ecs'; -import { ArtifactMetadataEntryType } from '@aws-cdk/cloud-assembly-schema'; -import { - App, - CfnElement, - Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib/aws-ecs'; import { HealthMonitor, } from '../../core/lib'; +import { + CWA_ASSET_LINUX, + CWA_ASSET_WINDOWS, +} from '../../core/test/asset-constants'; import { testConstructTags, } from '../../core/test/tag-helpers'; -import { - escapeTokenRegex, -} from '../../core/test/token-regex-helpers'; import { IHost, InstanceUserDataProvider, @@ -63,9 +61,13 @@ import { import { CONFIG_WORKER_ASSET_LINUX, CONFIG_WORKER_ASSET_WINDOWS, - CWA_ASSET_LINUX, + CONFIG_WORKER_HEALTHCHECK_LINUX, + CONFIG_WORKER_HEALTHCHECK_WINDOWS, + CONFIG_WORKER_PORT_ASSET_LINUX, + CONFIG_WORKER_PORT_ASSET_WINDOWS, RQ_CONNECTION_ASSET, } from './asset-constants'; +import { resourcePropertiesCountIs } from './test-helper'; let app: App; let stack: Stack; @@ -113,12 +115,24 @@ test('default worker fleet is created correctly', () => { }); // THEN - expectCDK(wfstack).to(haveResource('AWS::AutoScaling::AutoScalingGroup')); - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 1); + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 't2.large', - spotPrice: ABSENT, - })); - expectCDK(wfstack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + IamInstanceProfile: { + Ref: Match.stringLikeRegexp('^workerFleetInstanceProfile.*'), + }, + ImageId: 'ami-any', + SecurityGroups: [ + { + 'Fn::GetAtt': [ + Match.stringLikeRegexp('^workerFleetInstanceSecurityGroup.*'), + 'GroupId', + ], + }, + ], + spotPrice: Match.absent(), + }); + Template.fromStack(wfstack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { IpProtocol: 'tcp', ToPort: parseInt(renderQueue.endpoint.portAsString(), 10), SourceSecurityGroupId: { @@ -130,15 +144,19 @@ test('default worker fleet is created correctly', () => { GroupId: { 'Fn::ImportValue': 'infraStack:ExportsOutputFnGetAttRQLBSecurityGroupAC643AEDGroupId8F9F7830', }, - })); - expectCDK(wfstack).to(haveResource('Custom::LogRetention', { + }); + Template.fromStack(wfstack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: 3, LogGroupName: '/renderfarm/workerFleet', - })); - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch('being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'); - expect(fleet.node.metadataEntry[1].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[1].data).toContain('being created without a health monitor attached to it. This means that the fleet will not automatically scale-in to 0 if the workers are unhealthy'); + }); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'), + ); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without a health monitor attached to it. This means that the fleet will not automatically scale-in to 0 if the workers are unhealthy'), + ); }); test('security group is added to fleet after its creation', () => { @@ -156,7 +174,7 @@ test('security group is added to fleet after its creation', () => { })); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { SecurityGroups: [ { 'Fn::GetAtt': [ @@ -166,7 +184,7 @@ test('security group is added to fleet after its creation', () => { }, 'sg-123456789', ], - })); + }); }); test('WorkerFleet uses given security group', () => { @@ -183,11 +201,11 @@ test('WorkerFleet uses given security group', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { SecurityGroups: [ 'sg-123456789', ], - })); + }); }); describe('allowing log listener port', () => { @@ -204,7 +222,7 @@ describe('allowing log listener port', () => { fleet.allowListenerPortFrom(Peer.ipv4('127.0.0.1/24').connections); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', { SecurityGroupEgress: [{ CidrIp: '0.0.0.0/0' }], SecurityGroupIngress: [ { @@ -215,7 +233,7 @@ describe('allowing log listener port', () => { ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], }, ], - })); + }); }); test('to CIDR', () => { @@ -231,7 +249,7 @@ describe('allowing log listener port', () => { fleet.allowListenerPortTo(Peer.ipv4('127.0.0.1/24').connections); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', { SecurityGroupEgress: [{ CidrIp: '0.0.0.0/0' }], SecurityGroupIngress: [ { @@ -242,7 +260,7 @@ describe('allowing log listener port', () => { ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], }, ], - })); + }); }); test('from SecurityGroup', () => { @@ -259,12 +277,12 @@ describe('allowing log listener port', () => { fleet.allowListenerPortFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'], IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], - })); + }); }); test('to SecurityGroup', () => { @@ -281,12 +299,12 @@ describe('allowing log listener port', () => { fleet.allowListenerPortTo(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'], IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], - })); + }); }); test('from other stack', () => { @@ -307,12 +325,12 @@ describe('allowing log listener port', () => { fleet.allowListenerPortFrom(securityGroup); // THEN - expectCDK(stack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'], IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], - })); + }); }); test('to other stack', () => { @@ -333,12 +351,12 @@ describe('allowing log listener port', () => { fleet.allowListenerPortTo(securityGroup); // THEN - expectCDK(otherStack).to(haveResourceLike('AWS::EC2::SecurityGroupIngress', { + Template.fromStack(otherStack).hasResourceProperties('AWS::EC2::SecurityGroupIngress', { FromPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'], IpProtocol: 'tcp', SourceSecurityGroupId: 'sg-123456789', ToPort: WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT'] + WorkerInstanceFleet['MAX_WORKERS_PER_HOST'], - })); + }); }); }); @@ -347,14 +365,31 @@ test('default worker fleet is created correctly with linux image', () => { new WorkerInstanceFleet(stack, 'workerFleet', { vpc, workerMachineImage: new GenericLinuxImage({ - 'us-east-1': '123', + 'us-east-1': 'ami-any', }), renderQueue, }); // THEN - expectCDK(stack).to(haveResource('AWS::AutoScaling::AutoScalingGroup')); - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration')); + // 3 = repository + renderqueue + worker fleet + Template.fromStack(stack).resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 3); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + InstanceType: 't2.large', + IamInstanceProfile: { + Ref: Match.stringLikeRegexp('^workerFleetInstanceProfile.*'), + }, + ImageId: 'ami-any', + SecurityGroups: [ + { + 'Fn::GetAtt': [ + Match.stringLikeRegexp('^workerFleetInstanceSecurityGroup.*'), + 'GroupId', + ], + }, + ], + spotPrice: Match.absent(), + }); + }); test('default worker fleet is created correctly with spot config', () => { @@ -369,10 +404,10 @@ test('default worker fleet is created correctly with spot config', () => { }); // THEN - expectCDK(wfstack).to(haveResource('AWS::AutoScaling::AutoScalingGroup')); - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).resourceCountIs('AWS::AutoScaling::AutoScalingGroup', 1); + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { SpotPrice: '2.5', - })); + }); }); test('default worker fleet is not created with incorrect spot config', () => { @@ -413,9 +448,9 @@ test('default worker fleet is created correctly custom Instance type', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { InstanceType: 't2.medium', - })); + }); }); test.each([ @@ -437,19 +472,38 @@ test.each([ }, }); - expectCDK(stack).to(haveResource('Custom::LogRetention', { + Template.fromStack(stack).hasResourceProperties('Custom::LogRetention', { RetentionInDays: 3, LogGroupName: testPrefix + id, - })); + }); }); -test('default worker fleet is created correctly custom subnet values', () => { +test('worker fleet uses given UserData', () => { + // GIVEN + const id = 'workerFleet'; + const userData = UserData.forLinux(); + + // WHEN + const workerFleet = new WorkerInstanceFleet(stack, id, { + vpc, + workerMachineImage: new GenericLinuxImage({ + 'us-east-1': '123', + }), + renderQueue, + userData, + }); + + // THEN + expect(workerFleet.fleet.userData).toBe(userData); +}); + +test('default linux worker fleet is created correctly custom subnet values', () => { vpc = new Vpc(stack, 'VPC1Az', { maxAzs: 1, }); // WHEN - const workers = new WorkerInstanceFleet(stack, 'workerFleet', { + new WorkerInstanceFleet(stack, 'workerFleet', { vpc, workerMachineImage: new GenericLinuxImage({ 'us-east-1': '123', @@ -465,480 +519,148 @@ test('default worker fleet is created correctly custom subnet values', () => { }); // THEN - expectCDK(stack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { VPCZoneIdentifier: [{ Ref: 'VPC1AzPublicSubnet1Subnet9649CC17', }], - })); - const userData = stack.resolve(workers.fleet.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': [ - '', - [ - '#!/bin/bash\nfunction exitTrap(){\nexitCode=$?\n/opt/aws/bin/cfn-signal --stack infraStack --resource workerFleetASG25520D69 --region us-east-1 -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}\ntrap exitTrap EXIT\nmkdir -p $(dirname \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "\')\naws s3 cp 's3://", - { Ref: CWA_ASSET_LINUX.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - '\'\n' + - 'set -e\n' + - 'chmod +x \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - '\'\n\'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CWA_ASSET_LINUX.Key }, - ], - }, - ], - }, - '\' -i us-east-1 ', - {Ref: 'workerFleetStringParameterDB3717DA'}, - '\nmkdir -p $(dirname \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - { Ref: RQ_CONNECTION_ASSET.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\'\n' + - 'if [ -f \"/etc/profile.d/deadlineclient.sh\" ]; then\n' + - ' source \"/etc/profile.d/deadlineclient.sh\"\n' + - 'fi\n' + - '"${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '" --render-queue "http://', - { - 'Fn::GetAtt': [ - 'RQLB3B7B1CBC', - 'DNSName', - ], - }, - ':8080" \n' + - 'rm -f "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: RQ_CONNECTION_ASSET.Key }, - ], - }, - ], - }, - '\"\n' + - "mkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - '\' \'/tmp/', - { - 'Fn::Select': [ - 0, + }); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + InstanceType: 't2.medium', + IamInstanceProfile: { + Ref: Match.stringLikeRegexp('workerFleetInstanceProfile.*'), + }, + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + 'function exitTrap(){\nexitCode=$?\n/opt/aws/bin/cfn-signal --stack infraStack --resource workerFleetASG25520D69 --region us-east-1 -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}\n' + + 'trap exitTrap EXIT\n' + + `mkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], + 'Fn::Sub': CWA_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n` + + `set -e\nchmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh' -i us-east-1 `, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], + Ref: Match.stringLikeRegexp('^workerFleetStringParameter.*'), }, - ], - }, - "'\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, + `\nmkdir -p $(dirname '/tmp/${RQ_CONNECTION_ASSET.Key}.py')\naws s3 cp 's3://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `/${RQ_CONNECTION_ASSET.Key}.py' '/tmp/${RQ_CONNECTION_ASSET.Key}.py'\n` + + 'if [ -f "/etc/profile.d/deadlineclient.sh" ]; then\n source "/etc/profile.d/deadlineclient.sh"\nfi\n' + + `"\${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "http://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, + 'Fn::GetAtt': [ + 'RQLB3B7B1CBC', + 'DNSName', ], }, - ], - }, - "')\naws s3 cp 's3://", - { Ref: CONFIG_WORKER_ASSET_LINUX.Bucket }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, + `:8080" \nrm -f "/tmp/${RQ_CONNECTION_ASSET.Key}.py"` + + `\nmkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, + ], + }, + }, + }); +}); + +test('default windows worker fleet is created correctly custom subnet values', () => { + vpc = new Vpc(stack, 'VPC1Az', { + maxAzs: 1, + }); + + // WHEN + new WorkerInstanceFleet(stack, 'workerFleet', { + vpc, + workerMachineImage: new GenericWindowsImage({ + 'us-east-1': '123', + }), + renderQueue, + instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.MEDIUM), + vpcSubnets: { + subnetType: SubnetType.PUBLIC, + }, + healthCheckConfig: { + port: 6161, + }, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::AutoScalingGroup', { + VPCZoneIdentifier: [{ + Ref: 'VPC1AzPublicSubnet1Subnet9649CC17', + }], + }); + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + InstanceType: 't2.medium', + IamInstanceProfile: { + Ref: Match.stringLikeRegexp('workerFleetInstanceProfile.*'), + }, + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + 'trap {\n$success=($PSItem.Exception.Message -eq "Success")\n' + + 'cfn-signal --stack infraStack --resource workerFleetASG25520D69 --region us-east-1 --success ($success.ToString().ToLower())\nbreak\n}\n' + + `mkdir (Split-Path -Path 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + 'Fn::Sub': CWA_ASSET_WINDOWS.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `' -key '${CWA_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n&'C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1' -i us-east-1 `, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + Ref: Match.stringLikeRegexp('^workerFleetStringParameter.*'), }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, + `\nif (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CWA_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }\n` + + `mkdir (Split-Path -Path 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, - ], + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `' -key '${RQ_CONNECTION_ASSET.Key}.py' -file 'C:/temp/${RQ_CONNECTION_ASSET.Key}.py' -ErrorAction Stop\n` + + '$ErrorActionPreference = "Stop"\n' + + '$DEADLINE_PATH = (get-item env:"DEADLINE_PATH").Value\n' + + `& "$DEADLINE_PATH/deadlinecommand.exe" -executeScriptNoGui "C:/temp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "http://`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_LINUX.Key }, + 'Fn::GetAtt': [ + 'RQLB3B7B1CBC', + 'DNSName', ], }, - ], - }, - `' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/`, - { - 'Fn::Select': [ - 0, + ':8080" 2>&1\n' + + `Remove-Item -Path "C:/temp/${RQ_CONNECTION_ASSET.Key}.py"\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' ) -ea 0\nRead-S3Object -BucketName '`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], + 'Fn::Sub': CONFIG_WORKER_ASSET_WINDOWS.Bucket.replace('${AWS::Region}', 'us-east-1'), }, - ], - }, - { - 'Fn::Select': [ - 1, + `' -key '${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -file 'C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py' -ErrorAction Stop\n` + + `mkdir (Split-Path -Path 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' ) -ea 0\nRead-S3Object -BucketName '`, { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_WINDOWS.Bucket.replace('${AWS::Region}', 'us-east-1'), }, + `' -key '${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -file 'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' -ErrorAction Stop\n` + + `&'C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} C:/temp/${CONFIG_WORKER_ASSET_WINDOWS.Key}.py\n` + + `if (!$?) { Write-Error 'Failed to execute the file \"C:/temp/${CONFIG_WORKER_PORT_ASSET_WINDOWS.Key}.ps1\"' -ErrorAction Stop }\n` + + 'throw \"Success\"', ], - }, - ], - ], + ], + }, + }, }); }); @@ -948,7 +670,7 @@ test('default worker fleet is created correctly with groups, pools and region', }); // WHEN - const workers = new WorkerInstanceFleet(stack, 'workerFleet', { + new WorkerInstanceFleet(stack, 'workerFleet', { vpc, workerMachineImage: new GenericLinuxImage({ 'us-east-1': '123', @@ -958,486 +680,65 @@ test('default worker fleet is created correctly with groups, pools and region', vpcSubnets: { subnetType: SubnetType.PUBLIC, }, - groups: ['A', 'B'], - pools: ['C', 'D'], + groups: ['A', 'B'], // We want to make sure that these are converted to lowercase + pools: ['C', 'D'], // We want to make sure that these are converted to lowercase region: 'E', }); // THEN - const userData = stack.resolve(workers.fleet.userData.render()); - expect(userData).toStrictEqual({ - 'Fn::Join': ['', [ - '#!/bin/bash\nfunction exitTrap(){\nexitCode=$?\n/opt/aws/bin/cfn-signal --stack infraStack --resource workerFleetASG25520D69 --region us-east-1 -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}\ntrap exitTrap EXIT\nmkdir -p $(dirname \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - {Ref: CWA_ASSET_LINUX.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CWA_ASSET_LINUX.Key}, - ], - }, - ], - }, - "' -i us-east-1 ", - {Ref: 'workerFleetStringParameterDB3717DA'}, - '\nmkdir -p $(dirname \'/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - '\')\naws s3 cp \'s3://', - {Ref: RQ_CONNECTION_ASSET.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - '\'\n' + - 'if [ -f \"/etc/profile.d/deadlineclient.sh\" ]; then\n' + - ' source \"/etc/profile.d/deadlineclient.sh\"\n' + - 'fi\n' + - '"${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - '" --render-queue "http://', - { - 'Fn::GetAtt': [ - 'RQLB3B7B1CBC', - 'DNSName', - ], - }, - ':8080" \n' + - 'rm -f "/tmp/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: RQ_CONNECTION_ASSET.Key}, - ], - }, - ], - }, - '\"\n' + - "mkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Bucket, - }, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { Ref: CONFIG_WORKER_ASSET_WINDOWS.Key }, - ], - }, - ], - }, - "'\nmkdir -p $(dirname '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - "')\naws s3 cp 's3://", - {Ref: CONFIG_WORKER_ASSET_LINUX.Bucket}, - '/', - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - "' '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - "'\nset -e\nchmod +x '/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - "'\n'/tmp/", - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - {Ref: CONFIG_WORKER_ASSET_LINUX.Key}, - ], - }, - ], - }, - `' 'a,b' 'c,d' 'E' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/`, - { - 'Fn::Select': [ - 0, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, - ], - }, - { - 'Fn::Select': [ - 1, - { - 'Fn::Split': [ - '||', - { - Ref: CONFIG_WORKER_ASSET_WINDOWS.Key, - }, - ], - }, + Template.fromStack(stack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { + InstanceType: 't2.medium', + IamInstanceProfile: { + Ref: Match.stringLikeRegexp('workerFleetInstanceProfile.*'), + }, + UserData: { + 'Fn::Base64': { + 'Fn::Join': [ + '', + [ + '#!/bin/bash\n' + + 'function exitTrap(){\nexitCode=$?\n/opt/aws/bin/cfn-signal --stack infraStack --resource workerFleetASG25520D69 --region us-east-1 -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}\n' + + 'trap exitTrap EXIT\n' + + `mkdir -p $(dirname '/tmp/${CWA_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CWA_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), + }, + `/${CWA_ASSET_LINUX.Key}.sh' '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n` + + `set -e\nchmod +x '/tmp/${CWA_ASSET_LINUX.Key}.sh'\n'/tmp/${CWA_ASSET_LINUX.Key}.sh' -i us-east-1 `, + { + Ref: Match.stringLikeRegexp('^workerFleetStringParameter.*'), + }, + `\nmkdir -p $(dirname '/tmp/${RQ_CONNECTION_ASSET.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': RQ_CONNECTION_ASSET.Bucket.replace('${AWS::Region}', 'us-east-1'), + }, + `/${RQ_CONNECTION_ASSET.Key}.py' '/tmp/${RQ_CONNECTION_ASSET.Key}.py'\n` + + 'if [ -f "/etc/profile.d/deadlineclient.sh" ]; then\n source "/etc/profile.d/deadlineclient.sh"\nfi\n' + + `"\${DEADLINE_PATH}/deadlinecommand" -executeScriptNoGui "/tmp/${RQ_CONNECTION_ASSET.Key}.py" --render-queue "http://`, + { + 'Fn::GetAtt': [ + 'RQLB3B7B1CBC', + 'DNSName', + ], + }, + `:8080" \nrm -f "/tmp/${RQ_CONNECTION_ASSET.Key}.py"` + + `\nmkdir -p $(dirname '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_PORT_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), + }, + `/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py' '/tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py'\n` + + `mkdir -p $(dirname '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh')\naws s3 cp 's3://`, + { + 'Fn::Sub': CONFIG_WORKER_ASSET_LINUX.Bucket.replace('${AWS::Region}', 'us-east-1'), + }, + `/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + 'set -e\n' + + `chmod +x '/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh'\n` + + `'/tmp/${CONFIG_WORKER_ASSET_LINUX.Key}.sh' 'a,b' 'c,d' 'E' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}' ${WorkerInstanceConfiguration['DEFAULT_LISTENER_PORT']} /tmp/${CONFIG_WORKER_PORT_ASSET_LINUX.Key}.py`, + ], ], }, - ]], + }, }); }); @@ -1585,8 +886,10 @@ describe('Block Device Tests', () => { renderQueue, healthMonitor, }); - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch('being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'), + ); }); test('No Warnings if Encrypted BlockDevices Provided', () => { @@ -1607,7 +910,7 @@ describe('Block Device Tests', () => { }); //THEN - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { BlockDeviceMappings: [ { Ebs: { @@ -1616,9 +919,11 @@ describe('Block Device Tests', () => { }, }, ], - })); + }); - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(wfstack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); test('Warnings if non-Encrypted BlockDevices Provided', () => { @@ -1640,7 +945,7 @@ describe('Block Device Tests', () => { }); //THEN - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { BlockDeviceMappings: [ { Ebs: { @@ -1649,10 +954,12 @@ describe('Block Device Tests', () => { }, }, ], - })); + }); - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch(`The BlockDevice \"${DEVICE_NAME}\" on the worker-fleet workerFleet is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp(`The BlockDevice \"${DEVICE_NAME}\" on the worker-fleet workerFleet is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`), + ); }); test('Warnings for BlockDevices without encryption specified', () => { @@ -1674,7 +981,7 @@ describe('Block Device Tests', () => { }); //THEN - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { BlockDeviceMappings: [ { Ebs: { @@ -1682,10 +989,12 @@ describe('Block Device Tests', () => { }, }, ], - })); + }); - expect(fleet.node.metadataEntry[0].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[0].data).toMatch(`The BlockDevice \"${DEVICE_NAME}\" on the worker-fleet workerFleet is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp(`The BlockDevice \"${DEVICE_NAME}\" on the worker-fleet workerFleet is not encrypted. Workers can have access to sensitive data so it is recommended to encrypt the devices on the worker fleet.`), + ); }); test('No warnings for Ephemeral blockDeviceVolumes', () => { @@ -1706,16 +1015,18 @@ describe('Block Device Tests', () => { }); //THEN - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { BlockDeviceMappings: [ { DeviceName: DEVICE_NAME, VirtualName: 'ephemeral0', }, ], - })); + }); - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(wfstack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); test('No warnings for Suppressed blockDeviceVolumes', () => { @@ -1736,15 +1047,17 @@ describe('Block Device Tests', () => { }); //THEN - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::LaunchConfiguration', { + Template.fromStack(wfstack).hasResourceProperties('AWS::AutoScaling::LaunchConfiguration', { BlockDeviceMappings: [ { DeviceName: DEVICE_NAME, }, ], - })); + }); - expect(fleet.node.metadataEntry).toHaveLength(0); + Annotations.fromStack(wfstack).hasNoInfo(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoWarning(`/${fleet.node.path}`, Match.anyValue()); + Annotations.fromStack(wfstack).hasNoError(`/${fleet.node.path}`, Match.anyValue()); }); }); @@ -1772,18 +1085,18 @@ describe('HealthMonitor Tests', () => { // THEN // Ensure the configuration script is executed with the expected arguments. - expect(userData).toMatch(new RegExp(escapeTokenRegex('&\'C:/temp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'63415\' \'10.1.9.2\''))); + expect(userData).toContain(`&'C:/temp/${CONFIG_WORKER_HEALTHCHECK_WINDOWS.Key}.ps1' '63415' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}'`); // Ensure that the health monitor target group has been set up. // Note: It's sufficient to just check for any resource created by the HealthMonitor registration. // The HealthMonitor tests cover ensuring that all of the resources are set up. - expectCDK(wfstack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(wfstack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { HealthCheckIntervalSeconds: 300, HealthCheckPort: '63415', HealthCheckProtocol: 'HTTP', Port: 8081, Protocol: 'HTTP', TargetType: 'instance', - })); + }); }); test('Monitor is configured for Linux', () => { @@ -1800,18 +1113,18 @@ describe('HealthMonitor Tests', () => { // THEN // Ensure the configuration script is executed with the expected arguments. - expect(userData).toMatch(new RegExp(escapeTokenRegex('\'/tmp/${Token[TOKEN.\\d+]}${Token[TOKEN.\\d+]}\' \'63415\' \'10.1.9.2\''))); + expect(userData).toContain(`'/tmp/${CONFIG_WORKER_HEALTHCHECK_LINUX.Key}.sh' '63415' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}'`); // Ensure that the health monitor target group has been set up. // Note: It's sufficient to just check for any resource created by the HealthMonitor registration. // The HealthMonitor tests cover ensuring that all of the resources are set up. - expectCDK(wfstack).to(haveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', { + Template.fromStack(wfstack).hasResourceProperties('AWS::ElasticLoadBalancingV2::TargetGroup', { HealthCheckIntervalSeconds: 300, HealthCheckPort: '63415', HealthCheckProtocol: 'HTTP', Port: 8081, Protocol: 'HTTP', TargetType: 'instance', - })); + }); }); test('UserData is added', () => { @@ -1906,15 +1219,22 @@ test('worker fleet signals when non-zero minCapacity', () => { // THEN expect(userData).toContain('cfn-signal'); - expectCDK(wfstack).to(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { + Template.fromStack(wfstack).hasResource('AWS::AutoScaling::AutoScalingGroup', { CreationPolicy: { ResourceSignal: { Count: 1, }, }, - }, ResourcePart.CompleteDefinition)); - // [0] = warning about block devices. [1] = warning about no health monitor - expect(fleet.node.metadataEntry).toHaveLength(2); + }); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'), + ); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without a health monitor attached to it. This means that the fleet will not automatically scale-in to 0 if the workers are unhealthy'), + ); + }); test('worker fleet does not signal when zero minCapacity', () => { @@ -1935,14 +1255,21 @@ test('worker fleet does not signal when zero minCapacity', () => { // There should be no cfn-signal call in the UserData. expect(userData).not.toContain('cfn-signal'); // Make sure we don't have a CreationPolicy - expectCDK(wfstack).notTo(haveResourceLike('AWS::AutoScaling::AutoScalingGroup', { - CreationPolicy: objectLike({}), - }, ResourcePart.CompleteDefinition)); - // There should be a warning in the construct's metadata about deploying with no capacity. - expect(fleet.node.metadataEntry).toHaveLength(3); - // [0] = warning about block devices. [2] = warning about no health monitor - expect(fleet.node.metadataEntry[1].type).toMatch(ArtifactMetadataEntryType.WARN); - expect(fleet.node.metadataEntry[1].data).toMatch(/Deploying with 0 minimum capacity./); + resourcePropertiesCountIs(wfstack, 'AWS::AutoScaling::AutoScalingGroup', { + CreationPolicy: Match.anyValue(), + }, 0); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*Deploying with 0 minimum capacity\..*'), + ); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without being provided any block devices so the Source AMI\'s devices will be used. Workers can have access to sensitive data so it is recommended to either explicitly encrypt the devices on the worker fleet or to ensure the source AMI\'s Drives are encrypted.'), + ); + Annotations.fromStack(wfstack).hasWarning( + `/${fleet.node.path}`, + Match.stringLikeRegexp('.*being created without a health monitor attached to it. This means that the fleet will not automatically scale-in to 0 if the workers are unhealthy'), + ); }); describe('secrets management enabled', () => { @@ -1977,10 +1304,10 @@ describe('secrets management enabled', () => { const workerInstanceFleet = new WorkerInstanceFleet(wfstack, 'WorkerInstanceFleet', props); // THEN - expect(workerInstanceFleet.node.metadataEntry).toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', - })); + Annotations.fromStack(wfstack).hasWarning( + `/${workerInstanceFleet.node.path}`, + 'Deadline Secrets Management is enabled on the Repository and VPC subnets have not been supplied. Using dedicated subnets is recommended. See https://github.com/aws/aws-rfdk/blobs/release/packages/aws-rfdk/lib/deadline/README.md#using-dedicated-subnets-for-deadline-components', + ); }); test('vpc subnets specified => does not emit dedicated subnets warning', () => { @@ -1993,9 +1320,9 @@ describe('secrets management enabled', () => { }); // THEN - expect(workerInstanceFleet.node.metadataEntry).not.toContainEqual(expect.objectContaining({ - type: 'aws:cdk:warning', - data: expect.stringMatching(/dedicated subnet/i), - })); + Annotations.fromStack(wfstack).hasNoWarning( + `/${workerInstanceFleet.node.path}`, + Match.stringLikeRegexp('.*dedicated subnet.*'), + ); }); }); diff --git a/packages/aws-rfdk/lib/lambdas/nodejs/configure-spot-event-plugin/test/handler.test.ts b/packages/aws-rfdk/lib/lambdas/nodejs/configure-spot-event-plugin/test/handler.test.ts index 95654a8f2..08228f8bb 100644 --- a/packages/aws-rfdk/lib/lambdas/nodejs/configure-spot-event-plugin/test/handler.test.ts +++ b/packages/aws-rfdk/lib/lambdas/nodejs/configure-spot-event-plugin/test/handler.test.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { - LaunchTemplate, -} from '@aws-cdk/aws-ec2'; import { App, Expiration, Stack, -} from '@aws-cdk/core'; +} from 'aws-cdk-lib'; +import { + LaunchTemplate, +} from 'aws-cdk-lib/aws-ec2'; import * as AWS from 'aws-sdk'; import { SpotEventPluginDisplayInstanceStatus, diff --git a/packages/aws-rfdk/lib/lambdas/nodejs/lib/kms/test/validation.test.ts b/packages/aws-rfdk/lib/lambdas/nodejs/lib/kms/test/validation.test.ts index 79dfc432f..3a44c4321 100644 --- a/packages/aws-rfdk/lib/lambdas/nodejs/lib/kms/test/validation.test.ts +++ b/packages/aws-rfdk/lib/lambdas/nodejs/lib/kms/test/validation.test.ts @@ -25,6 +25,6 @@ test.each([ ['arn:aws:kms:us-west-2:111122223333:key1234abcd-12ab-34cd-56ef-1234567890ab', false], ['arn:aws:kms:us-west-2:111122223333:key/', false], ['arn:aws:kms:us-west-2:111122223333:key/invalid-characters-ghijklmnopqr', false], -])('test isArn(%s) -> %p', (value: string, expected: boolean) => { +])('isArn(%s) -> %p', (value: string, expected: boolean) => { expect(isArn(value)).toBe(expected); }); diff --git a/packages/aws-rfdk/lib/lambdas/nodejs/lib/secrets-manager/test/validation.test.ts b/packages/aws-rfdk/lib/lambdas/nodejs/lib/secrets-manager/test/validation.test.ts index 728ac1e82..a6b490b24 100644 --- a/packages/aws-rfdk/lib/lambdas/nodejs/lib/secrets-manager/test/validation.test.ts +++ b/packages/aws-rfdk/lib/lambdas/nodejs/lib/secrets-manager/test/validation.test.ts @@ -24,6 +24,6 @@ test.each([ ['arn:aws:secretsmanager:us-west-1:1234567890:sec:SecretPath/SecretName', false], ['arn:aws:secretsmanager:us-west-1:1234567890:secret:SecretName', true], ['arn:aws:secretsmanager:us-west-1:1234567890:secret:SecretPath/', true], -])('test isArn(%s) -> %p', (value: string, expected: boolean) => { +])('isArn(%s) -> %p', (value: string, expected: boolean) => { expect(isArn(value)).toBe(expected); }); diff --git a/packages/aws-rfdk/lib/lambdas/nodejs/lib/x509-certs/test/certificate.test.ts b/packages/aws-rfdk/lib/lambdas/nodejs/lib/x509-certs/test/certificate.test.ts index a53aeca5f..6002ad96b 100644 --- a/packages/aws-rfdk/lib/lambdas/nodejs/lib/x509-certs/test/certificate.test.ts +++ b/packages/aws-rfdk/lib/lambdas/nodejs/lib/x509-certs/test/certificate.test.ts @@ -273,5 +273,7 @@ test('decrypt private key', async () => { // THEN expect(decryptedKey).toEqual(expectedDecryptedKey); // Must have the decrypted private key - expect(decryptedKey).toContain('-----BEGIN RSA PRIVATE KEY-----'); + // OpenSSL 1.0.x: -----BEGIN RSA PRIVATE KEY----- + // OpenSSL 1.1.x: -----BEGIN PRIVATE KEY----- + expect(decryptedKey).toMatch(/-----BEGIN (?:RSA )?PRIVATE KEY-----/); }); diff --git a/packages/aws-rfdk/package.json b/packages/aws-rfdk/package.json index 581c115a6..3b5a337bc 100644 --- a/packages/aws-rfdk/package.json +++ b/packages/aws-rfdk/package.json @@ -1,6 +1,6 @@ { "name": "aws-rfdk", - "version": "0.42.0", + "version": "1.0.0", "private": false, "description": "Package for core render farm constructs", "main": "lib/index.js", @@ -28,33 +28,35 @@ "url": "https://github.com/aws/aws-rfdk.git", "directory": "packages/aws-rfdk" }, + "homepage": "https://github.com/aws/aws-rfdk", "pkglint": { "exclude": [ - "dependencies/cdk-point-dependencies", - "ignore/strong-name-key", - "package-info/homepage", - "package-info/scripts/compat", - "package-info/stability", "jsii/dotnet/icon-url", "jsii/dotnet/strong-name", "jsii/java", "jsii/dotnet" ] }, + "awslint": { + "exclude": [ + "duration-prop-type:aws-rfdk.StaticPrivateIpServerProps.resourceSignalTimeout" + ] + }, "scripts": { - "awslint": "cdk-awslint", - "build": "cdk-build", + "awslint": "awslint", + "build": "jsii --project-references --silence-warnings=reserved-word && yarn run lint && yarn run pkglint", "build+test": "yarn run build && yarn test", "build+test+package": "yarn run build+test && yarn run package", "clean": "tsc --build --clean && bash ./clean.sh", - "lint": "cdk-lint", - "lintfix": "cdk-lint --fix", - "package": "cdk-package", - "pkglint": "pkglint -f", + "lint": "eslint . --ext=.ts --resolve-plugins-relative-to=.", + "lintfix": "eslint . --ext=.ts --resolve-plugins-relative-to=. --fix", + "package": "jsii-packmak -o dist", + "pkglint": "pkglint", + "pkglintfix": "pkglint -f", "test": "yarn testcdk && yarn testpy", - "testcdk": "cdk-test", + "testcdk": "CDK_DISABLE_STACK_TRACE=1 jest --silent", "testpy": "./test-python.sh", - "watch": "cdk-watch" + "watch": "tsc -w" }, "keywords": [ "aws", @@ -64,224 +66,38 @@ "deadline" ], "devDependencies": { - "@aws-cdk/assert": "1.160.0", - "@aws-cdk/assets": "1.160.0", - "@aws-cdk/aws-acmpca": "1.160.0", - "@aws-cdk/aws-apigateway": "1.160.0", - "@aws-cdk/aws-apigatewayv2": "1.160.0", - "@aws-cdk/aws-apigatewayv2-integrations": "1.160.0", - "@aws-cdk/aws-applicationautoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling-common": "1.160.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.160.0", - "@aws-cdk/aws-batch": "1.160.0", - "@aws-cdk/aws-certificatemanager": "1.160.0", - "@aws-cdk/aws-cloudformation": "1.160.0", - "@aws-cdk/aws-cloudfront": "1.160.0", - "@aws-cdk/aws-cloudwatch": "1.160.0", - "@aws-cdk/aws-cloudwatch-actions": "1.160.0", - "@aws-cdk/aws-codebuild": "1.160.0", - "@aws-cdk/aws-codecommit": "1.160.0", - "@aws-cdk/aws-codeguruprofiler": "1.160.0", - "@aws-cdk/aws-codepipeline": "1.160.0", - "@aws-cdk/aws-codestarnotifications": "1.160.0", - "@aws-cdk/aws-cognito": "1.160.0", - "@aws-cdk/aws-databrew": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-dynamodb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecr-assets": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-ecs-patterns": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-eks": "1.160.0", - "@aws-cdk/aws-elasticloadbalancing": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-events": "1.160.0", - "@aws-cdk/aws-events-targets": "1.160.0", - "@aws-cdk/aws-fsx": "1.160.0", - "@aws-cdk/aws-globalaccelerator": "1.160.0", - "@aws-cdk/aws-glue": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-kinesis": "1.160.0", - "@aws-cdk/aws-kinesisfirehose": "1.160.0", - "@aws-cdk/aws-kms": "1.160.0", - "@aws-cdk/aws-lambda": "1.160.0", - "@aws-cdk/aws-lambda-nodejs": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-route53-targets": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-sam": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/aws-servicediscovery": "1.160.0", - "@aws-cdk/aws-signer": "1.160.0", - "@aws-cdk/aws-sns": "1.160.0", - "@aws-cdk/aws-sns-subscriptions": "1.160.0", - "@aws-cdk/aws-sqs": "1.160.0", - "@aws-cdk/aws-ssm": "1.160.0", - "@aws-cdk/aws-stepfunctions": "1.160.0", - "@aws-cdk/aws-stepfunctions-tasks": "1.160.0", - "@aws-cdk/cloud-assembly-schema": "1.160.0", - "@aws-cdk/core": "1.160.0", - "@aws-cdk/custom-resources": "1.160.0", - "@aws-cdk/cx-api": "1.160.0", - "@aws-cdk/lambda-layer-awscli": "1.160.0", - "@aws-cdk/lambda-layer-kubectl": "1.160.0", - "@aws-cdk/lambda-layer-node-proxy-agent": "1.160.0", - "@aws-cdk/region-info": "1.160.0", - "@types/aws-lambda": "^8.10.100", + "@types/aws-lambda": "^8.10.101", "@types/jest": "^27.5.2", - "@types/sinon": "^10.0.11", - "aws-sdk": "^2.1155.0", + "@types/sinon": "^10.0.13", + "aws-cdk-lib": "2.33.0", + "aws-sdk": "^2.1184.0", "aws-sdk-mock": "5.5.0", - "cdk-build-tools": "0.42.0", - "constructs": "^3.3.69", + "awslint": "2.33.0", + "constructs": "^10.0.0", "dynalite": "^3.2.2", - "pkglint": "0.42.0", - "sinon": "^14.0.0" + "eslint": "^8.22.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.4.2", + "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jest": "^26.8.3", + "eslint-plugin-license-header": "^0.6.0", + "jest": "^27.5.1", + "jsii": "^1.63.1", + "jsii-pacmak": "^1.63.1", + "jsii-reflect": "^1.63.1", + "pkglint": "1.0.0", + "sinon": "^14.0.0", + "ts-jest": "^28.0.8", + "typescript": "~4.7.4" }, "dependencies": { - "@aws-cdk/assets": "1.160.0", - "@aws-cdk/aws-acmpca": "1.160.0", - "@aws-cdk/aws-apigateway": "1.160.0", - "@aws-cdk/aws-apigatewayv2": "1.160.0", - "@aws-cdk/aws-apigatewayv2-integrations": "1.160.0", - "@aws-cdk/aws-applicationautoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling-common": "1.160.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.160.0", - "@aws-cdk/aws-batch": "1.160.0", - "@aws-cdk/aws-certificatemanager": "1.160.0", - "@aws-cdk/aws-cloudformation": "1.160.0", - "@aws-cdk/aws-cloudfront": "1.160.0", - "@aws-cdk/aws-cloudwatch": "1.160.0", - "@aws-cdk/aws-cloudwatch-actions": "1.160.0", - "@aws-cdk/aws-codebuild": "1.160.0", - "@aws-cdk/aws-codecommit": "1.160.0", - "@aws-cdk/aws-codeguruprofiler": "1.160.0", - "@aws-cdk/aws-codepipeline": "1.160.0", - "@aws-cdk/aws-codestarnotifications": "1.160.0", - "@aws-cdk/aws-cognito": "1.160.0", - "@aws-cdk/aws-databrew": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-dynamodb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecr-assets": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-ecs-patterns": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-eks": "1.160.0", - "@aws-cdk/aws-elasticloadbalancing": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-events": "1.160.0", - "@aws-cdk/aws-events-targets": "1.160.0", - "@aws-cdk/aws-fsx": "1.160.0", - "@aws-cdk/aws-globalaccelerator": "1.160.0", - "@aws-cdk/aws-glue": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-kinesis": "1.160.0", - "@aws-cdk/aws-kinesisfirehose": "1.160.0", - "@aws-cdk/aws-kms": "1.160.0", - "@aws-cdk/aws-lambda": "1.160.0", - "@aws-cdk/aws-lambda-nodejs": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-route53-targets": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-sam": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/aws-servicediscovery": "1.160.0", - "@aws-cdk/aws-signer": "1.160.0", - "@aws-cdk/aws-sns": "1.160.0", - "@aws-cdk/aws-sns-subscriptions": "1.160.0", - "@aws-cdk/aws-sqs": "1.160.0", - "@aws-cdk/aws-ssm": "1.160.0", - "@aws-cdk/aws-stepfunctions": "1.160.0", - "@aws-cdk/aws-stepfunctions-tasks": "1.160.0", - "@aws-cdk/cloud-assembly-schema": "1.160.0", - "@aws-cdk/core": "1.160.0", - "@aws-cdk/custom-resources": "1.160.0", - "@aws-cdk/cx-api": "1.160.0", - "@aws-cdk/lambda-layer-awscli": "1.160.0", - "@aws-cdk/lambda-layer-kubectl": "1.160.0", - "@aws-cdk/lambda-layer-node-proxy-agent": "1.160.0", - "@aws-cdk/region-info": "1.160.0", - "constructs": "^3.3.69" + "aws-cdk-lib": "2.33.0", + "constructs": "^10.0.0" }, "peerDependencies": { - "@aws-cdk/assets": "1.160.0", - "@aws-cdk/aws-acmpca": "1.160.0", - "@aws-cdk/aws-apigateway": "1.160.0", - "@aws-cdk/aws-apigatewayv2": "1.160.0", - "@aws-cdk/aws-apigatewayv2-integrations": "1.160.0", - "@aws-cdk/aws-applicationautoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling": "1.160.0", - "@aws-cdk/aws-autoscaling-common": "1.160.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.160.0", - "@aws-cdk/aws-batch": "1.160.0", - "@aws-cdk/aws-certificatemanager": "1.160.0", - "@aws-cdk/aws-cloudformation": "1.160.0", - "@aws-cdk/aws-cloudfront": "1.160.0", - "@aws-cdk/aws-cloudwatch": "1.160.0", - "@aws-cdk/aws-cloudwatch-actions": "1.160.0", - "@aws-cdk/aws-codebuild": "1.160.0", - "@aws-cdk/aws-codecommit": "1.160.0", - "@aws-cdk/aws-codeguruprofiler": "1.160.0", - "@aws-cdk/aws-codepipeline": "1.160.0", - "@aws-cdk/aws-codestarnotifications": "1.160.0", - "@aws-cdk/aws-cognito": "1.160.0", - "@aws-cdk/aws-databrew": "1.160.0", - "@aws-cdk/aws-docdb": "1.160.0", - "@aws-cdk/aws-dynamodb": "1.160.0", - "@aws-cdk/aws-ec2": "1.160.0", - "@aws-cdk/aws-ecr": "1.160.0", - "@aws-cdk/aws-ecr-assets": "1.160.0", - "@aws-cdk/aws-ecs": "1.160.0", - "@aws-cdk/aws-ecs-patterns": "1.160.0", - "@aws-cdk/aws-efs": "1.160.0", - "@aws-cdk/aws-eks": "1.160.0", - "@aws-cdk/aws-elasticloadbalancing": "1.160.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.160.0", - "@aws-cdk/aws-events": "1.160.0", - "@aws-cdk/aws-events-targets": "1.160.0", - "@aws-cdk/aws-fsx": "1.160.0", - "@aws-cdk/aws-globalaccelerator": "1.160.0", - "@aws-cdk/aws-glue": "1.160.0", - "@aws-cdk/aws-iam": "1.160.0", - "@aws-cdk/aws-kinesis": "1.160.0", - "@aws-cdk/aws-kinesisfirehose": "1.160.0", - "@aws-cdk/aws-kms": "1.160.0", - "@aws-cdk/aws-lambda": "1.160.0", - "@aws-cdk/aws-lambda-nodejs": "1.160.0", - "@aws-cdk/aws-logs": "1.160.0", - "@aws-cdk/aws-route53": "1.160.0", - "@aws-cdk/aws-route53-targets": "1.160.0", - "@aws-cdk/aws-s3": "1.160.0", - "@aws-cdk/aws-s3-assets": "1.160.0", - "@aws-cdk/aws-sam": "1.160.0", - "@aws-cdk/aws-secretsmanager": "1.160.0", - "@aws-cdk/aws-servicediscovery": "1.160.0", - "@aws-cdk/aws-signer": "1.160.0", - "@aws-cdk/aws-sns": "1.160.0", - "@aws-cdk/aws-sns-subscriptions": "1.160.0", - "@aws-cdk/aws-sqs": "1.160.0", - "@aws-cdk/aws-ssm": "1.160.0", - "@aws-cdk/aws-stepfunctions": "1.160.0", - "@aws-cdk/aws-stepfunctions-tasks": "1.160.0", - "@aws-cdk/cloud-assembly-schema": "1.160.0", - "@aws-cdk/core": "1.160.0", - "@aws-cdk/custom-resources": "1.160.0", - "@aws-cdk/cx-api": "1.160.0", - "@aws-cdk/lambda-layer-awscli": "1.160.0", - "@aws-cdk/lambda-layer-kubectl": "1.160.0", - "@aws-cdk/lambda-layer-node-proxy-agent": "1.160.0", - "@aws-cdk/region-info": "1.160.0", - "constructs": "^3.3.69" + "aws-cdk-lib": "2.33.0", + "constructs": "^10.0.0" }, "engines": { "node": ">= 14.15.0" diff --git a/tools/cdk-build-tools/.eslintrc.js b/tools/cdk-build-tools/.eslintrc.js deleted file mode 100644 index cd7a30278..000000000 --- a/tools/cdk-build-tools/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -const baseConfig = require('./config/eslintrc'); -baseConfig.parserOptions.project = __dirname + '/tsconfig.json'; -baseConfig.rules["license-header/header"][0] = 'off'; -// Disable linting of white-space between the TyepScript type annotation syntax on this package to help merge -// upstream code. -baseConfig.rules["@typescript-eslint/type-annotation-spacing"][0] = 'off'; -module.exports = baseConfig; diff --git a/tools/cdk-build-tools/.gitignore b/tools/cdk-build-tools/.gitignore deleted file mode 100644 index 870835aae..000000000 --- a/tools/cdk-build-tools/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.js -*.js.map -*.d.ts -dist - -*.snk -!license-header.js -!.eslintrc.js -!config/*.js -junit.xml \ No newline at end of file diff --git a/tools/cdk-build-tools/.npmignore b/tools/cdk-build-tools/.npmignore deleted file mode 100644 index d91351326..000000000 --- a/tools/cdk-build-tools/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -# Don't include original .ts files when doing `npm pack` -*.ts -!*.d.ts -coverage -.nyc_output -*.tgz - -*.snk -.eslintrc.js -# exclude cdk artifacts -**/cdk.out -junit.xml \ No newline at end of file diff --git a/tools/cdk-build-tools/LICENSE b/tools/cdk-build-tools/LICENSE deleted file mode 100644 index 82ad00bb0..000000000 --- a/tools/cdk-build-tools/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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-2022 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/tools/cdk-build-tools/NOTICE b/tools/cdk-build-tools/NOTICE deleted file mode 100644 index 1b7adbb89..000000000 --- a/tools/cdk-build-tools/NOTICE +++ /dev/null @@ -1,2 +0,0 @@ -AWS Cloud Development Kit (AWS CDK) -Copyright 2018-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/tools/cdk-build-tools/README.md b/tools/cdk-build-tools/README.md deleted file mode 100644 index 8b7dd2487..000000000 --- a/tools/cdk-build-tools/README.md +++ /dev/null @@ -1,9 +0,0 @@ -CDK Build Tools -================ - -These scripts wrap the common operations that need to happen -during a CDK build, in a common place so it's easy to change -the build for all packages. - -Written in TypeScript instead of shell so that they can work -on Windows with no extra effort. diff --git a/tools/cdk-build-tools/bin/cdk-awslint b/tools/cdk-build-tools/bin/cdk-awslint deleted file mode 100755 index ea9cac349..000000000 --- a/tools/cdk-build-tools/bin/cdk-awslint +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('awslint/bin/awslint.js'); \ No newline at end of file diff --git a/tools/cdk-build-tools/bin/cdk-build b/tools/cdk-build-tools/bin/cdk-build deleted file mode 100755 index 4a9ad6b9a..000000000 --- a/tools/cdk-build-tools/bin/cdk-build +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cdk-build.js'); \ No newline at end of file diff --git a/tools/cdk-build-tools/bin/cdk-build.ts b/tools/cdk-build-tools/bin/cdk-build.ts deleted file mode 100644 index 87f269364..000000000 --- a/tools/cdk-build-tools/bin/cdk-build.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as yargs from 'yargs'; -import { compileCurrentPackage } from '../lib/compile'; -import { lintCurrentPackage } from '../lib/lint'; -import { shell } from '../lib/os'; -import { cdkBuildOptions, CompilerOverrides } from '../lib/package-info'; -import { Timers } from '../lib/timer'; - -async function main() { - const args = yargs - .env('CDK_BUILD') - .usage('Usage: cdk-build') - .option('jsii', { - type: 'string', - desc: 'Specify a different jsii executable', - defaultDescription: 'jsii provided by node dependencies', - }) - .option('tsc', { - type: 'string', - desc: 'Specify a different tsc executable', - defaultDescription: 'tsc provided by node dependencies', - }) - .option('eslint', { - type: 'string', - desc: 'Specify a different eslint executable', - defaultDescription: 'eslint provided by node dependencies', - }) - .argv; - - const options = cdkBuildOptions(); - - if (options.pre) { - await shell(options.pre, { timers }); - } - - // See if we need to call cfn2ts - if (options.cloudformation) { - if (typeof options.cloudformation === 'string') { - // There can be multiple scopes, ensuring it's always an array. - options.cloudformation = [options.cloudformation]; - } - await shell(['cfn2ts', ...options.cloudformation.map(scope => `--scope=${scope}`)], { timers }); - } - - const overrides: CompilerOverrides = { eslint: args.eslint, jsii: args.jsii, tsc: args.tsc }; - await compileCurrentPackage(timers, overrides); - await lintCurrentPackage(options, overrides); - - if (options.post) { - await shell(options.post, { timers }); - } -} - -const timers = new Timers(); -const buildTimer = timers.start('Total time'); - -main().then(() => { - buildTimer.end(); -}).catch(e => { - buildTimer.end(); - process.stderr.write(`${e.toString()}\n`); - process.stderr.write(`Build failed. ${timers.display()}\n`); - process.stderr.write('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n'); - process.exit(1); -}); diff --git a/tools/cdk-build-tools/bin/cdk-compat b/tools/cdk-build-tools/bin/cdk-compat deleted file mode 100755 index 4fe0c5da5..000000000 --- a/tools/cdk-build-tools/bin/cdk-compat +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -euo pipefail -script_dir="$(cd $(dirname $0) && pwd)" -repo_root="${script_dir}/../.." -ignore="${repo_root}/allowed-breaking-changes.txt" -package_name=$(node -p "require('./package.json').name") - -exec npx jsii-diff --keys --ignore-file ${ignore} npm:${package_name} diff --git a/tools/cdk-build-tools/bin/cdk-lint b/tools/cdk-build-tools/bin/cdk-lint deleted file mode 100755 index ef253d4b3..000000000 --- a/tools/cdk-build-tools/bin/cdk-lint +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cdk-lint.js'); \ No newline at end of file diff --git a/tools/cdk-build-tools/bin/cdk-lint.ts b/tools/cdk-build-tools/bin/cdk-lint.ts deleted file mode 100644 index a8ffaf949..000000000 --- a/tools/cdk-build-tools/bin/cdk-lint.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as yargs from 'yargs'; -import { lintCurrentPackage } from '../lib/lint'; -import { cdkBuildOptions } from '../lib/package-info'; - -async function main() { - const args = yargs - .usage('Usage: cdk-lint') - .option('eslint', { - type: 'string', - desc: 'Specify a different eslint executable', - defaultDescription: 'eslint provided by node dependencies', - }) - .option('fix', { - type: 'boolean', - desc: 'Fix the found issues', - default: false, - }) - .argv; - - const options = cdkBuildOptions(); - - await lintCurrentPackage(options, { eslint: args.eslint, fix: args.fix }); -} - -main().catch(e => { - process.stderr.write(`${e.toString()}\n`); - process.stderr.write('Linting failed.\n'); - process.exit(1); -}); diff --git a/tools/cdk-build-tools/bin/cdk-package b/tools/cdk-build-tools/bin/cdk-package deleted file mode 100755 index 196d3af27..000000000 --- a/tools/cdk-build-tools/bin/cdk-package +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cdk-package.js'); \ No newline at end of file diff --git a/tools/cdk-build-tools/bin/cdk-package.ts b/tools/cdk-build-tools/bin/cdk-package.ts deleted file mode 100644 index 85843294b..000000000 --- a/tools/cdk-build-tools/bin/cdk-package.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as path from 'path'; -import * as fs from 'fs-extra'; -import * as yargs from 'yargs'; -import { shell } from '../lib/os'; -import { cdkPackageOptions, isJsii, isPrivate } from '../lib/package-info'; -import { Timers } from '../lib/timer'; - -const timers = new Timers(); -const buildTimer = timers.start('Total time'); - -async function main() { - const args = yargs - .env('CDK_PACKAGE') - .usage('Usage: cdk-package') - .option('verbose', { type: 'boolean', default: false, alias: 'v', desc: 'verbose output' }) - .option('targets', { type: 'array', default: new Array(), desc: 'Targets to pass to jsii-pacmak' }) - .option('jsii-pacmak', { - type: 'string', - desc: 'Specify a different jsii-pacmak executable', - default: require.resolve('jsii-pacmak/bin/jsii-pacmak'), - defaultDescription: 'jsii-pacmak provided by node dependencies', - }) - .argv; - - const options = cdkPackageOptions(); - - const outdir = 'dist'; - - // if this is a private module, don't package - if (isPrivate()) { - process.stdout.write('No packaging for private modules.\n'); - return; - } - - if (isJsii()) { - const command = [args['jsii-pacmak'], - args.verbose ? '-vvv' : '-v', - ...args.targets ? flatMap(args.targets, (target: string) => ['-t', target]) : [], - '-o', outdir ]; - await shell(command, { timers }); - } else { - // just "npm pack" and deploy to "outdir" - const tarball = (await shell([ 'npm', 'pack' ], { timers })).trim(); - const target = path.join(outdir, 'js'); - await fs.remove(target); - await fs.mkdirp(target); - await fs.move(tarball, path.join(target, path.basename(tarball))); - } - - if (options.post) { - await shell(options.post, { timers }); - } -} - - -main().then(() => { - buildTimer.end(); - process.stdout.write(`Package complete. ${timers.display()}\n`); -}).catch(e => { - buildTimer.end(); - process.stderr.write(`${e.toString()}\n`); - process.stderr.write(`Package failed. ${timers.display()}\n`); - process.exit(1); -}); - -function flatMap(xs: T[], f: (x: T) => U[]): U[] { - const ret = new Array(); - for (const x of xs) { - ret.push(...f(x)); - } - return ret; -} diff --git a/tools/cdk-build-tools/bin/cdk-test b/tools/cdk-build-tools/bin/cdk-test deleted file mode 100755 index 113d44af0..000000000 --- a/tools/cdk-build-tools/bin/cdk-test +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cdk-test.js'); diff --git a/tools/cdk-build-tools/bin/cdk-test.ts b/tools/cdk-build-tools/bin/cdk-test.ts deleted file mode 100644 index d04524b6f..000000000 --- a/tools/cdk-build-tools/bin/cdk-test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as yargs from 'yargs'; -import { shell } from '../lib/os'; -import { cdkBuildOptions, hasIntegTests, nodeunitTestFiles } from '../lib/package-info'; -import { Timers } from '../lib/timer'; - -async function main() { - const args = yargs - .env('CDK_TEST') - .usage('Usage: cdk-test') - .option('jest', { - type: 'string', - desc: 'Specify a different jest executable', - default: require.resolve('jest/bin/jest'), - defaultDescription: 'jest provided by node dependencies', - }) - .argv; - - const options = cdkBuildOptions(); - const defaultShellOptions = { - timers, - env: { - CDK_DISABLE_STACK_TRACE: '1', - }, - }; - - if (options.test) { - await shell(options.test, defaultShellOptions); - } - - const nuTestFiles = await nodeunitTestFiles(); - if (nuTestFiles.length > 0) { - throw new Error(`nodeunit tests are no longer supported but ${nuTestFiles.length} were found: ${nuTestFiles.map(f => f.filename)}`); - } - - await shell([args.jest, '--silent'], defaultShellOptions); - - // Run integration test if the package has integ test files - if (await hasIntegTests()) { - await shell(['cdk-integ-assert'], defaultShellOptions); - } -} - -const timers = new Timers(); -const buildTimer = timers.start('Total time'); - -main().then(() => { - buildTimer.end(); - process.stdout.write(`Tests successful. ${timers.display()}\n`); -}).catch(e => { - buildTimer.end(); - process.stderr.write(`${e.toString()}\n`); - process.stderr.write(`Tests failed. ${timers.display()}\n`); - process.stderr.write('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n'); - process.exit(1); -}); diff --git a/tools/cdk-build-tools/bin/cdk-watch b/tools/cdk-build-tools/bin/cdk-watch deleted file mode 100755 index 2943181e7..000000000 --- a/tools/cdk-build-tools/bin/cdk-watch +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./cdk-watch.js'); diff --git a/tools/cdk-build-tools/bin/cdk-watch.ts b/tools/cdk-build-tools/bin/cdk-watch.ts deleted file mode 100644 index ef3c26e73..000000000 --- a/tools/cdk-build-tools/bin/cdk-watch.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as yargs from 'yargs'; -import { shell } from '../lib/os'; -import { packageCompiler } from '../lib/package-info'; - -interface Arguments extends yargs.Arguments { - jsii?: string; - tsc?: string; -} - -async function main() { - const args: Arguments = yargs - .env('CDK_WATCH') - .usage('Usage: cdk-watch') - .option('jsii', { - type: 'string', - desc: 'Specify a different jsii executable', - defaultDescription: 'jsii provided by node dependencies', - }) - .option('tsc', { - type: 'string', - desc: 'Specify a different tsc executable', - defaultDescription: 'tsc provided by node dependencies', - }) - .argv as any; - - await shell(packageCompiler({ jsii: args.jsii, tsc: args.tsc }).concat(['-w'])); -} - -main().catch(e => { - process.stderr.write(`${e.toString()}\n`); - process.exit(1); -}); diff --git a/tools/cdk-build-tools/chmod.bat b/tools/cdk-build-tools/chmod.bat deleted file mode 100644 index 59ac42c09..000000000 --- a/tools/cdk-build-tools/chmod.bat +++ /dev/null @@ -1,2 +0,0 @@ -@rem Just here so that running 'chmod' doesn't fail on Windows. -@rem Doesn't actually do anything, because it doesn't need to. diff --git a/tools/cdk-build-tools/lib/compile.ts b/tools/cdk-build-tools/lib/compile.ts deleted file mode 100644 index 110133311..000000000 --- a/tools/cdk-build-tools/lib/compile.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { makeExecutable, shell } from './os'; -import { CompilerOverrides, currentPackageJson, packageCompiler } from './package-info'; -import { Timers } from './timer'; - -/** - * Run the compiler on the current package - */ -export async function compileCurrentPackage(timers: Timers, compilers: CompilerOverrides = {}): Promise { - await shell(packageCompiler(compilers), { timers }); - - // Find files in bin/ that look like they should be executable, and make them so. - const scripts = currentPackageJson().bin || {}; - for (const script of Object.values(scripts) as any) { - await makeExecutable(script); - } -} diff --git a/tools/cdk-build-tools/lib/index.ts b/tools/cdk-build-tools/lib/index.ts deleted file mode 100644 index 449451226..000000000 --- a/tools/cdk-build-tools/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { shell } from './os'; diff --git a/tools/cdk-build-tools/lib/lint.ts b/tools/cdk-build-tools/lib/lint.ts deleted file mode 100644 index e9afd90dd..000000000 --- a/tools/cdk-build-tools/lib/lint.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as path from 'path'; -import { shell } from './os'; -import { CDKBuildOptions, CompilerOverrides } from './package-info'; - -export async function lintCurrentPackage(options: CDKBuildOptions, compilers: CompilerOverrides & { fix?: boolean } = {}): Promise { - if (!options.eslint?.disable) { - await shell([ - compilers.eslint || require.resolve('eslint/bin/eslint'), - '.', - '--ext=.ts', - `--resolve-plugins-relative-to=${__dirname}`, - ...compilers.fix ? ['--fix'] : [], - ]); - } - - if (!options.pkglint?.disable) { - await shell(['pkglint']); - } - - await shell([ path.join(__dirname, '..', 'bin', 'cdk-awslint') ]); -} diff --git a/tools/cdk-build-tools/lib/os.ts b/tools/cdk-build-tools/lib/os.ts deleted file mode 100644 index 314e945e8..000000000 --- a/tools/cdk-build-tools/lib/os.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as child_process from 'child_process'; -import * as fs from 'fs'; -import * as util from 'util'; -import * as colors from 'colors/safe'; -import { Timers } from './timer'; - -interface ShellOptions { - timers?: Timers; - env?: child_process.SpawnOptions['env']; -} - -/** - * A shell command that does what you want - * - * Is platform-aware, handles errors nicely. - */ -export async function shell(command: string[], options: ShellOptions = {}): Promise { - const timer = (options.timers || new Timers()).start(command[0]); - - await makeShellScriptExecutable(command[0]); - - const child = child_process.spawn(command[0], command.slice(1), { - // Need this for Windows where we want .cmd and .bat to be found as well. - shell: true, - stdio: [ 'ignore', 'pipe', 'pipe' ], - env: { - ...process.env, - ...options.env, - }, - }); - - const makeRed = process.stderr.isTTY ? colors.red : (x: string) => x; - - return new Promise((resolve, reject) => { - const stdout = new Array(); - - child.stdout!.on('data', chunk => { - process.stdout.write(chunk); - stdout.push(chunk); - }); - - child.stderr!.on('data', chunk => { - process.stderr.write(makeRed(chunk.toString())); - }); - - child.once('error', reject); - - child.once('exit', code => { - timer.end(); - if (code === 0) { - resolve(Buffer.concat(stdout).toString('utf-8')); - } else { - reject(new Error(`${renderCommandLine(command)} exited with error code ${code}`)); - } - }); - }); -} - -/** - * Render the given command line as a string - * - * Probably missing some cases but giving it a good effort. - */ -function renderCommandLine(cmd: string[]) { - if (process.platform !== 'win32') { - return doRender(cmd, hasAnyChars(' ', '\\', '!', '"', "'", '&', '$'), posixEscape); - } else { - return doRender(cmd, hasAnyChars(' ', '"', '&', '^', '%'), windowsEscape); - } -} - -/** - * Render a UNIX command line - */ -function doRender(cmd: string[], needsEscaping: (x: string) => boolean, doEscape: (x: string) => string): string { - return cmd.map(x => needsEscaping(x) ? doEscape(x) : x).join(' '); -} - -/** - * Return a predicate that checks if a string has any of the indicated chars in it - */ -function hasAnyChars(...chars: string[]): (x: string) => boolean { - return (str: string) => { - return chars.some(c => str.indexOf(c) !== -1); - }; -} - -/** - * Escape a shell argument for POSIX shells - * - * Wrapping in single quotes and escaping single quotes inside will do it for us. - */ -function posixEscape(x: string) { - // Turn ' -> '"'"' - x = x.replace("'", "'\"'\"'"); - return `'${x}'`; -} - -/** - * Escape a shell argument for cmd.exe - * - * This is how to do it right, but I'm not following everything: - * - * https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ - */ -function windowsEscape(x: string): string { - // First surround by double quotes, ignore the part about backslashes - x = `"${x}"`; - // Now escape all special characters - const shellMeta = ['"', '&', '^', '%']; - return x.split('').map(c => shellMeta.indexOf(x) !== -1 ? '^' + c : c).join(''); -} - -/** - * Make the script executable on the current platform - * - * On UNIX, we'll use chmod to directly execute the file. - * - * On Windows, we'll do nothing and expect our other tooling - * (npm/lerna) to generate appropriate .cmd files when linking. - */ -export async function makeExecutable(javascriptFile: string): Promise { - if (process.platform !== 'win32') { - await util.promisify(fs.chmod)(javascriptFile, 0o755); - } -} - -/** - * If the given file exists and looks like a shell script, make sure it's executable - */ -async function makeShellScriptExecutable(script: string) { - try { - if (await canExecute(script)) { return; } - if (!await isShellScript(script)) { return; } - await util.promisify(fs.chmod)(script, 0o755); - } catch (e: any) { - // If it happens that this file doesn't exist, that's fine. It's - // probably a file that can be found on the $PATH. - if (e.code === 'ENOENT') { return; } - throw e; - } -} - -async function canExecute(fileName: string): Promise { - try { - await util.promisify(fs.access)(fileName, fs.constants.X_OK); - return true; - } catch (e: any) { - if (e.code === 'EACCES') { return false; } - throw e; - } -} - -async function isShellScript(script: string): Promise { - const f = await util.promisify(fs.open)(script, 'r'); - const buffer = Buffer.alloc(2); - await util.promisify(fs.read)(f, buffer, 0, 2, null); - - return buffer.equals(Buffer.from('#!')); -} diff --git a/tools/cdk-build-tools/lib/package-info.ts b/tools/cdk-build-tools/lib/package-info.ts deleted file mode 100644 index d096de486..000000000 --- a/tools/cdk-build-tools/lib/package-info.ts +++ /dev/null @@ -1,172 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import * as util from 'util'; - -const readdir = util.promisify(fs.readdir); -const stat = util.promisify(fs.stat); - -/** - * Return the package JSON for the current package - */ -export function currentPackageJson(): any { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require(path.join(process.cwd(), 'package.json')); -} - -/** - * Return the CDK build options - */ -export function cdkBuildOptions(): CDKBuildOptions { - // These could have been in a separate cdk-build.json but for - // now it's easiest to just read them from the package JSON. - // Our package directories are littered with .json files enough - // already. - return currentPackageJson()['cdk-build'] || {}; -} - -/** - * Return the cdk-package options - */ -export function cdkPackageOptions(): CDKPackageOptions { - return currentPackageJson()['cdk-package'] || {}; -} - -/** - * Whether this is a jsii package - */ -export function isJsii(): boolean { - return currentPackageJson().jsii !== undefined; -} - -/** - * Whether this is a private package - */ -export function isPrivate(): boolean { - return currentPackageJson().private !== undefined; -} - -export interface File { - filename: string; - path: string; -} - -export async function listFiles(dirName: string, predicate: (x: File) => boolean): Promise { - try { - const files = (await readdir(dirName)).map(filename => ({ filename, path: path.join(dirName, filename) })); - - const ret: File[] = []; - for (const file of files) { - const s = await stat(file.path); - if (s.isDirectory()) { - // Recurse - ret.push(...await listFiles(file.path, predicate)); - } else { - if (predicate(file)) { - ret.push(file); - } - } - } - - return ret; - } catch (e: any) { - if (e.code === 'ENOENT') { return []; } - throw e; - } -} - -/** - * Return the nodeunit test files for this package - */ -export async function nodeunitTestFiles(): Promise { - return listFiles('test', f => f.filename.startsWith('test.') && f.filename.endsWith('.js')); -} - -export async function hasIntegTests(): Promise { - const files = await listFiles('test', f => f.filename.startsWith('integ.') && f.filename.endsWith('.js')); - return files.length > 0; -} - -export interface CompilerOverrides { - eslint?: string; - jsii?: string; - tsc?: string; -} - -/** - * Return the compiler for this package (either tsc or jsii) - */ -export function packageCompiler(compilers: CompilerOverrides): string[] { - if (isJsii()) { - return [compilers.jsii || require.resolve('jsii/bin/jsii'), '--project-references', '--silence-warnings=reserved-word']; - } else { - return [compilers.tsc || require.resolve('typescript/bin/tsc'), '--build']; - } -} - -export interface CDKBuildOptions { - /** - * What CloudFormation scope to generate resources for, if any - */ - cloudformation?: string | string[]; - - /** - * Options passed to `eslint` invocations. - */ - eslint?: { - /** - * Disable linting - * @default false - */ - disable?: boolean; - }; - - pkglint?: { - disable?: boolean; - }; - - /** - * An optional command (formatted as a list of strings) to run before building - * - * (Typically a code generator) - */ - pre?: string[]; - - /** - * An optional command (formatted as a list of strings) to run after building - * - * (Schema generator for example) - */ - post?: string[]; - - /** - * An optional command (formatted as a list of strings) to run before testing. - */ - test?: string[]; - - /** - * Whether the package uses Jest for tests. - * @deprecated Tests will always use Jest. - */ - jest?: boolean; -} - -export interface CDKPackageOptions { - /** - * Should this package be shrinkwrap - */ - shrinkWrap?: boolean; - - /* - * An optional command (formatted as a list of strings) to run after packaging - */ - post?: string[]; -} - -/** - * Return a full path to the config file in this package - * - * The addressed file is cdk-build-tools/config/FILE. - */ -export function configFilePath(fileName: string) { - return path.resolve(__dirname, '..', 'config', fileName); -} diff --git a/tools/cdk-build-tools/lib/timer.ts b/tools/cdk-build-tools/lib/timer.ts deleted file mode 100644 index 46e633717..000000000 --- a/tools/cdk-build-tools/lib/timer.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * A single timer - */ -export class Timer { - public timeMs?: number; - private startTime: number; - - constructor(public readonly label: string) { - this.startTime = Date.now(); - } - - public start() { - this.startTime = Date.now(); - } - - public end() { - this.timeMs = (Date.now() - this.startTime) / 1000; - } - - public isSet() { - return this.timeMs !== undefined; - } - - public humanTime() { - if (!this.timeMs) { return '???'; } - - const parts = []; - - let time = this.timeMs; - if (time > 60) { - const mins = Math.floor(time / 60); - parts.push(mins + 'm'); - time -= mins * 60; - } - parts.push(time.toFixed(1) + 's'); - - return parts.join(''); - } -} - -/** - * A collection of Timers - */ -export class Timers { - private readonly timers: Timer[] = []; - - public record(label: string, operation: () => T): T { - const timer = this.start(label); - try { - const x = operation(); - timer.end(); - return x; - } catch (e: any) { - timer.end(); - throw e; - } - } - - public async recordAsync(label: string, operation: () => Promise) { - const timer = this.start(label); - try { - const x = await operation(); - timer.end(); - return x; - } catch (e: any) { - timer.end(); - throw e; - } - } - - public start(label: string) { - const timer = new Timer(label); - this.timers.push(timer); - return timer; - } - - public display(): string { - const timers = this.timers.filter(t => t.isSet()); - timers.sort((a: Timer, b: Timer) => b.timeMs! - a.timeMs!); - return timers.map(t => `${t.label} (${t.humanTime()})`).join(' | '); - } -} diff --git a/tools/cdk-build-tools/package.json b/tools/cdk-build-tools/package.json deleted file mode 100644 index 8a3a41a4b..000000000 --- a/tools/cdk-build-tools/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "cdk-build-tools", - "private": true, - "version": "0.42.0", - "description": "Tools package with shared build scripts for CDK packages", - "main": "lib/index.js", - "repository": { - "type": "git", - "url": "https://github.com/aws/aws-rfdk.git", - "directory": "tools/cdk-build-tools" - }, - "bin": { - "cdk-build": "bin/cdk-build", - "cdk-compat": "bin/cdk-compat", - "cdk-watch": "bin/cdk-watch", - "cdk-test": "bin/cdk-test", - "cdk-package": "bin/cdk-package", - "cdk-awslint": "bin/cdk-awslint", - "cdk-lint": "bin/cdk-lint" - }, - "scripts": { - "build": "tsc -b && chmod +x bin/cdk-build && chmod +x bin/cdk-test && chmod +x bin/cdk-watch && chmod +x bin/cdk-awslint && chmod +x bin/cdk-lint && pkglint && eslint . --ext=.ts", - "watch": "tsc -b -w", - "pkglint": "pkglint -f", - "test": "echo success", - "build+test+package": "yarn run build+test", - "build+test": "yarn run build && yarn test", - "eslint": "eslint . --ext=.ts" - }, - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com", - "organization": true - }, - "license": "Apache-2.0", - "devDependencies": { - "@types/fs-extra": "^8.1.2", - "@types/jest": "^27.5.2", - "@types/semver": "^7.3.9", - "@types/yargs": "^15.0.14", - "pkglint": "0.42.0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "awslint": "1.160.0", - "colors": "1.4.0", - "eslint": "^7.32.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", - "eslint-plugin-deprecation": "^1.3.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^24.7.0", - "fs-extra": "^9.1.0", - "jest": "^27.5.1", - "jest-junit": "^13.2.0", - "jsii": "^1.60.0", - "jsii-pacmak": "^1.60.0", - "jsii-reflect": "^1.60.0", - "nyc": "^15.1.0", - "semver": "^7.3.7", - "ts-jest": "^27.1.5", - "typescript": "~4.7.3", - "yargs": "^16.2.0" - }, - "keywords": [ - "aws", - "cdk" - ], - "homepage": "https://github.com/aws/aws-cdk", - "engines": { - "node": ">= 14.15.0" - }, - "pkglint": { - "exclude": [ - "license/notice-file", - "package-info/keywords" - ] - } -} diff --git a/tools/cdk-build-tools/tsconfig.json b/tools/cdk-build-tools/tsconfig.json deleted file mode 100644 index 14499cd2a..000000000 --- a/tools/cdk-build-tools/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "lib": ["es2018"], - "strict": true, - "alwaysStrict": true, - "declaration": true, - "inlineSourceMap": true, - "inlineSources": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "resolveJsonModule": true, - "composite": true, - "incremental": true - }, - "include": ["**/*.ts"] -} diff --git a/tools/pkglint/lib/aws-service-official-names.json b/tools/pkglint/lib/aws-service-official-names.json deleted file mode 100644 index 61ac88c6f..000000000 --- a/tools/pkglint/lib/aws-service-official-names.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "AWS::AmazonMQ": "Amazon MQ", - "AWS::Amplify": "AWS Amplify", - "AWS::ApiGateway": "Amazon API Gateway", - "AWS::AppMesh": "AWS App Mesh", - "AWS::AppStream": "Amazon AppStream 2.0", - "AWS::AppSync": "AWS AppSync", - "AWS::ApplicationAutoScaling": "AWS Auto Scaling", - "AWS::Athena": "Amazon Athena", - "AWS::AutoScaling": "Amazon EC2 Auto Scaling", - "AWS::AutoScalingPlans": "AWS Auto Scaling Plans", - "AWS::Backup": "AWS Backup", - "AWS::Batch": "AWS Batch", - "AWS::Budgets": "AWS Budgets", - "AWS::CertificateManager": "AWS Certificate Manager", - "AWS::Cloud9": "AWS Cloud9", - "AWS::CloudFormation": "AWS CloudFormation", - "AWS::CloudFront": "Amazon CloudFront", - "AWS::CloudTrail": "AWS CloudTrail", - "AWS::CloudWatch": "Amazon CloudWatch", - "AWS::CodeBuild": "AWS CodeBuild", - "AWS::CodeCommit": "AWS CodeCommit", - "AWS::CodeDeploy": "AWS CodeDeploy", - "AWS::CodePipeline": "AWS CodePipeline", - "AWS::Cognito": "Amazon Cognito", - "AWS::Config": "AWS Config", - "AWS::DAX": "Amazon DynamoDB Accelerator", - "AWS::DLM": "Amazon Data Lifecycle Manager", - "AWS::DMS": "AWS Database Migration Service", - "AWS::DataPipeline": "AWS Data Pipeline", - "AWS::DirectoryService": "AWS Directory Service", - "AWS::DocDB": "Amazon DocumentDB", - "AWS::DynamoDB": "Amazon DynamoDB", - "AWS::EC2": "Amazon EC2", - "AWS::ECR": "Amazon ECR", - "AWS::ECS": "Amazon ECS", - "AWS::EFS": "Amazon Elastic File System", - "AWS::EKS": "Amazon EKS", - "AWS::EMR": "Amazon EMR", - "AWS::ElastiCache": "Amazon ElastiCache", - "AWS::ElasticBeanstalk": "AWS Elastic Beanstalk", - "AWS::ElasticLoadBalancing": "Amazon Elastic Load Balancing", - "AWS::ElasticLoadBalancingV2": "Amazon Elastic Load Balancing V2", - "AWS::Elasticsearch": "Amazon Elasticsearch Service", - "AWS::Events": "Amazon EventBridge", - "AWS::FSx": "Amazon FSx", - "AWS::GameLift": "Amazon GameLift", - "AWS::Glue": "AWS Glue", - "AWS::Greengrass": "AWS IoT Greengrass", - "AWS::GuardDuty": "Amazon GuardDuty", - "AWS::IAM": "AWS Identity and Access Management", - "AWS::Inspector": "Amazon Inspector", - "AWS::IoT1Click": "AWS IoT 1-Click", - "AWS::IoT": "AWS IoT", - "AWS::IoTAnalytics": "AWS IoT Analytics", - "AWS::IoTThingsGraph": "AWS IoT Things Graph", - "AWS::KMS": "AWS Key Management Service", - "AWS::Kinesis": "Amazon Kinesis", - "AWS::KinesisAnalytics": "Amazon Kinesis Data Analytics", - "AWS::KinesisFirehose": "Amazon Kinesis Data Firehose", - "AWS::Lambda": "AWS Lambda", - "AWS::Logs": "Amazon CloudWatch Logs", - "AWS::MediaLive": "AWS Elemental MediaLive", - "AWS::MediaStore": "AWS Elemental MediaStore", - "AWS::MSK": "Amazon Managed Streaming for Apache Kafka", - "AWS::Neptune": "Amazon Neptune", - "AWS::OpsWorks": "AWS OpsWorks", - "AWS::OpsWorksCM": "AWS OpsWorks CM", - "AWS::Pinpoint": "Amazon Pinpoint", - "AWS::PinpointEmail": "Amazon Pinpoint Email", - "AWS::RAM": "AWS Resource Access Manager", - "AWS::RDS": "Amazon Relational Database Service", - "AWS::Redshift": "Amazon Redshift", - "AWS::RoboMaker": "AWS RoboMaker", - "AWS::Route53": "Amazon Route53", - "AWS::Route53Resolver": "Amazon Route53 Resolver", - "AWS::S3": "Amazon S3", - "AWS::SDB": "Amazon SimpleDB", - "AWS::SES": "Amazon Simple Email Service", - "AWS::SNS": "Amazon Simple Notification Service", - "AWS::SQS": "Amazon Simple Queue Service", - "AWS::SSM": "AWS Systems Manager", - "AWS::SageMaker": "Amazon SageMaker", - "AWS::SecretsManager": "AWS Secrets Manager", - "AWS::SecurityHub": "AWS Security Hub", - "AWS::Serverless": "AWS Serverless Application Model", - "AWS::ServiceCatalog": "AWS Service Catalog", - "AWS::ServiceDiscovery": "Amazon ECS Service Discovery", - "AWS::StepFunctions": "AWS Step Functions", - "AWS::Transfer": "AWS Transfer for SFTP", - "AWS::WAF": "AWS Web Application Firewall", - "AWS::WAFRegional": "AWS WAF Regional", - "AWS::WorkSpaces": "Amazon WorkSpaces", - "Alexa::ASK": "Alexa Skills Kit" -} diff --git a/tools/pkglint/lib/rules.ts b/tools/pkglint/lib/rules.ts index ef91d7e40..c07371792 100644 --- a/tools/pkglint/lib/rules.ts +++ b/tools/pkglint/lib/rules.ts @@ -14,8 +14,6 @@ import { const PKGLINT_VERSION = require('../package.json').version; // eslint-disable-line @typescript-eslint/no-require-imports -const AWS_SERVICE_NAMES = require('./aws-service-official-names.json'); // eslint-disable-line @typescript-eslint/no-require-imports - /** * Verify that the package name matches the directory name */ @@ -98,7 +96,7 @@ export class HomepageCorrect extends ValidationRule { public readonly name = 'package-info/homepage'; public validate(pkg: PackageJson): void { - expectJSON(this.name, pkg, 'homepage', 'https://github.com/aws/aws-cdk'); + expectJSON(this.name, pkg, 'homepage', 'https://github.com/aws/aws-rfdk'); } } @@ -157,32 +155,15 @@ export class ReadmeFile extends ValidationRule { public validate(pkg: PackageJson): void { const readmeFile = path.join(pkg.packageRoot, 'README.md'); - const scopes = pkg.json['cdk-build'] && pkg.json['cdk-build'].cloudformation; - if (!scopes) { - return; - } - if (pkg.packageName === '@aws-cdk/core') { - return; - } - const scope: string = typeof scopes === 'string' ? scopes : scopes[0]; - const serviceName = AWS_SERVICE_NAMES[scope]; - - const headline = serviceName && `${serviceName} Construct Library`; + const headline = 'Render Farm Deployment Kit on AWS'; if (!fs.existsSync(readmeFile)) { pkg.report({ ruleName: this.name, message: 'There must be a README.md file at the root of the package', - fix: () => fs.writeFileSync( - readmeFile, - [ - `## ${headline || pkg.json.description}`, - 'This module is part of the[AWS Cloud Development Kit](https://github.com/aws/aws-cdk) project.', - ].join('\n'), - ), }); } else if (headline) { - const requiredFirstLine = `## ${headline}`; + const requiredFirstLine = `# ${headline}`; const [firstLine, ...rest] = fs.readFileSync(readmeFile, { encoding: 'utf8' }).split('\n'); if (firstLine !== requiredFirstLine) { pkg.report({ @@ -195,44 +176,6 @@ export class ReadmeFile extends ValidationRule { } } -const MATURITY_TO_STABILITY: Record = { - 'cfn-only': 'experimental', - 'experimental': 'experimental', - 'developer-preview': 'experimental', - 'stable': 'stable', - 'deprecated': 'deprecated', -}; - -/** - * There must be a stability setting, and it must match the package maturity. - * - * Maturity setting is leading here (as there are more options than the - * stability setting), but the stability setting must be present for `jsii` - * to properly read and encode it into the assembly. - */ -export class StabilitySetting extends ValidationRule { - public readonly name = 'package-info/stability'; - - public validate(pkg: PackageJson): void { - if (pkg.json.private) { - // Does not apply to private packages! - return; - } - - const maturity = pkg.json.maturity as string | undefined; - const stability = pkg.json.stability as string | undefined; - - const expectedStability = maturity ? MATURITY_TO_STABILITY[maturity] : undefined; - if (!stability || (expectedStability && stability !== expectedStability)) { - pkg.report({ - ruleName: this.name, - message: `stability is '${stability}', but based on maturity is expected to be '${expectedStability}'`, - fix: expectedStability ? (() => pkg.json.stability = expectedStability) : undefined, - }); - } - } -} - /** * Keywords must contain RFDK keywords. */ @@ -287,12 +230,8 @@ export class RFDKPackage extends ValidationRule { // skip private packages if (pkg.json.private) { return; } - if (!shouldUseCDKBuildTools(pkg)) { return; } - const merkleMarker = '.LAST_PACKAGE'; - expectJSON(this.name, pkg, 'scripts.package', 'cdk-package'); - const outdir = 'dist'; // if this is @@ -348,26 +287,6 @@ export class IncludeJsiiInNpmTarball extends ValidationRule { } } -/** - * Verifies there is no dependency on "jsii" since it's defined at the repo - * level. - */ -export class NoJsiiDep extends ValidationRule { - public readonly name = 'dependencies/no-jsii'; - - public validate(pkg: PackageJson): void { - const predicate = (s: string) => s.startsWith('jsii'); - - if (pkg.getDevDependency(predicate)) { - pkg.report({ - ruleName: this.name, - message: 'packages should not have a devDep on jsii since it is defined at the repo level', - fix: () => pkg.removeDevDependency(predicate), - }); - } - } -} - /** * Verifies that the expected versions of node will be supported. */ @@ -407,10 +326,6 @@ export class NoAtTypesInDependencies extends ValidationRule { } } -function isCdkModuleName(name: string) { - return !!name.match(/^@aws-cdk\//); -} - /** * Computes the module name for various other purposes (java package, ...) */ @@ -426,43 +341,6 @@ function rfdkModuleName(name: string) { }; } -/** - * The package must depend on cdk-build-tools - */ -export class MustDependOnBuildTools extends ValidationRule { - public readonly name = 'dependencies/build-tools'; - - public validate(pkg: PackageJson): void { - if (!shouldUseCDKBuildTools(pkg)) { return; } - - // We can't ACTUALLY require cdk-build-tools/package.json here, - // because WE don't depend on cdk-build-tools and we don't know if - // the package does. - expectDevDependency(this.name, - pkg, - 'cdk-build-tools', - `${PKGLINT_VERSION}`); - } -} - -/** - * Build script must be 'cdk-build' - */ -export class MustUseCDKBuild extends ValidationRule { - public readonly name = 'package-info/scripts/build'; - - public validate(pkg: PackageJson): void { - if (!shouldUseCDKBuildTools(pkg)) { return; } - - expectJSON(this.name, pkg, 'scripts.build', 'cdk-build'); - - // cdk-build will write a hash file that we have to ignore. - const merkleMarker = '.LAST_BUILD'; - fileShouldContain(this.name, pkg, '.gitignore', merkleMarker); - fileShouldContain(this.name, pkg, '.npmignore', merkleMarker); - } -} - /** * Dependencies in both regular and peerDependencies must agree in semver * @@ -499,70 +377,6 @@ export class RegularDependenciesMustSatisfyPeerDependencies extends ValidationRu } } -/** - * Check that dependencies on @aws-cdk/ packages use point versions (not version ranges) - * and that they are also defined in `peerDependencies`. - */ -export class MustDependonCdkByPointVersions extends ValidationRule { - public readonly name = 'dependencies/cdk-point-dependencies'; - - public validate(pkg: PackageJson): void { - // yes, ugly, but we have a bunch of references to other files in the repo. - // we use the root package.json to determine what should be the version - // across the repo: in local builds, this should be 0.0.0 and in CI builds - // this would be the actual version of the repo after it's been aligned - // using scripts/align-version.sh - const expectedVersion = require('../../../package.json').version; // eslint-disable-line @typescript-eslint/no-require-imports - const ignore = [ - '@aws-cdk/cloudformation-diff', - '@aws-cdk/cfnspec', - '@aws-cdk/cx-api', - '@aws-cdk/cloud-assembly-schema', - '@aws-cdk/region-info', - ]; - - for (const [depName, depVersion] of Object.entries(pkg.dependencies)) { - if (!isCdkModuleName(depName) || ignore.includes(depName)) { - continue; - } - - const peerDep = pkg.peerDependencies[depName]; - if (!peerDep) { - pkg.report({ - ruleName: this.name, - message: `dependency ${depName} must also appear in peerDependencies`, - fix: () => pkg.addPeerDependency(depName, expectedVersion), - }); - } - - if (peerDep !== expectedVersion) { - pkg.report({ - ruleName: this.name, - message: `peer dependency ${depName} should have the version ${expectedVersion}`, - fix: () => pkg.addPeerDependency(depName, expectedVersion), - }); - } - - if (depVersion !== expectedVersion) { - pkg.report({ - ruleName: this.name, - message: `dependency ${depName}: dependency version must be ${expectedVersion}`, - fix: () => pkg.addDependency(depName, expectedVersion), - }); - } - } - } -} - -export class MustIgnoreSNK extends ValidationRule { - public readonly name = 'ignore/strong-name-key'; - - public validate(pkg: PackageJson): void { - fileShouldContain(this.name, pkg, '.npmignore', '*.snk'); - fileShouldContain(this.name, pkg, '.gitignore', '*.snk'); - } -} - export class MustIgnoreJunitXml extends ValidationRule { public readonly name = 'ignore/junit'; @@ -589,32 +403,17 @@ export class NpmIgnoreForJsiiModules extends ValidationRule { } } -/** - * Must use 'cdk-watch' command - */ -export class MustUseCDKWatch extends ValidationRule { - public readonly name = 'package-info/scripts/watch'; - - public validate(pkg: PackageJson): void { - if (!shouldUseCDKBuildTools(pkg)) { return; } - - expectJSON(this.name, pkg, 'scripts.watch', 'cdk-watch'); - } -} /** - * Must use 'cdk-test' command + * Must have test-generated files in .gitignore */ -export class MustUseCDKTest extends ValidationRule { +export class MustIgnoreTestFiles extends ValidationRule { public readonly name = 'package-info/scripts/test'; public validate(pkg: PackageJson): void { - if (!shouldUseCDKBuildTools(pkg)) { return; } if (!hasTestDirectory(pkg)) { return; } - expectJSON(this.name, pkg, 'scripts.test', 'cdk-test'); - - // 'cdk-test' will calculate coverage, so have the appropriate + // Tests ill calculate coverage, so have the appropriate // files in .gitignore. fileShouldContain(this.name, pkg, '.gitignore', '.nyc_output'); fileShouldContain(this.name, pkg, '.gitignore', 'coverage'); @@ -633,47 +432,11 @@ export class MustHaveNodeEnginesDeclaration extends ValidationRule { } } -/** - * Scripts that run integ tests must also have the individual 'integ' script to update them - * - * This commands comes from the dev-dependency cdk-integ-tools. - */ -export class MustHaveIntegCommand extends ValidationRule { - public readonly name = 'package-info/scripts/integ'; - - public validate(pkg: PackageJson): void { - if (!hasIntegTests(pkg)) { return; } - - expectJSON(this.name, pkg, 'scripts.integ', 'cdk-integ'); - - // We can't ACTUALLY require cdk-build-tools/package.json here, - // because WE don't depend on cdk-build-tools and we don't know if - // the package does. - expectDevDependency(this.name, - pkg, - 'cdk-integ-tools', - `${PKGLINT_VERSION}`); - } -} - -/** - * Checks API backwards compatibility against the latest released version. - */ -export class CompatScript extends ValidationRule { - public readonly name = 'package-info/scripts/compat'; - - public validate(pkg: PackageJson): void { - if (!isJSII(pkg)) { return ; } - - expectJSON(this.name, pkg, 'scripts.compat', 'cdk-compat'); - } -} - export class PkgLintAsScript extends ValidationRule { public readonly name = 'package-info/scripts/pkglint'; public validate(pkg: PackageJson): void { - const script = 'pkglint -f'; + const script = 'pkglint'; expectDevDependency(this.name, pkg, 'pkglint', `${PKGLINT_VERSION}`); @@ -801,21 +564,7 @@ export class AwsLint extends ValidationRule { return; } - if (!isAWS(pkg)) { - return; - } - - expectJSON(this.name, pkg, 'scripts.awslint', 'cdk-awslint'); - } -} - -export class Cfn2Ts extends ValidationRule { - public readonly name = 'cfn2ts'; - - public validate(pkg: PackageJson) { - if (!isJSII(pkg) || !isAWS(pkg)) { - return expectJSON(this.name, pkg, 'scripts.cfn2ts', undefined); - } + expectJSON(this.name, pkg, 'scripts.awslint', 'awslint'); } } @@ -934,7 +683,7 @@ export class ConstructsDependency extends ValidationRule { public readonly name = 'constructs/dependency'; public validate(pkg: PackageJson) { - const REQUIRED_VERSION = '^3.3.69'; + const REQUIRED_VERSION = '^10.0.0'; if (pkg.devDependencies?.constructs && pkg.devDependencies?.constructs !== REQUIRED_VERSION) { pkg.report({ @@ -977,17 +726,6 @@ export class EslintSetup extends ValidationRule { pkg.report({ ruleName: this.name, message: 'There must be a .eslintrc.js file at the root of the package', - fix: () => { - const rootRelative = path.relative(pkg.packageRoot, repoRoot(pkg.packageRoot)); - fs.writeFileSync( - eslintrcFilename, - [ - `const baseConfig = require('${rootRelative}/tools/cdk-build-tools/config/eslintrc');`, - "baseConfig.parserOptions.project = __dirname + '/tsconfig.json';", - 'module.exports = baseConfig;', - ].join('\n') + '\n', - ); - }, }); } fileShouldContain(this.name, pkg, '.gitignore', '!.eslintrc.js'); @@ -999,42 +737,11 @@ export class JestSetup extends ValidationRule { public readonly name = 'package-info/jest.config'; public validate(pkg: PackageJson): void { - const cdkBuild = pkg.json['cdk-build'] || {}; - - // check whether the package.json contains the "jest" key, - // which we no longer use - if (pkg.json.jest) { - pkg.report({ - ruleName: this.name, - message: 'Using Jest is set through a flag in the "cdk-build" key in package.json, the "jest" key is ignored', - fix: () => { - delete pkg.json.jest; - cdkBuild.jest = true; - pkg.json['cdk-build'] = cdkBuild; - }, - }); - } - - // this rule should only be enforced for packages that use Jest for testing - if (!cdkBuild.jest) { - return; - } - const jestConfigFilename = 'jest.config.js'; if (!fs.existsSync(jestConfigFilename)) { pkg.report({ ruleName: this.name, message: 'There must be a jest.config.js file at the root of the package', - fix: () => { - const rootRelative = path.relative(pkg.packageRoot, repoRoot(pkg.packageRoot)); - fs.writeFileSync( - jestConfigFilename, - [ - `const baseConfig = require('${rootRelative}/tools/cdk-build-tools/config/jest.config');`, - 'module.exports = baseConfig;', - ].join('\n') + '\n', - ); - }, }); } fileShouldContain(this.name, pkg, '.gitignore', '!jest.config.js'); @@ -1058,14 +765,6 @@ function isJSII(pkg: PackageJson): boolean { return (pkg.json.jsii !== undefined); } -/** - * Indicates that this is an "AWS" package (i.e. that it it has a cloudformation source) - * @param pkg - */ -function isAWS(pkg: PackageJson): boolean { - return pkg.json['cdk-build']?.cloudformation != null; -} - /** * Determine whether the package has tests * @@ -1074,32 +773,3 @@ function isAWS(pkg: PackageJson): boolean { function hasTestDirectory(pkg: PackageJson) { return fs.existsSync(path.join(pkg.packageRoot, 'test')); } - -/** - * Whether this package has integ tests - * - * A package has integ tests if it mentions 'cdk-integ' in the "test" script. - */ -function hasIntegTests(pkg: PackageJson) { - if (!hasTestDirectory(pkg)) { return false; } - - const files = fs.readdirSync(path.join(pkg.packageRoot, 'test')); - return files.some(p => p.startsWith('integ.')); -} - -/** - * Return whether this package should use CDK build tools - */ -function shouldUseCDKBuildTools(pkg: PackageJson) { - // The packages that DON'T use CDKBuildTools are the package itself - // and the packages used by it. - return pkg.packageName !== 'cdk-build-tools' && pkg.packageName !== 'merkle-build' && pkg.packageName !== 'awslint'; -} - -function repoRoot(dir: string) { - let root = dir; - for (let i = 0; i < 50 && !fs.existsSync(path.join(root, 'yarn.lock')); i++) { - root = path.dirname(root); - } - return root; -} diff --git a/tools/pkglint/package.json b/tools/pkglint/package.json index 6b708f8d6..22bb2f512 100644 --- a/tools/pkglint/package.json +++ b/tools/pkglint/package.json @@ -1,6 +1,6 @@ { "name": "pkglint", - "version": "0.42.0", + "version": "1.0.0", "private": true, "description": "Validate and fix package.json files", "main": "lib/index.js", @@ -38,14 +38,14 @@ "@types/fs-extra": "^8.1.2", "@types/glob": "^7.2.0", "@types/jest": "^27.5.2", - "@types/semver": "^7.3.9", + "@types/semver": "^7.3.12", "@types/yargs": "^15.0.14", - "eslint": "^7.32.0", + "eslint": "^8.22.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^2.7.1", + "eslint-import-resolver-typescript": "^3.4.2", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^24.7.0", - "typescript": "~4.7.3" + "eslint-plugin-jest": "^26.8.3", + "typescript": "~4.7.4" }, "nozem": { "ostools": [ @@ -56,7 +56,7 @@ "dependencies": { "case": "^1.6.3", "colors": "1.4.0", - "fs-extra": "^9.1.0", + "fs-extra": "^10.1.0", "semver": "^7.3.7", "yargs": "^16.2.0" } diff --git a/yarn.lock b/yarn.lock index e0fb36e64..4cf940f1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,945 +10,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@aws-cdk/assert@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/assert/-/assert-1.160.0.tgz#b43544d3acd54ae853e7333bf8b7314a1031981d" - integrity sha512-UIdBNpFg+lmFncoqWD28Ri1r8r7jbdvLkhEhipgVCMv8kqKYDBb0VgDBdd+uEB486kU2TIflftHa1q/135gOdg== - dependencies: - "@aws-cdk/cloudformation-diff" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/assets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/assets/-/assets-1.160.0.tgz#db87791b9f629c665535c90f5056660ab19b40a4" - integrity sha512-GpJF8s0jkwhTvMTUVjW+x733uNEm2lc8C7gsBHkupqrlZmwtkfB5U4Rp4ebvdXWM/5ZdUTkI8fBJjrhg0bIlbw== - dependencies: - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-acmpca@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-acmpca/-/aws-acmpca-1.160.0.tgz#8380488a933a3d9d3a469a28a3338ec856585ed6" - integrity sha512-3CFODMgFeriiBsczF/MnTnr7GqkRUD+/sASPYNcxxBZA1Zqz+9O7/T85X9lTnKXiTJg40CPC/jOB6aMBKtyU7Q== - dependencies: - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-apigateway@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigateway/-/aws-apigateway-1.160.0.tgz#dd2b8a67404fd62a55a903332ba78a700d26e44e" - integrity sha512-6P7ry309HuLlTrTtMFfNc/StjwnvHqh5DZqnJpZ0H4ChI7vwoJryiLvn/aEuKQ5yI/ZkcPZZ01PCjDVdyqNQ/A== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-cognito" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-stepfunctions" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-apigatewayv2-integrations@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2-integrations/-/aws-apigatewayv2-integrations-1.160.0.tgz#c625e4ca5ef8dddfcaa817fcc4370a929506fad7" - integrity sha512-EYkNs9ciXXymB/8PRNaGnpfjI2I7zqY9X08N94jPFrbsvw9ekr8LfejgqwGcaJm46x7eJ9tQNIp5xJuiPjjOhA== - dependencies: - "@aws-cdk/aws-apigatewayv2" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-servicediscovery" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-apigatewayv2@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2/-/aws-apigatewayv2-1.160.0.tgz#bd32233557a237d670a43c4a8ab8fba0c7d171d6" - integrity sha512-/YcnrLkX0Y2Zh0eoIkwoVbXBCyVhCyls0xSI9O7H5G/jvBNGDUVrWle6P0/pbN8YVjPN/7Injvjs71sE7ohijA== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-applicationautoscaling@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.160.0.tgz#67c438fd4d3b0f8da2fb6e2ac44a1aa8584db0d9" - integrity sha512-Olx6kOdPh4C5i78EzyS9lKr7lNib3W+yXLBL88GcV/3CGzTavOpinn1nuzCVLDFKYONpQAh7ULorxNilEoK6Qw== - dependencies: - "@aws-cdk/aws-autoscaling-common" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-autoscaling-common@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.160.0.tgz#17fa34a4706f7c237114fc2f51420215b3dd362a" - integrity sha512-XGn7xbOMB973pDTQlXjfrK4iPYlq3tcHPSf5l3ROkVuN3mtxPTTITekf6cORJ7YYAA+8MC3la4ivzJ7onT2O1g== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-autoscaling-hooktargets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-hooktargets/-/aws-autoscaling-hooktargets-1.160.0.tgz#ac13aadaf6ff47b41ab418be453b3d798ad81e46" - integrity sha512-Zq2YwLGMGIQpZ9ii6+gSs+788/daHPYerjZzFPI8rf7D7CeMkILsWKoMr5xZOZIfYihZokU+ebTVkotRgUkihQ== - dependencies: - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sns-subscriptions" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-autoscaling@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling/-/aws-autoscaling-1.160.0.tgz#76b924f7e1a886bfc5a6d62f178bf41d6a6d7c80" - integrity sha512-SGRuCGH4zfjsWcrgb5dWzOBE4dL077N3L8m1CDp/MttWoxdD4IlSqktcsgTFkbt2WqOUwFZkBJHfbctEtepP2A== - dependencies: - "@aws-cdk/aws-autoscaling-common" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-elasticloadbalancing" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-batch@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-batch/-/aws-batch-1.160.0.tgz#a7d3045e72b1e378e0408a307f4aa33d944d52d3" - integrity sha512-+cYMFqxOtJpUfMj72d/KDfEwiHoWJiADA4HiOEWTbXk8pd5cXlFJJncbUGtxLyn5di+LInpfTwRC3IcbTAyuuQ== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-ecs" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-secretsmanager" "1.160.0" - "@aws-cdk/aws-ssm" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-certificatemanager@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.160.0.tgz#b32119d7034a5bc92ddbe9298965728bee6fe697" - integrity sha512-5QiIDfYugPxGV7NLoxzwX4B2zDdTlSqXSARUdYji3zwdVCzjD8Utd33WwdX1FyO/niXAWVCc8jmSARt4oYC8mA== - dependencies: - "@aws-cdk/aws-acmpca" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-cloudformation@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.160.0.tgz#e12ad6013982578fd6341cabb8d43cb05187c04a" - integrity sha512-NE+XuKyiqInKYe7X6cJeXbIRwnajxyzubjqpSgYEBVsFkVtuB/D+Sheiwxl6D5yZ6xtZHgDegyn9oSanSP32tw== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-cloudfront@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudfront/-/aws-cloudfront-1.160.0.tgz#7bb9ac0a278b315345a4fa24703754d732b4d219" - integrity sha512-C+xYpDz3BdJ/Fn16nqnYzKkMUAqVe5WS0Pfrtg6Z5+2VeUsuGeomommJBI6Ns3m/vkUmjLzauZx89gAXOgHMew== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-ssm" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-cloudwatch-actions@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch-actions/-/aws-cloudwatch-actions-1.160.0.tgz#cb69abd00db2fe09a9b1317c3162de85a218ca06" - integrity sha512-C9g5VIyawf4jQHvj+oXQmhnSeQPVXHDkcKNHcm47G7d0rExlksKS9AfMo9Ea2f/OAa4H6nX/cyy3I+4oqYZw3A== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.160.0" - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-cloudwatch@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.160.0.tgz#6f1b99743112086d7dd3c6bbeda7a081908e0fb5" - integrity sha512-9wxLH07K4N0jGwFRNLge2EgyFPnI9+S9b37yNtbni4U2xyeZjdvkP1HAb3u1Bxn4kEDeKwwFlQf4Emp/Es+AjQ== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-codebuild@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codebuild/-/aws-codebuild-1.160.0.tgz#6af194afbc671100c329527f57dd6bcbaa573be1" - integrity sha512-PglnJHQnU8avEYcWbj2nTmK7V9EgeUWAACQzNUmDGUKvuXGRfTSF/Vdy9gjvTqeEuwGiOfVZPZnYmmGm744GLQ== - dependencies: - "@aws-cdk/assets" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-codecommit" "1.160.0" - "@aws-cdk/aws-codestarnotifications" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-ecr-assets" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-secretsmanager" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - yaml "1.10.2" - -"@aws-cdk/aws-codecommit@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codecommit/-/aws-codecommit-1.160.0.tgz#c2c38dcefb2635e10b280eab5c411ccf5a191469" - integrity sha512-n7WNnTeYO7pxEE20zmFGUrXQRJvMyQGF2Upen0oIY8VvVa11qVDFIs0tseKwFBWBMSx9sCHvUioo5cnMYWVtvw== - dependencies: - "@aws-cdk/aws-codestarnotifications" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-codeguruprofiler@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.160.0.tgz#8d911268d86016d2eb57043b4bdcfaad8e445495" - integrity sha512-d8iNt8qJ8cfjp3NOuzHBVl4RtJDSgQ+fG1DHlbvlpUu5lzAOXHfS35WjI49yHTpdsge/UvwKb3aCPi8QJobqnA== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-codepipeline@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codepipeline/-/aws-codepipeline-1.160.0.tgz#663fd2fdc462ea1d07939a729bd7c61c8c37add4" - integrity sha512-7MZqXn4ho9ufkRG0sI9JsahxJFz6SadJWm0+w51Avd1y9Y0EhL8ManHQ5wu61HtkP3ZohhmWzsKatLu1ZFyiuA== - dependencies: - "@aws-cdk/aws-codestarnotifications" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-codestarnotifications@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.160.0.tgz#29e2b985e2bdd39120a4f66bbd61868d8a9b683e" - integrity sha512-zOyjApE1aU2UzuC9iOeJzuEMQFBhpYwqv03JD/pChFk1u2Ck3Ckww8Ix1MBDj0feGd4U54nza2R5crvSf+UdJQ== - dependencies: - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-cognito@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cognito/-/aws-cognito-1.160.0.tgz#e68c71a352156011b9c8f1b87dd77f19a9e49c2a" - integrity sha512-6WVpl7VsX9muZjI5COrS8GkbXBsR2vcXzweD7/NHBF213jKH7Y0KIYCEjkZtrXt301Nh8LkOyCHY88+YkEIxFQ== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - punycode "^2.1.1" - -"@aws-cdk/aws-databrew@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-databrew/-/aws-databrew-1.160.0.tgz#af3f1d73542aedf57afbf72e1826f0991da201a2" - integrity sha512-b1xQvFYQNFVlG9LyN9B1i0+UxdbJPIokaL42MMdNaCb/UAiSg7zB6KyAv+rTaK1VIzM+w1p/tIvYHqm7RhWuig== - dependencies: - "@aws-cdk/core" "1.160.0" - -"@aws-cdk/aws-docdb@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-docdb/-/aws-docdb-1.160.0.tgz#59ac92e3ddef5b975c893ee94ce6db6541753894" - integrity sha512-dFp9tkbZ0HPxJxRwBjpzRsKZxKDwfxURIzt57zGWi3mQrI4ndU7gdNvGyxHUk5lqwl0dx3tjCQ5xxw1OHKU0uA== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-efs" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-secretsmanager" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-dynamodb@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-dynamodb/-/aws-dynamodb-1.160.0.tgz#f50bf78745d96f91c845e013811f35c9e6241d6d" - integrity sha512-1G1Hy8PJsewvWQIChGox5IYhTYExmwar1icNYlv++WDAnu5ztkLuV02GW2090Cevw/TEZgMQaBI+/MgWi73C6g== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kinesis" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ec2@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ec2/-/aws-ec2-1.160.0.tgz#f0e25c660459b82d29b6afdcf1f8c48990e8bc4f" - integrity sha512-S8qbJyFhk1nB2YWlFn6VQWWuUq8rds323cUsrHnvRUdyIt9dgRFzIRnaD0jOiBndfjUylhEe0zvoYWfntajmTw== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-ssm" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ecr-assets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.160.0.tgz#84efc6c67b15a619255999848a44cd7f21ca15d2" - integrity sha512-vIWi/Iudn/y1JaG1q3QxD0dsf+9Hz3rzpmm2ZzwbWTAbtUtZ7beDMc2smIGUMSFMpHZnvAdhiwsGf6q2mObEhw== - dependencies: - "@aws-cdk/assets" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ecr@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr/-/aws-ecr-1.160.0.tgz#e0c730e0902e40e7a83d2b587ca33f4109326e25" - integrity sha512-B0R5WNKptVWk2od5Lww/1TYw5amUJMQJgIrLJl1WLvDmhj9tVDO7S9AOpLKvK38tKSEvHTSNcXdI1+ftMav+kA== - dependencies: - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ecs-patterns@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs-patterns/-/aws-ecs-patterns-1.160.0.tgz#de9c5eeb868123a932d3016054175874de072c0f" - integrity sha512-gg/oulzbpsinF75q6mshlP0QoMyKm8WZ7Bi4lr5OLyr/kl4pfePx7gbjkhtlsW2YFttGOCmfHgQP+6aYnW3/xQ== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.160.0" - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecs" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-events-targets" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/aws-route53-targets" "1.160.0" - "@aws-cdk/aws-servicediscovery" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ecs@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs/-/aws-ecs-1.160.0.tgz#71824286831682f72ad402c611d30262f7801263" - integrity sha512-1rRyvwGXgITItHVauGYC4XSvNRQgaq7MnDy2a2AeJ5SHZBasTtQROM1D4Ub/YL1Ss8Q1vBxbC2Rxg6mg3IUmoQ== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.160.0" - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-autoscaling-hooktargets" "1.160.0" - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-ecr-assets" "1.160.0" - "@aws-cdk/aws-elasticloadbalancing" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/aws-route53-targets" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-secretsmanager" "1.160.0" - "@aws-cdk/aws-servicediscovery" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/aws-ssm" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-efs@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-efs/-/aws-efs-1.160.0.tgz#c5e51906e307b7b01ba39d48d49a777328d2140c" - integrity sha512-R7ef5g1i0mNrVA/CkuBgDhd2lvhABTqQukraT+fr7aBQt6rbcC7cjEtIhVat+STF+7TBhl8p+Qa5LKOUviU15Q== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-eks@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-eks/-/aws-eks-1.160.0.tgz#d20d7a7270c7a9b8008a7e5af2c72e5c5407730a" - integrity sha512-zXWBe6lMXHIzP/3/x/2ztXP5X7dfa6aKUHS1+JGNgKEebXxcmuhYrH2cLOBWIvU2shNUIfTGeSARQZxExnzNJA== - dependencies: - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-ssm" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - "@aws-cdk/lambda-layer-awscli" "1.160.0" - "@aws-cdk/lambda-layer-kubectl" "1.160.0" - "@aws-cdk/lambda-layer-node-proxy-agent" "1.160.0" - constructs "^3.3.69" - yaml "1.10.2" - -"@aws-cdk/aws-elasticloadbalancing@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancing/-/aws-elasticloadbalancing-1.160.0.tgz#f3348bc5784d31e78a542d4f7793ddf2a05d0a07" - integrity sha512-OYzHJnrhXzzwkEgZdARaKUnqWOCCsMB/TVo38TQcC5obLmQtsi6XKNhV9ol9h26y3fXBfupMT6dB9AT2cdxF0w== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-elasticloadbalancingv2@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancingv2/-/aws-elasticloadbalancingv2-1.160.0.tgz#7f925e660d03a732b6235361995d159e847050d8" - integrity sha512-arAQ9LvdHuxGJmCxnpNR/19dV7zkNw7/mq2e6mjv5nfXlYDAwY6kJFrbLnIyVwwGnhNehZBE0Cq3CjRkFzPaMw== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-events-targets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events-targets/-/aws-events-targets-1.160.0.tgz#6839121e2af3ee1e0a7017f198c58a84ffe97b19" - integrity sha512-bXnKRgK1e4DBsIh4T3K/ZsNkAluYhHaBydPiCjlI6GpwZV4+IOanonYhOpTOA7AQqMtb26UIvG8axf3PhxCodA== - dependencies: - "@aws-cdk/aws-apigateway" "1.160.0" - "@aws-cdk/aws-autoscaling" "1.160.0" - "@aws-cdk/aws-codebuild" "1.160.0" - "@aws-cdk/aws-codepipeline" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecs" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kinesis" "1.160.0" - "@aws-cdk/aws-kinesisfirehose" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sns-subscriptions" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/aws-stepfunctions" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-events@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events/-/aws-events-1.160.0.tgz#9f06e1004baf5428a76a7202bd6bd654547a0895" - integrity sha512-p+IGVC5YLxFI3Sr+mqpsH+FOJNIZfrbH7Bn7HCSZX/LT4s/OOpYFRsVYKEAvUsZU06vdRKBYv51p+OdlDXYOOQ== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-fsx@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-fsx/-/aws-fsx-1.160.0.tgz#208e5b4e7041baaf0aaaf0e2a0fd546208280537" - integrity sha512-Z++vHEY65i0nELJaPQKmxZ2ALhVsLHK5kr7lxjg0KX3yNoB4yEupf+DGqwt1TTd48u22ZgPF+E+HG2xdbilN/Q== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-globalaccelerator@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-globalaccelerator/-/aws-globalaccelerator-1.160.0.tgz#041a098c2cb977c6593e5ed5fe9a3b1930feb178" - integrity sha512-epXMyJ/Xs4+uPqe4j3C/fyKZxmBqOXo60tRG0+qNMC0A6aaDIzOIBKSKsZm60hK1o9MbB/9qYIR4IKOXNX3Zog== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-glue@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-glue/-/aws-glue-1.160.0.tgz#376277041a2c380541029c1a700c120046b91a09" - integrity sha512-01m8hUJDVeBOx2g7x+T4vjtosnMMyAvGKY2O1+p/wNmI0gEsXu5pIan5tRgCiWyPkyMretSN07zlSZorM+curg== - dependencies: - "@aws-cdk/assets" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-iam@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-iam/-/aws-iam-1.160.0.tgz#08e8238449fa5ac901ba85ac0f3fd1c9483e9986" - integrity sha512-XLRceC64dNRFlegfW6dlmW/K7DWcN12h5dycTO0fRvmkuc+ZqNvU/8Zb133jiKWBh/OaBG4SS3HxpN1anpbT/w== - dependencies: - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-imagebuilder@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-imagebuilder/-/aws-imagebuilder-1.160.0.tgz#fb592d004ee3af8923863f7154edd66562417338" - integrity sha512-bWCYZgpPIvN0zNFJ9pxksl8pL2rJzmRHPNiGgrsPFmoSHflC1QBZo4m7bn46rL8tF5BgnkVt3uggMmddJ7qrfw== - dependencies: - "@aws-cdk/core" "1.160.0" - -"@aws-cdk/aws-kinesis@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesis/-/aws-kinesis-1.160.0.tgz#67ffb208d6666532cbcd6e464e472ae0ce51f24f" - integrity sha512-Y7IfyprIaPJKmOck2R0c+m9Iw6VNZgBV05lajL5iltAlBsuLCudXE2l5sZwOTe7ebz61clpQUjYUL/QgjoPqrg== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-kinesisfirehose@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesisfirehose/-/aws-kinesisfirehose-1.160.0.tgz#2a135df625affda2356d39c83c005d4eb6b526a5" - integrity sha512-Lz9Zrd17kZyxLktHlSaraYEZJxcOlU8RUrw077saFe40vcVODgZOCih9rdln0EeTuOPcRCoOgw/NEu3aFfF0zA== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kinesis" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-kms@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kms/-/aws-kms-1.160.0.tgz#b01ef82ff9b748c736854e12c50542dd512a5d0a" - integrity sha512-HVn+Nfy4/99NB4MgsAfCpoD4aMEL0G0YQXPxF0yhv8qGJuqaUpyUX5yPHEKeOSlWJStKo/WbjkMYaw7s5kW5Iw== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-lambda-nodejs@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda-nodejs/-/aws-lambda-nodejs-1.160.0.tgz#ec6c8411da48f6f92b2cc60943b58107a9b25dc4" - integrity sha512-w56YDyhsoAvOa6GG5m0cxrItcdspbk9bVzc8iisq48d3MThv+es9zTAeugIk/OqnTEAah1aWf3ladzGeXe/LCA== - dependencies: - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-lambda@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda/-/aws-lambda-1.160.0.tgz#96d4fad46ce35cce08bf1df7ff5b366d45dbc6f2" - integrity sha512-5YnB5OFiHvAHWq7B0rdWNPRixJs4QokqKnxVvWoBxRrRO4ZcS/nuVXt9imVKKshpWH+9h8S7+EG387lH1RFRcA== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-codeguruprofiler" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-ecr-assets" "1.160.0" - "@aws-cdk/aws-efs" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/aws-signer" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-logs@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-logs/-/aws-logs-1.160.0.tgz#44eb743baf1f6962b47aa1b179d3e7c374be09fd" - integrity sha512-Akj2DzISmQM1KnLFFb6M+xk3UptVzMyjUn5MVYGIzSd7/UCJ7OlyUyXbST9fb3UxxmeklM4moIZ7fZCW3uUNOg== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-s3-assets" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-route53-targets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53-targets/-/aws-route53-targets-1.160.0.tgz#d1b40499c51236f34d7afa7bb72333f7f93d5bf6" - integrity sha512-iRQIoUmIVKi6zevLVPL4ldpYEfxU3T2qFAExB819SQMajV7L/Yf6+XTvQ7NR/X87rP4Z6eAa8dUHbPSjkqX1kg== - dependencies: - "@aws-cdk/aws-apigateway" "1.160.0" - "@aws-cdk/aws-cloudfront" "1.160.0" - "@aws-cdk/aws-cognito" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-elasticloadbalancing" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-globalaccelerator" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-route53@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53/-/aws-route53-1.160.0.tgz#b842ac671326ace41f401a2403f92d671afd5870" - integrity sha512-aHh8OFJ44y0xw9+eQtgqqA81a9f+oWIrIeBidCMIF9IHAGIZBM1OMyV3Tr2jS1qRztL3xXwlLHPhzt/XOCAwAA== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-s3-assets@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.160.0.tgz#e8156a3f28cbc985a92be8f271caa15da0a2f8f3" - integrity sha512-jJZhOTL6FYXLDCIVZBv3QMPzhGto3AiYZvZnX9Fl4dMh2X/rlhdvlwLJ9BULZsy0D7nLUDIYuY5X8uuSpaKw/w== - dependencies: - "@aws-cdk/assets" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-s3@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3/-/aws-s3-1.160.0.tgz#0f8a24dac482bf1d91c0fbe8af2b79f2db650a83" - integrity sha512-VLzQwAZrH0p78DrSHEVuxgnK0q+VvBeKuNQMXjP/BA6j1QmkD4QKcVnHKlVoA3WXB2i8uaM8bQFdcIhbdU6CCw== - dependencies: - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-sam@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sam/-/aws-sam-1.160.0.tgz#e0f84f50e530433a745696e7c131b221efb39c31" - integrity sha512-bUcG4nnDomqnDdqdCh/kAX7Lz1jflUj073qMH/dClp5RafrTZbjhf0Ctwy+nNj+KSMZ1vG9XDNsXz0PZGuKZxQ== - dependencies: - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-secretsmanager@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-secretsmanager/-/aws-secretsmanager-1.160.0.tgz#6ddbf67027469e89e5ed0f9072e91663c5e10621" - integrity sha512-uNtU79k0K08v+beFwmt9R7tRBeAemkaPCAJtUZ6adkDJf63o6q9hBA+zO5hysTweQsupJzfknqooQ3WETbcwpQ== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-sam" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-servicediscovery@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-servicediscovery/-/aws-servicediscovery-1.160.0.tgz#e42031f1b21cc38390c057fcc0e4be55c707b844" - integrity sha512-QYVq5hM79zLguHZrHy09rSbIRbV86NC5bS68wKWvbdMSO3jR8qxG+cqKWC7T2hOGIuGkXvC31tvP7OFo5AgpJg== - dependencies: - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.160.0" - "@aws-cdk/aws-route53" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-signer@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-signer/-/aws-signer-1.160.0.tgz#85882e90431baa321a909f84da03d541cb52e382" - integrity sha512-HDylh604EV4U8VIG9LwP/3Kgj31F+cH0Ued0wwGm6OUlP2ISN4RNLaRe7krx9tvLpxi1TBHmnMTDz0RTFMA9lQ== - dependencies: - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-sns-subscriptions@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns-subscriptions/-/aws-sns-subscriptions-1.160.0.tgz#dea229b9a3415e00daebc07cb364a7701ef63626" - integrity sha512-myaSG1MPOzqqljIzTD71t7y2MvBgawXO5Y4UZ6F5xbEOs2j503AjKtKKnRcE10LgDDhtM4hMEt0lEavviOWt0w== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-sns@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns/-/aws-sns-1.160.0.tgz#f0d1b995dff06edd6766ff851663a4ad701657f4" - integrity sha512-IDFM41sPGcaxgalH2MHjGamKDv19hQygm+w8vceqyCEnZRhnDCVWhxzaHM8VB6T9KnVLwkPVFbSEbbiWQSgxgQ== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-codestarnotifications" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-sqs@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sqs/-/aws-sqs-1.160.0.tgz#fdc007a6a3bc12a23cb1c15ea61cc7ca0e1bab7f" - integrity sha512-hAWV077dzlQMo/WaceNZj18yfO/uuLgMrARxKxExnOTG61+OKo1OtFEWm/+EQ5VzFWiUqEUPTaPFMkujgbQ1Mw== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-ssm@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ssm/-/aws-ssm-1.160.0.tgz#d4a1bfbfc28d89320d766da6d126d1d8454d5112" - integrity sha512-5FVZyXg+YJg4VlpGRrS7G22FMUAdaiOxBFGq3EIvmBxIJQgFPXoKqFwaWRsauUFuDT99QgX1fWryZ4tAU7FA5g== - dependencies: - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-stepfunctions-tasks@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-stepfunctions-tasks/-/aws-stepfunctions-tasks-1.160.0.tgz#2806cb785ff081fdd407187d8c9eff193e45e606" - integrity sha512-in4H2cspDBNxjbGwck+BFrtkWBVF2D9jJyGDDSOpjSIovu27guMTNkU2TZhaTx3u7JR1AbB70t9BFWpLYIkHpA== - dependencies: - "@aws-cdk/aws-apigateway" "1.160.0" - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-codebuild" "1.160.0" - "@aws-cdk/aws-dynamodb" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-ecr" "1.160.0" - "@aws-cdk/aws-ecr-assets" "1.160.0" - "@aws-cdk/aws-ecs" "1.160.0" - "@aws-cdk/aws-eks" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-kms" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/aws-sqs" "1.160.0" - "@aws-cdk/aws-stepfunctions" "1.160.0" - "@aws-cdk/core" "1.160.0" - "@aws-cdk/custom-resources" "1.160.0" - "@aws-cdk/lambda-layer-awscli" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/aws-stepfunctions@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-stepfunctions/-/aws-stepfunctions-1.160.0.tgz#904a7ff004ff3ff6dd4b1368098396dc1a5936b3" - integrity sha512-E+Pomi0rBNCGZ3rkRYnl5UjpsN/SAuav/SVhRhVifM5/IO+BQrdSJHSRq1V8WLy3OiGAKvezhzM+D1rdY3ETww== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.160.0" - "@aws-cdk/aws-events" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-s3" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/cfnspec@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-1.160.0.tgz#787f37a3d538001f3c1557ec2f192064bd0c250b" - integrity sha512-jnIgLLM0EFwS3eO3UcAaJ16M8cMgLw9FjlVQb34QNh9adaHgcRpGAcet8VrUTy7TUdHqR0fx78jIK01G/5Lrug== - dependencies: - fs-extra "^9.1.0" - md5 "^2.3.0" - -"@aws-cdk/cloud-assembly-schema@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.160.0.tgz#1f692f72569e76de7a46920e165ded4ba4eba690" - integrity sha512-/2LftwkGKZ+k7L1rBXFfNB0Fd+4NYv43VLon37+7RgZsxXC9/DPICajiF33WyAEF3xRjAcpYeiMzcQNtyoFECQ== - dependencies: - jsonschema "^1.4.1" - semver "^7.3.7" - -"@aws-cdk/cloudformation-diff@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.160.0.tgz#ac432e1029a1fef33bc90d45b2ba57f6e89ad381" - integrity sha512-rPmRUUyoX1PN2MLQQX/taJg5jk8pIvAXfKK/xJNN5Om17mpGNRuRLAxU1PDZitoDXOn8T3qR/T+dHe6J1vtkdw== - dependencies: - "@aws-cdk/cfnspec" "1.160.0" - "@types/node" "^10.17.60" - chalk "^4" - diff "^5.1.0" - fast-deep-equal "^3.1.3" - string-width "^4.2.3" - table "^6.8.0" - -"@aws-cdk/core@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/core/-/core-1.160.0.tgz#28d76a01e0a0c4811ab2b276de267be7e1408abd" - integrity sha512-cS2YALqAJ6GHoTcBKhMnOzPxjKF+LgwEDbLFBYnBUGoaAVh8b1pvr442AM1eg8n7gxVAkDdehrgPabekpspu+A== - dependencies: - "@aws-cdk/cloud-assembly-schema" "1.160.0" - "@aws-cdk/cx-api" "1.160.0" - "@aws-cdk/region-info" "1.160.0" - "@balena/dockerignore" "^1.0.2" - constructs "^3.3.69" - fs-extra "^9.1.0" - ignore "^5.2.0" - minimatch "^3.1.2" - -"@aws-cdk/custom-resources@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/custom-resources/-/custom-resources-1.160.0.tgz#314a594cceb8cdbc3c278509212289c8e383d7f2" - integrity sha512-MuINir6HfwHprnrgWtheWzRXJoI1ZjlAEVrKJGM/By7d3lws2ftp44eteqIzrNBEpF9Xt9woW0+Z2XTN9NRqUA== - dependencies: - "@aws-cdk/aws-cloudformation" "1.160.0" - "@aws-cdk/aws-ec2" "1.160.0" - "@aws-cdk/aws-iam" "1.160.0" - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/aws-logs" "1.160.0" - "@aws-cdk/aws-sns" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/cx-api@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-1.160.0.tgz#debcb085fdfe1658e7deca95d9492e2e4e4cc242" - integrity sha512-najDj4d1ombMIziL8v3vUGvsL/Rcq/1gkIL9IKMb9h3KzWPL6y51Vo7A8tTvt/QcPpsxF4A7UL3OGNmukT3bSw== - dependencies: - "@aws-cdk/cloud-assembly-schema" "1.160.0" - semver "^7.3.7" - -"@aws-cdk/lambda-layer-awscli@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/lambda-layer-awscli/-/lambda-layer-awscli-1.160.0.tgz#71527fe321b1be5cbd3b78891ccd666ef6c16d85" - integrity sha512-QSC+f8TDEkd+YD6IMzy4fBFS/yYB2YdzcANnq+IFqBGyw+as4CjtNDZ6zoyvA6DPFuBtf5P9MOuVr660eRQarA== - dependencies: - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/lambda-layer-kubectl@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/lambda-layer-kubectl/-/lambda-layer-kubectl-1.160.0.tgz#246d2f66422bdae58ca83a6e74aa56459cc2e0e7" - integrity sha512-pZduDZmGaHtFlbbZEsaMttYCoOaxdyIfFIKfaqKj3t72oZ2EAsWKJ6shu6jGX+dv9G8Pz9clJ3B+WnOozytNhQ== - dependencies: - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/lambda-layer-node-proxy-agent@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/lambda-layer-node-proxy-agent/-/lambda-layer-node-proxy-agent-1.160.0.tgz#3266af5a86d5b4e2fd18659b472e97baf7760ad3" - integrity sha512-SC/eFwDJdtHjKJMRsjd1y0wtaMdV3Q2pDP1VkRf2+kIu2M28TsY41o0//9PUT9Imf+rHJwrDpL6FmNojf9g2FA== - dependencies: - "@aws-cdk/aws-lambda" "1.160.0" - "@aws-cdk/core" "1.160.0" - constructs "^3.3.69" - -"@aws-cdk/region-info@1.160.0": - version "1.160.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/region-info/-/region-info-1.160.0.tgz#aefeb9acfa02ba9baceeb167a0c2dbb44340e491" - integrity sha512-B6esadtyghIMaiBP+Jgy7U8S26oOzqKDYdXBRx5E+2UsO6aXzntowx5B0J67otnPZIjUqatYXe6uyOb1txDxLQ== - "@aws-crypto/ie11-detection@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz#bb6c2facf8f03457e949dcf0921477397ffa4c6e" @@ -1004,377 +65,377 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.110.0.tgz#15b493b776ec4f7236c6ad6134a6fe87e9dc5292" - integrity sha512-zok/WEVuK7Jh6V9YeA56pNZtxUASon9LTkS7vE65A4UFmNkPGNBCNgoiBcbhWfxwrZ8wtXcQk6rtUut39831mA== +"@aws-sdk/abort-controller@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.127.0.tgz#60c98bffdb185d8eb5d3e43f30f57a32cc8687d6" + integrity sha512-G77FLYcl9egUoD3ZmR6TX94NMqBMeT53hBGrEE3uVUJV1CwfGKfaF007mPpRZnIB3avnJBQGEK6MrwlCfv2qAw== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/client-cloudformation@^3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.110.0.tgz#c789604972f6bd3cc63bd5996c0d6a459e7b19c0" - integrity sha512-rjzU7TvV6lHFErx7XwBBUNtxKvSVO3bwBWkaI/712/6ipr8Muhedw2OLJLEY/td/0ldKWjtTi2xmDXwOHvIadQ== +"@aws-sdk/client-cloudformation@^3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.137.0.tgz#4aa6eb430d59b046e3f6872ace9750d929e3e540" + integrity sha512-RP2jPEYx+vj6N/62DE/SFttGyowWs9qc0nNAhCcbD0JYcxOreOAd65sntkvRb1ebDqxxW1mLs7pb/O2k8AagVg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.110.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-node" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/client-sts" "3.137.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-node" "3.137.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" - "@aws-sdk/util-waiter" "3.110.0" + "@aws-sdk/util-waiter" "3.127.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-cloudwatch-logs@^3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.110.0.tgz#567d8925bedf5d11cb060831ef17ab97b25b18ae" - integrity sha512-GwGd60OReAF2W0tIAfmFT0KchF/wnU+AV8ZhepkCXp4uZtey8lTNDvnFJvZ00853NjtWv66Xr0URAqA9zNgoYA== +"@aws-sdk/client-cloudwatch-logs@^3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.137.0.tgz#8ab043a88204bdb53ff5f56571d1b701d2959fc3" + integrity sha512-dBp0Aj/JX0MvIEfkg6AqYAn7us2w8GIvZ/WW1Yb4Hq32+pf39UgH5q5q68V1THsYmDq5vDTTDrooP9PNq+MnSg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.110.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-node" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/client-sts" "3.137.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-node" "3.137.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-secrets-manager@^3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.110.0.tgz#862916f5fd6c79884e19b4865f56eac9829da895" - integrity sha512-pIP0ozGiXf8cMiwHWm6+l+Bc/pZ154iSz/xKkqxfd1JXUDl1fnbe0caCBtWeTaNFhazW6nEAQc9KdDOgj09VWw== +"@aws-sdk/client-secrets-manager@^3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.137.0.tgz#e4d412aa631fc933ae592acc8852cbee6dab054b" + integrity sha512-iNnbFW6aaqi5hQuib8lkWHpdvLPK1RyaPdcCEyEWUmlsHBz+gtdZwPWANiFnoWJWdAtgxNZeyeiGnvTYmenrww== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.110.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-node" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/client-sts" "3.137.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-node" "3.137.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-ssm@^3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.110.0.tgz#507489821f676a1540cb4629505a1c76ea93008f" - integrity sha512-QV7lgbnN53+Y2oR98OR/KaB6dvQwFdqyNFFm8h8Qgi9mHS+xLAp6sj8B66d6jJ4318IUq2bfKfAR+wDyFFTTKw== +"@aws-sdk/client-ssm@^3.137.0": + version "3.138.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.138.0.tgz#ff541ae1135ca2347e16a7251e3d0c62306e3db7" + integrity sha512-g1J6d2z0DsShzawHR6nQHbNdU4BKsoFIMQWfSa94Uv5Q4Hn/jsu4wqvqhfHErHjqYolYhhUIfpngtossq1X3wg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.110.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-node" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/client-sts" "3.137.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-node" "3.137.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" - "@aws-sdk/util-waiter" "3.110.0" + "@aws-sdk/util-waiter" "3.127.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-sso@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.110.0.tgz#3945b1145bd780653fd7acb1d8aefa7fd309938f" - integrity sha512-Mzj8bfHaB+Ajghf0iMDdbpzL6jY+GbRDKATpmUOAswBDy72JifoBq7qUAV+NwhjUdF+jUzXkdCAAIaai2kglrg== +"@aws-sdk/client-sso@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.137.0.tgz#cc1c35de209a28ddfdeccc6e3e4658c76a355f73" + integrity sha512-l9y9usMuXGI+o1c/VO2qMccN0Bm0T5bFmmbRljB6kIzbJYXD/wVqR8GMZwSnFnz52cnURQ4pgqM1ETg54FlBYQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sts@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.110.0.tgz#cab709b17af4a6ce4b79c154ae2c22d98d84fc46" - integrity sha512-BJD0fxCoqqL7eA/tRRj7z5n4/P8tIZZgOOWJqd6euf6t90uPssz/MJw01bFJBljMl4BtMGvLXHKkyzWtVezI0w== +"@aws-sdk/client-sts@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.137.0.tgz#71a4fe715b30943d599bd6654d26ccafed138545" + integrity sha512-yJqfkEq0DG9Ds+oif/sc02PX6vfSNcyRe3YcaW5P6ouMyhJRljSIVCnA6iPwJaTsmK9BE9PDgFD2v/GYM/XgOA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-node" "3.110.0" - "@aws-sdk/fetch-http-handler" "3.110.0" - "@aws-sdk/hash-node" "3.110.0" - "@aws-sdk/invalid-dependency" "3.110.0" - "@aws-sdk/middleware-content-length" "3.110.0" - "@aws-sdk/middleware-host-header" "3.110.0" - "@aws-sdk/middleware-logger" "3.110.0" - "@aws-sdk/middleware-recursion-detection" "3.110.0" - "@aws-sdk/middleware-retry" "3.110.0" - "@aws-sdk/middleware-sdk-sts" "3.110.0" - "@aws-sdk/middleware-serde" "3.110.0" - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/middleware-user-agent" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/node-http-handler" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/smithy-client" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-node" "3.137.0" + "@aws-sdk/fetch-http-handler" "3.131.0" + "@aws-sdk/hash-node" "3.127.0" + "@aws-sdk/invalid-dependency" "3.127.0" + "@aws-sdk/middleware-content-length" "3.127.0" + "@aws-sdk/middleware-host-header" "3.127.0" + "@aws-sdk/middleware-logger" "3.127.0" + "@aws-sdk/middleware-recursion-detection" "3.127.0" + "@aws-sdk/middleware-retry" "3.127.0" + "@aws-sdk/middleware-sdk-sts" "3.130.0" + "@aws-sdk/middleware-serde" "3.127.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/middleware-user-agent" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/node-http-handler" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/smithy-client" "3.137.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.110.0" - "@aws-sdk/util-defaults-mode-node" "3.110.0" - "@aws-sdk/util-user-agent-browser" "3.110.0" - "@aws-sdk/util-user-agent-node" "3.110.0" + "@aws-sdk/util-defaults-mode-browser" "3.137.0" + "@aws-sdk/util-defaults-mode-node" "3.137.0" + "@aws-sdk/util-user-agent-browser" "3.127.0" + "@aws-sdk/util-user-agent-node" "3.127.0" "@aws-sdk/util-utf8-browser" "3.109.0" "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/config-resolver@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.110.0.tgz#93de506934aa06dd973e5e3dab95b629697372f9" - integrity sha512-7VvtKy4CL63BAktQ2vgsjhWDSXpkXO5YdiI56LQnHztrvSuJBBaxJ7R1p/k0b2tEUhYKUziAIW8EKE/7EGPR4g== +"@aws-sdk/config-resolver@3.130.0": + version "3.130.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.130.0.tgz#ba0fa915fa5613e87051a9826531e59cab4387b1" + integrity sha512-7dkCHHI9kRcHW6YNr9/2Ub6XkvU9Fu6H/BnlKbaKlDR8jq7QpaFhPhctOVi5D/NDpxJgALifexFne0dvo3piTw== dependencies: - "@aws-sdk/signature-v4" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/signature-v4" "3.130.0" + "@aws-sdk/types" "3.127.0" "@aws-sdk/util-config-provider" "3.109.0" - "@aws-sdk/util-middleware" "3.110.0" + "@aws-sdk/util-middleware" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.110.0.tgz#c95552fc0a3ae857ced0e171e53082cf3c84bc74" - integrity sha512-oFU3IYk/Bl5tdsz1qigtm3I25a9cvXPqlE8VjYjxVDdLujF5zd/4HLbhP4GQWhpEwZmM1ijcSNfLcyywVevTZg== +"@aws-sdk/credential-provider-env@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.127.0.tgz#06eb67461f7df8feb14abd3b459f682544d78e43" + integrity sha512-Ig7XhUikRBlnRTYT5JBGzWfYZp68X5vkFVIFCmsHHt/qVy0Nz9raZpmDHicdS1u67yxDkWgCPn/bNevWnM0GFg== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-imds@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.110.0.tgz#ba4f178ccab65c5760bce38e7f694584dad3fd74" - integrity sha512-atl+7/dAB+8fG9XI2fYyCgXKYDbOzot65VAwis+14bOEUCVp7PCJifBEZ/L8GEq564p+Fa2p1IpV0wuQXxqFUQ== +"@aws-sdk/credential-provider-imds@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.127.0.tgz#1fc7b40bf21adcc2a897e47b72796bd8ebcc7d86" + integrity sha512-I6KlIBBzmJn/U1KikiC50PK3SspT9G5lkVLBaW5a6YfOcijqVTXfAN3kYzqhfeS0j4IgfJEwKVsjsZfmprJO5A== dependencies: - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/url-parser" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-ini@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.110.0.tgz#88e3c00da31634f219b5d7036a150d5819210836" - integrity sha512-DVbCWGnvXBvxdf0XGB0nVQjZNwEJc7OhhBFUfF/bP2LXwyZX7n2w4NGNpi2fLnwrgbySoPNbBpp8X3NhVvK14g== - dependencies: - "@aws-sdk/credential-provider-env" "3.110.0" - "@aws-sdk/credential-provider-imds" "3.110.0" - "@aws-sdk/credential-provider-sso" "3.110.0" - "@aws-sdk/credential-provider-web-identity" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/shared-ini-file-loader" "3.110.0" - "@aws-sdk/types" "3.110.0" +"@aws-sdk/credential-provider-ini@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.137.0.tgz#ad7e35b61a38fa37db0f2dc8b3a2d56cad4e0e79" + integrity sha512-FNSYjHaW83b4sQac+EWh/C6p1taBdvPOXFAVml1mPH49Nlkv9/E4bbjaWwgxvlxjqjNCbkDMKzhb19DN3gVulA== + dependencies: + "@aws-sdk/credential-provider-env" "3.127.0" + "@aws-sdk/credential-provider-imds" "3.127.0" + "@aws-sdk/credential-provider-sso" "3.137.0" + "@aws-sdk/credential-provider-web-identity" "3.127.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/shared-ini-file-loader" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-node@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.110.0.tgz#263a8f7f0bac1645c1ef09ff94bbb7efd5163042" - integrity sha512-6AE97H6KDwOYTRjzP7dIyEg4jUd33ZLehgmtaBbJ1GhchtU3L8W0+Mh7ICpwKX/cYMJcKJKzT27BwYVWtOtCDA== - dependencies: - "@aws-sdk/credential-provider-env" "3.110.0" - "@aws-sdk/credential-provider-imds" "3.110.0" - "@aws-sdk/credential-provider-ini" "3.110.0" - "@aws-sdk/credential-provider-process" "3.110.0" - "@aws-sdk/credential-provider-sso" "3.110.0" - "@aws-sdk/credential-provider-web-identity" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/shared-ini-file-loader" "3.110.0" - "@aws-sdk/types" "3.110.0" +"@aws-sdk/credential-provider-node@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.137.0.tgz#ec0a95ae6696ed849b97feea53eb7826b5d79103" + integrity sha512-if4CzNSyPS3ZERLtDocNNC+l5ejK93d2hoOzNHP2qCmTppThEPWF2TH506ez0v0lbUzeI7qWgpYe9m4+BFLEwQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.127.0" + "@aws-sdk/credential-provider-imds" "3.127.0" + "@aws-sdk/credential-provider-ini" "3.137.0" + "@aws-sdk/credential-provider-process" "3.127.0" + "@aws-sdk/credential-provider-sso" "3.137.0" + "@aws-sdk/credential-provider-web-identity" "3.127.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/shared-ini-file-loader" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-process@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.110.0.tgz#1f4543edd532beb4b690e6f3aaf74d00af3be5c4" - integrity sha512-JJcZePvRTfQHYj/+EEY13yItnZH/e8exlARFUjN0L13UrgHpOJtDQBa+YBHXo6MbTFQh+re25z2kzc+zOYSMNQ== +"@aws-sdk/credential-provider-process@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.127.0.tgz#6046a20013a3edd58b631668ed1d73dfd63a931c" + integrity sha512-6v0m2lqkO9J5fNlTl+HjriQNIdfg8mjVST544+5y9EnC/FVmTnIz64vfHveWdNkP/fehFx7wTimNENtoSqCn3A== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/shared-ini-file-loader" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/shared-ini-file-loader" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-sso@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.110.0.tgz#2a9c21eb4c7033d465c0c42f91af648a7fae1a7c" - integrity sha512-fXV9mc/2U2M5pP5E61uBSFdQXIMgNO4yebitkqNiseI3lg5dJVkYGfiWlvw6qGo6BNxKiEmvJD5Mu6/laYIvbw== +"@aws-sdk/credential-provider-sso@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.137.0.tgz#c1e573f5f934073596579d3f43da1c252713e9af" + integrity sha512-Up2Q3tWSo6Mv2icXMrHa8dGtnC9yQAeUnftrIlvLXi3P9RjxlOPZCSg1NF8FOS90RdEgORlj/7LPlIniHgGUmg== dependencies: - "@aws-sdk/client-sso" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/shared-ini-file-loader" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/client-sso" "3.137.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/shared-ini-file-loader" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.110.0.tgz#236e192826c3856e1f2b8eaa1ad126affd641082" - integrity sha512-e4e5u7v3fsUFZsMcFMhMy1NdJBQpunYcLwpYlszm3OEICwTTekQ+hVvnVRd134doHvzepE4yp9sAop0Cj+IRVQ== +"@aws-sdk/credential-provider-web-identity@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.127.0.tgz#a56c390bf0148f20573abd022930b28df345043a" + integrity sha512-85ahDZnLYB3dqkW+cQ0bWt+NVqOoxomTrJoq3IC2q6muebeFrJ0pyf0JEW/RNRzBiUvvsZujzGdWifzWyQKfVg== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/fetch-http-handler@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.110.0.tgz#0b6d552659b779c49ba0f99c78a57755864bf1b0" - integrity sha512-vk+K4GeCZL2J2rtvKO+T0Q7i3MDpEGZBMg5K2tj9sMcEQwty0BF0aFnP7Eu2l4/Zif2z1mWuUFM2WcZI6DVnbw== +"@aws-sdk/fetch-http-handler@3.131.0": + version "3.131.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.131.0.tgz#426721ba3c4e7687a6c12ce10bdc661900325815" + integrity sha512-eNxmPZQX2IUeBGWHNC7eNTekWn9VIPLYEMKJbKYUBJryxuTJ7TtLeyEK5oakUjMwP1AUvWT+CV7C+8L7uG1omQ== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/querystring-builder" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/querystring-builder" "3.127.0" + "@aws-sdk/types" "3.127.0" "@aws-sdk/util-base64-browser" "3.109.0" tslib "^2.3.1" -"@aws-sdk/hash-node@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.110.0.tgz#b225bfd16596b6485c1c610e8fef8de1e40931c4" - integrity sha512-wakl+kP2O8wTGYiQ3InZy+CVfGrIpFfq9fo4zif9PZac0BbUbguUU1dkY34uZiaf+4o2/9MoDYrHU2HYeXKxWw== +"@aws-sdk/hash-node@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.127.0.tgz#2fbbeb509a515e6a5cfd6846c02cc1967961a40b" + integrity sha512-wx7DKlXdKebH4JcMsOevdsm2oDNMVm36kuMm0XWRIrFWQ/oq7OquDpEMJzWvGqWF/IfFUpb7FhAWZZpALwlcwA== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/invalid-dependency@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.110.0.tgz#9104dfd40e35b6737dc7ab01f4e79c76c1109c44" - integrity sha512-O8J1InmtJkoiUMbQDtxBfOzgigBp9iSVsNXQrhs2qHh3826cJOfE7NGT3u+NMw73Pk5j2cfmOh1+7k/76IqxOg== +"@aws-sdk/invalid-dependency@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.127.0.tgz#3a99603e1969f67278495b827243e9a391b8cfc4" + integrity sha512-bxvmtmJ6gIRfOHvh1jAPZBH2mzppEblPjEOFo4mOzXz4U3qPIxeuukCjboMnGK9QEpV2wObWcYYld0vxoRrfiA== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" "@aws-sdk/is-array-buffer@3.55.0": @@ -1384,204 +445,199 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/middleware-content-length@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.110.0.tgz#f4dc3508952c5fae9740f172d3b76135dd4dba37" - integrity sha512-hKU+zdqfAJQg22LXMVu/z35nNIHrVAKpVKPe9+WYVdL/Z7JKUPK7QymqKGOyDuDbzW6OxyulC1zKGEX12zGmdA== +"@aws-sdk/middleware-content-length@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.127.0.tgz#662c1971fdb2dd7d34a9945ebd8da52578900434" + integrity sha512-AFmMaIEW3Rzg0TaKB9l/RENLowd7ZEEOpm0trYw1CgUUORWW/ydCsDT7pekPlC25CPbhUmWXCSA4xPFSYOVnDw== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.110.0.tgz#a28115e2797b86c2fb583000593b723a51313b92" - integrity sha512-/Cknn1vL2LTlclI0MX2RzmtdPlCJ5palCRXxm/mod1oHwg4oNTKRlUX3LUD+L8g7JuJ4h053Ch9KS/A0vanE5Q== +"@aws-sdk/middleware-host-header@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.127.0.tgz#679f685bd8b4f221ed2c11e90b381d6904034ef9" + integrity sha512-e2gTLJb5lYP9lRV7hN3rKY2l4jv8OygOoHElZJ3Z8KPZskjHelYPcQ8XbdfhSXXxC3vc/0QqN0ResFt3W3Pplg== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.110.0.tgz#69eb0b2d0d9833f6fdbe33eb1876254e7cee53ec" - integrity sha512-+pz+a+8dfTnzLj79nHrv3aONMp/N36/erMd+7JXeR84QEosVLrFBUwKA8x5x6O3s1iBbQzRKMYEIuja9xn1BPA== +"@aws-sdk/middleware-logger@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.127.0.tgz#b62fd148888f418bd74b0c9d76b80588224ee98f" + integrity sha512-jMNLcZB/ECA7OfkNBLNeAlrLRehyfnUeNQJHW3kcxs9h1+6VxaF6wY+WKozszLI7/3OBzQrFHBQCfRZV7ykSLg== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-recursion-detection@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.110.0.tgz#8daa2bc9f62cbf499d9c615726cf2a51f46e70ff" - integrity sha512-Wav782zd7bcd1e6txRob76CDOdVOaUQ8HXoywiIm/uFrEEUZvhs2mgnXjVUVCMBUehdNgnL99z420aS13JeL/Q== +"@aws-sdk/middleware-recursion-detection@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.127.0.tgz#84949efd4a05a4d00da3e9242825e3c9d715f800" + integrity sha512-tB6WX+Z1kUKTnn5h38XFrTCzoqPKjUZLUjN4Wb27/cbeSiTSKGAZcCXHOJm36Ukorl5arlybQTqGe689EU00Hw== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-retry@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.110.0.tgz#3bdbd66d06dcbddbdf684d1d81c6d5fd7746f03b" - integrity sha512-lwLAQQveCiUqymQvVYjCee6QOXw3Zqbc9yq+pxYdXbs1Cv1XMA6PeJeUU5r5KEVuSceBLyyrnl6E0R1l1om1MQ== +"@aws-sdk/middleware-retry@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.127.0.tgz#bcd0741ed676588101739083c6bd141d5c1911e1" + integrity sha512-ZSvg/AyGUacWnf3i8ZbyImtiCH+NyafF8uV7bITP7JkwPrG+VdNocJZOr88GRM0c1A0jfkOf7+oq+fInPwwiNA== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/service-error-classification" "3.110.0" - "@aws-sdk/types" "3.110.0" - "@aws-sdk/util-middleware" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/service-error-classification" "3.127.0" + "@aws-sdk/types" "3.127.0" + "@aws-sdk/util-middleware" "3.127.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-sts@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.110.0.tgz#8c1e34b72355c5e63495927a01839f210327f0c1" - integrity sha512-EjY/YFdlr5jECde6qIrTIyGBbn/34CKcQGKvmvRd31+3qaClIJLAwNuHfcVzWvCUGbAslsfvdbOpLju33pSQRA== +"@aws-sdk/middleware-sdk-sts@3.130.0": + version "3.130.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.130.0.tgz#b8dc87c25db048ae8b91962459dfaec5d5b48a8f" + integrity sha512-FDfs7+ohbhEK3eH3Dshr6JDiL8P72bp3ffeNpPBXuURFqwt4pCmjHuX3SqQR0JIJ2cl3aIdxc17rKaZJfOjtPw== dependencies: - "@aws-sdk/middleware-signing" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/signature-v4" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/middleware-signing" "3.130.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/signature-v4" "3.130.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-serde@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.110.0.tgz#603dcc1f68d78e9123f9b696150374a8357de6c3" - integrity sha512-brVupxgEAmcZ9cZvdHEH8zncjvGKIiud8pOe4fiimp5NpHmjBLew4jUbnOKNZNAjaidcKUtz//cxtutD6yXEww== +"@aws-sdk/middleware-serde@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.127.0.tgz#8732d71ed0d28c43e609fcc156b1a1ac307c0d5f" + integrity sha512-xmWMYV/t9M+b9yHjqaD1noDNJJViI2QwOH7TQZ9VbbrvdVtDrFuS9Sf9He80TBCJqeHShwQN9783W1I3Pu/8kw== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-signing@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.110.0.tgz#8faa6acdaedb1c29614fe7ba88a74534db38f3bb" - integrity sha512-y6ZKrGYfgDlFMzWhZmoq5J1UctBgZOUvMmnU9sSeZ020IlEPiOxFMvR0Zu6TcYThp8uy3P0wyjQtGYeTl9Z/kA== +"@aws-sdk/middleware-signing@3.130.0": + version "3.130.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.130.0.tgz#10c5606cf6cd32cf9afa857b0ff32659460902a7" + integrity sha512-JePq5XLR9TfRN3RQ0d7Za/bEW5D3xgtD1FNAwHeenWALeozMuQgRPjM5RroCnL/5jY3wuvCZI7cSXeqhawWqmA== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/signature-v4" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/signature-v4" "3.130.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/middleware-stack@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.110.0.tgz#5a531c83ec375adf9d7f1bd80b725cebf7b2f01d" - integrity sha512-iaLHw6ctOuGa9UxNueU01Xes+15dR+mqioRpUOUZ9Zx+vhXVpD7C8lnNqhRnYeFXs10/rNIzASgsIrAHTlnlIQ== +"@aws-sdk/middleware-stack@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.127.0.tgz#d569d964256cdd4a5afd149de325296cf19762f6" + integrity sha512-S1IoUE5o1vCmjsF5nIE8zlItNOM1UE+lhmZeigF7knXJ9+a6ewMB6POAj/s4eoi0wcn0eSnAGsqJCWMSUjOPLA== dependencies: tslib "^2.3.1" -"@aws-sdk/middleware-user-agent@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.110.0.tgz#52f32e99ecb641babcd59bb010527d5614e908f4" - integrity sha512-Y6FgiZr99DilYq6AjeaaWcNwVlSQpNGKrILzvV4Tmz03OaBIspe4KL+8EZ2YA/sAu5Lpw80vItdezqDOwGAlnQ== +"@aws-sdk/middleware-user-agent@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.127.0.tgz#f676aac4ddaba64bb12b6d69b0ed7328479cf798" + integrity sha512-CHxgswoOzdkOEoIq7Oyob3Sx/4FYUv6BhUesAX7MNshaDDsTQPbSWjw5bqZDiL/gO+X/34fvqCVVpVD2GvxW/g== dependencies: - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/node-config-provider@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.110.0.tgz#7d032082b85458ea4959f744d473e328be024359" - integrity sha512-46p4dCPGYctuybTQTwLpjenA1QFHeyJw/OyggGbtUJUy+833+ldnAwcPVML2aXJKUKv3APGI8vq1kaloyNku3Q== +"@aws-sdk/node-config-provider@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.127.0.tgz#43a460526f0c24a661264189712e0ff5475e9b45" + integrity sha512-bAHkASMhLZHT1yv2TX6OJGFV9Lc3t1gKfTMEKdXM2O2YhGfSx9A/qLeJm79oDfnILWQtSS2NicxlRDI2lYGf4g== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/shared-ini-file-loader" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/shared-ini-file-loader" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/node-http-handler@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.110.0.tgz#b29ba034558ec3cddae69860d49766a27ee73354" - integrity sha512-/rP+hY516DpP8fZhwFW5xM/ElH0w6lxw/15VvZCoY5EnOLAF5XIsJdzscWPSEW2FHCylBM4SNrKhGar14BDXhA== +"@aws-sdk/node-http-handler@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.127.0.tgz#81c0a34061b233027bc673f3359c36555c0688d7" + integrity sha512-pyMKvheK8eDwWLgYIRsWy8wiyhsbYYcqkZQs3Eh6upI4E8iCY7eMmhWvHYCibvsO+UjsOwa4cAMOfwnv/Z9s8A== dependencies: - "@aws-sdk/abort-controller" "3.110.0" - "@aws-sdk/protocol-http" "3.110.0" - "@aws-sdk/querystring-builder" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/abort-controller" "3.127.0" + "@aws-sdk/protocol-http" "3.127.0" + "@aws-sdk/querystring-builder" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/property-provider@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.110.0.tgz#ea60c33a8e243246fc21d478ff009063825b9abd" - integrity sha512-7NkpmYeOkK3mhWBNU+/zSDqwzeaSPH1qrq4L//WV7WS/weYyE/jusQeZoOxVsuZQnQEXHt5O2hKVeUwShl12xA== +"@aws-sdk/property-provider@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.127.0.tgz#3b70d23354c35ea04c29c97f05cc4108c2e194ba" + integrity sha512-JxenxlTEkWfLrtJqIjaXaJzAVQbbscoCb5bNjmdud07ESLVfWRKJx2nAJdecHKYp2M5NQyqBuFhQ1ELSFYQKCA== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/protocol-http@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.110.0.tgz#ff3cffa5b1eb7c8564a9e9019a8842b429c7f85c" - integrity sha512-qdi2gCbJiyPyLn+afebPNp/5nVCRh1X7t7IRIFl3FHVEC+o54u/ojay/MLZ4M/+X9Fa4Zxsb0Wpp3T0xAHVDBg== +"@aws-sdk/protocol-http@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.127.0.tgz#c1d7bb20f09f9e86fd885d3effb33850b618e549" + integrity sha512-UG83PVuKX40wilG2uRU0Fvz4OY8Bt+bSPOG776DFjwIXYzK7BwpJm9H2XI2HLhS5WxrJHhwrLBRgW6UiykMnFw== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/querystring-builder@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.110.0.tgz#c7f63262e898ab38cdbbbfcd03ddbfde346c9595" - integrity sha512-7V3CDXj519izmbBn9ZE68ymASwGriA+Aq+cb/yHSVtffnvXjPtvONNw7G/5iVblisGLSCUe2hSvpYtcaXozbHw== +"@aws-sdk/querystring-builder@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.127.0.tgz#50a100d13bd13bb06ee92dcd9568e21a37fb9c49" + integrity sha512-tsoyp4lLPsASPDYWsezGAHD8VJsZbjUNATNAzTCFdH6p+4SKBK83Q5kfXCzxt13M+l3oKbxxIWLvS0kVQFyltQ== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/querystring-parser@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.110.0.tgz#0551efb7aaa867d3b6705f62d798a45247f5f44b" - integrity sha512-//pJHH7hrhdDMZGBPKXKymmC/tJM7gFT0w/qbu/yd3Wm4W2fMB+8gkmj6EZctx7jrsWlfRQuvFejKqEfapur/g== +"@aws-sdk/querystring-parser@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.127.0.tgz#d485db0d24005e95bb4c9c478691cd805e5fc0f4" + integrity sha512-Vn/Dv+PqUSepp/DzLqq0LJJD8HdPefJCnLbO5WcHCARHSGlyGlZUFEM45k/oEHpTvgMXj/ORaP3A+tLwLu0AmA== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/service-error-classification@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.110.0.tgz#09398517d4ad9787bd0d904816bfe0ffd68b1f5f" - integrity sha512-ccgCE0pU/4RmXR6CP3fLAdhPAve7bK/yXBbGzpSHGAQOXqNxYzOsAvQ30Jg6X+qjLHsI/HR2pLIE65z4k6tynw== +"@aws-sdk/service-error-classification@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.127.0.tgz#64b69215b2525e3b6806856187ef54b00c0f85d1" + integrity sha512-wjZY9rnlA8SPrICUumTYicEKtK4/yKB62iadUk66hxe8MrH8JhuHH2NqIad0Pt/bK/YtNVhd3yb4pRapOeY5qQ== -"@aws-sdk/shared-ini-file-loader@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.110.0.tgz#f91b66e7084312df2b337cc990c9585e832fc2fc" - integrity sha512-E1ERoqEoG206XNBYWCKLgHkzCbTxdpDEGbsLET2DnvjFsT0s9p2dPvVux3bYl7JVAhyGduE+qcqWk7MzhFCBNQ== +"@aws-sdk/shared-ini-file-loader@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.127.0.tgz#019c5512bf92f954f6aca6f6811e38fe048aadf6" + integrity sha512-S3Nn4KRTqoJsB/TbRZSWBBUrkckNMR0Juqz7bOB+wupVvddKP6IcpspSC/GX9zgJjVMV8iGisZ6AUsYsC5r+cA== dependencies: tslib "^2.3.1" -"@aws-sdk/signature-v4@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.110.0.tgz#9dba5d06345fa756b4c23deeec7086f6148a5bf1" - integrity sha512-utxxdllOnmQDhbpipnFAbuQ4c2pwefZ+2hi48jKvQRULQ2PO4nxLmdZm6B0FXaTijbKsyO7GrMik+EZ6mi3ARQ== +"@aws-sdk/signature-v4@3.130.0": + version "3.130.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.130.0.tgz#152085234311610a350fdcd9a7f877a83aa44cf1" + integrity sha512-g5G1a1NHL2uOoFfC2zQdZcj+wbjgBQPkx6xGdtqNKf9v2kS0n6ap5JUGEaqWE02lUlmWHsoMsS73hXtzwXaBRQ== dependencies: "@aws-sdk/is-array-buffer" "3.55.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" "@aws-sdk/util-hex-encoding" "3.109.0" - "@aws-sdk/util-middleware" "3.110.0" + "@aws-sdk/util-middleware" "3.127.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/smithy-client@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.110.0.tgz#397c0e7ef56ffa058469c641b586978400c09dd7" - integrity sha512-gNLYrmdAe/1hVF2Nv2LF4OkL1A0a1o708pEMZHzql9xP164omRDaLrGDhz9tH7tsJEgLz+Bf4E8nTuISeDwvGg== +"@aws-sdk/smithy-client@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.137.0.tgz#cf0b639330dd1b4eb9b350e8d0e216c399290bd4" + integrity sha512-YAuWiSzHJGV9jQCjmcBWxbWRoq/3INEpdtfAdpR+X+sEZaRJESDGPt4or7WbQ9Tmbd/uZ0uQLYIed/NDSyJLLQ== dependencies: - "@aws-sdk/middleware-stack" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/middleware-stack" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/types@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.110.0.tgz#09404533b507925eadf9acf9c4356667048e45bd" - integrity sha512-dLVoqODU3laaqNFPyN1QLtlQnwX4gNPMXptEBIt/iJpuZf66IYJe6WCzVZGt4Zfa1CnUmrlA428AzdcA/KCr2A== - -"@aws-sdk/types@^3.1.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.55.0.tgz#d524d567e2b2722f2d6be83e2417dd6d46ce1490" - integrity sha512-wrDZjuy1CVAYxDCbm3bWQIKMGfNs7XXmG0eG4858Ixgqmq2avsIn5TORy8ynBxcXn9aekV/+tGEQ7BBSYzIVNQ== +"@aws-sdk/types@3.127.0", "@aws-sdk/types@^3.1.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.127.0.tgz#a7bafc47ee2328eee2453087521e6c3a39e7278d" + integrity sha512-e0wtx2IkOl7rwfKfLH5pPTzQ+d45V7b1WrjeL0WDI8kOu6w+sXmhNxI6uM2kf0k4NiTLN84lW290AEWupey9Og== -"@aws-sdk/url-parser@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.110.0.tgz#87d5c0a6f6d2f29027c747c65d8a2846302bc792" - integrity sha512-tILFB8/Q73yzgO0dErJNnELmmBszd0E6FucwAnG3hfDefjqCBe09Q/1yhu2aARXyRmZa4AKp0sWcdwIWHc8dnA== +"@aws-sdk/url-parser@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.127.0.tgz#7a5c6186e83dc6f823c989c0575aebe384e676b0" + integrity sha512-njZ7zn41JHRpNfr3BCesVXCLZE0zcWSfEdtRV0ICw0cU1FgYcKELSuY9+gLUB4ci6uc7gq7mPE8+w30FcM4QeA== dependencies: - "@aws-sdk/querystring-parser" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/querystring-parser" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" "@aws-sdk/util-base64-browser@3.109.0": @@ -1628,26 +684,26 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-browser@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.110.0.tgz#b72331874da2c5e8a366cd98828a06fe19b52ae5" - integrity sha512-Y2dcOOD20S3bv/IjUqpdKIiDt6995SXNG5Pu/LeSdXNyLCOIm9rX4gHTxl9fC1KK5M/gR9fGJ362f67WwqEEqw== +"@aws-sdk/util-defaults-mode-browser@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.137.0.tgz#68fe89aae7504f10d69a52806768f129195d1c65" + integrity sha512-9f5045wqPAcGLKIAXzZKHE2n42ilGo/g4rLSS09OXx9CoFT4lVdqZPqBqh/prDUMrqXge9FK3EH2VId7L5GpEQ== dependencies: - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-node@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.110.0.tgz#52b4c84fc7aa06838ea6bb29d216a2d7615b9036" - integrity sha512-Cr3Z5nyrw1KowjbW76xp8hkT/zJtYjAVZ9PS4l84KxIicbVvDOBpxG3yNddkuQcavmlH6G4wH9uM5DcnpKDncg== +"@aws-sdk/util-defaults-mode-node@3.137.0": + version "3.137.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.137.0.tgz#e43340efebb88d9f5a214127c383345d0bbcfd00" + integrity sha512-CvMpemcsOkoMEz0iALamyQBt1rHx98NvF/cay019F8m+umD03I8CclDugy/13DqESWfsVxn91lZY/DOnO+si7A== dependencies: - "@aws-sdk/config-resolver" "3.110.0" - "@aws-sdk/credential-provider-imds" "3.110.0" - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/property-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/config-resolver" "3.130.0" + "@aws-sdk/credential-provider-imds" "3.127.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/property-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" "@aws-sdk/util-hex-encoding@3.109.0": @@ -1664,10 +720,10 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-middleware@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.110.0.tgz#00a727273974f54424954235867c1ddb0f6dad56" - integrity sha512-PTVWrI5fA9d5hHJs6RzX2dIS2jRQ3uW073Fm0BePpQeDdZrEk+S5KNwRhUtpN6sdSV45vm6S9rrjZUG51qwGmA== +"@aws-sdk/util-middleware@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.127.0.tgz#266d6160886f272cb3e3c3eb5266abbac0c033bc" + integrity sha512-EwAPPed9TNqh+Wov2VStLn2NuJ/Wyt7IkZCbCsBuSNp3BFZ1V4gfwTjqtKCtB2LQgQ48MTgWgNCvrH0zjCSPGg== dependencies: tslib "^2.3.1" @@ -1678,38 +734,31 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.110.0.tgz#e0643e6047aab5137540259a42fbfdc37ae4abee" - integrity sha512-rNdhmHDMV5dNJctqlBWimkZLJRB+x03DB+61pm+SKSFk6gPIVIvc1WNXqDFphkiswT4vA13ZUkGHzt+N4+noQQ== +"@aws-sdk/util-user-agent-browser@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.127.0.tgz#dc6c4c9049ebf238c321883593b2cd3d82b5e755" + integrity sha512-uO2oHmJswuYKJS+GiMdYI8izhpC9M7/jFFvnAmLlTEVwpEi1VX9KePAOF+u5AaBC2kzITo/7dg141XfRHZloIQ== dependencies: - "@aws-sdk/types" "3.110.0" + "@aws-sdk/types" "3.127.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.110.0.tgz#750abd6bb14f25a11e09d764f724b0d0e1c1248b" - integrity sha512-OQ915TPCCBwZWz5Np8zkNWn7U6KvrTZfFoCOy/VIemK3dUqmnBZ7HqGpuZx8SwJ2R9JE1x+j0niYSJ5fWJZZKA== +"@aws-sdk/util-user-agent-node@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.127.0.tgz#368dc0c0e1160e8ca9e5ca21f3857004509aa06e" + integrity sha512-3P/M4ZDD2qMeeoCk7TE/Mw7cG5IjB87F6BP8nI8/oHuaz7j6fsI7D49SNpyjl8JApRynZ122Ad6hwQwRj3isYw== dependencies: - "@aws-sdk/node-config-provider" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/node-config-provider" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@3.109.0": +"@aws-sdk/util-utf8-browser@3.109.0", "@aws-sdk/util-utf8-browser@^3.0.0": version "3.109.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.109.0.tgz#d013272e1981b23a4c84ac06f154db686c0cf84e" integrity sha512-FmcGSz0v7Bqpl1SE8G1Gc0CtDpug+rvqNCG/szn86JApD/f5x8oByjbEiAyTU2ZH2VevUntx6EW68ulHyH+x+w== dependencies: tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz#a045bf1a93f6e0ff9c846631b168ea55bbb37668" - integrity sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug== - dependencies: - tslib "^2.3.1" - "@aws-sdk/util-utf8-node@3.109.0": version "3.109.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.109.0.tgz#89e06d916f5b246c7265f59bac742973ac0767ac" @@ -1718,22 +767,15 @@ "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/util-waiter@3.110.0": - version "3.110.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.110.0.tgz#fa1321024f4ffb270f4b09b703802b1730220f0e" - integrity sha512-8dE6W6XYfjk1gx/aeb8NeLfMMLkLFhlV1lmKpFSBJhY8msajU8aQahTuykq5JW8QT/wCGbqbu7dH35SdX7kO+A== +"@aws-sdk/util-waiter@3.127.0": + version "3.127.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.127.0.tgz#3485ebb614cc417fee397daf61ba4ca3aa5bbedb" + integrity sha512-E5qrRpBJS8dmClqSDW1pWVMKzCG/mxabG6jVUtlW/WLHnl/znxGaOQc6tnnwKik0nEq/4DpT9fEfPUz9JiLrkw== dependencies: - "@aws-sdk/abort-controller" "3.110.0" - "@aws-sdk/types" "3.110.0" + "@aws-sdk/abort-controller" "3.127.0" + "@aws-sdk/types" "3.127.0" tslib "^2.3.1" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" @@ -1741,45 +783,45 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/compat-data@^7.17.10": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" - integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== +"@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== "@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" - integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.5" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.5" - "@babel/types" "^7.18.4" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.12.3", "@babel/core@^7.7.5": +"@babel/core@^7.12.3": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== @@ -1809,13 +851,13 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== +"@babel/generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" + integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.18.9" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.15.4": @@ -1828,20 +870,20 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-function-name@^7.15.4": version "7.15.4" @@ -1852,13 +894,13 @@ "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" @@ -1874,12 +916,12 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" "@babel/helper-member-expression-to-functions@^7.15.4": version "7.15.4" @@ -1895,12 +937,12 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.15.8": version "7.15.8" @@ -1916,19 +958,19 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.6" -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" @@ -1959,12 +1001,12 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.17.7": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== dependencies: - "@babel/types" "^7.18.2" + "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.15.4": version "7.15.4" @@ -1973,32 +1015,32 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helpers@^7.15.4": version "7.15.4" @@ -2009,23 +1051,14 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" "@babel/highlight@^7.14.5": version "7.14.5" @@ -2036,15 +1069,24 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": version "7.15.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== -"@babel/parser@^7.16.7", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== +"@babel/parser@^7.18.6", "@babel/parser@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" + integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -2146,14 +1188,14 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== +"@babel/template@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": version "7.15.4" @@ -2170,19 +1212,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" +"@babel/traverse@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" + integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.9" + "@babel/types" "^7.18.9" debug "^4.1.0" globals "^11.1.0" @@ -2194,12 +1236,12 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@babel/types@^7.18.6", "@babel/types@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" + integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" "@balena/dockerignore@^1.0.2": @@ -2212,26 +1254,19 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" "@gar/promisify@^1.0.1": @@ -2244,16 +1279,21 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -2392,6 +1432,13 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -2442,10 +1489,10 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^27.2.5": - version "27.2.5" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" - integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -2453,15 +1500,16 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": @@ -2472,12 +1520,12 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" @@ -2491,19 +1539,16 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" @@ -2512,499 +1557,515 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jsii/check-node@1.61.0": - version "1.61.0" - resolved "https://registry.yarnpkg.com/@jsii/check-node/-/check-node-1.61.0.tgz#ba70e27cd21d4b5dd2af3d3c37f74eaea40dc56d" - integrity sha512-U6b2iNZZweV2qRvidCCZIOLFpTe6Kc8eZc9v8CbUtK2btChNYiWTkms4VUOcONIYT5uPfNlZpHZiqTr+Oqxmkg== +"@jsii/check-node@1.62.0": + version "1.62.0" + resolved "https://registry.yarnpkg.com/@jsii/check-node/-/check-node-1.62.0.tgz#3d3353d37ed1537acdfb63ea3e1506d82adb09b1" + integrity sha512-jYmY12Vrz3/0MJ9GTEfIxf4yh/7fsgYmuBp2UQfDLSfx+eaBvOG4xbjvsoa/AvfWF5VU95QqKAJLBDMOQK4z1g== dependencies: chalk "^4.1.2" semver "^7.3.7" -"@jsii/spec@1.61.0", "@jsii/spec@^1.60.0", "@jsii/spec@^1.61.0": - version "1.61.0" - resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.61.0.tgz#0529432d2bf6963374e3bfd6c36d95800defbefb" - integrity sha512-pv1jAZY+gez62BCiHwfdCnjl2reye88QOKsD5IlCf7XbmvyQ4xFXVV2EnFzv4HUUtr+yuBj/tZz0HjOFsEBUQw== +"@jsii/check-node@1.63.2": + version "1.63.2" + resolved "https://registry.yarnpkg.com/@jsii/check-node/-/check-node-1.63.2.tgz#009cd1a00023460634ccdf9680f19409810f204a" + integrity sha512-vTj8ZCXIUG0ciq0VX+yhWSyCNsFos9TJlQamZPSVATS23cfCav7HGyxA7bydeNML3sfN0MzFQ0OKYyjAMeFw5A== + dependencies: + chalk "^4.1.2" + semver "^7.3.7" + +"@jsii/spec@1.63.2", "@jsii/spec@^1.63.2": + version "1.63.2" + resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.63.2.tgz#36cdde3279ba8e1d212bbcba9b4766b1a3aaab95" + integrity sha512-zIFZDG/qtQJWa2I7W1cUXExeshr4WSSuMNHWGkJzIn4hFtYv4eQG7cP3gF2ToqAwS2WgsX7fQ7dDrLg0Pzfc2A== dependencies: ajv "^8.11.0" -"@lerna/add@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-5.1.4.tgz#ddd21385b0a2f427b1bf1dd193e7e56f77bb3544" - integrity sha512-kysQaV0+6aFtT0rkbaeuP6qb0vYDwo7TiC+Og4STyXxv2mHXi3F8r6Z9xXNUn8LPi29gaCmB8DLmbEGlTBM4xg== +"@jsii/spec@^1.62.0": + version "1.62.0" + resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.62.0.tgz#d673c6891171b19bd25d0f4c7676e5ee5e235a70" + integrity sha512-KR2ttOgZjyNHKkPDLFUnOnLPml0KLjwfYNEQTtYQKjhhIrlZZwnc1azYZ4GapLTgnklZVNgsDsbBW0sXKYJIhA== dependencies: - "@lerna/bootstrap" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/npm-conf" "5.1.4" - "@lerna/validation-error" "5.1.4" + ajv "^8.11.0" + +"@lerna/add@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-5.4.3.tgz#633e3ddaf342fd1b04161439a266aed9fb37e82e" + integrity sha512-wBjBHX/A0nSiVGJDq5wNpqR+zrxKFREeKrqvIXGmAgcwpDjp76JLVhdSdQns+X+AYsf13NFaNhBqfGlF5SZNnQ== + dependencies: + "@lerna/bootstrap" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/npm-conf" "5.4.3" + "@lerna/validation-error" "5.4.3" dedent "^0.7.0" - npm-package-arg "^8.1.0" + npm-package-arg "8.1.1" p-map "^4.0.0" - pacote "^13.4.1" + pacote "^13.6.1" semver "^7.3.4" -"@lerna/bootstrap@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-5.1.4.tgz#da60d4d329884d9153b536390aeb10c944e004a4" - integrity sha512-uCP0WdxGCGAGkwcuhv2nLqLByq9WJ5yr+93A8T15xZJfQsXLtYjjlivIe35MjS77eR+krwl5uY6WmGPJ33+afg== - dependencies: - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/has-npm-version" "5.1.4" - "@lerna/npm-install" "5.1.4" - "@lerna/package-graph" "5.1.4" - "@lerna/pulse-till-done" "5.1.4" - "@lerna/rimraf-dir" "5.1.4" - "@lerna/run-lifecycle" "5.1.4" - "@lerna/run-topologically" "5.1.4" - "@lerna/symlink-binary" "5.1.4" - "@lerna/symlink-dependencies" "5.1.4" - "@lerna/validation-error" "5.1.4" - "@npmcli/arborist" "5.2.0" +"@lerna/bootstrap@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-5.4.3.tgz#69d744710c3ac386468ff0ead4e4386d4077ae63" + integrity sha512-9mruEpXD2p8mG9Feak0QzU+JcROsJ8J0MvY7gTGtUqQJqBIA6HGEYXQueHbcl+jGdZyTZOz139KsavPui55QEQ== + dependencies: + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/has-npm-version" "5.4.3" + "@lerna/npm-install" "5.4.3" + "@lerna/package-graph" "5.4.3" + "@lerna/pulse-till-done" "5.4.3" + "@lerna/rimraf-dir" "5.4.3" + "@lerna/run-lifecycle" "5.4.3" + "@lerna/run-topologically" "5.4.3" + "@lerna/symlink-binary" "5.4.3" + "@lerna/symlink-dependencies" "5.4.3" + "@lerna/validation-error" "5.4.3" + "@npmcli/arborist" "5.3.0" dedent "^0.7.0" get-port "^5.1.1" multimatch "^5.0.0" - npm-package-arg "^8.1.0" + npm-package-arg "8.1.1" npmlog "^6.0.2" p-map "^4.0.0" p-map-series "^2.1.0" p-waterfall "^2.1.1" semver "^7.3.4" -"@lerna/changed@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-5.1.4.tgz#00e660f991f0d76104a467dbebea1c232c0ef647" - integrity sha512-XwA3+pw5keO2CyjobLN8dU7mvGbzB3FD+LtLPI/zk7UbNIbl7V6uaIkoPJIdTWwP1e6S1BnGCVsAMtwQ980gTA== +"@lerna/changed@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-5.4.3.tgz#527a32f2a5bddd0f69d44ac3aaa0174ef9661936" + integrity sha512-q1ARClN0pLZ53hBPiR4TJB6GGq17Yhwb6iKwQryZBWuOEc87NqqRtIPWswk5NISj2qcPQlbyrnB3RshwLkyo7w== dependencies: - "@lerna/collect-updates" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/listable" "5.1.4" - "@lerna/output" "5.1.4" + "@lerna/collect-updates" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/listable" "5.4.3" + "@lerna/output" "5.4.3" -"@lerna/check-working-tree@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-5.1.4.tgz#d875eaedcf370603e7c73665ded28783ae01dcb5" - integrity sha512-yFkRmZd25viwxyyOHZd3g7k2Od2Mk0Sf15fol3h/a7P0rUMf6UaMoGo2qlyo+DS51sz+eNalMmFKLpRrDXcSSw== +"@lerna/check-working-tree@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-5.4.3.tgz#50576cd9c5abfc405ab6a95a61eab4f2e797d07a" + integrity sha512-OnGqIDW8sRcAQDV8mdtvYIh0EIv2FXm+4/qKAveFhyDkWWpnUF/ZSIa/CFVHYoKFFzb5WOBouml2oqWPyFHhbA== dependencies: - "@lerna/collect-uncommitted" "5.1.4" - "@lerna/describe-ref" "5.1.4" - "@lerna/validation-error" "5.1.4" + "@lerna/collect-uncommitted" "5.4.3" + "@lerna/describe-ref" "5.4.3" + "@lerna/validation-error" "5.4.3" -"@lerna/child-process@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-5.1.4.tgz#164322198c27698fde9d913da120afa6501e390e" - integrity sha512-F7xP+bEdkE3JTyKz0t33QA5v2meXZrQQ0JmHa7/AlEg6D2r7gQ8UHSHuSUiNfX4drjpePe/9XaZylj01KLcx/w== +"@lerna/child-process@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-5.4.3.tgz#b048145774108cd0bbcfd0ebd6ed7aeb78bfc9bc" + integrity sha512-p7wJ8QT8kXHk4EAy/oyjCD603n1F61Tm4l6thF1h9MAw3ejSvvUZ0BKSg9vPoZ/YMAC9ZuVm1mFsyoi5RlvIHw== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/clean@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-5.1.4.tgz#293d3669aed70d541a5e16c372144ef0e5ea3bfd" - integrity sha512-4Du/r8iYSYFpo1t5J1BYivmj84n9mGebt89isVsyqMmrCqd5B2ix/Z8PYPQFMwm7k9YYbV+sZGSpRvtXkn8kIw== +"@lerna/clean@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-5.4.3.tgz#83abd846bc91ffbf0ccf0b153061d73ef175c8ed" + integrity sha512-Kl04A5NqywbBf7azSt9UJqHzRCXogHNpEh3Yng5+Y4ggunP4zVabzdoYGdggS4AsbDuIOKECx9BmCiDwJ4Qv8g== dependencies: - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/prompt" "5.1.4" - "@lerna/pulse-till-done" "5.1.4" - "@lerna/rimraf-dir" "5.1.4" + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/prompt" "5.4.3" + "@lerna/pulse-till-done" "5.4.3" + "@lerna/rimraf-dir" "5.4.3" p-map "^4.0.0" p-map-series "^2.1.0" p-waterfall "^2.1.1" -"@lerna/cli@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-5.1.4.tgz#8cf9ba07c8d0d072d5aa61e55d4d3a16ab181d79" - integrity sha512-ckLSNJBY4iVmu6nBhHb8UchpWGm49z9pjsAEJQ4F/VNkT6zKsmOCfv2ahkvudQ77gc0K/dH+MTvoOHsH85bpow== +"@lerna/cli@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-5.4.3.tgz#2609d528c43b355418a84e6490184b97a2995c4e" + integrity sha512-avnRUZ51nSZMR+tOcMQZ61hnVbDNdmyaVRxfSLByH5OFY+KPnfaTPv1z4ub+rEtV2NTI5DYWAqxupNGLuu9bQQ== dependencies: - "@lerna/global-options" "5.1.4" + "@lerna/global-options" "5.4.3" dedent "^0.7.0" npmlog "^6.0.2" yargs "^16.2.0" -"@lerna/collect-uncommitted@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-5.1.4.tgz#19ddf64bdb9a630ed4a651b364efeee32416e307" - integrity sha512-CI9PXYQuewqA4ZBMRycDUSVRJmAxUeP8HEZ3aKNvAwlLxLlGCueh8qOHXZHxgkmF6eQtcEjblsReiDt8bFJZpA== +"@lerna/collect-uncommitted@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-5.4.3.tgz#198e981767e09271f0ac9f91fe942754a1f5f8a8" + integrity sha512-/0u95DbwP1+orGifkPRqaIqD8Ui2vpy9KmeuHTui+4iR/ZvZbgIouMdOhH+fU9e5hfLF6geUKnEFjL+Lxa4qdg== dependencies: - "@lerna/child-process" "5.1.4" + "@lerna/child-process" "5.4.3" chalk "^4.1.0" npmlog "^6.0.2" -"@lerna/collect-updates@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-5.1.4.tgz#c03aef26c6b28d55a693b47b60fa3f4bebbee6cf" - integrity sha512-P1zlaZ0QkKIjbU3o7hjd4zcxzti1ndS4+eQNmlxZP3IcmlJ4+Ne+VxGeaACsjzPPBqSBWX1xcyMFLALH/Jo2CA== +"@lerna/collect-updates@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-5.4.3.tgz#074ce2b208e54ff7948398d005fcb01249284ee0" + integrity sha512-TU3+hcwqHWKSK0J+NWNo5pjP7nnCzhnFfL/UfCG6oNAUb6PnmKSgZ9NqjOXja1WjJPrtFDIGoIYzLJZCePFyLw== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/describe-ref" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/describe-ref" "5.4.3" minimatch "^3.0.4" npmlog "^6.0.2" slash "^3.0.0" -"@lerna/command@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-5.1.4.tgz#c8f4b7f4700a6718310bea48e7ad2454e4659a80" - integrity sha512-S/3oIagN9/ntuGtljSxHu4liB9e9YFWsq/xZOR8YoqROJENv5G5zyAmHjXq90AR/tGmLvufzFliBfEIG9CywFA== +"@lerna/command@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-5.4.3.tgz#9d492a8e66d06a382005a89a79d05a06a1426ef7" + integrity sha512-xBdbqcvHeWltH4QvWcmH9dKjWzD+KXfhSP0NBgwED8ZNMxSuzBz2OS3Ps8KbLemXNP8P0yhjoPgitGmxxeY/ow== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/package-graph" "5.1.4" - "@lerna/project" "5.1.4" - "@lerna/validation-error" "5.1.4" - "@lerna/write-log-file" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/package-graph" "5.4.3" + "@lerna/project" "5.4.3" + "@lerna/validation-error" "5.4.3" + "@lerna/write-log-file" "5.4.3" clone-deep "^4.0.1" dedent "^0.7.0" execa "^5.0.0" is-ci "^2.0.0" npmlog "^6.0.2" -"@lerna/conventional-commits@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-5.1.4.tgz#9aa42c32fd7b306dfb4d838e18e02261635a496f" - integrity sha512-0v0exYOH9cJTNpKggqAw7vHVLlPjqO6Y20PUg44F3GOEjd54VIGDqu+MkVhflqvUftzZjmcUHDUGHVP+8dFBNw== +"@lerna/conventional-commits@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-5.4.3.tgz#1f619991aad35a696eca458fb9b966c4b85a1fe4" + integrity sha512-GHZdpCUMqalO692O7Mqj5idYftZWaCylb4TSPkHEU8xSfxtufp8lM+Q8Xxv35ymzs0pBrmzSLZIpIMQ9awDABg== dependencies: - "@lerna/validation-error" "5.1.4" + "@lerna/validation-error" "5.4.3" conventional-changelog-angular "^5.0.12" - conventional-changelog-core "^4.2.2" + conventional-changelog-core "^4.2.4" conventional-recommended-bump "^6.1.0" fs-extra "^9.1.0" get-stream "^6.0.0" - npm-package-arg "^8.1.0" + npm-package-arg "8.1.1" npmlog "^6.0.2" pify "^5.0.0" semver "^7.3.4" -"@lerna/create-symlink@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-5.1.4.tgz#dc5f45f4e5192850eea920982c2f4e1808b899c5" - integrity sha512-VTTuCgM5gXk0frAFxfVQqfX9QxXKz6TKpKsHcC39BAR3aiSUW8vqRImbLvaFtKpnEMW0HshDfuzp6rRkaiyWYw== +"@lerna/create-symlink@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-5.4.3.tgz#fda167628dc169ced79a004609b5c823157d8cfc" + integrity sha512-QxmKCHA5woed/qJjKNkOSgkbhhmPV3g61F499uVwPtyPivn9Y2mbeVPMQrLkb0CL9M6aJ7vE4fi6T5XMqsbNpg== dependencies: - cmd-shim "^4.1.0" + cmd-shim "^5.0.0" fs-extra "^9.1.0" npmlog "^6.0.2" -"@lerna/create@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-5.1.4.tgz#2829ff28c5e2b7060ee9e260868a8bf70f9d603e" - integrity sha512-UPR5EnFg0WzXiRIKl+MGHH3hBB6s1xkLDJNLGzac5Ztry/ibLDhl47wYoYcToiQ3/y3/3751WLJErF+A52mCyw== +"@lerna/create@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-5.4.3.tgz#acf6528de1f42465d6824b4d048b39f7ce49af4b" + integrity sha512-VLrcfjBNzhUie5tLWSEa203BljirEG7OH62lgoLqR9qA/FVozoWrRKmly/EVw8Q7+5UNw/ciTzXnbm0BPXl6tg== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/npm-conf" "5.1.4" - "@lerna/validation-error" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/npm-conf" "5.4.3" + "@lerna/validation-error" "5.4.3" dedent "^0.7.0" fs-extra "^9.1.0" globby "^11.0.2" - init-package-json "^2.0.2" - npm-package-arg "^8.1.0" + init-package-json "^3.0.2" + npm-package-arg "8.1.1" p-reduce "^2.1.0" - pacote "^13.4.1" + pacote "^13.6.1" pify "^5.0.0" semver "^7.3.4" slash "^3.0.0" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^3.0.0" + validate-npm-package-name "^4.0.0" whatwg-url "^8.4.0" yargs-parser "20.2.4" -"@lerna/describe-ref@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-5.1.4.tgz#352da8757946ca1529a2655688323c9838a8e1ad" - integrity sha512-ztLWLIyrHPxVhs8yfVpCDIw2st5c246KfoTqjEX8N6s8v0dLs3vfCKCM70ej6lBNkwqBXSilgHrd3AkGq3kq6Q== +"@lerna/describe-ref@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-5.4.3.tgz#3b515d966e6804864f68950c13bf306c5ad74141" + integrity sha512-g3R5exjZy5MOcMPzgU8+t7sGEt4gGMKQLUFfg5NAceera6RGWUieY8OWL6jlacgyM4c8iyh15Tu14YwzL2DiBA== dependencies: - "@lerna/child-process" "5.1.4" + "@lerna/child-process" "5.4.3" npmlog "^6.0.2" -"@lerna/diff@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-5.1.4.tgz#43a3c39b84c3148a89dcee5a3b7434909c5e601a" - integrity sha512-o5chvMHcKQS4zkdGX7LCaMgNn0flrG9OEiGt8DCIzRUa6aWJAlE2oZyOj+VsiUxzaZJxm2oV+GkISQYRJPlPug== +"@lerna/diff@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-5.4.3.tgz#724644c55dae7a4cf196d5db922238a3dde079e2" + integrity sha512-MJKvy/XC2RpS/gqg7GguQsBv5rZm+S5P/kfnqhapXCniGviZfq+JfY5TQCsAP9umiybR2sB004K1Z7heyU8uMA== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/validation-error" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/validation-error" "5.4.3" npmlog "^6.0.2" -"@lerna/exec@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-5.1.4.tgz#b1b35c65593429dcc822fcbc72153d3cf3adf0b9" - integrity sha512-6vn1UCxJZTTt90WlWItI05yj4xaNOShgIl5Yi9mx1Ex6nVS32mmTOqHI/+Cn4M+P0C4u1hFymd2aIEfWnmdUsA== - dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/profiler" "5.1.4" - "@lerna/run-topologically" "5.1.4" - "@lerna/validation-error" "5.1.4" +"@lerna/exec@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-5.4.3.tgz#85427f565fda9dcb25f76428d30baf0da007be5f" + integrity sha512-BLrva/KV6JWTV+7h7h+NQDsxpz0z1Nh99BUqqvZDzGIKMey4c1fo+CQGac77TsAophnv0ieFgHkSmrC6NXJa9g== + dependencies: + "@lerna/child-process" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/profiler" "5.4.3" + "@lerna/run-topologically" "5.4.3" + "@lerna/validation-error" "5.4.3" p-map "^4.0.0" -"@lerna/filter-options@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-5.1.4.tgz#417d9770cece09385c533ea89dbf140c9f49ded8" - integrity sha512-a6hLVZOb7awjI9Tk5hx90BB6GZz59npBRQN0kSG6drV1H+vi+wU7ee6OZ5EMHQgnzdZ6OjZQRHlWCCTXyNdKgQ== +"@lerna/filter-options@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-5.4.3.tgz#2447ea9f5a4d03bf772fb47fea727d085fe8aa01" + integrity sha512-581GE81BSWgS9za4tBv1nwZ2ImgH7UO3xil1b7xogvc/iGwM0MgOwt9f1MrS5ZOliNnme4cSZEGFe+QWPXCE4A== dependencies: - "@lerna/collect-updates" "5.1.4" - "@lerna/filter-packages" "5.1.4" + "@lerna/collect-updates" "5.4.3" + "@lerna/filter-packages" "5.4.3" dedent "^0.7.0" npmlog "^6.0.2" -"@lerna/filter-packages@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-5.1.4.tgz#54cd19d6f1fcbd27f0fd78c6f0c56412ebd7f454" - integrity sha512-a+ThrgYyGrTfBZUMfi/WvcqX3Ce6JaMZjTYoNAmKpHYNZFRqdmgOT1fFLLF+/y62XGqCf0wo50xRYNg0hIAf3Q== +"@lerna/filter-packages@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-5.4.3.tgz#fdcad77f8ce76012a585d6ef12c3eba732c46aa9" + integrity sha512-W5OVMUjXh/Zii17FCSbIf/6Q3Bo5ETMAWMZ6EpHSU99M0kdvgpjXj3VUSjiCzwccqIa2EZjaua0RWSbOtfZCVg== dependencies: - "@lerna/validation-error" "5.1.4" + "@lerna/validation-error" "5.4.3" multimatch "^5.0.0" npmlog "^6.0.2" -"@lerna/get-npm-exec-opts@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.1.4.tgz#99a8f9ce73acac6206331b4cb87f24006e712cb4" - integrity sha512-A+cNgTWWQOcNGWz9wj40/NWK46v8TtTAmXuEPfzDruv6VdmXEVIuq7SCeUPj9+aRxMQXVCil0/Vyo2z6R9TDLw== +"@lerna/get-npm-exec-opts@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.4.3.tgz#9cf0d299ae534adc0d5efe883e304bd5c3e14076" + integrity sha512-q/3zQvlwTpAh6HVtVGOTuCGIgkhtCPK9CcHRo09c0Q3LQk5MsZYkPmJe0ujU1Gf7pILzQA5tnCy56eWT5uMPUg== dependencies: npmlog "^6.0.2" -"@lerna/get-packed@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-5.1.4.tgz#cd376e017afb5327391ecdf781377c9b9fed09bb" - integrity sha512-JD9U4Sp7Dpt3nUdXAo5f9SIXK2QsBaguChCZ8VTAl3eb7j0o7nrHYoh1eAa8rDT2L9+AxcUFDMi/wDdCotlJmA== +"@lerna/get-packed@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-5.4.3.tgz#5a44b51b515b1d8b7e194772e4b8ec4419df9204" + integrity sha512-y97plqJmrTwnZE9EH0MhtwnVHOF/revnH95fD2UyUpGrxdAFvbE7rs3A9zrSxurFLn4q6qWBKONwQLccQSTBTA== dependencies: fs-extra "^9.1.0" - ssri "^8.0.1" + ssri "^9.0.1" tar "^6.1.0" -"@lerna/github-client@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-5.1.4.tgz#818b921b12f2777dc55d1f4f955669c72fec7dcb" - integrity sha512-VAaH9ycnGVsaGWM5uRKvd0oXlOERHOEOwxXLaCnR1mA7k5490B5jTlwhSWYdA4s40CF9AOdIVNgBhP+T7MlcPw== +"@lerna/github-client@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-5.4.3.tgz#30e37a357eff5b8c10c2fea8069f0df99932d8ea" + integrity sha512-P/i64IUDw72YvS5lTciCLAxvjliN2lZSDZSqH59kQ4m2dma0dChiLTreq1Ei8xyY124oacARwxxQCN95m2u3nw== dependencies: - "@lerna/child-process" "5.1.4" + "@lerna/child-process" "5.4.3" "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^18.1.0" - git-url-parse "^11.4.4" + "@octokit/rest" "^19.0.3" + git-url-parse "^12.0.0" npmlog "^6.0.2" -"@lerna/gitlab-client@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-5.1.4.tgz#82fb901eeaf75c51afa2c165e2bd26ef9695275c" - integrity sha512-F0Pa6Cv6TE0gbhuHR2gVVwdzstqePMZhTNcVY5So3YJrb1ppuUH/4cVXhRcEOj16QuWJ6yysxb7mj8tY4Zv0Bw== +"@lerna/gitlab-client@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-5.4.3.tgz#ecf81a0400ad199e9542676519ecf1a5bb898666" + integrity sha512-EEr5OkdiS7ev2X9jaknr3UUksPajij1nGFFhPXpAexAEkJYSRjdSvfPtd4ssTViIHMGHKMcNcGrMW+ESly1lpw== dependencies: node-fetch "^2.6.1" npmlog "^6.0.2" whatwg-url "^8.4.0" -"@lerna/global-options@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-5.1.4.tgz#6daa9572c76171cdeb4cd4e48a7a1beae3e2ab4f" - integrity sha512-gs6y97tomIuyYdDr9uKQ5B5AR9m6wVft6lrxWlGlLo0prz39tx7fJ9wT2IpJ9iALCadkQW6g7XFtddwfm5VRhg== +"@lerna/global-options@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-5.4.3.tgz#5603fd90a69ac8585d413d743ab03f7da18e2f0c" + integrity sha512-e0TVIHLl0IULJWfLA9uGOIYnI3MVAjTp9I0p/9u3fC62dQxJBhoy5/9+y2zuu85MTB+4XTVi2m8G99H9pfBhMA== -"@lerna/has-npm-version@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-5.1.4.tgz#4e2c01072ac4420e5ed3b645fa04d0673de38a25" - integrity sha512-U81b1nvqwF8PGyHib8/AWeGbaNipGdqXZsRO5g3ob9A5X57GXJ86cQVLejLi+znY4SmQcHladC4TotJkpNF1Ag== +"@lerna/has-npm-version@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-5.4.3.tgz#721cd987d02cfebc6e6ab953f888009a62f3e2e0" + integrity sha512-Vu5etw5vXEbYLOO26lO3u5gEjX9vWUjqLTQfNEnJxflaH9JWw2NNJ/6nXG0hqc8kEmMdhabrw+FHSKaO9ZQygw== dependencies: - "@lerna/child-process" "5.1.4" + "@lerna/child-process" "5.4.3" semver "^7.3.4" -"@lerna/import@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-5.1.4.tgz#28f5521f0fd69d894bb97325fa8c950d8200de3d" - integrity sha512-Kswe1NKJDUDlO/gbkFcurzaYlaj/fXlapHTaih9LmQDiVPOE9GphD5qnABCV0c4CqeSnCzRujT5BUjjL5z7viA== +"@lerna/import@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-5.4.3.tgz#c3b552f53bf9d49abc7167dfbcc54ff9211e8d3d" + integrity sha512-SRUyITjhqbN7JOrUHskaqbppiq8yqpSLw1+tseT3D3HdYQQjvQzR1GjBVm+LZKlHRi9qqku9fqUNQf9AqbtysA== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/prompt" "5.1.4" - "@lerna/pulse-till-done" "5.1.4" - "@lerna/validation-error" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/prompt" "5.4.3" + "@lerna/pulse-till-done" "5.4.3" + "@lerna/validation-error" "5.4.3" dedent "^0.7.0" fs-extra "^9.1.0" p-map-series "^2.1.0" -"@lerna/info@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-5.1.4.tgz#fe803801d4ae747c25f914f7d3562d05902ede7e" - integrity sha512-9OMdNtmDMKLwfX+aZk9nHLfksYXuU7IcIiVJ9dR7gYx1PoKjXvTpd/+hd7t/tmElM21kmPVxQBu02L3KmXw+hQ== +"@lerna/info@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-5.4.3.tgz#f35c68b97d05734d418d36a83be7dea138b280e0" + integrity sha512-cO0jWK2zcU9fsnoR2aqYU1IqNxWBkLvvQcTiodPqMsTAVh2F8cbwUXptWJyvsyCkKqO86axa7h6AbeF9rHRj0g== dependencies: - "@lerna/command" "5.1.4" - "@lerna/output" "5.1.4" + "@lerna/command" "5.4.3" + "@lerna/output" "5.4.3" envinfo "^7.7.4" -"@lerna/init@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-5.1.4.tgz#7f195046e010c566f22d7a81b4167c0df2b88ef9" - integrity sha512-OdI5iWYT1JcB6f5mjmCjgpkOrpDdSSDzmSi34kp/NP1FkbskDoMffVBTQiV8/h6zAg3jk1+aLQYLMuR5E6nIwA== +"@lerna/init@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-5.4.3.tgz#7ff95984864daecfc8f152b4456f9e17da218af9" + integrity sha512-cicNfMuswF+8S5RhbvCnXIrdNWTS5/ajwGYOv85x/Gu2FOJ1eqJ4W4Ai6ybANBefErE4+7aSGl/kt/+sRvTeTw== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/command" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/project" "5.4.3" fs-extra "^9.1.0" p-map "^4.0.0" write-json-file "^4.3.0" -"@lerna/link@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-5.1.4.tgz#5009da73e9f7d899bb5495e9ebb2f1ececb83f4b" - integrity sha512-j73MW+vam6e8XdwyQGeHR9X7TUmgvLG0wV1vDLjSyrhk/Q5oFo0RTRgfDJqR4tCtRnv0vujvw5oDXfSbBmg67g== +"@lerna/link@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-5.4.3.tgz#feaa02124a75c2a9e5990e88b2f4f73c21081ae4" + integrity sha512-DY6PQYE2g1a5QGDXCoajr8hl87m83vmfUIz1342x1qwWHmfRLfS3KTPPfa5bsZk/ABVOrqjjz/v3m4SEJ4LC5A== dependencies: - "@lerna/command" "5.1.4" - "@lerna/package-graph" "5.1.4" - "@lerna/symlink-dependencies" "5.1.4" + "@lerna/command" "5.4.3" + "@lerna/package-graph" "5.4.3" + "@lerna/symlink-dependencies" "5.4.3" p-map "^4.0.0" slash "^3.0.0" -"@lerna/list@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-5.1.4.tgz#19f8d229e3d39384e7f7ae4d67c7f3a3b8af751a" - integrity sha512-D7FAUik18s5FtHnBoPzodR8LUvH5b0a/ziV8ICaKWZ98H4w9qpNsQtBe0O+7DwUuqLKYpycst5tY5WVGnNwuNA== +"@lerna/list@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-5.4.3.tgz#24c0df926777c218b3e6486baded3c8b17ea6f5a" + integrity sha512-VEoJfobof7Welp+1yX6gm0EtpZw9vyztGvTtOeHQ1fhfW88oav03Qoi/hk1qZXPf7/hVZrJKEmSJ4etxsbZ3/g== dependencies: - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/listable" "5.1.4" - "@lerna/output" "5.1.4" + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/listable" "5.4.3" + "@lerna/output" "5.4.3" -"@lerna/listable@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-5.1.4.tgz#0eb7d124502bfb3641959b6f86775e9ec9747e72" - integrity sha512-grGLrffBNX38l5mzZgkv4xE9UcAAKBi1s+LgloI3rusgTdE/B8gvCOYMqLf9V08iojs7Ke2xPf0whJmbEeK/qA== +"@lerna/listable@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-5.4.3.tgz#92459e2c2c052da2e51d9e1e7fe94786ea739cb0" + integrity sha512-VcJMw+z84Rj1nLIso474+veFx0tCH9Jas02YXx9cgAnaK1IRP0BI9O0vccQIZ+2Rb62VLiFGzyCJIyKyhcGZHw== dependencies: - "@lerna/query-graph" "5.1.4" + "@lerna/query-graph" "5.4.3" chalk "^4.1.0" columnify "^1.6.0" -"@lerna/log-packed@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-5.1.4.tgz#23f64fe9e80157af6e1e848d06bdb9d786439269" - integrity sha512-qJlWMVjc/uM1I7AWqrOPeBLVZy9YExi/QqUyvmkb8mmsPXnW7rxIJQdYgRifS5aFNTbX/MtG8Q65Rr4syiVnSA== +"@lerna/log-packed@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-5.4.3.tgz#4f994f1b435078d49b08eec84496f6ad81158078" + integrity sha512-pFEBaj5JOf44+kOV6eiFHAfEULC6NhHJHHFwkljL1WNcx/+46aOADY9LrjmVtp8uPWv3fMCb3ZGcxuGebz1lYA== dependencies: byte-size "^7.0.0" columnify "^1.6.0" has-unicode "^2.0.1" npmlog "^6.0.2" -"@lerna/npm-conf@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-5.1.4.tgz#6d746452806397e941399e6bf13da62e5c41cb8f" - integrity sha512-kNbw2jO0HD9P4+nS8RIFub549BiQYG/sdFUuNWu7cCjErB+g/5ayfE6Mn5HyiRPMYXVw73iR8IzvkCCDWEOB7Q== +"@lerna/npm-conf@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-5.4.3.tgz#d5ea75aff7d561e8c0a529abff1ac9eee135482e" + integrity sha512-iQrrZHxAXqogfCpQvC/ac42/gR3osT+WN2FFB1gjVYYFBMZto5mlpcvyzH8rb75OJfak8iDtOYHUymmwSda1jw== dependencies: config-chain "^1.1.12" pify "^5.0.0" -"@lerna/npm-dist-tag@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-5.1.4.tgz#32d6eb915134a5c26a62eea509b553aafb604b7b" - integrity sha512-9q5N3iy8KGFBsyRBmNEftj8ACeCXNh2JUBqk/wYGiB0WH0oVf0UY/uo6VUy8dZjyJ9Q0eZa1ONtFHIg3QrzGDA== +"@lerna/npm-dist-tag@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-5.4.3.tgz#d070167a3cb4bd28c1b034c954eb8597f8806f4d" + integrity sha512-LnbD6xrnrmMdXH/nntyd/xJueKZGhCv3YLWK9F6YQdmUoeWY+W7eckmdd8LKL6ZqupyeLxgn0NKwiJ5wxf0F2w== dependencies: - "@lerna/otplease" "5.1.4" - npm-package-arg "^8.1.0" - npm-registry-fetch "^9.0.0" + "@lerna/otplease" "5.4.3" + npm-package-arg "8.1.1" + npm-registry-fetch "^13.3.0" npmlog "^6.0.2" -"@lerna/npm-install@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-5.1.4.tgz#5b85d0b097380ae089297cb9903508230df5dd49" - integrity sha512-DbbUK2Zy7ZBpkHimlFKf7XbGzBsoPfqzf0i9hIYBHmND9YWSgIgVFJcyRH7E6UKpr4wRChW4h6xEV81jKykB7w== +"@lerna/npm-install@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-5.4.3.tgz#ce40861298965ff3cec9e672dad02f4399f7f54b" + integrity sha512-MPXYQ1r/UMV9x+6F2VEk3miHOw4fn+G4zN11PGB5nWmuaT4uq7rPoudkdRvMRqm6bK0NpL/trssSb12ERzevqg== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/get-npm-exec-opts" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/get-npm-exec-opts" "5.4.3" fs-extra "^9.1.0" - npm-package-arg "^8.1.0" + npm-package-arg "8.1.1" npmlog "^6.0.2" signal-exit "^3.0.3" write-pkg "^4.0.0" -"@lerna/npm-publish@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-5.1.4.tgz#7f922a7e778b94106ba8929c30324554238faaab" - integrity sha512-MXtd2cFN+oJMxj9m1fXYAo+KE2BzO84Ukt3uAhQb1cXU01ZCwqGl/lQRWw5vI88emrKs0akx3d6E77PFpX9rpw== +"@lerna/npm-publish@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-5.4.3.tgz#7dffa552c42071aa707cd5a88d7984da7ea3188c" + integrity sha512-yfwtTWYRace2oJK+a7nVUs7HubypgoA1fEZ6JUZFKVkq54C8tDdyYz4EtTtiFr7WMjP8p3NWxh7RNh7Tyx7ckQ== dependencies: - "@lerna/otplease" "5.1.4" - "@lerna/run-lifecycle" "5.1.4" + "@lerna/otplease" "5.4.3" + "@lerna/run-lifecycle" "5.4.3" fs-extra "^9.1.0" - libnpmpublish "^4.0.0" - npm-package-arg "^8.1.0" + libnpmpublish "^6.0.4" + npm-package-arg "8.1.1" npmlog "^6.0.2" pify "^5.0.0" - read-package-json "^3.0.0" + read-package-json "^5.0.1" -"@lerna/npm-run-script@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-5.1.4.tgz#6db6a15ff4a012d064b14c72601031b64c8137ec" - integrity sha512-vw2G69lFmFzdX553GidE66QgCZ3cGyxoOvnpCdvZ1n9AS5ZwZSiL8Ms6N3Vj+AOhESFZmFZkzIVhtpX5/xNzLg== +"@lerna/npm-run-script@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-5.4.3.tgz#4fcf3b641919446aca1d584633c22e3ab2a12f00" + integrity sha512-xb6YAxAxGDBPlpZtjDPlM9NAgIcNte31iuGpG0I5eTYqBppKNZ7CQ8oi76qptrLyrK/ug9kqDIGti5OgyAMihQ== dependencies: - "@lerna/child-process" "5.1.4" - "@lerna/get-npm-exec-opts" "5.1.4" + "@lerna/child-process" "5.4.3" + "@lerna/get-npm-exec-opts" "5.4.3" npmlog "^6.0.2" -"@lerna/otplease@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-5.1.4.tgz#211956a78fa9ff2bed94e3b2a32762b68dfbd15f" - integrity sha512-t3qKC55D7rCacNTsqQwn25XxDRQXgRHYWS0gqn2ch+dTwXOI61Uto9okVhgn2ZfZVydJ3sjnktOsPeSXhQRQew== +"@lerna/otplease@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-5.4.3.tgz#645da8b8bc2e4b9929333b70e5a8ce972c85ca73" + integrity sha512-iy+NpqP9UcB8a0W3Nhq20x2gWSRQcmkOb25qSJj7f5AisCwGWypYlD6RZ9NqCzUD7KEbAaydEEyhoPw9dQRFmg== dependencies: - "@lerna/prompt" "5.1.4" + "@lerna/prompt" "5.4.3" -"@lerna/output@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-5.1.4.tgz#6b56336b612a573994125a11a7b139deda2b5576" - integrity sha512-E9nLEcV5GJbTKJd/d+cvU54CIzQqoU2rJAeXeyHTufbjgCTPk4I8uDNHmG7uJ+aPrif6PPBt1IIw+w5UnStfdw== +"@lerna/output@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/output/-/output-5.4.3.tgz#6003a46356b92951a4c041b70b6bf27d358a6cab" + integrity sha512-y/skSk0jMxPlJ1gpQwmKiMdElbznOMCYdCi170wfj3esby+fr8eULiwx7wUy3K+YtEGp7JS6TUjXb4zm9O0rMw== dependencies: npmlog "^6.0.2" -"@lerna/pack-directory@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-5.1.4.tgz#9a069e5bfc0d61391bd6c6f2ba362c8907cb80a7" - integrity sha512-TsltQrbwC/bPwQbL5i7WCMNM4Chl8+iqzawRZbILfjYpt3UK9xSV2tWfc9QtbmRBETvcFz/UMKQQDz+LMWN9jw== +"@lerna/pack-directory@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-5.4.3.tgz#eea41c6db9a0b0e81efa07f334d3770a11e8608b" + integrity sha512-47vsQem4Jr1W7Ce03RKihprBFLh2Q+VKgIcQGPec764i5uv3QWHzqK//da7+fmHr86qusinHvCIV7X3pXcohWg== dependencies: - "@lerna/get-packed" "5.1.4" - "@lerna/package" "5.1.4" - "@lerna/run-lifecycle" "5.1.4" - "@lerna/temp-write" "5.1.4" - npm-packlist "^2.1.4" + "@lerna/get-packed" "5.4.3" + "@lerna/package" "5.4.3" + "@lerna/run-lifecycle" "5.4.3" + "@lerna/temp-write" "5.4.3" + npm-packlist "^5.1.1" npmlog "^6.0.2" tar "^6.1.0" -"@lerna/package-graph@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-5.1.4.tgz#df5910f588334284637a6a3cc24766806ba88f52" - integrity sha512-dP1gLcrqou5/8zef7u5ne4GTslNXULjpi3dDiljohKNR4XelsC4lkkF9m1Uzn9E1nAphHRhWXrRq40kqxmdYXg== +"@lerna/package-graph@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-5.4.3.tgz#5710409b6233a20dfc98bb0004c611bc8a9ae9d4" + integrity sha512-8eyAS+hb+K/+1Si2UNh4KPaLFdgTgdrRcsuTY7aKaINyrzoLTArAKPk4dQZTH1d0SUWtFzicvWixkkzq21QuOw== dependencies: - "@lerna/prerelease-id-from-version" "5.1.4" - "@lerna/validation-error" "5.1.4" - npm-package-arg "^8.1.0" + "@lerna/prerelease-id-from-version" "5.4.3" + "@lerna/validation-error" "5.4.3" + npm-package-arg "8.1.1" npmlog "^6.0.2" semver "^7.3.4" -"@lerna/package@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-5.1.4.tgz#7dd77d18cd0227793afa9819be988167bcc0cb02" - integrity sha512-L0zsxslJZ+swkG/KLU3TQHmWPR0hf0eLIdOROyA9Nxvuo8C/702ddYZcuEYcz9t/jOuSgSB2s90iK2oTIncNbw== +"@lerna/package@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/package/-/package-5.4.3.tgz#ff1505199977debfa58862dde5df804d5db4bca6" + integrity sha512-EIw82v4ijzS3qRCSKHNSJ/UTnFDroaEp6mj7pzLO6lIrAqg7MgtKeThMhzEAMvF4yNB7BL+UR+dZ0jI47WgQJQ== dependencies: load-json-file "^6.2.0" - npm-package-arg "^8.1.0" + npm-package-arg "8.1.1" write-pkg "^4.0.0" -"@lerna/prerelease-id-from-version@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.1.4.tgz#ea34adb5810622a656fa8dea17595d6b794e2872" - integrity sha512-kDcXKKFD6Ww/FinLEvsY1P3aIiuVLyonkttvfKJTJvm3ymz7/fBKz8GotFXuONVC1xSIK9Nrk3jGYs6ZGoha+w== +"@lerna/prerelease-id-from-version@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.4.3.tgz#28db7eac5bb21762f2d7562ddc5d12e8f0eced38" + integrity sha512-bXsBCv/VJrWXz2usnk52TtTb4dsXSeYDI2U1N2z/DssFKlOpH7xL1mKWC4OXE2XBqb9I49sDPfZzN8BxTfJdJQ== dependencies: semver "^7.3.4" -"@lerna/profiler@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-5.1.4.tgz#ce679f1a0b29489e3b530c6708c6f951d46fd15d" - integrity sha512-JLkS90+CSmi85v3SlJc5Wjk73MHmIviqtL3fM/Z6clBLbsRPkbBBfSwXKp7O281knF6E2UNTrWOtEG7b6wG3TQ== +"@lerna/profiler@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-5.4.3.tgz#1905e8ae96ec23681323ee6b820387689a5b06ad" + integrity sha512-6otMDwCzfWszV0K7RRjlF5gibLZt1ay+NmtrhL7TZ7PSizIJXlf6HxZiYodGgjahKAdGxx34H9XyToVzOLdg3w== dependencies: fs-extra "^9.1.0" npmlog "^6.0.2" upath "^2.0.1" -"@lerna/project@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-5.1.4.tgz#5185a6ef17d4cc2be0fec505e0f4507c2e68af3b" - integrity sha512-k0z3w45t746uAUkN+jY/jF+/BqHodGFYaUfM0DTDOGUWC8tXzxuqk3bchShp6Wct2gwNQWbtWHl50Jhhw5PC5g== +"@lerna/project@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-5.4.3.tgz#48d6fffc025cb6fcb42aa75fa29582f72cd71ab3" + integrity sha512-j2EeuwdbHsL++jy0s2ShDbdOPirPOL/FNMRf7Qtwl4pEWoOiSYmv/LnIt2pV7cwww9Lx8Y682/7CQwlXdgrrMw== dependencies: - "@lerna/package" "5.1.4" - "@lerna/validation-error" "5.1.4" + "@lerna/package" "5.4.3" + "@lerna/validation-error" "5.4.3" cosmiconfig "^7.0.0" dedent "^0.7.0" dot-prop "^6.0.1" @@ -3016,139 +2077,140 @@ resolve-from "^5.0.0" write-json-file "^4.3.0" -"@lerna/prompt@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-5.1.4.tgz#16f6f56752e0e542350cafbc8583d3d4690d8394" - integrity sha512-AiE8NIzh+x2+F0t96M+rfwLtKzBNXjQEWXtBfEcA1eRqanMWUr6ejfmdkoEzXVrMzyY/ugPdWQYbGCI00iF7Tg== +"@lerna/prompt@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-5.4.3.tgz#ace30e42f59c16a2d5c4ec663e4fc73b1f604a57" + integrity sha512-VqrTgnbm1H24aYacXmZ2z7atHO6W4NamvwHroGRFqiM34dCLQh8S22X5mNnb4nX5lgfb+doqcxBtOi91vqpJ2g== dependencies: - inquirer "^7.3.3" + inquirer "^8.2.4" npmlog "^6.0.2" -"@lerna/publish@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-5.1.4.tgz#d9d7203ec7e9dc3d0a9b8123a2c0b1afa536bd05" - integrity sha512-hbFAwOlyUR4AUBd7qTQXXVKgaxTS4Mz4Kkjxz8g7jtqo+T0KvU3JbfwDqxOiCwcDk+qkrBbkwbvc27jcObSwkw== - dependencies: - "@lerna/check-working-tree" "5.1.4" - "@lerna/child-process" "5.1.4" - "@lerna/collect-updates" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/describe-ref" "5.1.4" - "@lerna/log-packed" "5.1.4" - "@lerna/npm-conf" "5.1.4" - "@lerna/npm-dist-tag" "5.1.4" - "@lerna/npm-publish" "5.1.4" - "@lerna/otplease" "5.1.4" - "@lerna/output" "5.1.4" - "@lerna/pack-directory" "5.1.4" - "@lerna/prerelease-id-from-version" "5.1.4" - "@lerna/prompt" "5.1.4" - "@lerna/pulse-till-done" "5.1.4" - "@lerna/run-lifecycle" "5.1.4" - "@lerna/run-topologically" "5.1.4" - "@lerna/validation-error" "5.1.4" - "@lerna/version" "5.1.4" +"@lerna/publish@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-5.4.3.tgz#94ec4197f5e00765686512787b54fbbd83164799" + integrity sha512-SYziRvRwahzbM0A4T63FfQsk2i33cIauKXlJz6t3GQZvVzUFb0gD/baVas2V7Fs/Ty1oCqtmDKB/ABTznWYwGg== + dependencies: + "@lerna/check-working-tree" "5.4.3" + "@lerna/child-process" "5.4.3" + "@lerna/collect-updates" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/describe-ref" "5.4.3" + "@lerna/log-packed" "5.4.3" + "@lerna/npm-conf" "5.4.3" + "@lerna/npm-dist-tag" "5.4.3" + "@lerna/npm-publish" "5.4.3" + "@lerna/otplease" "5.4.3" + "@lerna/output" "5.4.3" + "@lerna/pack-directory" "5.4.3" + "@lerna/prerelease-id-from-version" "5.4.3" + "@lerna/prompt" "5.4.3" + "@lerna/pulse-till-done" "5.4.3" + "@lerna/run-lifecycle" "5.4.3" + "@lerna/run-topologically" "5.4.3" + "@lerna/validation-error" "5.4.3" + "@lerna/version" "5.4.3" fs-extra "^9.1.0" - libnpmaccess "^4.0.1" - npm-package-arg "^8.1.0" - npm-registry-fetch "^9.0.0" + libnpmaccess "^6.0.3" + npm-package-arg "8.1.1" + npm-registry-fetch "^13.3.0" npmlog "^6.0.2" p-map "^4.0.0" p-pipe "^3.1.0" - pacote "^13.4.1" + pacote "^13.6.1" semver "^7.3.4" -"@lerna/pulse-till-done@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-5.1.4.tgz#b82b362341665e44e2885abd84b22e4122bafcaa" - integrity sha512-zFPzv6cY0OcqtcR91ueZqd+ulTLE4vPk9l6iPAfefgqh6w0E6hSmG6J9RmYE3gaMHSFJdvYHb/yyTPLF32J9lg== +"@lerna/pulse-till-done@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-5.4.3.tgz#0aced2e3c9d7763fd880688e10fc1b3d40158066" + integrity sha512-Twy0UmVtyFzC+sLDnuY0u37Xu17WAP7ysQ7riaLx9KhO0M9MZvoY+kDF/hg0K204tZi0dr6R5eLGEUd+Xkg9Rw== dependencies: npmlog "^6.0.2" -"@lerna/query-graph@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-5.1.4.tgz#7333bebc711e03755fb96e23b4e99c974eac3d10" - integrity sha512-G8DYNqp5ISbbMjEJhGst1GHk59zO18IG9oaVSK14M7iF3qCLtg0iJ1Do4LDNpda3EF8PrLOx2mrNM5MBcGMjEg== +"@lerna/query-graph@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-5.4.3.tgz#e9421f751039c0dfdaf5cea4f319129c534f0386" + integrity sha512-eiRsEPg+t2tN9VWXSAj2y0zEphPrOz6DdYw/5ntVFDecIfoANxGKcCkOTqb3PnaC8BojI64N3Ju+i41jcO0mLw== dependencies: - "@lerna/package-graph" "5.1.4" + "@lerna/package-graph" "5.4.3" -"@lerna/resolve-symlink@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-5.1.4.tgz#7173d4103d1ae868a000336a636fcbfd15a8ae53" - integrity sha512-hpnaX5tznAtbQXlyc92kJiywdTnnbCf6wihSZwDiVnVgXuHJ3LvmjN677h9A0jobY6KdTT+wIoAHpJuZHj60vQ== +"@lerna/resolve-symlink@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-5.4.3.tgz#168f64244e87d7b9f6e89d183a70dfbf64590c20" + integrity sha512-BzqinKmTny70KgSBAaVgdLHaVR3WXRVk5EDbQHB73qg4dHiyYrzvDBqkaKzv1K1th8E4LdQQXf5LiNEbfU/1Bg== dependencies: fs-extra "^9.1.0" npmlog "^6.0.2" - read-cmd-shim "^2.0.0" + read-cmd-shim "^3.0.0" -"@lerna/rimraf-dir@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-5.1.4.tgz#2d216d97d223aa7a521ae77cae1ae29a6a0d96ca" - integrity sha512-WvHm4gE1/HWbI4gCjJw3clPT+FRq2Ob9I9EDbfw4c307MNT4kW4bJU2mt0nyv/uwYhUkTG+GQVrlt+Dtcif77g== +"@lerna/rimraf-dir@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-5.4.3.tgz#60d91a8d1de928d1a818a3e113e64707e461dbba" + integrity sha512-gBraUVczKk4Jik1+qCj4jtQ53l1zmWmMoH7A11ifYI60Dg7Mc6iQcIZOIj6siD5TSOtSCy7qePu3VyXBOIquvQ== dependencies: - "@lerna/child-process" "5.1.4" + "@lerna/child-process" "5.4.3" npmlog "^6.0.2" path-exists "^4.0.0" rimraf "^3.0.2" -"@lerna/run-lifecycle@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-5.1.4.tgz#9d0e80bec6dee25342640b7ccfbe13d89d22e32d" - integrity sha512-ubmqi1ixebBHSTYS0oK8MoqBoJE7UDrXWTWsv84UrXiPutTffLR8ZQJKlMEcetQVzX9qbjpKbzc+jQWXPWid2A== +"@lerna/run-lifecycle@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-5.4.3.tgz#18aa3ebde70caf21c1d52454090419853329a48f" + integrity sha512-XKUfELNjkR6EUg+Xh92s1etjNvCbTBw20QMXDsyGSipHcLr7huXjC0D2/4/+j8/N5sz/rg+JufQfc1ldtpOU0A== dependencies: - "@lerna/npm-conf" "5.1.4" - "@npmcli/run-script" "^3.0.2" + "@lerna/npm-conf" "5.4.3" + "@npmcli/run-script" "^4.1.7" npmlog "^6.0.2" + p-queue "^6.6.2" -"@lerna/run-topologically@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-5.1.4.tgz#f026407253e751102f2dba9ee764daa4b3a88bcf" - integrity sha512-MckWfLu/xuRtaThdUgrJC2naumv2LOIiMoJfxCdYpiCrIgq5YrwqOxjQ0awHqQhkvFZ5G91ucBcBEIMsOou1iw== +"@lerna/run-topologically@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-5.4.3.tgz#772b97e6553bc77841582b25d97e52746754e7c6" + integrity sha512-9bT8mJ0RICIk16l8L9jRRqSXGSiLEKUd50DLz5Tv0EdOKD+prwffAivCpVMYF9tdD5UaQzDAK/VzFdS5FEzPQg== dependencies: - "@lerna/query-graph" "5.1.4" + "@lerna/query-graph" "5.4.3" p-queue "^6.6.2" -"@lerna/run@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-5.1.4.tgz#fb97a659eee440f978231306a0d8745a9a6eb39f" - integrity sha512-iaTioOF66z02Y9ml/Ba0ePpXOwZ+BkODcNXrJbyW8WhraL0fSjyno0FspO1Eu0nG4JMtgCsoEzHNphsk7Wg+7A== - dependencies: - "@lerna/command" "5.1.4" - "@lerna/filter-options" "5.1.4" - "@lerna/npm-run-script" "5.1.4" - "@lerna/output" "5.1.4" - "@lerna/profiler" "5.1.4" - "@lerna/run-topologically" "5.1.4" - "@lerna/timer" "5.1.4" - "@lerna/validation-error" "5.1.4" +"@lerna/run@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-5.4.3.tgz#e011a1d11408b0cc5abe41f006df189ebcf3bfa7" + integrity sha512-PyHOYCsuJ+5r9ymjtwbQCbMMebVhaZ7Xy4jNpL9kqIvmdxe1S5QTP6Vyc6+RAvUtx0upP++0MFFA8CbZ1ZwOcw== + dependencies: + "@lerna/command" "5.4.3" + "@lerna/filter-options" "5.4.3" + "@lerna/npm-run-script" "5.4.3" + "@lerna/output" "5.4.3" + "@lerna/profiler" "5.4.3" + "@lerna/run-topologically" "5.4.3" + "@lerna/timer" "5.4.3" + "@lerna/validation-error" "5.4.3" p-map "^4.0.0" -"@lerna/symlink-binary@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-5.1.4.tgz#1bba4aa23125c8a8ce3d6b15b869caa62824c6b5" - integrity sha512-SNjHxCNTCD0Xfj3CNBTG+3ut4aDAVaq+SrB2ckFNmZ5Z9yFdnX6aP+PBzLD/0q5hj18lGlaJ8iZjD/ubbrgFCA== +"@lerna/symlink-binary@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-5.4.3.tgz#0cfe58a2781429c5dc057a1d12c67c7dbfe730c3" + integrity sha512-iXBijyb1+NiOeifnRsbicSju6/FGtv6hvNny2lbjyr0EJ8jMz6JaoQ6eep9yXhgaNRJND1Pw9JBiCv6EhhcyCw== dependencies: - "@lerna/create-symlink" "5.1.4" - "@lerna/package" "5.1.4" + "@lerna/create-symlink" "5.4.3" + "@lerna/package" "5.4.3" fs-extra "^9.1.0" p-map "^4.0.0" -"@lerna/symlink-dependencies@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-5.1.4.tgz#70497b85cde43e9add4eacb10f1de35b97f937b9" - integrity sha512-SuzylyNs1R5bVRqSCwfbQLdDP83RX8ncQxOy2SSSrScwkzdBCDqDPh4haeADsq2+RoOQBItn1PDfzUCNAWomDA== +"@lerna/symlink-dependencies@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-5.4.3.tgz#856803bfca5e65824f60312e5465e9a66fc5c1c8" + integrity sha512-9fK3fIl6wyihyfKhDUquiAx8JoMjctBJ7zhLjrgOon5Ua2fyc+mVp9fTWsjHtv7IaC/TeP9oA4/IcBtdr2xieg== dependencies: - "@lerna/create-symlink" "5.1.4" - "@lerna/resolve-symlink" "5.1.4" - "@lerna/symlink-binary" "5.1.4" + "@lerna/create-symlink" "5.4.3" + "@lerna/resolve-symlink" "5.4.3" + "@lerna/symlink-binary" "5.4.3" fs-extra "^9.1.0" p-map "^4.0.0" p-map-series "^2.1.0" -"@lerna/temp-write@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/temp-write/-/temp-write-5.1.4.tgz#eca417418496fbb29d8bae36b548fd7afb46523f" - integrity sha512-f+6+ud87pyitM9zAq7GBhB7uoHTcgLJvR3YGv5sNja4jIl3+zdKPDcyxzVyQb38knuRSkGM8NjYOWi4zwcMaGw== +"@lerna/temp-write@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/temp-write/-/temp-write-5.4.3.tgz#e9562fc75eed7fbd7bedb7e164893646579411da" + integrity sha512-HgAVNmKfeRKm4QPFGFfmzVC/lA2jv5QpMXPPDahoBEI6BhYtMmHiUWQan6dfsCoSf65xDd+9NTESya9AOSbN2w== dependencies: graceful-fs "^4.1.15" is-stream "^2.0.0" @@ -3156,37 +2218,37 @@ temp-dir "^1.0.0" uuid "^8.3.2" -"@lerna/timer@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-5.1.4.tgz#a94734ba5bed1f3ad9b6fc0ce9609e5e624bc7ec" - integrity sha512-fhQtqkLxNexPWzhI1WAxZnHIBM8VhChvUJu503u1Rmp2JxhXbTE4Txnu1gPvqlDjdoE6ck0vN5icmfMVRwKc8g== +"@lerna/timer@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-5.4.3.tgz#8aa030d49bb2ee693b624a8a69e4c92538960e6f" + integrity sha512-0NwrCxug6pmSAuPaAHNr5VRGw7+nqikoIpwx6RViJiOD+UYFf3k955fngtSX2JhETR/7it9ncgpbaLvlxusx9g== -"@lerna/validation-error@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-5.1.4.tgz#095d12367ec17a5fc00c0cf6cd8a83c3ddb9a9c3" - integrity sha512-wys9Fv/bUy7sYXOK9t+V3XSyEHK5tUXwY22nfIDYu416WcSkkE4DI8Q2nTv4nYYOmG2Y7IOhaSenbsPLQ0VqtQ== +"@lerna/validation-error@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-5.4.3.tgz#8a3060b466116efe8c18366a505a291e8a2e2778" + integrity sha512-edf9vbQaDViffhHqL/wHdGs83RV7uJ4N5E3VEpjXefWIUfgmw9wYjkX338WYUh/XqDYbSV6C1M8A24FT3/0uzw== dependencies: npmlog "^6.0.2" -"@lerna/version@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-5.1.4.tgz#87a2c19ba0d1e8c8417d6c2b87d1702e95a0bdf5" - integrity sha512-cYgm1SNdiK129JoWI8WMwjsxaIyeAC1gCaToWk36Tw+BCF3PbkdoTKdneDmJ+7qbX1QrzxsgHTcjwIt4lZPEqQ== - dependencies: - "@lerna/check-working-tree" "5.1.4" - "@lerna/child-process" "5.1.4" - "@lerna/collect-updates" "5.1.4" - "@lerna/command" "5.1.4" - "@lerna/conventional-commits" "5.1.4" - "@lerna/github-client" "5.1.4" - "@lerna/gitlab-client" "5.1.4" - "@lerna/output" "5.1.4" - "@lerna/prerelease-id-from-version" "5.1.4" - "@lerna/prompt" "5.1.4" - "@lerna/run-lifecycle" "5.1.4" - "@lerna/run-topologically" "5.1.4" - "@lerna/temp-write" "5.1.4" - "@lerna/validation-error" "5.1.4" +"@lerna/version@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-5.4.3.tgz#7c5c0888f7f162999c5b9314dd48b899c1bbea8e" + integrity sha512-a6Q+o1fZbOg/GVG8QtvfyOpX0sZ38bbI9hSJU5YMf99YKdyzp80dDDav+IGMxIaZSj08HJ1pPyXOLR27I8fTUQ== + dependencies: + "@lerna/check-working-tree" "5.4.3" + "@lerna/child-process" "5.4.3" + "@lerna/collect-updates" "5.4.3" + "@lerna/command" "5.4.3" + "@lerna/conventional-commits" "5.4.3" + "@lerna/github-client" "5.4.3" + "@lerna/gitlab-client" "5.4.3" + "@lerna/output" "5.4.3" + "@lerna/prerelease-id-from-version" "5.4.3" + "@lerna/prompt" "5.4.3" + "@lerna/run-lifecycle" "5.4.3" + "@lerna/run-topologically" "5.4.3" + "@lerna/temp-write" "5.4.3" + "@lerna/validation-error" "5.4.3" chalk "^4.1.0" dedent "^0.7.0" load-json-file "^6.2.0" @@ -3200,13 +2262,13 @@ slash "^3.0.0" write-json-file "^4.3.0" -"@lerna/write-log-file@5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-5.1.4.tgz#bd9cc578d0a35be11f0c489252e945478a0d3c0d" - integrity sha512-ISJbkjaSKhJ4d7V90RFvuwDQFq9ZH/KN475KFJr+TBFZTwMiXuBahlq+j8/a+nItejNnuPD4/xlWuzCOuGJORQ== +"@lerna/write-log-file@5.4.3": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-5.4.3.tgz#6f721c380693ac764c00d6cc5413cffa50a972b4" + integrity sha512-S2kctFhsO4mMbR52tW9VjYrGWUMYO5YIjprg8B7vQSwYvWOOJfqOKy/A+P/U5zXuCSAbDDGssyS+CCM36MFEQw== dependencies: npmlog "^6.0.2" - write-file-atomic "^3.0.3" + write-file-atomic "^4.0.1" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3229,10 +2291,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.2.0.tgz#ee40dfe1f81ae1524819ee39c8f3e7022b0d6269" - integrity sha512-zWV7scFGL0SmpvfQyIWnMFbU/0YgtMNyvJiJwR98kyjUSntJGWFFR0O600d5W+TrDcTg0GyDbY+HdzGEg+GXLg== +"@npmcli/arborist@5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.3.0.tgz#321d9424677bfc08569e98a5ac445ee781f32053" + integrity sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/installed-package-contents" "^1.0.7" @@ -3242,7 +2304,7 @@ "@npmcli/name-from-folder" "^1.0.1" "@npmcli/node-gyp" "^2.0.0" "@npmcli/package-json" "^2.0.0" - "@npmcli/run-script" "^3.0.0" + "@npmcli/run-script" "^4.1.3" bin-links "^3.0.0" cacache "^16.0.6" common-ancestor-path "^1.0.1" @@ -3256,7 +2318,7 @@ npm-pick-manifest "^7.0.0" npm-registry-fetch "^13.0.0" npmlog "^6.0.2" - pacote "^13.0.5" + pacote "^13.6.1" parse-conflict-json "^2.0.1" proc-log "^2.0.0" promise-all-reject-late "^1.0.0" @@ -3269,11 +2331,6 @@ treeverse "^2.0.0" walk-up-path "^1.0.0" -"@npmcli/ci-detect@^1.0.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" - integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== - "@npmcli/fs@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" @@ -3373,7 +2430,7 @@ dependencies: infer-owner "^1.0.4" -"@npmcli/run-script@^3.0.0", "@npmcli/run-script@^3.0.1", "@npmcli/run-script@^3.0.2": +"@npmcli/run-script@^3.0.1": version "3.0.3" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-3.0.3.tgz#66afa6e0c4c3484056195f295fa6c1d1a45ddf58" integrity sha512-ZXL6qgC5NjwfZJ2nET+ZSLEz/PJgJ/5CU90C2S66dZY4Jw73DasS4ZCXuy/KHWYP0imjJ4VtA+Gebb5BxxKp9Q== @@ -3383,41 +2440,66 @@ node-gyp "^8.4.1" read-package-json-fast "^2.0.3" -"@octokit/auth-token@^2.4.4": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" - integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== +"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" + integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + which "^2.0.2" + +"@nrwl/cli@14.5.7": + version "14.5.7" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-14.5.7.tgz#c5aad51bd07b07c84949f300eb0779455a16ba50" + integrity sha512-VbjUx8hkNxjA/vFGUrcqfQ8yZgnL0JfUxO0M5pLUaffZMCpAt/eXw6ufd35GaQ91RWHeI7FX0Zv+Ke8d+tZcuA== + dependencies: + nx "14.5.7" + +"@nrwl/tao@14.5.7": + version "14.5.7" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-14.5.7.tgz#ce94fb9b24cb800e41e3e9b942cbdde57c598882" + integrity sha512-6REA1aedpBXYBSgqMhJHllHCf6jveV8KycuNYIXy5r8BbCJPjTloiMrrACwUhGAqHDaP3FvvlTy2JiKAmBqlJQ== + dependencies: + nx "14.5.7" + +"@octokit/auth-token@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.0.tgz#6f22c5fc56445c496628488ba6810131558fa4a9" + integrity sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ== dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" - integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== +"@octokit/core@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.0.4.tgz#335d9b377691e3264ce57a9e5a1f6cda783e5838" + integrity sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ== dependencies: - "@octokit/auth-token" "^2.4.4" - "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.6.0" - "@octokit/request-error" "^2.0.5" + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" "@octokit/types" "^6.0.3" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/endpoint@^6.0.1": - version "6.0.12" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" - integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== +"@octokit/endpoint@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.0.tgz#be758a1236d68d6bbb505e686dd50881c327a519" + integrity sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ== dependencies: "@octokit/types" "^6.0.3" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/graphql@^4.5.8": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" - integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== +"@octokit/graphql@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.0.tgz#2cc6eb3bf8e0278656df1a7d0ca0d7591599e3b3" + integrity sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ== dependencies: - "@octokit/request" "^5.6.0" + "@octokit/request" "^6.0.0" "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" @@ -3426,69 +2508,106 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== + "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^2.16.8": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" - integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== +"@octokit/plugin-paginate-rest@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" + integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.41.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" - integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== +"@octokit/plugin-rest-endpoint-methods@^6.0.0": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.1.2.tgz#bbf55cfc43acf177514441ecd1d26031006f73ed" + integrity sha512-sAfSKtLHNq0UQ2iFuI41I6m5SK6bnKFRJ5kUjDRVbmQXiRVi4aQiIcgG4cM7bt+bhSiWL4HwnTxDkWFlKeKClA== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.40.0" deprecation "^2.3.1" -"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" - integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== +"@octokit/request-error@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.0.tgz#f527d178f115a3b62d76ce4804dd5bdbc0270a81" + integrity sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w== dependencies: "@octokit/types" "^6.0.3" deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.6.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" - integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== +"@octokit/request@^6.0.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.0.tgz#9c25606df84e6f2ccbcc2c58e1d35438e20b688b" + integrity sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q== dependencies: - "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.1.0" + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" "@octokit/types" "^6.16.1" is-plain-object "^5.0.0" - node-fetch "^2.6.1" + node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@^18.1.0": - version "18.12.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" - integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== +"@octokit/rest@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" + integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== dependencies: - "@octokit/core" "^3.5.1" - "@octokit/plugin-paginate-rest" "^2.16.8" + "@octokit/core" "^4.0.0" + "@octokit/plugin-paginate-rest" "^3.0.0" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + "@octokit/plugin-rest-endpoint-methods" "^6.0.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1": version "6.34.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== dependencies: "@octokit/openapi-types" "^11.2.0" +"@octokit/types@^6.40.0", "@octokit/types@^6.41.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== + dependencies: + "@octokit/openapi-types" "^12.11.0" + +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@pkgr/utils@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.0.tgz#3b8491f112a80839450498816767eb03b7db6139" + integrity sha512-7dIJ9CRVzBnqyEl7diUHPUFJf/oty2SeoVzcMocc5PeOUDK9KGzvgIBjGRRzzlRDaOjh3ADwH0WeibQvi3ls2Q== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@sinclair/typebox@^0.24.1": + version "0.24.28" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" + integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== + "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -3541,30 +2660,10 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.10.tgz#10fecee4a3be17357ce99b370bd81874044d8dbd" - integrity sha512-N+srakvPaYMGkwjNDx3ASx65Zl3QG8dJgVtIB+YMOkucU+zctlv/hdP5250VKdDHSDoW9PFZoCqbqNcAPjCjXA== - -"@tsconfig/node14@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.2.tgz#b09c08de2eb319ca2acab17a1b8028af110b24b3" - integrity sha512-YwrUA5ysDXHFYfL0Xed9x3sNS4P+aKlCOnnbqUa2E5HdQshHFleCJVrj1PlGTb4GgFUCDyte1v3JWLy2sz8Oqg== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/aws-lambda@^8.10.100": - version "8.10.100" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.100.tgz#31442a71c09e0ef08e41b7342d62cf374fa268df" - integrity sha512-Qldp1LhbgQ4tEHewci0/q5qVRaDr8ylvsYfpitJ+FFixzAHpgitvM2NM449uYWt2tYo/iJy25aSRRUVvwIT+ng== +"@types/aws-lambda@^8.10.101": + version "8.10.101" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.101.tgz#35d85783a834e04604d49e85dc7ee6e2820e8939" + integrity sha512-84geGyVc0H9P9aGbcg/vkDh5akJq0bEf3tizHNR2d1gcm0wsp9IZ/SW6rPxvgjJFi3OeVxDc8WTKCAjoZbogzg== "@types/babel__core@^7.0.0": version "7.1.19" @@ -3666,11 +2765,6 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -3696,16 +2790,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.7.tgz#4a53d8332bb65a45470a2f9e2611f1ced637a5cb" integrity sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ== -"@types/node@^10.17.60": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - "@types/node@^18.0.0": version "18.0.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== +"@types/node@^18.6.2": + version "18.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.3.tgz#4e4a95b6fe44014563ceb514b2598b3e623d1c98" + integrity sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -3721,15 +2815,15 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== -"@types/semver@^7.3.9": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== +"@types/semver@^7.3.12": + version "7.3.12" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" + integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== -"@types/sinon@^10.0.11": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== +"@types/sinon@^10.0.13": + version "10.0.13" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" + integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== dependencies: "@types/sinonjs__fake-timers" "*" @@ -3762,31 +2856,27 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@types/yargs@^17.0.8": + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" + "@types/yargs-parser" "*" -"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== +"@typescript-eslint/eslint-plugin@^5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz#c0a480d05211660221eda963cc844732fe9b1714" + integrity sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ== dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/type-utils" "5.33.1" + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": version "5.16.0" @@ -3795,23 +2885,15 @@ dependencies: "@typescript-eslint/utils" "5.16.0" -"@typescript-eslint/parser@^4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/parser@^5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.31.0.tgz#7f42d7dcc68a0a6d80a0f3d9a65063aee7bb8d2c" + integrity sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/scope-manager" "5.31.0" + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/typescript-estree" "5.31.0" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.16.0": version "5.16.0" @@ -3821,28 +2903,45 @@ "@typescript-eslint/types" "5.16.0" "@typescript-eslint/visitor-keys" "5.16.0" -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/scope-manager@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz#f47a794ba84d9b818ab7f8f44fff55a61016c606" + integrity sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg== + dependencies: + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/visitor-keys" "5.31.0" + +"@typescript-eslint/scope-manager@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz#8d31553e1b874210018ca069b3d192c6d23bc493" + integrity sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + +"@typescript-eslint/type-utils@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz#1a14e94650a0ae39f6e3b77478baff002cec4367" + integrity sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g== + dependencies: + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@5.16.0": version "5.16.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.16.0.tgz#5827b011982950ed350f075eaecb7f47d3c643ee" integrity sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g== -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" +"@typescript-eslint/types@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.31.0.tgz#7aa389122b64b18e473c1672fb3b8310e5f07a9a" + integrity sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g== + +"@typescript-eslint/types@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.1.tgz#3faef41793d527a519e19ab2747c12d6f3741ff7" + integrity sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ== "@typescript-eslint/typescript-estree@5.16.0": version "5.16.0" @@ -3857,6 +2956,32 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz#eb92970c9d6e3946690d50c346fb9b1d745ee882" + integrity sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw== + dependencies: + "@typescript-eslint/types" "5.31.0" + "@typescript-eslint/visitor-keys" "5.31.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz#a573bd360790afdcba80844e962d8b2031984f34" + integrity sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.16.0": version "5.16.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.16.0.tgz#42218b459d6d66418a4eb199a382bdc261650679" @@ -3869,13 +2994,17 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@typescript-eslint/utils@5.33.1", "@typescript-eslint/utils@^5.10.0": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.33.1.tgz#171725f924fe1fe82bb776522bb85bc034e88575" + integrity sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" "@typescript-eslint/visitor-keys@5.16.0": version "5.16.0" @@ -3885,6 +3014,22 @@ "@typescript-eslint/types" "5.16.0" eslint-visitor-keys "^3.0.0" +"@typescript-eslint/visitor-keys@5.31.0": + version "5.31.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz#b0eca264df01ce85dceb76aebff3784629258f54" + integrity sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg== + dependencies: + "@typescript-eslint/types" "5.31.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz#0155c7571c8cd08956580b880aea327d5c34a18b" + integrity sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg== + dependencies: + "@typescript-eslint/types" "5.33.1" + eslint-visitor-keys "^3.3.0" + "@xmldom/xmldom@^0.8.2": version "0.8.2" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.2.tgz#b695ff674e8216efa632a3d36ad51ae9843380c0" @@ -3938,7 +3083,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -3948,20 +3093,15 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.2.4, acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== add-stream@^1.0.0: version "1.0.0" @@ -4011,16 +3151,6 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.6.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" @@ -4067,7 +3197,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -4075,23 +3205,11 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - "aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - are-we-there-yet@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" @@ -4100,11 +3218,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -4112,6 +3225,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -4162,11 +3280,6 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - async@^2.6.3: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -4184,10 +3297,30 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -aws-cdk@1.160.0: - version "1.160.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-1.160.0.tgz#525f4a31e83e07bcd623522713b3f57e34b234c0" - integrity sha512-WJu0Y1igEV0/RnVm+ppynYdlrqA1wD7mN9SNXJJA6VTozeboIZF9ZskwDkFZ6o1VXmvW/i8K2heSNLv2HuDZNQ== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-cdk-lib@2.33.0: + version "2.33.0" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.33.0.tgz#cd9cc7ab097a80833f3d63aa1a704d401d85fc10" + integrity sha512-+aV6+P3RROFndkw9/mtXCciL1RL2tHssju6kgwmml0XIqcnjJ8qyCR23fE8MEq49Q+6dQ8sBN2HtrdKHw/sgnw== + dependencies: + "@balena/dockerignore" "^1.0.2" + case "1.6.3" + fs-extra "^9.1.0" + ignore "^5.2.0" + jsonschema "^1.4.1" + minimatch "^3.1.2" + punycode "^2.1.1" + semver "^7.3.7" + yaml "1.10.2" + +aws-cdk@2.33.0: + version "2.33.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.33.0.tgz#be867e5e49a5b84c5839f408ea4c26adef015298" + integrity sha512-pwqqXzdkyBraKARdyZ6OqMIbEHlnM0x5LJ08zFYQGcrC+jk/e3Y3XWGJrapC6sAKNwQNF78dcJbTSNBjjLXMdQ== optionalDependencies: fsevents "2.3.2" @@ -4200,10 +3333,10 @@ aws-sdk-mock@5.5.0: sinon "^11.1.1" traverse "^0.6.6" -aws-sdk@^2.1155.0, aws-sdk@^2.928.0: - version "2.1155.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1155.0.tgz#baee24931a969a44496afc8eff5f6543518d5b75" - integrity sha512-H2QircO+R3/tx7DhRKYsGuj0YJcIY2N53U2gDExAmy34/oNAGUcS1eKB8DwTbpNPrnQgZzYDGBgHMTFWtN2XZA== +aws-sdk@^2.1184.0, aws-sdk@^2.928.0: + version "2.1184.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1184.0.tgz#6f800815382284825a3f03422410eaf3cefcac68" + integrity sha512-g4UQgc8+Ljk2e6xJYwBSQrDJ8BmQ/E3nHLw9ITEJKC1hgK8DLy77PUielA0ptscoKz5ySCSSGbMjR1B1HgThKQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -4212,19 +3345,20 @@ aws-sdk@^2.1155.0, aws-sdk@^2.928.0: querystring "0.2.0" sax "1.2.1" url "0.10.3" + util "^0.12.4" uuid "8.0.0" xml2js "0.4.19" -awslint@1.160.0: - version "1.160.0" - resolved "https://registry.yarnpkg.com/awslint/-/awslint-1.160.0.tgz#e1e5429a004fb063d65f8d4718c19985527d6d9b" - integrity sha512-5TyMeYXatCB7aPN9liu+JxDILGr8juT1XSnw1IPdAJ4vEqAILK+1KmA2535yQh3fqD1/eTtPnnFXEH2k+LzC6A== +awslint@2.33.0: + version "2.33.0" + resolved "https://registry.yarnpkg.com/awslint/-/awslint-2.33.0.tgz#e000b80792469eddcf9928647ea0510776e3071c" + integrity sha512-zSwubnmarwetE7j4QCT12G45ZbHTcuxdHv8iog21rbeRiKc6DPI9hMyVLacolZ0MY3PeLPmAzkSdXLUpe+Vd/w== dependencies: - "@jsii/spec" "^1.60.0" + "@jsii/spec" "^1.62.0" camelcase "^6.3.0" chalk "^4" fs-extra "^9.1.0" - jsii-reflect "^1.60.0" + jsii-reflect "^1.62.0" yargs "^16.2.0" babel-jest@^27.5.1: @@ -4320,6 +3454,20 @@ bin-links@^3.0.0: rimraf "^3.0.0" write-file-atomic "^4.0.0" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -4340,7 +3488,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.1: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -4432,7 +3580,7 @@ byte-size@^7.0.0: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== -cacache@^15.0.5, cacache@^15.2.0: +cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -4480,16 +3628,6 @@ cacache@^16.0.0, cacache@^16.0.6, cacache@^16.1.0: tar "^6.1.11" unique-filename "^1.1.1" -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4512,7 +3650,7 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -4537,11 +3675,19 @@ caniuse-lite@^1.0.30001349: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz#95c5efdb64148bb4870771749b9a619304755ce5" integrity sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg== -case@^1.6.3: +case@1.6.3, case@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4551,7 +3697,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4569,10 +3715,20 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= +chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" chownr@^2.0.0: version "2.0.0" @@ -4599,27 +3755,28 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^3.1.0: +cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" +cli-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -4648,13 +3805,6 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= -cmd-shim@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" - integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== - dependencies: - mkdirp-infer-owner "^2.0.0" - cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" @@ -4667,10 +3817,10 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -codemaker@^1.61.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/codemaker/-/codemaker-1.61.0.tgz#effa25a75f24db254a850ea04cc691aa67c92918" - integrity sha512-do01ygDHvcw0ZqV4isyzwMMJmAO+LtqROLC3dlp6XJk7XdTaZHoyMXRLoDdB50o4QLmGf2NZEVZmbKEOOXNYRw== +codemaker@^1.63.2: + version "1.63.2" + resolved "https://registry.yarnpkg.com/codemaker/-/codemaker-1.63.2.tgz#135ec2b19af1c21a522526f26f91bc37885cfd4b" + integrity sha512-cb0fQK8kHE7NVl4V98evbDhEwXsObujJLVGbQJXJ1W9O2c6DTKzJ0hct+NnQqAEaAgll9qUJbWxTsIlSoqLOsQ== dependencies: camelcase "^6.3.0" decamelize "^5.0.1" @@ -4735,11 +3885,6 @@ common-ancestor-path@^1.0.1: resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - commonmark@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.30.0.tgz#38811dc7bbf0f59d277ae09054d4d73a332f2e45" @@ -4786,10 +3931,10 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -constructs@^3.3.69: - version "3.3.161" - resolved "https://registry.yarnpkg.com/constructs/-/constructs-3.3.161.tgz#9726b1d450f3b9aca7907230f2248e3fd4058ce4" - integrity sha512-/27vW3fo0iyb3py4vKI1BduEYmv8vv8uJgLXvI+5F0Jbnn0/E+As2wkGMa7bumhzCd0Ckv/USkAXstGYVXTYQA== +constructs@^10.0.0: + version "10.1.54" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.1.54.tgz#569849c9bb20f5626efff1fd44c91f65247ba08c" + integrity sha512-zpHUVzv/FaEdZzdbz8N0H6kXxpvJaAqaLVD/OpCMzVyqqAkv/CAi9N/zFuFwuc/EJZLmDY9Kx4uNIQYX/NI3jA== conventional-changelog-angular@^5.0.12: version "5.0.13" @@ -4836,7 +3981,7 @@ conventional-changelog-conventionalcommits@^4.5.0: lodash "^4.17.15" q "^1.5.1" -conventional-changelog-core@^4.2.1, conventional-changelog-core@^4.2.2: +conventional-changelog-core@^4.2.1, conventional-changelog-core@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== @@ -4986,12 +4131,7 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5000,11 +4140,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -5036,21 +4171,21 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-format@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" - integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== +date-format@^4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.13.tgz#87c3aab3a4f6f37582c5f5f63692d2956fa67890" + integrity sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ== dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: ms "2.1.2" debug@^2.6.9: @@ -5067,13 +4202,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -5087,7 +4215,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5102,11 +4230,6 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5122,13 +4245,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== - dependencies: - strip-bom "^4.0.0" - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -5144,6 +4260,11 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5151,6 +4272,14 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + defined@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" @@ -5209,21 +4338,11 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diff@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5266,6 +4385,11 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dotenv@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + dotgitignore@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dotgitignore/-/dotgitignore-2.1.0.tgz#a4b15a4e4ef3cf383598aaf1dfa4a04bcc089b7b" @@ -5334,7 +4458,22 @@ encoding@^0.1.12, encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -enquirer@^2.3.5: +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -5406,6 +4545,35 @@ es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5415,11 +4583,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5460,16 +4623,18 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-import-resolver-typescript@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" - integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== +eslint-import-resolver-typescript@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.4.2.tgz#9ee568aad73e63eee37b7b5344da5467806b90a3" + integrity sha512-8SuWlRIEO83X9PsJSK9VjgH0EDk1ZzNI36+r3C0xNYVJ+O1+TprOFtTwqqyPMHG+br/I9A5Q80RE7K3/eIr9XA== dependencies: debug "^4.3.4" - glob "^7.2.0" + enhanced-resolve "^5.10.0" + get-tsconfig "^4.2.0" + globby "^13.1.2" + is-core-module "^2.9.0" is-glob "^4.0.3" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" + synckit "^0.8.3" eslint-module-utils@^2.7.3: version "2.7.3" @@ -5507,17 +4672,17 @@ eslint-plugin-import@^2.26.0: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" - integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== +eslint-plugin-jest@^26.8.3: + version "26.8.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.8.3.tgz#f5d9bb162636491c8f6f0cd2743fe67c86569338" + integrity sha512-2roWu1MkEiihQ/qEszPPoaoqVI1x2D8Jtadk5AmoXTdEeNVPMu01Dtz7jIuTOAmdW3L+tSkPZOtEtQroYJDt0A== dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" + "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-license-header@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-license-header/-/eslint-plugin-license-header-0.4.0.tgz#3e83825ed8e8bf3f83009e97cd1dd30531b6481e" - integrity sha512-KNpyxD+r8d9VoioyaHofUDsrYO+epVv/WjGZKugfO+qVN1KvHi/LwpXXY1618OCOYEaRNXZeRUtbOIb2YvJXTw== +eslint-plugin-license-header@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.0.tgz#81b0bab59da5a752d3a129f04bd0ca35bb6b07a2" + integrity sha512-IEywStBWaDBDMkogYoKUAdaOuomZ+YaQmdoSD2vHmXobekM+XuP6SWLlvwUUhIbdocn3MTlb5CUJ8E4VHz1c/w== dependencies: requireindex "^1.2.0" @@ -5529,12 +4694,13 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^3.0.0: version "3.0.0" @@ -5543,75 +4709,69 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0: +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.22.0: + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.3" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" + find-up "^5.0.0" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -5701,7 +4861,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1: +fast-glob@3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== @@ -5752,7 +4912,7 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^3.0.0, figures@^3.1.0: +figures@3.2.0, figures@^3.0.0, figures@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -5773,20 +4933,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= - -find-cache-dir@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -5825,23 +4971,27 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: version "3.2.4" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== -flatted@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== +flatted@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" + is-callable "^1.1.3" form-data@^3.0.0: version "3.0.1" @@ -5852,10 +5002,10 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^10.1.0: version "10.1.0" @@ -5866,6 +5016,15 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -5888,7 +5047,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@2.3.2, fsevents@^2.3.2: +fsevents@2.3.2, fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5898,11 +5057,26 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -5922,12 +5096,21 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -5969,6 +5152,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" + integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== + git-raw-commits@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" @@ -5996,20 +5184,20 @@ git-semver-tags@^4.0.0, git-semver-tags@^4.1.1: meow "^8.0.0" semver "^6.0.0" -git-up@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" - integrity sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA== +git-up@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-6.0.0.tgz#dbd6e4eee270338be847a0601e6d0763c90b74db" + integrity sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA== dependencies: - is-ssh "^1.3.0" - parse-url "^6.0.0" + is-ssh "^1.4.0" + parse-url "^7.0.2" -git-url-parse@^11.4.4: - version "11.6.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.6.0.tgz#c634b8de7faa66498a2b88932df31702c67df605" - integrity sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g== +git-url-parse@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-12.0.0.tgz#4ba70bc1e99138321c57e3765aaf7428e5abb793" + integrity sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q== dependencies: - git-up "^4.0.0" + git-up "^6.0.0" gitconfiglocal@^1.0.0: version "1.0.0" @@ -6018,17 +5206,24 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -glob-parent@^5.1.1, glob-parent@^5.1.2: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -6037,7 +5232,7 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.2.0: +glob@^7.1.1, glob@^7.1.2: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6049,6 +5244,18 @@ glob@^7.1.2, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3, glob@^7.1.4: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.0.1: version "8.0.3" resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" @@ -6065,26 +5272,19 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" -globby@^11.0.2, globby@^11.0.4: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@^11.0.3: +globby@^11.0.2, globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6096,21 +5296,32 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +globby@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + handlebars@^4.7.6: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -6133,6 +5344,11 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6143,11 +5359,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6167,19 +5395,18 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" @@ -6273,13 +5500,6 @@ ieee754@^1.1.13, ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - ignore-walk@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" @@ -6287,12 +5507,7 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -6356,37 +5571,39 @@ ini@^1.3.2, ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" - integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== +init-package-json@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" + integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== dependencies: - npm-package-arg "^8.1.5" + npm-package-arg "^9.0.1" promzard "^0.3.0" - read "~1.0.1" - read-package-json "^4.1.1" + read "^1.0.7" + read-package-json "^5.0.0" semver "^7.3.5" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^3.0.0" + validate-npm-package-name "^4.0.0" -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== +inquirer@^8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== dependencies: ansi-escapes "^4.2.1" - chalk "^4.1.0" + chalk "^4.1.1" cli-cursor "^3.1.0" cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.19" + lodash "^4.17.21" mute-stream "0.0.8" + ora "^5.4.1" run-async "^2.4.0" - rxjs "^6.6.0" + rxjs "^7.5.5" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" + wrap-ansi "^7.0.0" internal-slot@^1.0.3: version "1.0.3" @@ -6402,6 +5619,14 @@ ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6414,6 +5639,13 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -6422,12 +5654,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.4: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -6439,14 +5666,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-core-module@^2.8.1: +is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -6460,6 +5680,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6475,13 +5700,25 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -6492,6 +5729,11 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + is-number-object@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" @@ -6549,12 +5791,19 @@ is-shared-array-buffer@^1.0.1: resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== -is-ssh@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" - integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-ssh@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== dependencies: - protocols "^1.1.0" + protocols "^2.0.1" is-stream@^2.0.0: version "2.0.1" @@ -6582,11 +5831,27 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" @@ -6594,10 +5859,19 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.0" -is-windows@^1.0.2: +is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" @@ -6619,28 +5893,11 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - istanbul-lib-instrument@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.0.4.tgz#e976f2aa66ebc6737f236d3ab05b76e36f885c80" @@ -6663,19 +5920,6 @@ istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-processinfo@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" - integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.0" - istanbul-lib-coverage "^3.0.0-alpha.1" - make-dir "^3.0.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^3.3.3" - istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -6694,14 +5938,6 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384" - integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - istanbul-reports@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" @@ -6893,10 +6129,10 @@ jest-jasmine2@^27.5.1: pretty-format "^27.5.1" throat "^6.0.1" -jest-junit@^13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-13.2.0.tgz#66eeb86429aafac8c1745a70f44ace185aacb943" - integrity sha512-B0XNlotl1rdsvFZkFfoa19mc634+rrd8E4Sskb92Bb8MmSXeWV9XJGUyctunZS1W410uAxcyYuPUGVnbcOH8cg== +jest-junit@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-14.0.0.tgz#f69fc31bab32224848f443480c2c808fccb2a802" + integrity sha512-kALvBDegstTROfDGXH71UGD7k5g7593Y1wuX1wpWT+QTYcBbmtuGOA8UlAt56zo/B2eMIOcaOVEON3j0VXVa4g== dependencies: mkdirp "^1.0.4" strip-ansi "^6.0.1" @@ -7070,7 +6306,7 @@ jest-snapshot@^27.5.1: pretty-format "^27.5.1" semver "^7.3.2" -jest-util@^27.0.0, jest-util@^27.5.1: +jest-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== @@ -7082,6 +6318,18 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -7135,6 +6383,13 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -7181,85 +6436,85 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsii-diff@^1.60.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/jsii-diff/-/jsii-diff-1.61.0.tgz#7f54fbac7018a8a436b732a6bf48d34b37871e23" - integrity sha512-nZWn3/FA2Tq4ll+Vx+xfpBZ4ElQVqHmLUtXcZtq3Gys+d1p5JTLoVWFafS+hXOE9yh9dQbUovAx0urmHl+0wRg== - dependencies: - "@jsii/check-node" "1.61.0" - "@jsii/spec" "^1.61.0" - fs-extra "^10.1.0" - jsii-reflect "^1.61.0" - log4js "^6.5.2" - yargs "^16.2.0" - -jsii-pacmak@^1.60.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/jsii-pacmak/-/jsii-pacmak-1.61.0.tgz#90b66694305df4c5713fc99615bdc0209f1f7093" - integrity sha512-XFrUx19TZcP+NBO29P5Q/fegRURXs4UaH8l2+/OITn1PXGOhEq/eCA6TDpdrLXtyt6ebkrLemsrDd0ZW4d0Qvg== +jsii-pacmak@^1.63.1: + version "1.63.2" + resolved "https://registry.yarnpkg.com/jsii-pacmak/-/jsii-pacmak-1.63.2.tgz#e42f62e2319c12049eafc669730ba0d37be47e81" + integrity sha512-pIHkmLXlLqaTdKW7ALzRrBXRkQayA5kQ8rAvbXu50C1UDPV0CIZuXftC1BeHgRqfQNmGluX0PsTcF0jF2zyfBw== dependencies: - "@jsii/check-node" "1.61.0" - "@jsii/spec" "^1.61.0" + "@jsii/check-node" "1.63.2" + "@jsii/spec" "^1.63.2" clone "^2.1.2" - codemaker "^1.61.0" + codemaker "^1.63.2" commonmark "^0.30.0" escape-string-regexp "^4.0.0" fs-extra "^10.1.0" - jsii-reflect "^1.61.0" - jsii-rosetta "^1.61.0" + jsii-reflect "^1.63.2" + jsii-rosetta "^1.63.2" semver "^7.3.7" spdx-license-list "^6.6.0" xmlbuilder "^15.1.1" yargs "^16.2.0" -jsii-reflect@^1.60.0, jsii-reflect@^1.61.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.61.0.tgz#23a2b0151987dd9cc27fb046abe40c87dee8f8d8" - integrity sha512-nqBylNBqJJoTJR9TpywW5i55zaOWlNxJTHSWyVYJnrp5ZuYI2R0+nMUxux1hT0Zbd77KbRHXeSByW1aQ6Mfi/A== +jsii-reflect@^1.62.0: + version "1.62.0" + resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.62.0.tgz#2a116e50d91f0cfe42b1501ef15cd2e95902a7be" + integrity sha512-oMNxK1sctAl635m6IyCV9GWAljWjN5bE29Jn2+H4hiPVbNaWgGiyl74DqVTWJlPcrqVaHP+56ZmuYqputWaMOw== dependencies: - "@jsii/check-node" "1.61.0" - "@jsii/spec" "^1.61.0" + "@jsii/check-node" "1.62.0" + "@jsii/spec" "^1.62.0" chalk "^4" fs-extra "^10.1.0" - oo-ascii-tree "^1.61.0" + oo-ascii-tree "^1.62.0" yargs "^16.2.0" -jsii-rosetta@^1.61.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/jsii-rosetta/-/jsii-rosetta-1.61.0.tgz#ea82332545481aa373ac5b4826a303d16ec46b13" - integrity sha512-n8y3er0nOchLo17Wh0/yVmCDGNuwlhccp/Liwvl0ewf0hYMC5vICjWTIdCetsRoQQIOuc4pOmMNomldTTlPUUw== +jsii-reflect@^1.63.1, jsii-reflect@^1.63.2: + version "1.63.2" + resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.63.2.tgz#1f8d130a1cb5a03b30651543dd52c77eb9f620fe" + integrity sha512-eawNN/ySYVznYY2ZJYe5FNcSly12KgC8/MBDl4qln3daag3Ts/d7ocfbS9sjFayn4AhBojq1h1DDs8sjoG38Kg== dependencies: - "@jsii/check-node" "1.61.0" - "@jsii/spec" "1.61.0" + "@jsii/check-node" "1.63.2" + "@jsii/spec" "^1.63.2" + chalk "^4" + fs-extra "^10.1.0" + oo-ascii-tree "^1.63.2" + yargs "^16.2.0" + +jsii-rosetta@^1.63.2: + version "1.63.2" + resolved "https://registry.yarnpkg.com/jsii-rosetta/-/jsii-rosetta-1.63.2.tgz#42c1ee7a418392f0dcee8fa89277559871b76117" + integrity sha512-cBl8uAtNYuWqrwGue2Sr7cdgPhWx/QiAAE70lDec0OtBSNdGq0MUA04GD1/peQw4LPhE+1ikdeyspJYJaTtQgg== + dependencies: + "@jsii/check-node" "1.63.2" + "@jsii/spec" "1.63.2" "@xmldom/xmldom" "^0.8.2" commonmark "^0.30.0" fast-glob "^3.2.11" fs-extra "^10.1.0" - jsii "1.61.0" + jsii "1.63.2" semver "^7.3.7" semver-intersect "^1.4.0" sort-json "^2.0.1" - typescript-3.9 "npm:typescript@~3.9.10" + typescript "~3.9.10" workerpool "^6.2.1" yargs "^16.2.0" -jsii@1.61.0, jsii@^1.60.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/jsii/-/jsii-1.61.0.tgz#085af3c3ccfacaf5450907062a32be0c7ecbd8a1" - integrity sha512-haGNRe3k0bhTqUKjMQ/ZBq9H3BR7gB88+wSdvCzQ9IIN6XJNeTB9SvB5ry9XIwn6qk8THF7LXtaLga9Nzz+gFA== +jsii@1.63.2, jsii@^1.63.1: + version "1.63.2" + resolved "https://registry.yarnpkg.com/jsii/-/jsii-1.63.2.tgz#6042f7d1239f939ef0df28c41e090a3c221ac8f6" + integrity sha512-KHnsuTm4ErLiB4JNvPi/TzJuIXeqkMim95Qs9KG5M8tfDd/GHlsotwxNx9qfG2R7DdAWrH0MG+kd1wKIAl+GFw== dependencies: - "@jsii/check-node" "1.61.0" - "@jsii/spec" "^1.61.0" + "@jsii/check-node" "1.63.2" + "@jsii/spec" "^1.63.2" case "^1.6.3" chalk "^4" fast-deep-equal "^3.1.3" fs-extra "^10.1.0" - log4js "^6.5.2" + log4js "^6.6.1" semver "^7.3.7" semver-intersect "^1.4.0" sort-json "^2.0.1" spdx-license-list "^6.6.0" - typescript-3.9 "npm:typescript@~3.9.10" + typescript "~3.9.10" yargs "^16.2.0" json-parse-better-errors@^1.0.1: @@ -7297,11 +6552,6 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@2.x, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -7309,12 +6559,22 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonc-parser@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" @@ -7365,29 +6625,30 @@ lazy@^1.0.11: resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA= -lerna@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-5.1.4.tgz#57b1cd1fc0078f3c5009a07a7f7a4f8b85929b70" - integrity sha512-WwSbMslPxWSV7ARsGzkhJAFC1uQcuNGgiy2vZho4bpXVC+A7ZLXy8FngDbcAn7hCGC3ZDnl/4jdY6d84j63Y4g== - dependencies: - "@lerna/add" "5.1.4" - "@lerna/bootstrap" "5.1.4" - "@lerna/changed" "5.1.4" - "@lerna/clean" "5.1.4" - "@lerna/cli" "5.1.4" - "@lerna/create" "5.1.4" - "@lerna/diff" "5.1.4" - "@lerna/exec" "5.1.4" - "@lerna/import" "5.1.4" - "@lerna/info" "5.1.4" - "@lerna/init" "5.1.4" - "@lerna/link" "5.1.4" - "@lerna/list" "5.1.4" - "@lerna/publish" "5.1.4" - "@lerna/run" "5.1.4" - "@lerna/version" "5.1.4" +lerna@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-5.4.3.tgz#a0a7f24de87b7e4dc4eed5547c07c5dc0865d785" + integrity sha512-PypijMk4Jii8DoWGRLiHhBUaqpjXAmrwbs6uUZgyb07JrqCrXW3nhAyzdZE5S0rk1/sRzjd10fYmntOgNFfKBw== + dependencies: + "@lerna/add" "5.4.3" + "@lerna/bootstrap" "5.4.3" + "@lerna/changed" "5.4.3" + "@lerna/clean" "5.4.3" + "@lerna/cli" "5.4.3" + "@lerna/create" "5.4.3" + "@lerna/diff" "5.4.3" + "@lerna/exec" "5.4.3" + "@lerna/import" "5.4.3" + "@lerna/info" "5.4.3" + "@lerna/init" "5.4.3" + "@lerna/link" "5.4.3" + "@lerna/list" "5.4.3" + "@lerna/publish" "5.4.3" + "@lerna/run" "5.4.3" + "@lerna/version" "5.4.3" import-local "^3.0.2" npmlog "^6.0.2" + nx ">=14.5.4 < 16" level-codec@^9.0.0: version "9.0.2" @@ -7472,26 +6733,26 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libnpmaccess@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" - integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== +libnpmaccess@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" + integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== dependencies: aproba "^2.0.0" minipass "^3.1.1" - npm-package-arg "^8.1.2" - npm-registry-fetch "^11.0.0" - -libnpmpublish@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" - integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== + npm-package-arg "^9.0.1" + npm-registry-fetch "^13.0.0" + +libnpmpublish@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.4.tgz#adb41ec6b0c307d6f603746a4d929dcefb8f1a0b" + integrity sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg== dependencies: - normalize-package-data "^3.0.2" - npm-package-arg "^8.1.2" - npm-registry-fetch "^11.0.0" - semver "^7.1.3" - ssri "^8.0.1" + normalize-package-data "^4.0.0" + npm-package-arg "^9.0.1" + npm-registry-fetch "^13.0.0" + semver "^7.3.7" + ssri "^9.0.0" lines-and-columns@^1.1.6: version "1.1.6" @@ -7553,11 +6814,6 @@ lock@^1.1.0: resolved "https://registry.yarnpkg.com/lock/-/lock-1.1.0.tgz#53157499d1653b136ca66451071fca615703fa55" integrity sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU= -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -7578,26 +6834,29 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log4js@^6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.5.2.tgz#9ae371e5b3cb3a3a209c24686e5547f8670834e5" - integrity sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.6.1.tgz#48f23de8a87d2f5ffd3d913f24ca9ce77895272f" + integrity sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A== dependencies: - date-format "^4.0.10" + date-format "^4.0.13" debug "^4.3.4" - flatted "^3.2.5" + flatted "^3.2.6" rfdc "^1.3.0" - streamroller "^3.1.1" + streamroller "^3.1.2" lru-cache@^6.0.0: version "6.0.0" @@ -7624,22 +6883,22 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@1.x: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.6: - version "10.1.7" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.7.tgz#b1402cb3c9fad92b380ff3a863cdae5414a42f76" - integrity sha512-J/2xa2+7zlIUKqfyXDCXFpH3ypxO4k3rgkZHPSZkyUYcBT/hM80M3oyKLM/9dVriZFiGeGGS2Ei+0v2zfhqj3Q== +make-fetch-happen@^10.0.3: + version "10.2.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz#0bde3914f2f82750b5d48c6d2294d2c74f985e5b" + integrity sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg== dependencies: agentkeepalive "^4.2.1" cacache "^16.1.0" @@ -7658,28 +6917,29 @@ make-fetch-happen@^10.0.6: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^8.0.9: - version "8.0.14" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" - integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== +make-fetch-happen@^10.0.6: + version "10.1.7" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.7.tgz#b1402cb3c9fad92b380ff3a863cdae5414a42f76" + integrity sha512-J/2xa2+7zlIUKqfyXDCXFpH3ypxO4k3rgkZHPSZkyUYcBT/hM80M3oyKLM/9dVriZFiGeGGS2Ei+0v2zfhqj3Q== dependencies: - agentkeepalive "^4.1.3" - cacache "^15.0.5" + agentkeepalive "^4.2.1" + cacache "^16.1.0" http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" + lru-cache "^7.7.1" + minipass "^3.1.6" minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" + minipass-fetch "^2.0.3" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" + negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^5.0.0" - ssri "^8.0.0" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" -make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: +make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== @@ -7718,15 +6978,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - mdurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -7801,6 +7052,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7836,7 +7094,7 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: +minipass-fetch@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== @@ -7995,13 +7253,23 @@ nise@^5.1.0, nise@^5.1.1: just-extend "^4.0.2" path-to-regexp "^1.7.0" -node-fetch@^2.6.1: +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" +node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + node-gyp-build@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" @@ -8023,18 +7291,27 @@ node-gyp@^8.4.1: tar "^6.1.2" which "^2.0.2" +node-gyp@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.1.0.tgz#c8d8e590678ea1f7b8097511dedf41fc126648f8" + integrity sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - node-releases@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" @@ -8062,7 +7339,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: +normalize-package-data@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== @@ -8082,7 +7359,7 @@ normalize-package-data@^4.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -8111,13 +7388,13 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-arg@^8.0.0, npm-package-arg@^8.1.0, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: - version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" - integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== +npm-package-arg@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" + integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" + hosted-git-info "^3.0.6" + semver "^7.0.0" validate-npm-package-name "^3.0.0" npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: @@ -8129,16 +7406,6 @@ npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: semver "^7.3.5" validate-npm-package-name "^4.0.0" -npm-packlist@^2.1.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" - integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== - dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - npm-packlist@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.0.tgz#f3fd52903a021009913a133732022132eb355ce7" @@ -8149,6 +7416,16 @@ npm-packlist@^5.1.0: npm-bundled "^1.1.2" npm-normalize-package-bin "^1.0.1" +npm-packlist@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + npm-pick-manifest@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz#76dda30a7cd6b99be822217a935c2f5eacdaca4c" @@ -8159,18 +7436,6 @@ npm-pick-manifest@^7.0.0: npm-package-arg "^9.0.0" semver "^7.3.5" -npm-registry-fetch@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" - integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== - dependencies: - make-fetch-happen "^9.0.1" - minipass "^3.1.3" - minipass-fetch "^1.3.0" - minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" - npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: version "13.1.1" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.1.1.tgz#26dc4b26d0a545886e807748032ba2aefaaae96b" @@ -8184,19 +7449,18 @@ npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: npm-package-arg "^9.0.1" proc-log "^2.0.0" -npm-registry-fetch@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" - integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== +npm-registry-fetch@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz#0ce10fa4a699a1e70685ecf41bbfb4150d74231b" + integrity sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg== dependencies: - "@npmcli/ci-detect" "^1.0.0" - lru-cache "^6.0.0" - make-fetch-happen "^8.0.9" - minipass "^3.1.3" - minipass-fetch "^1.3.0" + make-fetch-happen "^10.0.6" + minipass "^3.1.6" + minipass-fetch "^2.0.3" minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" + minizlib "^2.1.2" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" npm-run-path@^4.0.1: version "4.0.1" @@ -8216,48 +7480,56 @@ npmlog@^6.0.0, npmlog@^6.0.2: set-blocking "^2.0.0" nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-inspect@^1.11.0, object-inspect@^1.9.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" + integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== + +nx@14.5.7, "nx@>=14.5.4 < 16": + version "14.5.7" + resolved "https://registry.yarnpkg.com/nx/-/nx-14.5.7.tgz#dddf810d6efa921012f60fb9983ef76978e5a696" + integrity sha512-Pa1YeVZoLejpv3zuZvUNxQ+h3eb74uuYuFKCqUVg1IO7dVL6aCvJRS6BUHktc8x9BhKurK12bbWG1wahXkGJtw== + dependencies: + "@nrwl/cli" "14.5.7" + "@nrwl/tao" "14.5.7" + "@parcel/watcher" "2.0.4" + chalk "4.1.0" + chokidar "^3.5.1" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^7.0.2" + dotenv "~10.0.0" + enquirer "~2.3.6" + fast-glob "3.2.7" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^10.1.0" + glob "7.1.4" + ignore "^5.0.4" + js-yaml "4.1.0" + jsonc-parser "3.0.0" + minimatch "3.0.5" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.3.4" + string-width "^4.2.3" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^3.9.0" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.4.0" + yargs-parser "21.0.1" + +object-inspect@^1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8296,10 +7568,24 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -oo-ascii-tree@^1.61.0: - version "1.61.0" - resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.61.0.tgz#06e151afdc3c3051635e94380d7a53512e4e59c1" - integrity sha512-/7aCOm8qkHUdr4iy9qPs3ZbRoWN8FaShpII56LgSFy/YitvskT3SOx92KwcsE5Mipu/X43YcUYFWCS8nUlR3Xw== +oo-ascii-tree@^1.62.0: + version "1.62.0" + resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.62.0.tgz#6e1944a409885c0af1d6e7b8245be8d432c40e4f" + integrity sha512-i0TzJUeAZmo9Hqv5rgfXiMkvqNbugaCz7y8jofgApb3p8oMe5+D8aaHKY45vG+NMI97nk69vOm9z3dZZ9i1Fqg== + +oo-ascii-tree@^1.63.2: + version "1.63.2" + resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.63.2.tgz#d7688b868daa361c5f0c328bb00bff626a7e0047" + integrity sha512-2bfZc5i6X1jt+ecaYdsr3Sl5LBnDhe32LXR6+UrHcqr3kG2JW4KIHpTP/Au6oksJnTXIgON1rJcbscVCVtR0cg== + +open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" optionator@^0.8.1: version "0.8.3" @@ -8325,6 +7611,21 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -8389,13 +7690,6 @@ p-map-series@^2.1.0: resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -8445,17 +7739,7 @@ p-waterfall@^2.1.1: dependencies: p-reduce "^2.0.0" -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -pacote@^13.0.3, pacote@^13.0.5, pacote@^13.4.1: +pacote@^13.0.3: version "13.6.0" resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.0.tgz#79ea3d3ae5a2b29e2994dcf18d75494e8d888032" integrity sha512-zHmuCwG4+QKnj47LFlW3LmArwKoglx2k5xtADiMCivVWPgNRP5QyLDGOIjGjwOe61lhl1rO63m/VxT16pEHLWg== @@ -8482,6 +7766,33 @@ pacote@^13.0.3, pacote@^13.0.5, pacote@^13.4.1: ssri "^9.0.0" tar "^6.1.11" +pacote@^13.6.1: + version "13.6.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.1.tgz#ac6cbd9032b4c16e5c1e0c60138dfe44e4cc589d" + integrity sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw== + dependencies: + "@npmcli/git" "^3.0.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/run-script" "^4.1.0" + cacache "^16.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.6" + mkdirp "^1.0.4" + npm-package-arg "^9.0.0" + npm-packlist "^5.1.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.1" + proc-log "^2.0.0" + promise-retry "^2.0.1" + read-package-json "^5.0.0" + read-package-json-fast "^2.0.3" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8516,25 +7827,22 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-path@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" - integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== +parse-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-5.0.0.tgz#f933152f3c6d34f4cf36cfc3d07b138ac113649d" + integrity sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A== dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - qs "^6.9.4" - query-string "^6.13.8" + protocols "^2.0.0" -parse-url@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" - integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== +parse-url@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-7.0.2.tgz#d21232417199b8d371c6aec0cedf1406fd6393f0" + integrity sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg== dependencies: - is-ssh "^1.3.0" + is-ssh "^1.4.0" normalize-url "^6.1.0" - parse-path "^4.0.0" - protocols "^1.4.0" + parse-path "^5.0.0" + protocols "^2.0.1" parse5@6.0.1: version "6.0.1" @@ -8595,6 +7903,11 @@ picomatch@^2.0.4, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8620,7 +7933,7 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -8637,17 +7950,7 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -pretty-format@^27.0.0: - version "27.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5" - integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA== - dependencies: - "@jest/types" "^27.2.5" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^27.5.1: +pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -8666,18 +7969,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -8721,10 +8012,10 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -protocols@^1.1.0, protocols@^1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" - integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== prr@~1.0.1: version "1.0.1" @@ -8732,9 +8023,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@1.3.2: version "1.3.2" @@ -8751,23 +8042,6 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@^6.9.4: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== - dependencies: - side-channel "^1.0.4" - -query-string@^6.13.8: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -8793,11 +8067,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -read-cmd-shim@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" - integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== - read-cmd-shim@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" @@ -8811,27 +8080,7 @@ read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" -read-package-json@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-3.0.1.tgz#c7108f0b9390257b08c21e3004d2404c806744b9" - integrity sha512-aLcPqxovhJTVJcsnROuuzQvv6oziQx4zd3JvG0vGCL5MjTONUc4uJ90zCBC6R7W7oUKBNoR/F8pkyfVwlbxqng== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^3.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-json@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea" - integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^3.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-json@^5.0.0: +read-package-json@^5.0.0, read-package-json@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== @@ -8877,14 +8126,14 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@~1.0.1: +read@1, read@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8916,6 +8165,13 @@ readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -8924,18 +8180,20 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regexpp@^3.1.0: +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - dependencies: - es6-error "^4.0.1" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -8946,11 +8204,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requireindex@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -9037,23 +8290,23 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +rxjs@^7.5.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" + integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" + +safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -9088,25 +8341,25 @@ semver-intersect@^1.4.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.0.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.7: +semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -9184,29 +8437,16 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^4.0.0: +slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== smart-buffer@^4.1.0, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== - dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" - socks-proxy-agent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" @@ -9225,7 +8465,7 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.1: +socks@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== @@ -9264,7 +8504,7 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" -source-map-support@^0.5.21, source-map-support@^0.5.6: +source-map-support@^0.5.6: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9287,18 +8527,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -9330,11 +8558,6 @@ spdx-license-list@^6.6.0: resolved "https://registry.yarnpkg.com/spdx-license-list/-/spdx-license-list-6.6.0.tgz#403e1807fd87ef2b4781677bc91896d23eaed4ea" integrity sha512-vLwdf9AWgdJQmG8cai2HKfkInFsliKaCCOwXmdVonClIhdURTX61KdDOoXC1qcQ7gDaZj+CUTcrMJeAdnCtrKA== -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -9361,7 +8584,7 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -ssri@^9.0.0: +ssri@^9.0.0, ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== @@ -9395,19 +8618,14 @@ standard-version@^9.5.0: stringify-package "^1.0.1" yargs "^16.0.0" -streamroller@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" - integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== +streamroller@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.2.tgz#abd444560768b340f696307cf84d3f46e86c0e63" + integrity sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A== dependencies: - date-format "^4.0.10" + date-format "^4.0.13" debug "^4.3.4" - fs-extra "^10.1.0" - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + fs-extra "^8.1.0" string-length@^4.0.1: version "4.0.2" @@ -9439,6 +8657,15 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -9447,6 +8674,15 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -9560,16 +8796,29 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9, table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +synckit@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.3.tgz#f36ca23fb7cbcf2b2b78c9e553ce6764dc6aa415" + integrity sha512-1goXnDYNJlKwCM37f5MTzRwo+8SqutgVtg2d37D6YnHHT4E3IhQMRfKiGdfTZU7LBlI6T8inCQUxnMBFHrbqWw== dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" + "@pkgr/utils" "^2.3.0" + tslib "^2.4.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-stream@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: version "6.1.11" @@ -9640,6 +8889,14 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9647,6 +8904,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -9700,40 +8964,21 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-jest@^27.1.5: - version "27.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" - integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== +ts-jest@^28.0.8: + version "28.0.8" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" lodash.memoize "4.x" make-error "1.x" semver "7.x" - yargs-parser "20.x" - -ts-node@^10.8.1: - version "10.8.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" - integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: + yargs-parser "^21.0.1" + +tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== @@ -9743,11 +8988,16 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.11.1, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" @@ -9804,7 +9054,7 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.0, type-fest@^0.8.1: +type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -9821,15 +9071,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -"typescript-3.9@npm:typescript@~3.9.10": +typescript@~3.9.10: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== -typescript@~4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" - integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== +typescript@~4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== uglify-js@^3.1.4: version "3.14.2" @@ -9846,6 +9096,16 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -9865,7 +9125,7 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.2: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -9900,27 +9160,29 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util@^0.12.4: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + uuid@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== -uuid@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-compile-cache@^2.0.3: +v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -9982,7 +9244,7 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" -wcwidth@^1.0.0: +wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= @@ -10044,10 +9306,17 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" which@^2.0.1, which@^2.0.2: version "2.0.2" @@ -10078,15 +9347,6 @@ workerpool@^6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -10110,7 +9370,7 @@ write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: +write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== @@ -10120,7 +9380,7 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0: +write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== @@ -10162,9 +9422,9 @@ write-pkg@^4.0.0: write-json-file "^3.2.0" ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xml-name-validator@^3.0.0: version "3.0.0" @@ -10204,11 +9464,6 @@ xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -10229,35 +9484,20 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@21.0.1: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" +yargs-parser@^21.0.0, yargs-parser@^21.0.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" @@ -10272,10 +9512,18 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yargs@^17.4.0: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" yocto-queue@^0.1.0: version "0.1.0"