diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bcff67ba0..29aea89ed 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,6 +13,12 @@ updates: ignore: - dependency-name: "@types/node" versions: ">=11.0.0-0" + - dependency-name: "constructs" + versions: ">=3.0.4" - dependency-name: "@aws-cdk/*" commit-message: prefix: "chore(deps):" + - package-ecosystem: "github-actions" + directory: "/" # Location of .github/workflows + schedule: + interval: "daily" diff --git a/.github/semantic.yml b/.github/semantic.yml new file mode 100644 index 000000000..e8debf0d5 --- /dev/null +++ b/.github/semantic.yml @@ -0,0 +1,2 @@ +# Configuration for Semantic Pull Requests +titleOnly: true diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml new file mode 100644 index 000000000..4ffe15b0b --- /dev/null +++ b/.github/workflows/auto-approve.yml @@ -0,0 +1,15 @@ +# Automatically approve PRs made by Dependabot + +name: Auto Approve Dependabot PR's + +on: + pull_request + +jobs: + auto-approve: + runs-on: ubuntu-latest + steps: + - uses: hmarr/auto-approve-action@v2.0.0 + if: github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]' + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2324f92a..429a9db88 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v2.1.2 with: node-version: ${{ matrix.node-version }} - run: yarn global add typescript diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 87095e308..c31d86ac3 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -13,14 +13,13 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v1 + uses: actions/checkout@v2 - name: Run Labeler if: success() - uses: crazy-max/ghaction-github-labeler@v2 + uses: crazy-max/ghaction-github-labeler@v3 with: - yaml_file: .github/config/labels.yml - skip_delete: false - dry_run: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} + yaml-file: .github/config/labels.yml + skip-delete: false + dry-run: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 373440dea..ee16af82a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,29 @@ 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. +## [0.18.0](https://github.com/aws/aws-rfdk/compare/v0.17.0...v0.18.0) (2020-10-13) + + +### Features + +* **bin:** Add simpler way to invoke stage-deadline ([#90](https://github.com/aws/aws-rfdk/issues/90)) ([cb68992](https://github.com/aws/aws-rfdk/commit/cb68992de1c72f7997de6ff81f1b0c09e88dacaf)) +* **deadline:** add ability to add spot event plugin managed policies to RenderQueue ([#141](https://github.com/aws/aws-rfdk/issues/141)) ([b2cf9e0](https://github.com/aws/aws-rfdk/commit/b2cf9e0cd8264b106e8f705f379181beb6916653)) +* **integ:** add ability to use hook function before each component test ([#155](https://github.com/aws/aws-rfdk/issues/155)) ([792586e](https://github.com/aws/aws-rfdk/commit/792586eeb5befedbe810ca6a91867ed006c029f0)) +* Update stage-deadline script with new version index ([#139](https://github.com/aws/aws-rfdk/issues/139)) ([9cbf99f](https://github.com/aws/aws-rfdk/commit/9cbf99f1a1f2effbfe85ab0ecbdcaecd418056db)) + + +### Bug Fixes + +* allowing empty log group prefixes ([#87](https://github.com/aws/aws-rfdk/issues/87)) ([e53571c](https://github.com/aws/aws-rfdk/commit/e53571c7d249f8efb81517af7031f264d0baf1d2)) +* **core:** Remove encryption on lifecycle SNS Topic ([#163](https://github.com/aws/aws-rfdk/issues/163)) ([5b663ca](https://github.com/aws/aws-rfdk/commit/5b663ca17713bdaf3f27aa568a6c4242ef2ceb61)), closes [#162](https://github.com/aws/aws-rfdk/issues/162) +* **deadline:** adding deadline version check for workers ([#100](https://github.com/aws/aws-rfdk/issues/100)) ([291f903](https://github.com/aws/aws-rfdk/commit/291f9033389157b745a0a812b4cb5584ea5fe05c)) +* **deadline:** adding version check for staging deadline ([#109](https://github.com/aws/aws-rfdk/issues/109)) ([75d0f9f](https://github.com/aws/aws-rfdk/commit/75d0f9fedce52de9dcfe73482965de923fa8941d)) +* **deadline:** Disable client SSL config for HTTP Render Queue ([#167](https://github.com/aws/aws-rfdk/issues/167)) ([fe347fa](https://github.com/aws/aws-rfdk/commit/fe347fa135d1b5008adb7990b93600f6638afc83)), closes [#165](https://github.com/aws/aws-rfdk/issues/165) +* **examples:** bump cdk core module version ([#122](https://github.com/aws/aws-rfdk/issues/122)) ([20db251](https://github.com/aws/aws-rfdk/commit/20db251d6b8fc53f8560637818e53e47ae106b49)) +* **examples:** Fix instructions and formatting in example app README ([#111](https://github.com/aws/aws-rfdk/issues/111)) ([f050f41](https://github.com/aws/aws-rfdk/commit/f050f41500b8d005d246c37e225895f0489debda)), closes [#105](https://github.com/aws/aws-rfdk/issues/105) +* **examples:** Minor fixes to Python example app REAME ([84b5ffa](https://github.com/aws/aws-rfdk/commit/84b5ffac9e282510c71f8e0348d24a573b2b337a)) +* **integ:** fix when PRE_COMPONENT_HOOK is undefined ([#166](https://github.com/aws/aws-rfdk/issues/166)) ([b4bfd4e](https://github.com/aws/aws-rfdk/commit/b4bfd4ec475c3e94002ac961c3b2ce6c8abd65ee)), closes [#164](https://github.com/aws/aws-rfdk/issues/164) + ## [0.17.0]() (Link not implemented) (2020-08-26) diff --git a/build.sh b/build.sh index 43f761efc..ed069e786 100755 --- a/build.sh +++ b/build.sh @@ -48,6 +48,6 @@ rm -rf $BUILD_INDICATOR echo "=============================================================================================" echo "building..." -time lerna run $bail --stream $runtarget || fail +time lerna run $bail --stream $runtarget --ignore 'all-in-farm**' || fail touch $BUILD_INDICATOR diff --git a/examples/deadline/All-In-AWS-Infrastructure-Basic/README.md b/examples/deadline/All-In-AWS-Infrastructure-Basic/README.md index dbb480f64..ba59673c7 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/README.md +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/README.md @@ -74,7 +74,7 @@ This sample application deploys a basic Deadline Render farm using Usage-Based L | | | v v v | | Health Monitor | | | | | | +-++ ++-+ | | | | | | | | | | ... | | | Monitors | +-------+ | | | -| | | +--+ +--+ <--------------+ | NLB | | | | +| | | +--+ +--+ <--------------+ | ALB | | | | | | | | | +-------+ | | | | | +-------------------+ | | | | | | +----------------+ | | 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 e587cc582..0d3e4f8a6 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/README.md @@ -12,66 +12,95 @@ These instructions assume that your working directory is `examples/deadline/All- --- -1. Install the dependencies of the sample app: -```bash -pip install -r requirements.txt -``` -2. Change the value in the `deadline_client_linux_ami_map` variable in `bin/config.py` to include the region + AMI ID mapping of your EC2 AMI(s) with Deadline Worker. -```python -# For example, in the us-west-2 region -self.deadline_client_linux_ami_map: Mapping[str, str] = {'us-west-2': ' --secret-binary fileb:// -``` -4. The output from the previous step will contain the secret's ARN. Change the value of the `ubl_certificate_secret_arn` variable in `bin/config.py` to the secret's ARN: -```python -self.ubl_certificate_secret_arn: str = '' -``` -5. Choose your UBL limits and change the value of the `ubl_licenses` variable in `bin/config.py` accordingly: -```python -self.ubl_licenses: List[UsageBasedLicense] = [ (e.g. UsageBasedLicense.forMaya(10))] -``` ---- +1. Install the dependencies of the sample app: -**Note:** The next two steps are optional. You may skip these if you do not need SSH access into your render farm. + ```bash + pip install -r requirements.txt + ``` +2. Change the value in the `deadline_client_linux_ami_map` variable in `package/config.py` to include the region + AMI ID mapping of your EC2 AMI(s) with Deadline Worker. ---- -6. Create an EC2 key pair to give you SSH access to the render farm: -```bash -aws ec2 create-key-pair --key-name -``` -7. Change the value of the `key_pair_name` variable in `bin/config.py` to your value for `` in the previous step:

**Note:** Save the value of the "KeyMaterial" field as a file in a secure location. This is your private key that you can use to SSH into the render farm. -```python -self.key_pair_name: Optional[str] = '' -``` -8. Choose the type of database you would like to deploy and change the value of the `deploy_mongo_db` variable in `bin/config.py` accordingly: -```python -# True = MongoDB, False = Amazon DocumentDB -self.deploy_mongo_db: bool = False -``` -9. If you set `deploy_mongo_db` to `True`, then you must accept the [SSPL license](https://www.mongodb.com/licensing/server-side-public-license) to successfully deploy MongoDB. To do so, change the value of `accept_sspl_license` in `bin/config.py`: -```python -self.accept_sspl_license: MongoDbSsplLicenseAcceptance = MongoDbSsplLicenseAcceptance.USER_REJECTS_SSPL -``` -10. Modify the `deadline_ver` field in the `config` block of `package.json` as desired, then stage the Docker recipes for `RenderQueue` and `UBLLicensing`: -```bash -# Set this value to the version of RFDK your application targets -RFDK_VERSION= -# Set this value to the version of AWS Thinkbox Deadline you'd like to deploy to your farm -RFDK_DEADLINE_VERSION= -npx --package=aws-rfdk@${RFDK_VERSION} stage-deadline \ - --deadlineInstallerURI s3://thinkbox-installers/Deadline/${RFDK_DEADLINE_VERSION}/Linux/DeadlineClient-${RFDK_DEADLINE_VERSION}-linux-x64-installer.run \ - --dockerRecipesURI s3://thinkbox-installers/DeadlineDocker/${RFDK_DEADLINE_VERSION}/DeadlineDocker-${RFDK_DEADLINE_VERSION}.tar.gz \ - --output stage -``` + ```python + # For example, in the us-west-2 region + self.deadline_client_linux_ami_map: Mapping[str, str] = { + 'us-west-2': '' + } + ``` +3. Create a binary secret in [SecretsManager](https://aws.amazon.com/secrets-manager/) that contains your [Usage-Based Licensing](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/aws-portal/licensing-setup.html?highlight=usage%20based%20licensing) certificates in a `.zip` file: + + ```bash + aws secretsmanager create-secret --name --secret-binary fileb:// + ``` +4. The output from the previous step will contain the secret's ARN. Change the value of the `ubl_certificate_secret_arn` variable in `package/config.py` to the secret's ARN: + + ```python + self.ubl_certificate_secret_arn: str = '' + ``` +5. Choose your UBL limits and change the value of the `ubl_licenses` variable in `package/config.py` accordingly. For example: + + ```python + self.ubl_licenses: List[UsageBasedLicense] = [ + # your UBL limits, for example: + + # up to 10 concurrent Maya licenses used at once + UsageBasedLicense.for_maya(10), + + # unlimited Arnold licenses + UsageBasedLicense.for_arnold() + ] + ``` + + --- + + **Note:** The next two steps are optional. You may skip these if you do not need SSH access into your render farm. + + --- +6. Create an EC2 key pair to give you SSH access to the render farm: + + ```bash + aws ec2 create-key-pair --key-name + ``` +7. Change the value of the `key_pair_name` variable in `package/config.py` to your value for `` in the previous step: + + **Note:** Save the value of the `"KeyMaterial"` field as a file in a secure location. This is your private key that you can use to SSH into the render farm. + + ```python + self.key_pair_name: Optional[str] = '' + ``` +8. Choose the type of database you would like to deploy (AWS DocumentDB or MongoDB). + If you would like to use MongoDB, you will need to accept the Mongo SSPL (see next step). + Once you've decided on a database type, change the value of the `deploy_mongo_db` variable in `package/config.py` accordingly: + + ```python + # True = MongoDB, False = Amazon DocumentDB + self.deploy_mongo_db: bool = False + ``` +9. If you set `deploy_mongo_db` to `True`, then you must accept the [SSPL license](https://www.mongodb.com/licensing/server-side-public-license) to successfully deploy MongoDB. To do so, change the value of `accept_sspl_license` in `package/config.py`: + + ```python + # To accept the MongoDB SSPL, change from USER_REJECTS_SSPL to USER_ACCEPTS_SSPL + self.accept_sspl_license: MongoDbSsplLicenseAcceptance = MongoDbSsplLicenseAcceptance.USER_REJECTS_SSPL + ``` +10. Stage the Docker recipes for `RenderQueue` and `UBLLicensing`: + + ```bash + # Set this value to the version of RFDK your application targets + RFDK_VERSION= + + # Set this value to the version of AWS Thinkbox Deadline you'd like to deploy to your farm. Deadline 10.1.9 and up are supported. + RFDK_DEADLINE_VERSION= + + npx --package=aws-rfdk@${RFDK_VERSION} stage-deadline \ + --deadlineInstallerURI s3://thinkbox-installers/Deadline/${RFDK_DEADLINE_VERSION}/Linux/DeadlineClient-${RFDK_DEADLINE_VERSION}-linux-x64-installer.run \ + --dockerRecipesURI s3://thinkbox-installers/DeadlineDocker/${RFDK_DEADLINE_VERSION}/DeadlineDocker-${RFDK_DEADLINE_VERSION}.tar.gz \ + --output stage + ``` 11. Deploy all the stacks in the sample app: -```bash -cdk deploy "*" -``` + + ```bash + cdk deploy "*" + ``` 13. Once you are finished with the sample app, you can tear it down by running: -```bash -cdk destroy "*" -``` \ No newline at end of file + + ```bash + cdk destroy "*" + ``` 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 3aeea95c6..2702c0076 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/python/setup.py @@ -18,7 +18,7 @@ install_requires=[ "aws-cdk.core==1.57.0", - "aws-rfdk==0.16.0" + "aws-rfdk==0.17.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 ef1705251..6f86fe685 100644 --- a/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md +++ b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/README.md @@ -12,65 +12,92 @@ These instructions assume that your working directory is `examples/deadline/All- --- -1. Install the dependencies of the sample app: -``` -yarn install -``` -2. Change the value in the `deadlineClientLinuxAmiMap` variable in `bin/config.ts` to include the region + AMI ID mapping of your EC2 AMI(s) with Deadline Worker. -```ts -// For example, in the us-west-2 region -public readonly deadlineClientLinuxAmiMap: Record = { - ['us-west-2']: '', - // ... - }; -``` -3. Create a binary secret in [SecretsManager](https://aws.amazon.com/secrets-manager/) that contains your [Usage-Based Licensing](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/aws-portal/licensing-setup.html?highlight=usage%20based%20licensing) certificates in a `.zip` file: -``` -aws secretsmanager create-secret --name --secret-binary fileb:// -``` -4. The output from the previous step will contain the secret's ARN. Change the value of the `ublCertificatesSecretArn` variable in `bin/config.ts` to the secret's ARN: -```ts -public readonly ublCertificatesSecretArn: string = ''; -``` -5. Choose your UBL limits and change the value of the `ublLicenses` variable in `bin/config.ts` accordingly: -```ts -public readonly ublLicenses: UsageBasedLicense[] = [ /* (e.g. UsageBasedLicense.forMaya(10)) */ ]; -``` ---- +1. Install the dependencies of the sample app: -**Note:** The next two steps are optional. You may skip these if you do not need SSH access into your render farm. + ``` + yarn install + ``` +2. Change the value in the `deadlineClientLinuxAmiMap` variable in `bin/config.ts` to include the region + AMI ID mapping of your EC2 AMI(s) with Deadline Worker. ---- -6. Create an EC2 key pair to give you SSH access to the render farm: -``` -aws ec2 create-key-pair --key-name -``` -7. Change the value of the `keyPairName` variable in `bin/config.ts` to your value for `` in the previous step:

**Note:** Save the value of the "KeyMaterial" field as a file in a secure location. This is your private key that you can use to SSH into the render farm. -```ts -public readonly keyPairName: string = ''; -``` -8. Choose the type of database you would like to deploy and change the value of the `deployMongoDB` variable in `bin/config.ts` accordingly: -```ts -// true = MongoDB, false = Amazon DocumentDB -public readonly deployMongoDB: boolean = false; -``` -9. If you set `deployMongoDB` to `true`, then you must accept the [SSPL license](https://www.mongodb.com/licensing/server-side-public-license) to successfully deploy MongoDB. To do so, change the value of `acceptSsplLicense` in `bin/config.ts`: -```ts -public readonly acceptSsplLicense: MongoDbSsplLicenseAcceptance = ; -``` -10. Modify the `deadline_ver` field in the `config` block of `package.json` as desired, then stage the Docker recipes for `RenderQueue` and `UBLLicensing`: -``` -yarn stage -``` + ```ts + // For example, in the us-west-2 region + public readonly deadlineClientLinuxAmiMap: Record = { + ['us-west-2']: '', + // ... + }; + ``` +3. Create a binary secret in [SecretsManager](https://aws.amazon.com/secrets-manager/) that contains your [Usage-Based Licensing](https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/aws-portal/licensing-setup.html?highlight=usage%20based%20licensing) certificates in a `.zip` file: + + ``` + aws secretsmanager create-secret --name --secret-binary fileb:// + ``` +4. The output from the previous step will contain the secret's ARN. Change the value of the `ublCertificatesSecretArn` variable in `bin/config.ts` to the secret's ARN: + + ```ts + public readonly ublCertificatesSecretArn: string = ''; + ``` +5. Choose your UBL limits and change the value of the `ublLicenses` variable in `bin/config.ts` accordingly. For example: + + ```ts + public readonly ublLicenses: UsageBasedLicense[] = [ + // your UBL limits, for example: + + // up to 10 concurrent Maya licenses used at once + UsageBasedLicense.forMaya(10), + + // unlimited Arnold licenses + UsageBasedLicense.forArnold() + ]; + ``` + + --- + + **Note:** The next two steps are optional. You may skip these if you do not need SSH access into your render farm. + + --- +6. Create an EC2 key pair to give you SSH access to the render farm: + + ``` + aws ec2 create-key-pair --key-name + ``` +7. Change the value of the `keyPairName` variable in `bin/config.ts` to your value for `` in the previous step: + + **Note:** Save the value of the `"KeyMaterial"` field as a file in a secure location. This is your private key that you can use to SSH into the render farm. + + ```ts + public readonly keyPairName: string = ''; + ``` +8. Choose the type of database you would like to deploy (AWS DocumentDB or MongoDB). + If you would like to use MongoDB, you will need to accept the Mongo SSPL (see next step). + Once you've decided on a database type, change the value of the `deployMongoDB` variable in `bin/config.ts` accordingly: + + ```ts + // true = MongoDB, false = Amazon DocumentDB + public readonly deployMongoDB: boolean = false; + ``` +9. If you set `deployMongoDB` to `true`, then you must accept the [SSPL license](https://www.mongodb.com/licensing/server-side-public-license) to successfully deploy MongoDB. To do so, change the value of `acceptSsplLicense` in `bin/config.ts`: + + ```ts + // To accept the MongoDB SSPL, change from USER_REJECTS_SSPL to USER_ACCEPTS_SSPL + public readonly acceptSsplLicense: MongoDbSsplLicenseAcceptance = MongoDbSsplLicenseAcceptance.USER_REJECTS_SSPL; + ``` +10. Modify the `deadline_ver` field in the `config` block of `package.json` as desired (Deadline 10.1.9 and up are supported), then stage the Docker recipes for `RenderQueue` and `UBLLicensing`: + + ``` + yarn stage + ``` 11. Build the sample app: -``` -yarn build -``` + + ``` + yarn build + ``` 12. Deploy all the stacks in the sample app: -``` -cdk deploy "*" -``` + + ``` + cdk deploy "*" + ``` 13. Once you are finished with the sample app, you can tear it down by running: -``` -cdk destroy "*" -``` + + ``` + cdk destroy "*" + ``` 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 e08ce79d4..dccaeb803 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 @@ -66,10 +66,7 @@ const network = new NetworkTier(app, 'NetworkTier', { env }); // --- Security Tier --- // // --------------------- // -const security = new SecurityTier(app, 'SecurityTier', { - env, - vpc: network.vpc, -}); +const security = new SecurityTier(app, 'SecurityTier', { env }); // -------------------- // // --- Storage Tier --- // 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 a998c7b8f..f4e4376af 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,24 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { - IVpc, -} from '@aws-cdk/aws-ec2'; import * as cdk from '@aws-cdk/core'; import { X509CertificatePem, } from 'aws-rfdk'; -/** - * Properties for {@link SecurityTier}. - */ -export interface SecurityTierProps extends cdk.StackProps { - /** - * The VPC to deploy resources into. - */ - readonly vpc: IVpc; -} - /** * The security tier of the render farm. This stack contains resources used to * ensure the render farm is secure. @@ -37,7 +24,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: SecurityTierProps) { + constructor(scope: cdk.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/package.json b/examples/deadline/All-In-AWS-Infrastructure-Basic/ts/package.json index 0582f2871..c838cc123 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.17.0", + "version": "0.18.0", "bin": { "app": "bin/app.js" }, @@ -18,14 +18,14 @@ "watch": "tsc -w" }, "devDependencies": { - "@types/node": "10.17.5", - "aws-cdk": "1.57.0", - "ts-node": "^8.1.0", - "typescript": "^3.8.3" + "@types/node": "^14.6.1", + "aws-cdk": "1.66.0", + "ts-node": "^9.0.0", + "typescript": "~3.9.7" }, "dependencies": { - "@aws-cdk/core": "1.57.0", - "aws-rfdk": "0.17.0", - "source-map-support": "^0.5.16" + "@aws-cdk/core": "1.66.0", + "aws-rfdk": "0.18.0", + "source-map-support": "^0.5.19" } } diff --git a/integ/.gitignore b/integ/.gitignore index e03f9a457..73e78aba7 100644 --- a/integ/.gitignore +++ b/integ/.gitignore @@ -11,6 +11,10 @@ yarn-error.log **/cdk.context.json test-output/ +# Deadline staging +stage/ +.e2etemp/ + # Include eslint config !.eslintrc.js diff --git a/integ/README.md b/integ/README.md index 3ab924373..3a7745548 100644 --- a/integ/README.md +++ b/integ/README.md @@ -6,44 +6,45 @@ To run all test suites: 1. Configure AWS credentials (tests will use the default AWS profile, so either set up a default profile in .aws/credentials or use temporary credentials). -1. If your AWS profile has a different default region fromw here the test app will be deployed, set the AWS_REGION variable to the desired region. +1. Set the environment variable CDK_DEFAULT_REGION to the region the test should be deployed in -1. Configure test-config.sh. This script sets environment variables which are necessary for the tests. Currently this includes: +1. Configure test-config.sh. This script configures which test modules will run and overrides certain default values. Currently these include: * Options required for all Deadline test components: * DEADLINE_VERSION - version of the Deadline repository installer used for the test * DEADLINE_STAGING_PATH - Complete path to local staging folder for Deadline assets (see `packages/aws-rfdk/docs/DockerImageRecipes.md` for more information) * Options required for the Deadline repository test component: * USER_ACCEPTS_SSPL_FOR_RFDK_TESTS - should be set to true. Setting this variable is considered acceptance of the terms of the SSPL license. Follow [this link](https://www.mongodb.com/licensing/server-side-public-license) to read the terms of the SSPL license. - * Options required for the Deadline worker fleet test component: + * Options required for the Deadline worker fleet test component (use `aws --region ec2 describe-images --owners 357466774442 --filters "Name=name,Values=*Worker*" "Name=name,Values=**" --query 'Images[*].[ImageId, Name]' --output text` to discover AMI's): * LINUX_DEADLINE_AMI_ID - set to the ID of an available Linux worker fleet AMI with Deadline installed. * WINDOWS_DEADLINE_AMI_ID - set to the ID of an available Windows worker fleet AMI with Deadline installed. 1. Execute `yarn run e2e` from the `integ` directory. This will handle deploying the necessary stacks, run the appropriate tests on them, and then tear them down. -1. Test output is stored in the `test-output` folder, stamped with the same ID tag attached to the stacks created during the test. - # Example Output: ```bash -PASS components/deadline/repository/test/deadline-repository.test.ts (13.218 s) - DocDB tests - ✓ DL-1-1: Deadline DB is initialized (3 ms) - ✓ DL-2-1: Deadline DB is initialized - EFS tests - ✓ DL-1-2: EFS is initialized (1 ms) - ✓ DL-2-2: EFS is initialized - ✓ DL-1-3: repository.ini version matches Deadline installer (1 ms) - ✓ DL-2-3: repository.ini version matches Deadline installer - CloudWatch LogGroup tests - ✓ DL-1-4: Verify CloudWatch LogGroup contains two LogStreams - ✓ DL-2-4: Verify CloudWatch LogGroup contains two LogStreams - ✓ DL-1-5: Verify cloud-init-output LogStream (1622 ms) - ✓ DL-2-5: Verify cloud-init-output LogStream (1608 ms) - ✓ DL-1-6: Verify DeadlineRepositoryInstallationLogs LogStream (510 ms) - ✓ DL-2-6: Verify DeadlineRepositoryInstallationLogs LogStream (672 ms) - -Test Suites: 1 passed, 1 total -Tests: 12 passed, 12 total -Snapshots: 0 total -Time: 13.803 s, estimated 19 s +Pretest setup runtime: 0m 8s +Infrastructure stack deploy runtime: 0m 9s +Infrastructure stack cleanup runtime: 1m 46s +Results for test component deadline_01_repository: + -Tests ran: 21 + -Tests passed: 21 + -Tests failed: 0 + -Deploy runtime: 0m 34s + -Test suite runtime: 0m 30s + -Cleanup runtime: 9m 0s +Results for test component deadline_02_renderQueue: + -Tests ran: 8 + -Tests passed: 8 + -Tests failed: 0 + -Deploy runtime: 23m 41s + -Test suite runtime: 0m 55s + -Cleanup runtime: 16m 2s +Results for test component deadline_03_workerFleet: + -Tests ran: 16 + -Tests passed: 16 + -Tests failed: 0 + -Deploy runtime: 49m 44s + -Test suite runtime: 3m 3s + -Cleanup runtime: 55m 34s ``` diff --git a/integ/components/deadline/common/functions/awaitSsmCommand.ts b/integ/components/deadline/common/functions/awaitSsmCommand.ts index 238d63b17..3379e7b2c 100644 --- a/integ/components/deadline/common/functions/awaitSsmCommand.ts +++ b/integ/components/deadline/common/functions/awaitSsmCommand.ts @@ -14,7 +14,7 @@ interface CommandResponse { // Custom function to send SSM command to run a particular script on the bastion instance, // wait for it to finish executing, then return the response. -export default function awaitSsmCommand(bastionId: string, params:SSM.SendCommandRequest){ +export default function awaitSsmCommand(bastionId: string, params: SSM.SendCommandRequest){ return new Promise( async (res) => { // Send the command diff --git a/integ/components/deadline/common/preflight/preflight.test.ts b/integ/components/deadline/common/preflight/preflight.test.ts deleted file mode 100644 index c0f5efba6..000000000 --- a/integ/components/deadline/common/preflight/preflight.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -const AWS_REGION = process.env.AWS_REGION?.toString(); -const DEADLINE_VERSION = process.env.DEADLINE_VERSION?.toString(); -const DEADLINE_STAGING_PATH = process.env.DEADLINE_STAGING_PATH?.toString(); - -test('AWS_REGION is set', () => { - expect(AWS_REGION).toBeTruthy(); -}); - -test('DEADLINE_VERSION is set', () => { - expect(DEADLINE_VERSION).toBeTruthy(); -}); - -test('DEADLINE_STAGING_PATH is set', () => { - expect(DEADLINE_STAGING_PATH).toBeTruthy(); -}); diff --git a/integ/components/deadline/common/scripts/bash/component_e2e.sh b/integ/components/deadline/common/scripts/bash/component_e2e.sh new file mode 100755 index 000000000..0feb4a6ff --- /dev/null +++ b/integ/components/deadline/common/scripts/bash/component_e2e.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +COMPONENT_NAME=${1:-undefined} +OPTION=${2:-undefined} + +if [[ $(basename $(pwd)) != $COMPONENT_NAME ]]; then + echo "ERROR: Script must be run from top directory of test component" + exit 1 +fi + +SKIP_TEST_CHECK=\$SKIP_${COMPONENT_NAME}_TEST +SKIP_TEST_CHECK=$(eval "echo $SKIP_TEST_CHECK" 2> /dev/null) || SKIP_TEST_CHECK=false +if [[ ! "${SKIP_TEST_CHECK}" = "true" ]]; then + + # Load utility functions + source "../common/scripts/bash/deploy-utils.sh" + + if [[ $OPTION != '--destroy-only' ]]; then + deploy_component_stacks $COMPONENT_NAME + execute_component_test $COMPONENT_NAME + fi + if [[ $OPTION != '--deploy-and-test-only' ]]; then + destroy_component_stacks $COMPONENT_NAME + fi +fi + +exit 0 diff --git a/integ/components/deadline/common/scripts/bash/deploy-utils.sh b/integ/components/deadline/common/scripts/bash/deploy-utils.sh new file mode 100755 index 000000000..a7af54264 --- /dev/null +++ b/integ/components/deadline/common/scripts/bash/deploy-utils.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +function deploy_component_stacks () { + COMPONENT_NAME=$1 + echo "Running $COMPONENT_NAME end-to-end test..." + + echo "Deploying test app for $COMPONENT_NAME test suite" + npx cdk deploy "*" --require-approval=never + echo "Test app $COMPONENT_NAME deployed." + + return 0 +} + +function execute_component_test () { + COMPONENT_NAME=$1 + echo "Running test suite $COMPONENT_NAME..." + yarn run test "$COMPONENT_NAME.test" --json --outputFile="./.e2etemp/$COMPONENT_NAME.json" + echo "Test suite $COMPONENT_NAME complete." + + return 0 +} + +function destroy_component_stacks () { + COMPONENT_NAME=$1 + echo "Destroying test app $COMPONENT_NAME..." + npx cdk destroy "*" -f + rm -f "./cdk.context.json" + rm -rf "./cdk.out" + echo "Test app $COMPONENT_NAME destroyed." + + return 0 +} diff --git a/integ/components/deadline/common/scripts/bastion/setup/install_deadline_client.sh b/integ/components/deadline/common/scripts/bastion/setup/install_deadline_client.sh deleted file mode 100644 index d10a2879b..000000000 --- a/integ/components/deadline/common/scripts/bastion/setup/install_deadline_client.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Script to install Deadline client on Bastion instance to test Deadline commands -# -# Input: -# None -# Output: -# Non-zero return code on failure. - -set -xeou pipefail - -sudo yum install -y lsb -sudo ./deadline-client-installer.run --mode unattended 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 new file mode 100644 index 000000000..02880ca37 --- /dev/null +++ b/integ/components/deadline/deadline_01_repository/bin/deadline_01_repository.ts @@ -0,0 +1,34 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { App, Stack } from '@aws-cdk/core'; +import { DatabaseType, StorageStruct } from '../../../../lib/storage-struct'; +import { RepositoryTestingTier } from '../lib/repository-testing-tier'; + +const app = new App(); +const env = { + account: process.env.CDK_DEFAULT_ACCOUNT, + region: process.env.CDK_DEFAULT_REGION, +}; + +const integStackTag = process.env.INTEG_STACK_TAG!.toString(); + +const componentTier = new Stack(app, 'RFDKInteg-DL-ComponentTier' + integStackTag, {env}); + +const structs: Array = [ + new StorageStruct(componentTier, 'StorageStruct1', { + integStackTag, + }), + new StorageStruct(componentTier, 'StorageStruct2', { + integStackTag, + databaseType: DatabaseType.DocDB, + }), + new StorageStruct(componentTier, 'StorageStruct3', { + integStackTag, + databaseType: DatabaseType.MongoDB, + }), +]; + +new RepositoryTestingTier(app, 'RFDKInteg-DL-TestingTier' + integStackTag, { env, integStackTag, structs }); diff --git a/integ/components/deadline/repository/cdk.json b/integ/components/deadline/deadline_01_repository/cdk.json similarity index 68% rename from integ/components/deadline/repository/cdk.json rename to integ/components/deadline/deadline_01_repository/cdk.json index ea162f8e1..e9e6fd71e 100644 --- a/integ/components/deadline/repository/cdk.json +++ b/integ/components/deadline/deadline_01_repository/cdk.json @@ -1,5 +1,5 @@ { - "app": "npx ts-node bin/deadline-repository.ts", + "app": "npx ts-node bin/deadline_01_repository.ts", "context": { "@aws-cdk/core:enableStackNameDuplicates": "true", "aws-cdk:enableDiffNoFail": "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 new file mode 100644 index 000000000..ff539ed7d --- /dev/null +++ b/integ/components/deadline/deadline_01_repository/lib/repository-testing-tier.ts @@ -0,0 +1,120 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path'; +import { ILogGroup } from '@aws-cdk/aws-logs'; +import { CfnOutput, Construct } from '@aws-cdk/core'; +import { MongoDbInstaller, MongoDbSsplLicenseAcceptance, MongoDbVersion } from 'aws-rfdk'; +import { Repository } from 'aws-rfdk/deadline'; +import { StorageStruct } from '../../../../lib/storage-struct'; +import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; + +/** + * Interface for RepositoryTestingTier properties + */ +export interface RepositoryTestingTierProps extends TestingTierProps { + /** + * Array of StorageStructs representing different test cases + */ + readonly structs: Array; +} + +/** + * Testing Tier for the Deadline Repository integration test + * + * Creates a test bastion and configures it to connect to one or more Deadline Repository constructs for testing + * + * Resources Deployed + * ------------------------ + * - A BastionLinuxHost instance + * + * Security Considerations + * ------------------------ + * - The bastion instance created by this test is configured to access farm resources on their default ports + * Test scripts stored on the bastion are used to read/write to the repository database and the file system. + * At execution the tests retrieve the value of secrets for the database password and authentication cert. + */ +export class RepositoryTestingTier extends TestingTier { + constructor(scope: Construct, id: string, props: RepositoryTestingTierProps) { + super(scope, id, props); + + const structs = props.structs; + structs.forEach( storageStruct => { + + const testSuiteId = 'DL' + (structs.indexOf(storageStruct) + 1).toString(); + + const repo = storageStruct.repo; + this.configureRepo(testSuiteId, repo); + + const database = storageStruct.database; + this.configureDatabase(testSuiteId, database); + + const efs = storageStruct.efs; + this.testInstance.connections.allowToDefaultPort(efs); + + const cert = storageStruct.database.cert; + this.configureCert(testSuiteId, cert); + }); + + this.configureBastionUserData({ + testingScriptPath: path.join(__dirname, '../scripts/bastion/testing'), + }); + this.fetchDocdbCert(); + this.installMongodb(); + + } + + /** + * Mounts the Deadline repository's file system to the bastion and outputs the name of its log group + * + * @param testSuiteId Test case to configure the repository for + * @param repo Repository object to connect to the test Bastion + */ + private configureRepo(testSuiteId: string, repo: Repository) { + + repo.fileSystem.mountToLinuxInstance(this.testInstance.instance, { + location: '/mnt/efs/fs' + testSuiteId.toLowerCase(), + }); + + const logGroup = repo.node.tryFindChild('RepositoryLogGroup') as ILogGroup; + if (logGroup) { + const logGroupName = logGroup.logGroupName; + new CfnOutput(this, 'logGroupName' + testSuiteId, { + value: logGroupName, + }); + } + else { + throw new Error('Error: Child "RepositoryLogGroup" not found on provided Repository object'); + } + } + + /** + * Installs MongoDB on the test instance + */ + protected installMongodb() { + const userAcceptsSSPL = process.env.USER_ACCEPTS_SSPL_FOR_RFDK_TESTS; + if (userAcceptsSSPL) { + const userSsplAcceptance = + userAcceptsSSPL.toString() === 'true' ? MongoDbSsplLicenseAcceptance.USER_ACCEPTS_SSPL : MongoDbSsplLicenseAcceptance.USER_REJECTS_SSPL; + const mongodbInstaller = new MongoDbInstaller(this, { + version: MongoDbVersion.COMMUNITY_3_6, + userSsplAcceptance, + }); + mongodbInstaller.installOnLinuxInstance(this.testInstance.instance); + } + } + + /** + * Adds user data to the bastion instance that fetches the shared DocDB cert bundle for authenticating to the database + */ + protected fetchDocdbCert() { + this.testInstance.instance.userData.addCommands( + 'cd ~ec2-user', + 'mkdir -p testScripts', + 'cd testScripts', + 'wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem', + ); + } +} diff --git a/integ/components/deadline/repository/scripts/bastion/testing/DL-read-docdb-response.sh b/integ/components/deadline/deadline_01_repository/scripts/bastion/testing/DL-read-docdb-response.sh similarity index 100% rename from integ/components/deadline/repository/scripts/bastion/testing/DL-read-docdb-response.sh rename to integ/components/deadline/deadline_01_repository/scripts/bastion/testing/DL-read-docdb-response.sh diff --git a/integ/components/deadline/repository/scripts/bastion/testing/DL-read-repository-settings.sh b/integ/components/deadline/deadline_01_repository/scripts/bastion/testing/DL-read-repository-settings.sh similarity index 84% rename from integ/components/deadline/repository/scripts/bastion/testing/DL-read-repository-settings.sh rename to integ/components/deadline/deadline_01_repository/scripts/bastion/testing/DL-read-repository-settings.sh index 4c530ec34..d9453f720 100644 --- a/integ/components/deadline/repository/scripts/bastion/testing/DL-read-repository-settings.sh +++ b/integ/components/deadline/deadline_01_repository/scripts/bastion/testing/DL-read-repository-settings.sh @@ -13,6 +13,6 @@ set -euo pipefail MOUNT_ID=$1 -cat "/mnt/efs/fs${MOUNT_ID}/DeadlineRepository/settings/repository.ini" +cat "/mnt/efs/fsdl${MOUNT_ID}/DeadlineRepository/settings/repository.ini" exit 0 diff --git a/integ/components/deadline/repository/test/deadline-repository.test.ts b/integ/components/deadline/deadline_01_repository/test/deadline_01_repository.test.ts similarity index 99% rename from integ/components/deadline/repository/test/deadline-repository.test.ts rename to integ/components/deadline/deadline_01_repository/test/deadline_01_repository.test.ts index e6e2d9b5a..2dca3703a 100644 --- a/integ/components/deadline/repository/test/deadline-repository.test.ts +++ b/integ/components/deadline/deadline_01_repository/test/deadline_01_repository.test.ts @@ -12,15 +12,13 @@ import awaitSsmCommand from '../../common/functions/awaitSsmCommand'; const testingStackName = 'RFDKInteg-DL-TestingTier' + process.env.INTEG_STACK_TAG?.toString(); const deadlineVersion = process.env.DEADLINE_VERSION?.toString(); -jest.setTimeout(10000); - const cloudformation = new CloudFormation(); const logs = new CloudWatchLogs(); const bastionRegex = /bastionId/; -const dbRegex = /secretARNDL(\d)/; +const dbRegex = /DatabaseSecretARNDL(\d)/; const logRegex = /logGroupNameDL(\d)/; -const certRegex = /certSecretARNDL(\d)/; +const certRegex = /CertSecretARNDL(\d)/; const testCases: Array> = [ [ 'RFDK-created DB and EFS', 1 ], diff --git a/integ/components/deadline/renderQueue/bin/deadline-renderQueue.ts b/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts similarity index 52% rename from integ/components/deadline/renderQueue/bin/deadline-renderQueue.ts rename to integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts index 26525235b..423fdd948 100644 --- a/integ/components/deadline/renderQueue/bin/deadline-renderQueue.ts +++ b/integ/components/deadline/deadline_02_renderQueue/bin/deadline_02_renderQueue.ts @@ -5,8 +5,8 @@ import { App, Stack } from '@aws-cdk/core'; import { RenderStruct } from '../../../../lib/render-struct'; -import { StorageStruct } from '../../../../lib/storage-struct'; -import { TestingTier } from '../lib/testing-tier'; +import { DatabaseType, StorageStruct } from '../../../../lib/storage-struct'; +import { RenderQueueTestingTier } from '../lib/renderQueue-testing-tier'; const app = new App(); const env = { @@ -23,21 +23,22 @@ const componentTier = new Stack(app, 'RFDKInteg-RQ-ComponentTier' + integStackTa // Add struct containing Deadline repository (the same repo is used for all test configurations) const storage = new StorageStruct(componentTier, 'StorageStruct', { integStackTag, - provideDocdbEfs: true, - useMongoDB: false, + databaseType: DatabaseType.DocDB, }); -// Create test struct for Render Queue in http mode -const render1 = new RenderStruct(componentTier, 'RenderStructRQ1', { - integStackTag, - repository: storage.repo, - protocol: 'http', -}); -//Create test struct for Render Queue in https mode -const render2 = new RenderStruct(componentTier, 'RenderStructRQ2', { - integStackTag, - repository: storage.repo, - protocol: 'https', -}); +const structs: Array = [ + // Create test struct for Render Queue in http mode + new RenderStruct(componentTier, 'RenderStructRQ1', { + integStackTag, + repository: storage.repo, + protocol: 'http', + }), + //Create test struct for Render Queue in https mode + new RenderStruct(componentTier, 'RenderStructRQ2', { + integStackTag, + repository: storage.repo, + protocol: 'https', + }), +]; -new TestingTier(app, 'RFDKInteg-RQ-TestingTier' + integStackTag, {env, integStackTag, structs: [render1, render2] }); +new RenderQueueTestingTier(app, 'RFDKInteg-RQ-TestingTier' + integStackTag, { env, integStackTag, structs }); diff --git a/integ/components/deadline/workerFleet/cdk.json b/integ/components/deadline/deadline_02_renderQueue/cdk.json similarity index 68% rename from integ/components/deadline/workerFleet/cdk.json rename to integ/components/deadline/deadline_02_renderQueue/cdk.json index 19e41fa30..0d889e791 100644 --- a/integ/components/deadline/workerFleet/cdk.json +++ b/integ/components/deadline/deadline_02_renderQueue/cdk.json @@ -1,5 +1,5 @@ { - "app": "npx ts-node bin/deadline-workerFleet.ts", + "app": "npx ts-node bin/deadline_02_renderQueue.ts", "context": { "@aws-cdk/core:enableStackNameDuplicates": "true", "aws-cdk:enableDiffNoFail": "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 new file mode 100644 index 000000000..a7e63ef76 --- /dev/null +++ b/integ/components/deadline/deadline_02_renderQueue/lib/renderQueue-testing-tier.ts @@ -0,0 +1,58 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path'; +import { Construct } from '@aws-cdk/core'; +import { RenderStruct } from '../../../../lib/render-struct'; +import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; + +/** + * Interface for RenderQueueTestingTier properties + */ +export interface RenderQueueTestingTierProps extends TestingTierProps { + /** + * Array of RenderStructs representing different test cases + */ + readonly structs: Array; +} + +/** + * Testing Tier for the Deadline RenderQueue integration test + * + * Creates a test bastion and configures it to connect to one or more Deadline RenderQueue constructs for testing + * + * Resources Deployed + * ------------------------ + * - A BastionLinuxHost instance + * + * Security Considerations + * ------------------------ + * - The bastion instance created by this test is configured to access farm resources on their default ports + * Test scripts stored on the bastion are used to fetch files stored on the repository and submit Deadline commands/jobs. + * At execution the tests retrieve the value of secrets for the authentication cert. + */ +export class RenderQueueTestingTier extends TestingTier { + constructor(scope: Construct, id: string, props: RenderQueueTestingTierProps) { + super(scope, id, props); + + const structs = props.structs; + structs.forEach( renderStruct => { + + const testSuiteId = 'RQ' + (structs.indexOf(renderStruct) + 1).toString(); + + const renderQueue = renderStruct.renderQueue; + this.configureRenderQueue(testSuiteId, renderQueue); + + const cert = renderStruct.cert; + this.configureCert(testSuiteId, cert); + + }); + + this.configureBastionUserData({ + testingScriptPath: path.join(__dirname, '../scripts/bastion/testing'), + }); + this.installDeadlineClient(); + } +} diff --git a/integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-fetch-repository-file.sh b/integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-fetch-repository-file.sh similarity index 100% rename from integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-fetch-repository-file.sh rename to integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-fetch-repository-file.sh diff --git a/integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-query-endpoint.sh b/integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-query-endpoint.sh similarity index 100% rename from integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-query-endpoint.sh rename to integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-query-endpoint.sh diff --git a/integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-submit-job.sh b/integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-submit-job.sh similarity index 100% rename from integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-submit-job.sh rename to integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-submit-job.sh diff --git a/integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-test-deadlinecommand.sh b/integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-test-deadlinecommand.sh similarity index 100% rename from integ/components/deadline/renderQueue/scripts/bastion/testing/RQ-test-deadlinecommand.sh rename to integ/components/deadline/deadline_02_renderQueue/scripts/bastion/testing/RQ-test-deadlinecommand.sh diff --git a/integ/components/deadline/renderQueue/test/deadline-renderQueue.test.ts b/integ/components/deadline/deadline_02_renderQueue/test/deadline_02_renderQueue.test.ts similarity index 99% rename from integ/components/deadline/renderQueue/test/deadline-renderQueue.test.ts rename to integ/components/deadline/deadline_02_renderQueue/test/deadline_02_renderQueue.test.ts index 31b5bddcf..9920fff43 100644 --- a/integ/components/deadline/renderQueue/test/deadline-renderQueue.test.ts +++ b/integ/components/deadline/deadline_02_renderQueue/test/deadline_02_renderQueue.test.ts @@ -10,13 +10,11 @@ import awaitSsmCommand from '../../common/functions/awaitSsmCommand'; // Name of testing stack is derived from env variable to ensure uniqueness const testingStackName = 'RFDKInteg-RQ-TestingTier' + process.env.INTEG_STACK_TAG?.toString(); -jest.setTimeout(10000); - const cloudformation = new CloudFormation(); const bastionRegex = /bastionId/; const rqRegex = /renderQueueEndpointRQ(\d)/; -const certRegex = /certSecretARNRQ(\d)/; +const certRegex = /CertSecretARNRQ(\d)/; const testCases: Array> = [ [ 'HTTP mode', 1 ], diff --git a/integ/components/deadline/workerFleet/bin/deadline-workerFleet.ts b/integ/components/deadline/deadline_03_workerFleet/bin/deadline_03_workerFleet.ts similarity index 84% rename from integ/components/deadline/workerFleet/bin/deadline-workerFleet.ts rename to integ/components/deadline/deadline_03_workerFleet/bin/deadline_03_workerFleet.ts index 0e5e8232e..a597ea7ea 100644 --- a/integ/components/deadline/workerFleet/bin/deadline-workerFleet.ts +++ b/integ/components/deadline/deadline_03_workerFleet/bin/deadline_03_workerFleet.ts @@ -5,9 +5,9 @@ import { App, Stack } from '@aws-cdk/core'; import { RenderStruct } from '../../../../lib/render-struct'; -import { StorageStruct } from '../../../../lib/storage-struct'; +import { DatabaseType, StorageStruct } from '../../../../lib/storage-struct'; import { WorkerStruct } from '../../../../lib/worker-struct'; -import { TestingTier } from '../lib/testing-tier'; +import { WorkerFleetTestingTier } from '../lib/workerFleet-testing-tier'; const app = new App(); const env = { @@ -32,8 +32,7 @@ oss.forEach( os => { // Create StorageStruct with repository const storage = new StorageStruct(componentTier, 'StorageStruct' + testId, { integStackTag, - provideDocdbEfs: true, - useMongoDB: false, + databaseType: DatabaseType.DocDB, }); // Create render queue with either HTTP or HTTPS protocol const render = new RenderStruct(componentTier, 'RenderStruct' + testId, { @@ -51,4 +50,4 @@ oss.forEach( os => { }); }); -new TestingTier(app, 'RFDKInteg-WF-TestingTier' + integStackTag, {env, integStackTag, structs}); +new WorkerFleetTestingTier(app, 'RFDKInteg-WF-TestingTier' + integStackTag, {env, integStackTag, structs}); diff --git a/integ/components/deadline/renderQueue/cdk.json b/integ/components/deadline/deadline_03_workerFleet/cdk.json similarity index 68% rename from integ/components/deadline/renderQueue/cdk.json rename to integ/components/deadline/deadline_03_workerFleet/cdk.json index b227ebd52..40d32f0ee 100644 --- a/integ/components/deadline/renderQueue/cdk.json +++ b/integ/components/deadline/deadline_03_workerFleet/cdk.json @@ -1,5 +1,5 @@ { - "app": "npx ts-node bin/deadline-renderQueue.ts", + "app": "npx ts-node bin/deadline_03_workerFleet.ts", "context": { "@aws-cdk/core:enableStackNameDuplicates": "true", "aws-cdk:enableDiffNoFail": "true" diff --git a/integ/components/deadline/deadline_03_workerFleet/lib/workerFleet-testing-tier.ts b/integ/components/deadline/deadline_03_workerFleet/lib/workerFleet-testing-tier.ts new file mode 100644 index 000000000..9f14558f8 --- /dev/null +++ b/integ/components/deadline/deadline_03_workerFleet/lib/workerFleet-testing-tier.ts @@ -0,0 +1,74 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path'; +import { Port } from '@aws-cdk/aws-ec2'; +import { Construct } from '@aws-cdk/core'; +import { IWorkerFleet } from 'aws-rfdk/deadline'; +import { TestingTier, TestingTierProps } from '../../../../lib/testing-tier'; +import { WorkerStruct } from '../../../../lib/worker-struct'; + +/** + * Interface for WorkerFleetTestingTier properties + */ +export interface WorkerFleetTestingTierProps extends TestingTierProps { + /** + * Array of WorkerStructs representing different test cases + */ + readonly structs: Array; +} + +/** + * Testing Tier for the Deadline WorkerFleet integration test + * + * Creates a test bastion and configures it to connect to one or more Deadline WorkerInstanceFleet constructs for testing. + * + * Resources Deployed + * ------------------------ + * - A BastionLinuxHost instance + * + * Security Considerations + * ------------------------ + * - The bastion instance created by this test is configured to access farm resources on their default ports + * Test scripts stored on the bastion are used to submit Deadline jobs to farm workers and request information about the workers. + * At execution the tests retrieve the value of secrets for the authentication cert. + */ +export class WorkerFleetTestingTier extends TestingTier { + constructor(scope: Construct, id: string, props: WorkerFleetTestingTierProps) { + super(scope, id, props); + + const structs = props.structs; + structs.forEach( workerStruct => { + + const testSuiteId = 'WF' + (structs.indexOf(workerStruct) + 1).toString(); + + const renderQueue = workerStruct.renderQueue; + this.configureRenderQueue(testSuiteId, renderQueue); + + const cert = workerStruct.cert; + this.configureCert(testSuiteId, cert); + + const workerFleet = workerStruct.workerFleet; + this.configureWorkerFleet(workerFleet); + }); + + this.configureBastionUserData({ + testingScriptPath: path.join(__dirname, '../scripts/bastion/testing'), + }); + this.installDeadlineClient(); + } + + /** + * Configures each worker to allow access from the bastion + * + * @param workerFleet Array of worker instances to connect to the test Bastion + */ + public configureWorkerFleet(workerFleet: Array) { + workerFleet.forEach( worker => { + this.testInstance.connections.allowTo(worker, Port.tcp(22)); + }); + } + +} diff --git a/integ/components/deadline/workerFleet/scripts/bastion/testing/WF-report-worker-sets.sh b/integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-report-worker-sets.sh similarity index 100% rename from integ/components/deadline/workerFleet/scripts/bastion/testing/WF-report-worker-sets.sh rename to integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-report-worker-sets.sh diff --git a/integ/components/deadline/workerFleet/scripts/bastion/testing/WF-report-workers.sh b/integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-report-workers.sh similarity index 100% rename from integ/components/deadline/workerFleet/scripts/bastion/testing/WF-report-workers.sh rename to integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-report-workers.sh diff --git a/integ/components/deadline/workerFleet/scripts/bastion/testing/WF-submit-jobs-to-sets.sh b/integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-submit-jobs-to-sets.sh similarity index 100% rename from integ/components/deadline/workerFleet/scripts/bastion/testing/WF-submit-jobs-to-sets.sh rename to integ/components/deadline/deadline_03_workerFleet/scripts/bastion/testing/WF-submit-jobs-to-sets.sh diff --git a/integ/components/deadline/workerFleet/test/deadline-workerFleet.test.ts b/integ/components/deadline/deadline_03_workerFleet/test/deadline_03_workerFleet.test.ts similarity index 99% rename from integ/components/deadline/workerFleet/test/deadline-workerFleet.test.ts rename to integ/components/deadline/deadline_03_workerFleet/test/deadline_03_workerFleet.test.ts index 50057981b..e9bdd00df 100644 --- a/integ/components/deadline/workerFleet/test/deadline-workerFleet.test.ts +++ b/integ/components/deadline/deadline_03_workerFleet/test/deadline_03_workerFleet.test.ts @@ -10,13 +10,11 @@ import awaitSsmCommand from '../../common/functions/awaitSsmCommand'; // Name of testing stack is derived from env variable to ensure uniqueness const testingStackName = 'RFDKInteg-WF-TestingTier' + process.env.INTEG_STACK_TAG?.toString(); -jest.setTimeout(20000); - const cloudformation = new CloudFormation(); const bastionRegex = /bastionId/; const rqRegex = /renderQueueEndpointWF(\d)/; -const certRegex = /certSecretARNWF(\d)/; +const certRegex = /CertSecretARNWF(\d)/; const testCases: Array> = [ [ 'Linux Worker HTTP mode', 1 ], diff --git a/integ/components/deadline/renderQueue/lib/testing-tier.ts b/integ/components/deadline/renderQueue/lib/testing-tier.ts deleted file mode 100644 index ebcd1912c..000000000 --- a/integ/components/deadline/renderQueue/lib/testing-tier.ts +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as path from 'path'; -import { BastionHostLinux, InstanceType, Port, SubnetType, Vpc } from '@aws-cdk/aws-ec2'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { CfnOutput, Construct, Duration, Stack, StackProps } from '@aws-cdk/core'; -import { RenderStruct } from '../../../../lib/render-struct'; - -// Params object for TestingTier -export interface TestingTierProps extends StackProps { - integStackTag: string; - structs: Array; -} - -// Class constructor -export class TestingTier extends Stack { - constructor(scope: Construct, id: string, props: TestingTierProps) { - super(scope, id, props); - - // Collect environment variables - const infrastructureStackName = 'RFDKIntegInfrastructure' + props.integStackTag; - const deadlineVersion = process.env.DEADLINE_VERSION!.toString(); - const stagePath = process.env.DEADLINE_STAGING_PATH!.toString(); - - // Vpc.fromLookup acquires vpc deployed to the _infrastructure stack - const vpc = Vpc.fromLookup(this, 'Vpc', { tags: { StackName: infrastructureStackName }}) as Vpc; - - // Create an instance that can be used for testing; SSM commands are communicated to the - // host instance to run test scripts installed during setup of the instance - const testInstance: BastionHostLinux = new BastionHostLinux(this, 'Bastion', { - vpc, - instanceType: new InstanceType('t3.small'), - subnetSelection: { - subnetType: SubnetType.PRIVATE, - }, - }); - - new CfnOutput(this, 'bastionId', { - value: testInstance.instanceId, - }); - - new CfnOutput(this, 'testCases', { - value: props.structs.length.toString(), - }); - - props.structs.forEach( struct => { - var testSuiteId = 'RQ' + (props.structs.indexOf(struct) + 1).toString(); - var renderQueue = struct.renderQueue; - var cert = struct.cert; - var port = renderQueue.endpoint.portAsString(); - var zoneName = Stack.of(renderQueue).stackName + '.local'; - var address; - switch(port) { - case '8080': - address = renderQueue.endpoint.hostname; - break; - case '4433': - address = 'renderqueue.' + zoneName; - break; - default: - break; - } - var renderQueueEndpoint = `${address}:${port}`; - - testInstance.connections.allowTo(renderQueue, Port.tcp(+port)); - - if(cert) { - cert?.cert.grantRead(testInstance); - new CfnOutput(this, 'certSecretARN' + testSuiteId, { - value: cert.cert.secretArn, - }); - } - - new CfnOutput(this, 'renderQueueEndpoint' + testSuiteId, { - value: renderQueueEndpoint, - }); - - }); - - testInstance.instance.instance.cfnOptions.creationPolicy = { - ...testInstance.instance.instance.cfnOptions.creationPolicy, - resourceSignal: { - timeout: Duration.minutes(5).toISOString(), - count: 1, - }, - }; - - // Set up user data to install scripts and other functionality on the Bastion instance - // Deadline client is necessary on the bastion instance that runs the tests, so this grabs the installer set up in the provided staging folder to do it - const clientInstaller = new Asset(this, 'ClientInstaller', { - path: path.join(stagePath, 'bin', 'DeadlineClient-' + deadlineVersion + '-linux-x64-installer.run'), - }); - clientInstaller.grantRead(testInstance); - - const instanceSetupScripts = new Asset(this, 'SetupScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'setup'), - }); - instanceSetupScripts.grantRead(testInstance); - - const instanceUtilScripts = new Asset(this, 'UtilScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'utils'), - }); - instanceUtilScripts.grantRead(testInstance); - - const testingScripts = new Asset(this, 'TestingScripts', { - path: path.join(__dirname, '..', 'scripts', 'bastion', 'testing'), - }); - testingScripts.grantRead(testInstance); - - const installerPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: clientInstaller.bucket, - bucketKey: clientInstaller.s3ObjectKey, - }); - const setupZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceSetupScripts.bucket, - bucketKey: instanceSetupScripts.s3ObjectKey, - }); - const utilZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceUtilScripts.bucket, - bucketKey: instanceUtilScripts.s3ObjectKey, - }); - const testsZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: testingScripts.bucket, - bucketKey: testingScripts.s3ObjectKey, - }); - - testInstance.instance.userData.addCommands( - 'set -xeou pipefail', - 'TMPDIR=$(mktemp -d)', - 'cd "${TMPDIR}"', - // Unzip & run the instance setup scripts - `unzip ${setupZipPath}`, - 'chmod +x *.sh', - // Copy over the Deadlient client installer and install it - `cp ${installerPath} ./deadline-client-installer.run`, - 'chmod +x *.run', - './install_deadline_client.sh', - './install_jq.sh', - // Unzip the testing scripts to: ~ec2-user/testScripts/ - 'cd ~ec2-user', - 'mkdir testScripts', - 'cd testScripts', - `unzip ${testsZipPath}`, - 'chmod +x *.sh', - // Unzip the utility scripts to: ~ec2-user/utilScripts/ - 'cd ~ec2-user', - 'mkdir utilScripts', - 'cd utilScripts', - `unzip ${utilZipPath}`, - 'chmod +x *.sh', - // Everything will be owned by root, by default (UserData runs as root) - 'chown ec2-user.ec2-user -R *', - // Cleanup - 'rm -rf "${TMPDIR}"', - `rm -f ${setupZipPath} ${testsZipPath} ${installerPath} ${utilZipPath}`, - ); - testInstance.instance.userData.addSignalOnExitCommand( testInstance.instance ); - } -} diff --git a/integ/components/deadline/renderQueue/scripts/bash/deploy-stacks.sh b/integ/components/deadline/renderQueue/scripts/bash/deploy-stacks.sh deleted file mode 100755 index fff918f17..000000000 --- a/integ/components/deadline/renderQueue/scripts/bash/deploy-stacks.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_RENDERQ_TEST_SUITE = true ]; then - npx cdk deploy "*" --require-approval=never -fi diff --git a/integ/components/deadline/renderQueue/scripts/bash/destroy-stacks.sh b/integ/components/deadline/renderQueue/scripts/bash/destroy-stacks.sh deleted file mode 100755 index 20c72cbbd..000000000 --- a/integ/components/deadline/renderQueue/scripts/bash/destroy-stacks.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_RENDERQ_TEST_SUITE = true ]; then - npx cdk destroy "*" -f -fi diff --git a/integ/components/deadline/renderQueue/scripts/bash/e2e.sh b/integ/components/deadline/renderQueue/scripts/bash/e2e.sh deleted file mode 100755 index 4b271f83f..000000000 --- a/integ/components/deadline/renderQueue/scripts/bash/e2e.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_RENDERQ_TEST_SUITE == true ]; then - - echo "Running Deadline RenderQueue end-to-end test..." >> "$OUTPUT_FILE" - - # Deploy a test app using the first configuration, run all jest tests, then tear the app down - echo "Deploying test app for Deadline Renderqueue test suite" >> "$OUTPUT_FILE" - npx cdk deploy "*" --require-approval=never - echo "Test app deployed. Running test suite..." >> "$OUTPUT_FILE" - npm run test deadline-renderQueue >> "$OUTPUT_FILE" 2>&1 - echo "Test suite complete. Destroying test app..." >> "$OUTPUT_FILE" - npx cdk destroy "*" -f - rm -f "./cdk.context.json" - rm -rf "./cdk.out" - echo "Test app destroyed." >> "$OUTPUT_FILE" - echo "Deadline RenderQueue tests complete." >> "$OUTPUT_FILE" -fi diff --git a/integ/components/deadline/repository/bin/deadline-repository.ts b/integ/components/deadline/repository/bin/deadline-repository.ts deleted file mode 100644 index f2dc2ff28..000000000 --- a/integ/components/deadline/repository/bin/deadline-repository.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import { App, Stack } from '@aws-cdk/core'; -import { StorageStruct } from '../../../../lib/storage-struct'; -import { TestingTier } from '../lib/testing-tier'; - -const app = new App(); -const env = { - account: process.env.CDK_DEFAULT_ACCOUNT, - region: process.env.CDK_DEFAULT_REGION, -}; - -const integStackTag = process.env.INTEG_STACK_TAG!.toString(); - -const componentTier = new Stack(app, 'RFDKInteg-DL-ComponentTier' + integStackTag, {env}); -const storage1 = new StorageStruct(componentTier, 'StorageStruct1', { - integStackTag, - provideDocdbEfs: false, - useMongoDB: false, -}); -const storage2 = new StorageStruct(componentTier, 'StorageStruct2', { - integStackTag, - provideDocdbEfs: true, - useMongoDB: false, -}); -const storage3 = new StorageStruct(componentTier, 'StorageStruct3', { - integStackTag, - provideDocdbEfs: false, - useMongoDB: true, -}); - -new TestingTier(app, 'RFDKInteg-DL-TestingTier' + integStackTag, { env, integStackTag, structs: [storage1, storage2, storage3] }); diff --git a/integ/components/deadline/repository/lib/testing-tier.ts b/integ/components/deadline/repository/lib/testing-tier.ts deleted file mode 100644 index 1ce701b0c..000000000 --- a/integ/components/deadline/repository/lib/testing-tier.ts +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as path from 'path'; -import { BastionHostLinux, InstanceType, Port, SubnetType, Vpc } from '@aws-cdk/aws-ec2'; -import { ILogGroup } from '@aws-cdk/aws-logs'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { CfnOutput, Construct, Duration, Stack, StackProps } from '@aws-cdk/core'; -import { MongoDbInstaller, MongoDbSsplLicenseAcceptance, MongoDbVersion } from 'aws-rfdk'; -import { StorageStruct } from '../../../../lib/storage-struct'; - -// Params object for TestingTier -export interface TestingTierProps extends StackProps { - integStackTag: string; - structs: Array; -} - -// Class constructor -export class TestingTier extends Stack { - constructor(scope: Construct, id: string, props: TestingTierProps) { - super(scope, id, props); - - const userAcceptsSSPL = process.env.USER_ACCEPTS_SSPL_FOR_RFDK_TESTS!.toString(); - const userSsplAcceptance = - userAcceptsSSPL === 'true' ? MongoDbSsplLicenseAcceptance.USER_ACCEPTS_SSPL : MongoDbSsplLicenseAcceptance.USER_REJECTS_SSPL; - - // Vpc.fromLookup acquires vpc deployed to the _infrastructure stack - const infrastructureStackName = 'RFDKIntegInfrastructure' + props.integStackTag; - const vpc = Vpc.fromLookup(this, infrastructureStackName, { tags: { StackName: infrastructureStackName }}) as Vpc; - - // Create an instance that can be used for testing; SSM commands are communicated to the - // host instance to run test scripts installed during setup of the instance - const testInstance: BastionHostLinux = new BastionHostLinux(this, 'Bastion', { - vpc, - instanceType: new InstanceType('t3.small'), - subnetSelection: { - subnetType: SubnetType.PRIVATE, - }, - }); - - new CfnOutput(this, 'bastionId', { - value: testInstance.instanceId, - }); - - new CfnOutput(this, 'testCases', { - value: props.structs.length.toString(), - }); - - props.structs.forEach( struct => { - var testSuiteId = 'DL' + (props.structs.indexOf(struct) + 1).toString(); - var repo = struct.repo; - var database = struct.database.db; - var dbSecret = struct.database.secret!; - var cert = struct.database.cert; - var efs = struct.efs!; - var logGroup = struct.repo.node.findChild('RepositoryLogGroup') as ILogGroup; - var logGroupName = logGroup.logGroupName; - - testInstance.connections.allowTo(database, Port.tcp(27017)); - testInstance.connections.allowToDefaultPort(efs); - dbSecret.grantRead(testInstance); - - repo.fileSystem.mountToLinuxInstance(testInstance.instance, { - location: '/mnt/efs/fs' + (props.structs.indexOf(struct) + 1).toString(), - }); - - if(cert) { - cert.cert?.grantRead(testInstance); - new CfnOutput(this, 'certSecretARN' + testSuiteId, { - value: cert.cert.secretArn, - }); - } - - new CfnOutput(this, 'secretARN' + testSuiteId, { - value: dbSecret.secretArn, - }); - - new CfnOutput(this, 'logGroupName' + testSuiteId, { - value: logGroupName, - }); - }); - - testInstance.instance.instance.cfnOptions.creationPolicy = { - ...testInstance.instance.instance.cfnOptions.creationPolicy, - resourceSignal: { - timeout: Duration.minutes(5).toISOString(), - count: 1, - }, - }; - - // Set up user data to install scripts and other functionality on the Bastion instance - const instanceSetupScripts = new Asset(this, 'SetupScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'setup'), - }); - instanceSetupScripts.grantRead(testInstance); - - const instanceUtilScripts = new Asset(this, 'UtilScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'utils'), - }); - instanceUtilScripts.grantRead(testInstance); - - const testingScripts = new Asset(this, 'TestingScripts', { - path: path.join(__dirname, '..', 'scripts', 'bastion', 'testing'), - }); - testingScripts.grantRead(testInstance); - - const setupZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceSetupScripts.bucket, - bucketKey: instanceSetupScripts.s3ObjectKey, - }); - const utilZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceUtilScripts.bucket, - bucketKey: instanceUtilScripts.s3ObjectKey, - }); - const testsZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: testingScripts.bucket, - bucketKey: testingScripts.s3ObjectKey, - }); - - testInstance.instance.userData.addCommands( - 'set -xeou pipefail', - 'TMPDIR=$(mktemp -d)', - 'cd "${TMPDIR}"', - // Unzip & run the instance setup scripts - `unzip ${setupZipPath}`, - 'chmod +x *.sh', - './install_jq.sh', - // Unzip the testing scripts to: ~ec2-user/testScripts/ - 'cd ~ec2-user', - 'mkdir testScripts', - 'cd testScripts', - `unzip ${testsZipPath}`, - 'chmod +x *.sh', - // Put the DocDB CA certificate in the testing directory. - 'wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem', - // Unzip the utility scripts to: ~ec2-user/utilScripts/ - 'cd ~ec2-user', - 'mkdir utilScripts', - 'cd utilScripts', - `unzip ${utilZipPath}`, - 'chmod +x *.sh', - // Everything will be owned by root, by default (UserData runs as root) - 'chown ec2-user.ec2-user -R *', - // Cleanup - 'rm -rf "${TMPDIR}"', - `rm -f ${setupZipPath} ${testsZipPath} ${utilZipPath}`, - ); - const mongodbInstaller = new MongoDbInstaller(this, { - version: MongoDbVersion.COMMUNITY_3_6, - userSsplAcceptance, - }); - mongodbInstaller.installOnLinuxInstance(testInstance.instance); - - testInstance.instance.userData.addSignalOnExitCommand( testInstance.instance ); - } -} diff --git a/integ/components/deadline/repository/scripts/bash/deploy-stacks.sh b/integ/components/deadline/repository/scripts/bash/deploy-stacks.sh deleted file mode 100755 index 0c8edb349..000000000 --- a/integ/components/deadline/repository/scripts/bash/deploy-stacks.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ ${EXECUTE_DEADLINE_REPOSITORY_TEST_SUITE} = true ]; then - - npx cdk deploy "*" --require-approval=never - -fi diff --git a/integ/components/deadline/repository/scripts/bash/destroy-stacks.sh b/integ/components/deadline/repository/scripts/bash/destroy-stacks.sh deleted file mode 100755 index b780b2cd4..000000000 --- a/integ/components/deadline/repository/scripts/bash/destroy-stacks.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ ${EXECUTE_DEADLINE_REPOSITORY_TEST_SUITE} = true ]; then - - npx cdk destroy "*" -f - -fi diff --git a/integ/components/deadline/repository/scripts/bash/e2e.sh b/integ/components/deadline/repository/scripts/bash/e2e.sh deleted file mode 100755 index 72824f0fb..000000000 --- a/integ/components/deadline/repository/scripts/bash/e2e.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_REPOSITORY_TEST_SUITE = true ]; then - - echo "Running Deadline Repository end-to-end test..." >> "$OUTPUT_FILE" - - # Deploy a test app using the first configuration, run all jest tests, then tear the app down - echo "Deploying test app for Deadline Repository test suite" >> "$OUTPUT_FILE" - npx cdk deploy "*" --require-approval=never - echo "Test app deployed. Running test suite..." >> "$OUTPUT_FILE" - npm run test deadline-repository >> "$OUTPUT_FILE" 2>&1 - echo "Test suite complete. Destroying test app..." >> "$OUTPUT_FILE" - npx cdk destroy "*" -f - rm -f "./cdk.context.json" - rm -rf "./cdk.out" - echo "Test app destroyed." >> "$OUTPUT_FILE" - echo "Deadline Repository tests complete." >> "$OUTPUT_FILE" -fi diff --git a/integ/components/deadline/repository/test/preflight/preflight.test.ts b/integ/components/deadline/repository/test/preflight/preflight.test.ts deleted file mode 100644 index b7578a209..000000000 --- a/integ/components/deadline/repository/test/preflight/preflight.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -var USER_ACCEPTS_SSPL_FOR_RFDK_TESTS = process.env.USER_ACCEPTS_SSPL_FOR_RFDK_TESTS?.toString(); - -var runTests = process.env.EXECUTE_DEADLINE_REPOSITORY_TEST_SUITE?.toString(); - -if( runTests === 'true' ){ - test('USER_ACCEPTS_SSPL_FOR_RFDK_TESTS is set to true', () => { - expect(USER_ACCEPTS_SSPL_FOR_RFDK_TESTS).toBe('true'); - }); -} -else { - test('Skipping test suite; preflight not run', () =>{ - expect(1).toEqual(1); - }); -} diff --git a/integ/components/deadline/workerFleet/lib/testing-tier.ts b/integ/components/deadline/workerFleet/lib/testing-tier.ts deleted file mode 100644 index fa2d926d4..000000000 --- a/integ/components/deadline/workerFleet/lib/testing-tier.ts +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as path from 'path'; -import { BastionHostLinux, InstanceType, Port, SubnetType, Vpc } from '@aws-cdk/aws-ec2'; -import { Asset } from '@aws-cdk/aws-s3-assets'; -import { CfnOutput, Construct, Duration, Stack, StackProps } from '@aws-cdk/core'; -import { WorkerStruct } from '../../../../lib/worker-struct'; - -// Params object for TestingTier -export interface TestingTierProps extends StackProps { - integStackTag: string; - structs: Array; -} - -// Class constructor -export class TestingTier extends Stack { - constructor(scope: Construct, id: string, props: TestingTierProps) { - super(scope, id, props); - - // Collect environment variables - const infrastructureStackName = 'RFDKIntegInfrastructure' + props.integStackTag; - const deadlineVersion = process.env.DEADLINE_VERSION!.toString(); - const stagePath = process.env.DEADLINE_STAGING_PATH!.toString(); - - // Vpc.fromLookup acquires vpc deployed to the _infrastructure stack - const vpc = Vpc.fromLookup(this, 'Vpc', { tags: { StackName: infrastructureStackName }}) as Vpc; - - // Create an instance that can be used for testing; SSM commands are communicated to the - // host instance to run test scripts installed during setup of the instance - const testInstance: BastionHostLinux = new BastionHostLinux(this, 'Bastion', { - vpc, - instanceType: new InstanceType('t3.small'), - subnetSelection: { - subnetType: SubnetType.PRIVATE, - }, - }); - - new CfnOutput(this, 'bastionId', { - value: testInstance.instanceId, - }); - - new CfnOutput(this, 'testCases', { - value: props.structs.length.toString(), - }); - - props.structs.forEach( struct => { - var testSuiteId = 'WF' + (props.structs.indexOf(struct) + 1).toString(); - var renderQueue = struct.renderQueue; - var cert = struct.cert; - var port = renderQueue.endpoint.portAsString(); - var zoneName = Stack.of(renderQueue).stackName + '.local'; - var address; - switch(port) { - case '8080': - address = renderQueue.endpoint.hostname; - break; - case '4433': - address = 'renderqueue.' + zoneName; - break; - default: - break; - } - var renderQueueEndpoint = `${address}:${port}`; - var workerFleet = struct.workerFleet; - - testInstance.connections.allowToDefaultPort(renderQueue); - testInstance.connections.allowTo(renderQueue, Port.tcp(22)); - workerFleet.forEach( worker => { - testInstance.connections.allowTo(worker, Port.tcp(22)); - }); - - if(cert) { - cert?.cert.grantRead(testInstance); - new CfnOutput(this, 'certSecretARN' + testSuiteId, { - value: cert.cert.secretArn, - }); - } - - new CfnOutput(this, 'renderQueueEndpoint' + testSuiteId, { - value: renderQueueEndpoint, - }); - - }); - - testInstance.instance.instance.cfnOptions.creationPolicy = { - ...testInstance.instance.instance.cfnOptions.creationPolicy, - resourceSignal: { - timeout: Duration.minutes(5).toISOString(), - count: 1, - }, - }; - - // Set up user data to install scripts and other functionality on the Bastion instance - // Deadline client is necessary on the bastion instance that runs the tests, so this grabs the installer set up in the provided staging folder to do it - const clientInstaller = new Asset(this, 'ClientInstaller', { - path: path.join(stagePath, 'bin', 'DeadlineClient-' + deadlineVersion + '-linux-x64-installer.run'), - }); - clientInstaller.grantRead(testInstance); - - const instanceSetupScripts = new Asset(this, 'SetupScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'setup'), - }); - instanceSetupScripts.grantRead(testInstance); - - const instanceUtilScripts = new Asset(this, 'UtilScripts', { - path: path.join(__dirname, '..', '..', 'common', 'scripts', 'bastion', 'utils'), - }); - instanceUtilScripts.grantRead(testInstance); - - const testingScripts = new Asset(this, 'TestingScripts', { - path: path.join(__dirname, '..', 'scripts', 'bastion', 'testing'), - }); - testingScripts.grantRead(testInstance); - - const installerPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: clientInstaller.bucket, - bucketKey: clientInstaller.s3ObjectKey, - }); - const setupZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceSetupScripts.bucket, - bucketKey: instanceSetupScripts.s3ObjectKey, - }); - const utilZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: instanceUtilScripts.bucket, - bucketKey: instanceUtilScripts.s3ObjectKey, - }); - const testsZipPath: string = testInstance.instance.userData.addS3DownloadCommand({ - bucket: testingScripts.bucket, - bucketKey: testingScripts.s3ObjectKey, - }); - - testInstance.instance.userData.addCommands( - 'set -xeou pipefail', - 'TMPDIR=$(mktemp -d)', - 'cd "${TMPDIR}"', - // Unzip & run the instance setup scripts - `unzip ${setupZipPath}`, - 'chmod +x *.sh', - `cp ${installerPath} ./deadline-client-installer.run`, - 'chmod +x *.run', - './install_deadline_client.sh', - './install_jq.sh', - // Unzip the testing scripts to: ~ec2-user/testScripts/ - 'cd ~ec2-user', - 'mkdir testScripts', - 'cd testScripts', - `unzip ${testsZipPath}`, - 'chmod +x *.sh', - // Unzip the utility scripts to: ~ec2-user/utilScripts/ - 'cd ~ec2-user', - 'mkdir utilScripts', - 'cd utilScripts', - `unzip ${utilZipPath}`, - 'chmod +x *.sh', - // Everything will be owned by root, by default (UserData runs as root) - 'chown ec2-user.ec2-user -R *', - // Cleanup - 'rm -rf "${TMPDIR}"', - `rm -f ${setupZipPath} ${testsZipPath} ${installerPath} ${utilZipPath}`, - ); - testInstance.instance.userData.addSignalOnExitCommand( testInstance.instance ); - } -} diff --git a/integ/components/deadline/workerFleet/scripts/bash/deploy-stacks.sh b/integ/components/deadline/workerFleet/scripts/bash/deploy-stacks.sh deleted file mode 100755 index ad2e79021..000000000 --- a/integ/components/deadline/workerFleet/scripts/bash/deploy-stacks.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_WORKER_TEST_SUITE = true ]; then - npx cdk deploy "*" --require-approval=never -fi diff --git a/integ/components/deadline/workerFleet/scripts/bash/destroy-stacks.sh b/integ/components/deadline/workerFleet/scripts/bash/destroy-stacks.sh deleted file mode 100755 index bb76f2d9d..000000000 --- a/integ/components/deadline/workerFleet/scripts/bash/destroy-stacks.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_WORKER_TEST_SUITE = true ]; then - npx cdk destroy "*" -f -fi diff --git a/integ/components/deadline/workerFleet/scripts/bash/e2e.sh b/integ/components/deadline/workerFleet/scripts/bash/e2e.sh deleted file mode 100755 index 2e74d007d..000000000 --- a/integ/components/deadline/workerFleet/scripts/bash/e2e.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -if [ $EXECUTE_DEADLINE_WORKER_TEST_SUITE == true ]; then - - echo "Running Deadline Worker end-to-end test..." >> "$OUTPUT_FILE" - - # Deploy a test app using the first configuration, run all jest tests, then tear the app down - echo "Deploying test app for Deadline Worker test suite" >> "$OUTPUT_FILE" - npx cdk deploy "*" --require-approval=never - echo "Test app deployed. Running test suite..." >> "$OUTPUT_FILE" - npm run test deadline-workerFleet >> "$OUTPUT_FILE" 2>&1 - echo "Test suite complete. Destroying test app..." >> "$OUTPUT_FILE" - npx cdk destroy "*" -f - rm -f "./cdk.context.json" - rm -rf "./cdk.out" - echo "Test app destroyed." >> "$OUTPUT_FILE" - echo "Deadline Worker tests complete." >> "$OUTPUT_FILE" -fi diff --git a/integ/components/deadline/workerFleet/test/preflight/preflight.test.ts b/integ/components/deadline/workerFleet/test/preflight/preflight.test.ts deleted file mode 100644 index 5a5de5d02..000000000 --- a/integ/components/deadline/workerFleet/test/preflight/preflight.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -var LINUX_DEADLINE_AMI_ID = process.env.LINUX_DEADLINE_AMI_ID?.toString(); -var WINDOWS_DEADLINE_AMI_ID = process.env.WINDOWS_DEADLINE_AMI_ID?.toString(); - -var runTests = process.env.EXECUTE_DEADLINE_WORKER_TEST_SUITE?.toString(); - -if( runTests === 'true' ){ - test('LINUX_DEADLINE_AMI_ID is set', () => { - expect(LINUX_DEADLINE_AMI_ID).toBeTruthy(); - }); - test('WINDOWS_DEADLINE_AMI_ID is set', () => { - expect(WINDOWS_DEADLINE_AMI_ID).toBeTruthy(); - }); -} -else { - test('Skipping test suite; preflight not run', () =>{ - expect(1).toEqual(1); - }); -} diff --git a/integ/jest.config.js b/integ/jest.config.js index 36a187ba4..3af0746c0 100644 --- a/integ/jest.config.js +++ b/integ/jest.config.js @@ -3,5 +3,6 @@ module.exports = { testMatch: ['**/*.test.ts'], transform: { '^.+\\.tsx?$': 'ts-jest' - } + }, + testTimeout: 60000 }; diff --git a/integ/lib/storage-struct.ts b/integ/lib/storage-struct.ts index 74d593db5..710c875c0 100644 --- a/integ/lib/storage-struct.ts +++ b/integ/lib/storage-struct.ts @@ -20,10 +20,14 @@ export interface IRenderFarmDb { cert?: X509CertificatePem, } +export enum DatabaseType { + DocDB = 1, + MongoDB = 2, +} + export interface StorageStructProps { readonly integStackTag: string; - readonly provideDocdbEfs: boolean; - readonly useMongoDB: boolean; + readonly databaseType?: DatabaseType; } export class StorageStruct extends Construct { @@ -58,9 +62,8 @@ export class StorageStruct extends Construct { let deadlineEfs; let deadlineMountableEfs; - // Check the configuration for the test for provideDocdbEfs - // If true, create a docDB and efs for the repository to use - if (props.provideDocdbEfs) { + // Check if the test requires a DocDB or MongoDB to be created. If neither is provided, the Repository construct will create a DocDB itself. + if (props.databaseType == DatabaseType.DocDB) { // Create a DocDB database cluster on the VPC database = new DatabaseCluster(this, 'DocumentDatabase', { @@ -97,8 +100,8 @@ export class StorageStruct extends Construct { filesystem: deadlineEfs, }); } - // If useMongoDB is true, a mongoDB instance is created in place of the DocDB - else if (props.useMongoDB) { + // If databaseType is MongoDB, a MongoDB instance is created in place of the DocDB + else if (props.databaseType == DatabaseType.MongoDB) { // Create CA signing certificate cacert = new X509CertificatePem(this, 'CaCert', { diff --git a/integ/lib/testing-tier.ts b/integ/lib/testing-tier.ts new file mode 100644 index 000000000..378ff7ae6 --- /dev/null +++ b/integ/lib/testing-tier.ts @@ -0,0 +1,254 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as path from 'path'; +import { BastionHostLinux, InstanceType, Port, SubnetType, Vpc } from '@aws-cdk/aws-ec2'; +import { Asset } from '@aws-cdk/aws-s3-assets'; +import { CfnOutput, Construct, Duration, Stack, StackProps } from '@aws-cdk/core'; +import { X509CertificatePem } from 'aws-rfdk'; +import { RenderQueue} from 'aws-rfdk/deadline'; +import { IRenderFarmDb } from './storage-struct'; + +/** + * Interface for configuring UserData to add to Bastion + */ +interface UserDataConfigProps { + /** + * Local path to the framework directory containing the testing script to be copied to the Bastion + */ + readonly testingScriptPath: string; +} + +/** + * Base interface for Testing Tier + */ +export interface TestingTierProps extends StackProps { + /** + * The unique suffix given to all stacks in the testing app + */ + readonly integStackTag: string; +} + +/** + * Base class for Testing Tier stacks + */ +export abstract class TestingTier extends Stack { + /** + * The Bastion instance used for communicating with the farm and executing test cases + */ + public readonly testInstance: BastionHostLinux; + + /** + * The version of Deadline used for installing DeadlineClient. Must be set by env variable before test execution. + */ + private deadlineVersion: string = process.env.DEADLINE_VERSION!.toString(); + + /** + * Full path to locally staged Deadline assets. Must be set by env variable before test execution. + */ + private stagePath: string = process.env.DEADLINE_STAGING_PATH!.toString(); + + constructor(scope: Construct, id: string, props: TestingTierProps) { + super(scope, id, props); + + const infrastructureStackName = 'RFDKIntegInfrastructure' + props.integStackTag; + + // Vpc.fromLookup acquires vpc deployed to the _infrastructure stack + const vpc = Vpc.fromLookup(this, 'Vpc', { tags: { StackName: infrastructureStackName }}) as Vpc; + + // Create an instance that can be used for testing; SSM commands are communicated to the + // host instance to run test scripts installed during setup of the instance + const testInstance: BastionHostLinux = new BastionHostLinux(this, 'Bastion', { + vpc, + instanceType: new InstanceType('t3.small'), + subnetSelection: { + subnetType: SubnetType.PRIVATE, + }, + }); + this.testInstance = testInstance; + + // Output bastion id for use in tests + new CfnOutput(this, 'bastionId', { + value: testInstance.instanceId, + }); + + } + + /** + * Grants the bastion permissions to read a resource's cert and creates a stack output for its secretARN. + * + * @param testSuiteId Test case to configure the cert for + * @param cert Certificate for authenticating to the database/render queue used for this test case + */ + public configureCert(testSuiteId: string, cert?: X509CertificatePem) { + if(cert) { + cert.cert.grantRead(this.testInstance); + new CfnOutput(this, 'CertSecretARN' + testSuiteId, { + value: cert.cert.secretArn, + }); + }; + } + + /** + * Allows the bastion to connect to the docDB/mongoDB instance and creates a stack output for the secretARN for the database + * + * @param testSuiteId Test case to configure the database for + * @param database Database object to connect to the test Bastion + */ + public configureDatabase(testSuiteId: string, database: IRenderFarmDb) { + const db = database.db; + const dbSecret = database.secret!; + + this.testInstance.connections.allowTo(db, Port.tcp(27017)); + dbSecret.grantRead(this.testInstance); + + new CfnOutput(this, 'DatabaseSecretARN' + testSuiteId, { + value: dbSecret.secretArn, + }); + } + + /** + * Configures connections on the farm's render queue to allow the bastion access + * + * @param testSuiteId Test case to configure the render queue for + * @param renderQueue Render queue object to connect to the test Bastion + */ + public configureRenderQueue(testSuiteId: string, renderQueue: RenderQueue) { + + const port = renderQueue.endpoint.portAsString(); + const zoneName = Stack.of(renderQueue).stackName + '.local'; + let address; + switch(port) { + case '8080': + address = renderQueue.endpoint.hostname; + break; + case '4433': + address = 'renderqueue.' + zoneName; + break; + default: + break; + } + const renderQueueEndpoint = `${address}:${port}`; + + this.testInstance.connections.allowToDefaultPort(renderQueue); + this.testInstance.connections.allowTo(renderQueue, Port.tcp(22)); + + new CfnOutput(this, 'renderQueueEndpoint' + testSuiteId, { + value: renderQueueEndpoint, + }); + } + + /** + * Adds userData commands to the test instance to install DeadlineClient + */ + protected installDeadlineClient() { + const clientInstaller = new Asset(this, 'ClientInstaller', { + path: path.join(this.stagePath, 'bin', 'DeadlineClient-' + this.deadlineVersion + '-linux-x64-installer.run'), + }); + clientInstaller.grantRead(this.testInstance); + const installerPath: string = this.testInstance.instance.userData.addS3DownloadCommand({ + bucket: clientInstaller.bucket, + bucketKey: clientInstaller.s3ObjectKey, + }); + + this.testInstance.instance.userData.addCommands( + 'cd ~ec2-user', + `cp ${installerPath} ./deadline-client-installer.run`, + 'chmod +x *.run', + 'sudo yum install -y lsb', + 'sudo ./deadline-client-installer.run --mode unattended', + `rm -f ${installerPath}`, + 'rm -f ./deadline-client-installer.run', + ); + } + + /** + * Configures assets to install on the bastion via userData + * + * @param props Options for configuring Bastion userData + */ + public configureBastionUserData(props: UserDataConfigProps) { + this.testInstance.instance.instance.cfnOptions.creationPolicy = { + ...this.testInstance.instance.instance.cfnOptions.creationPolicy, + resourceSignal: { + timeout: Duration.minutes(5).toIsoString(), + count: 1, + }, + }; + + const userDataCommands = []; + + userDataCommands.push( + 'set -xeou pipefail', + ); + + const instanceSetupScripts = new Asset(this, 'SetupScripts', { + path: path.join(__dirname, '..', 'components', 'deadline', 'common', 'scripts', 'bastion', 'setup'), + }); + instanceSetupScripts.grantRead(this.testInstance); + const setupZipPath: string = this.testInstance.instance.userData.addS3DownloadCommand({ + bucket: instanceSetupScripts.bucket, + bucketKey: instanceSetupScripts.s3ObjectKey, + }); + + userDataCommands.push( + // Unzip the utility scripts to: ~ec2-user/setupScripts/ + 'cd ~ec2-user', + 'mkdir -p setupScripts', + 'cd setupScripts', + `unzip ${setupZipPath}`, + `rm -f ${setupZipPath}`, + 'chmod +x *.sh', + './install_jq.sh', + ); + + const instanceUtilScripts = new Asset(this, 'UtilScripts', { + path: path.join(__dirname, '..', 'components', 'deadline', 'common', 'scripts', 'bastion', 'utils'), + }); + instanceUtilScripts.grantRead(this.testInstance); + const utilZipPath: string = this.testInstance.instance.userData.addS3DownloadCommand({ + bucket: instanceUtilScripts.bucket, + bucketKey: instanceUtilScripts.s3ObjectKey, + }); + + userDataCommands.push( + // Unzip the utility scripts to: ~ec2-user/utilScripts/ + 'cd ~ec2-user', + 'mkdir -p utilScripts', + 'cd utilScripts', + `unzip ${utilZipPath}`, + `rm -f ${utilZipPath}`, + 'chmod +x *.sh', + ); + + const testingScripts = new Asset(this, 'TestingScripts', { + path: props.testingScriptPath, + }); + testingScripts.grantRead(this.testInstance); + const testsZipPath: string = this.testInstance.instance.userData.addS3DownloadCommand({ + bucket: testingScripts.bucket, + bucketKey: testingScripts.s3ObjectKey, + }); + + userDataCommands.push( + // Unzip the testing scripts to: ~ec2-user/testScripts/ + 'cd ~ec2-user', + 'mkdir -p testScripts', + 'cd testScripts', + `unzip ${testsZipPath}`, + `rm -f ${testsZipPath}`, + 'chmod +x *.sh', + ); + + userDataCommands.push( + // Everything will be owned by root, by default (UserData runs as root) + 'cd ~ec2-user', + 'chown ec2-user.ec2-user -R *', + ); + + this.testInstance.instance.userData.addCommands( ...userDataCommands ); + this.testInstance.instance.userData.addSignalOnExitCommand( this.testInstance.instance ); + } +} diff --git a/integ/package.json b/integ/package.json index b99a4192c..1a869dfea 100644 --- a/integ/package.json +++ b/integ/package.json @@ -1,6 +1,6 @@ { "name": "integ", - "version": "0.17.0", + "version": "0.18.0", "private": false, "description": "Integration tests for RFDK constructs", "bin": { @@ -54,50 +54,50 @@ "pkglint": "pkglint -f" }, "devDependencies": { - "@aws-cdk/assert": "1.57.0", - "@types/jest": "^26.0.4", - "@types/node": "^14.0.14", - "@typescript-eslint/eslint-plugin": "^3.5.0", - "@typescript-eslint/parser": "^3.5.0", - "aws-cdk": "1.57.0", - "eslint": "^7.4.0", + "@aws-cdk/assert": "1.66.0", + "@types/jest": "^26.0.10", + "@types/node": "^14.6.1", + "@typescript-eslint/eslint-plugin": "^3.10.1", + "@typescript-eslint/parser": "^3.10.1", + "aws-cdk": "1.66.0", + "eslint": "^7.7.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-import-resolver-typescript": "^2.0.0", + "eslint-import-resolver-typescript": "^2.2.1", "eslint-plugin-import": "^2.22.0", "eslint-plugin-license-header": "^0.2.0", - "jest": "^26.1.0", - "pkglint": "0.17.0", - "ts-jest": "^26.1.3" + "jest": "^26.4.2", + "pkglint": "0.18.0", + "ts-jest": "^26.2.0" }, "dependencies": { - "@aws-cdk/aws-docdb": "1.57.0", - "@aws-cdk/aws-ec2": "1.57.0", - "@aws-cdk/aws-efs": "1.57.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.57.0", - "@aws-cdk/aws-iam": "1.57.0", - "@aws-cdk/aws-logs": "1.57.0", - "@aws-cdk/aws-route53": "1.57.0", - "@aws-cdk/aws-s3": "1.57.0", - "@aws-cdk/aws-s3-assets": "1.57.0", - "@aws-cdk/aws-secretsmanager": "1.57.0", - "@aws-cdk/core": "1.57.0", - "aws-rfdk": "0.17.0", - "aws-sdk": "^2.709.0" + "@aws-cdk/aws-docdb": "1.66.0", + "@aws-cdk/aws-ec2": "1.66.0", + "@aws-cdk/aws-efs": "1.66.0", + "@aws-cdk/aws-elasticloadbalancingv2": "1.66.0", + "@aws-cdk/aws-iam": "1.66.0", + "@aws-cdk/aws-logs": "1.66.0", + "@aws-cdk/aws-route53": "1.66.0", + "@aws-cdk/aws-s3": "1.66.0", + "@aws-cdk/aws-s3-assets": "1.66.0", + "@aws-cdk/aws-secretsmanager": "1.66.0", + "@aws-cdk/core": "1.66.0", + "aws-rfdk": "0.18.0", + "aws-sdk": "^2.741.0" }, "peerDependencies": { - "@aws-cdk/aws-docdb": "1.57.0", - "@aws-cdk/aws-ec2": "1.57.0", - "@aws-cdk/aws-efs": "1.57.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.57.0", - "@aws-cdk/aws-iam": "1.57.0", - "@aws-cdk/aws-logs": "1.57.0", - "@aws-cdk/aws-route53": "1.57.0", - "@aws-cdk/aws-s3": "1.57.0", - "@aws-cdk/aws-s3-assets": "1.57.0", - "@aws-cdk/aws-secretsmanager": "1.57.0", - "@aws-cdk/core": "1.57.0", - "aws-rfdk": "0.17.0", - "aws-sdk": "^2.709.0" + "@aws-cdk/aws-docdb": "1.66.0", + "@aws-cdk/aws-ec2": "1.66.0", + "@aws-cdk/aws-efs": "1.66.0", + "@aws-cdk/aws-elasticloadbalancingv2": "1.66.0", + "@aws-cdk/aws-iam": "1.66.0", + "@aws-cdk/aws-logs": "1.66.0", + "@aws-cdk/aws-route53": "1.66.0", + "@aws-cdk/aws-s3": "1.66.0", + "@aws-cdk/aws-s3-assets": "1.66.0", + "@aws-cdk/aws-secretsmanager": "1.66.0", + "@aws-cdk/core": "1.66.0", + "aws-rfdk": "0.18.0", + "aws-sdk": "^2.741.0" }, "engines": { "node": ">= 10.13.0 <13 || >=13.7.0" diff --git a/integ/scripts/bash/cleanup.sh b/integ/scripts/bash/cleanup.sh index 2a07204da..f01e0d198 100755 --- a/integ/scripts/bash/cleanup.sh +++ b/integ/scripts/bash/cleanup.sh @@ -10,12 +10,14 @@ set -euo pipefail shopt -s globstar -root="$(pwd)" +INTEG_ROOT="$(pwd)" -for component in **/cdk.json; do - component_root="$(dirname "$component")" - rm -f "${component_root}/cdk.context.json" - rm -rf "${component_root}/cdk.out" - done +for COMPONENT in **/cdk.json; do + COMPONENT_ROOT="$(dirname "$COMPONENT")" + rm -f "${COMPONENT_ROOT}/cdk.context.json" + rm -rf "${COMPONENT_ROOT}/cdk.out" +done -rm -rf "${root}/node_modules" +rm -rf "$INTEG_ROOT/node_modules" +rm -rf "$INTEG_ROOT/stage" +rm -rf "$INTEG_ROOT/.e2etemp" diff --git a/integ/scripts/bash/deploy-all.sh b/integ/scripts/bash/deploy-all.sh index dc4e814b6..4dd6248db 100755 --- a/integ/scripts/bash/deploy-all.sh +++ b/integ/scripts/bash/deploy-all.sh @@ -8,29 +8,39 @@ set -euo pipefail shopt -s globstar -root="$(pwd)" -infrastructure="${root}/components/_infrastructure" -source "${root}/test-config.sh" +INTEG_ROOT="$(pwd)" +BASH_SCRIPTS="$INTEG_ROOT/scripts/bash" +INFRASTRUCTURE_APP="$INTEG_ROOT/components/_infrastructure" + +# Load environment variables from config file +if [ ! "${SKIP_TEST_CONFIG-}" = true ]; then + # Load variables from config file + echo "Loading config..." + source "$INTEG_ROOT/test-config.sh" +fi + +# Set variables from script +source $BASH_SCRIPTS/set-test-variables.sh if [ -z ${INTEG_STACK_TAG+x} ]; then # Create a unique tag to add to stack names and some resources export INTEG_STACK_TAG="$(date +%s%N)" fi -# Run preflight checks to make sure necessary variables, etc. are set -jest --passWithNoTests --silent "preflight" - # Deploy the infrastructure app, a cdk app containing only a VPC to be supplied to the following tests -cd "$infrastructure" +cd "$INFRASTRUCTURE_APP" npx cdk deploy "*" --require-approval=never -cd "$root" +cd "$INTEG_ROOT" -for component in **/cdk.json; do - component_root="$(dirname "$component")" +for COMPONENT in **/cdk.json; do + COMPONENT_ROOT="$(dirname "$COMPONENT")" + COMPONENT_NAME=$(basename "$COMPONENT_ROOT") # Use a pattern match to exclude the infrastructure app from the results - if [[ "$(basename "$component_root")" != _* ]]; then + if [[ "$(basename "$COMPONENT_ROOT")" != _* ]]; then # Excecute the e2e test in the component's scripts directory - cd "${root}/${component_root}" && "./scripts/bash/deploy-stacks.sh" + cd "$INTEG_ROOT/$COMPONENT_ROOT" && ../common/scripts/bash/component_e2e.sh "$COMPONENT_NAME" --deploy-and-test-only fi done + +exit 0 diff --git a/integ/scripts/bash/deploy-infrastructure.sh b/integ/scripts/bash/deploy-infrastructure.sh new file mode 100755 index 000000000..4282c40ea --- /dev/null +++ b/integ/scripts/bash/deploy-infrastructure.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail +shopt -s globstar + +# Deploy the infrastructure app, a cdk app containing only a VPC to be supplied to the following tests +INFRASTRUCTURE_APP="$INTEG_ROOT/components/_infrastructure" +cd "$INFRASTRUCTURE_APP" +echo "Deploying RFDK-integ infrastructure..." +npx cdk deploy "*" --require-approval=never || yarn run tear-down +echo "RFDK-integ infrastructure deployed." +cd "$INTEG_ROOT" + +exit 0 diff --git a/integ/scripts/bash/fetch-worker-amis.sh b/integ/scripts/bash/fetch-worker-amis.sh new file mode 100755 index 000000000..e7f7aaef9 --- /dev/null +++ b/integ/scripts/bash/fetch-worker-amis.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +# Only pull AMI ids if one of these variables is not already set +if [ -z ${LINUX_DEADLINE_AMI_ID+x} ] || [ -z ${WINDOWS_DEADLINE_AMI_ID+x} ]; then + DEADLINE_RELEASE=$(sed 's/\(.*\..*\..*\)\..*/\1/' <<< $DEADLINE_VERSION) + curl https://awsportal.s3.amazonaws.com/$DEADLINE_RELEASE/Release/amis.json --silent -o "$INTEG_TEMP_DIR/amis.json" + if [ -z ${LINUX_DEADLINE_AMI_ID+x} ]; then + export LINUX_DEADLINE_AMI_ID=$(node -e $'const json = require(\'./.e2etemp/amis.json\'); console.log(json[process.argv[1]].worker["ami-id"])' "$AWS_REGION") + fi + if [ -z ${WINDOWS_DEADLINE_AMI_ID+x} ]; then + export WINDOWS_DEADLINE_AMI_ID=$(node -e $'const json = require(\'./.e2etemp/amis.json\'); console.log(json[process.argv[1]].windowsWorker["ami-id"])' "$AWS_REGION") + fi +fi diff --git a/integ/scripts/bash/report-test-results.sh b/integ/scripts/bash/report-test-results.sh new file mode 100755 index 000000000..e18fbc2ee --- /dev/null +++ b/integ/scripts/bash/report-test-results.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail +shopt -s globstar + +PRETEST_TIME=$(( $PRETEST_FINISH_TIME - $TEST_START_TIME )) +echo "Pretest setup runtime: $((($PRETEST_TIME / 60) % 60))m $(($PRETEST_TIME % 60))s" + +INFRASTRUCTURE_DEPLOY_TIME=$(( $INFRASTRUCTURE_DEPLOY_FINISH_TIME - $PRETEST_FINISH_TIME )) +echo "Infrastructure stack deploy runtime: $((($INFRASTRUCTURE_DEPLOY_TIME / 60) % 60))m $(($INFRASTRUCTURE_DEPLOY_TIME % 60))s" + +INFRASTRUCTURE_DESTROY_TIME=$(( $INFRASTRUCTURE_DESTROY_FINISH_TIME - $INFRASTRUCTURE_DESTROY_START_TIME )) +echo "Infrastructure stack cleanup runtime: $((($INFRASTRUCTURE_DESTROY_TIME / 60) % 60))m $(($INFRASTRUCTURE_DESTROY_TIME % 60))s" + +# Function pulls test results from test output file and calculates time spent on each stage of the test +report_results () { + COMPONENT_NAME=$1 + + if [ $(ls "$INTEG_TEMP_DIR/$COMPONENT_NAME.json" 2> /dev/null) ]; then + # Get test numbers from jest output + TESTS_RAN=$(node -e $'const json = require(process.argv[1]); console.log(json.numTotalTests)' "$INTEG_TEMP_DIR/$COMPONENT_NAME.json") + TESTS_PASSED=$(node -e $'const json = require(process.argv[1]); console.log(json.numPassedTests)' "$INTEG_TEMP_DIR/$COMPONENT_NAME.json") + TESTS_FAILED=$(node -e $'const json = require(process.argv[1]); console.log(json.numFailedTests)' "$INTEG_TEMP_DIR/$COMPONENT_NAME.json") + + DEPLOY_START_TIME=${COMPONENT_NAME}_START_TIME + DEPLOY_FINISH_TIME=$(node -e $'const json = require(process.argv[1]); console.log(json.startTime)' "$INTEG_TEMP_DIR/$COMPONENT_NAME.json") + DEPLOY_FINISH_TIME="${DEPLOY_FINISH_TIME:0:10}" + DESTROY_START_TIME=$(node -e $'const json = require(process.argv[1]); console.log(json.testResults[0].endTime)' "$INTEG_TEMP_DIR/$COMPONENT_NAME.json") + DESTROY_START_TIME="${DESTROY_START_TIME:0:10}" + DESTROY_FINISH_TIME=${COMPONENT_NAME}_FINISH_TIME + + # Calculate seconds from when deploy began to when test began + DEPLOY_TIME=$(( $DEPLOY_FINISH_TIME - $DEPLOY_START_TIME )) + # Calculate seconds from when deploy ended to when teardown began + TEST_TIME=$(( $DESTROY_START_TIME - $DEPLOY_FINISH_TIME )) + # Calculate seconds from when test ended to when teardown finished + DESTROY_TIME=$(( $DESTROY_FINISH_TIME - $DESTROY_START_TIME )) + + echo "Results for test component $COMPONENT_NAME: " + echo " -Tests ran:" $TESTS_RAN + echo " -Tests passed:" $TESTS_PASSED + echo " -Tests failed:" $TESTS_FAILED + echo " -Deploy runtime: $((($DEPLOY_TIME / 60) % 60))m $(($DEPLOY_TIME % 60))s" + echo " -Test suite runtime: $((($TEST_TIME / 60) % 60))m $(($TEST_TIME % 60))s" + echo " -Cleanup runtime: $((($DESTROY_TIME / 60) % 60))m $(($DESTROY_TIME % 60))s" + + fi +} + +# Report test results for each test component +for COMPONENT in **/cdk.json; do + COMPONENT_ROOT="$(dirname "$COMPONENT")" + COMPONENT_NAME=$(basename "$COMPONENT_ROOT") + # Use a pattern match to exclude the infrastructure app from the results + if [[ "$COMPONENT_NAME" != _* ]]; then + report_results $COMPONENT_NAME + + fi + export ${COMPONENT_NAME}_FINISH_TIME=$SECONDS +done + +exit 0 diff --git a/integ/scripts/bash/rfdk-integ-e2e.sh b/integ/scripts/bash/rfdk-integ-e2e.sh index 6976dff4f..9e6ed47ee 100755 --- a/integ/scripts/bash/rfdk-integ-e2e.sh +++ b/integ/scripts/bash/rfdk-integ-e2e.sh @@ -6,60 +6,108 @@ # Script to run end to end test for configured RFDK components # Configuration information for each test is drawn from integ/test-config.sh # Script handles stack deployment, execution of the necessary tests, and teardown -# set -euo pipefail shopt -s globstar -root="$(pwd)" -infrastructure="${root}/components/_infrastructure" +#Mark test start time +export TEST_START_TIME="$(date +%s)" +SECONDS=$TEST_START_TIME -echo "Loading config..." -source "${root}/test-config.sh" +export INTEG_ROOT="$(pwd)" +BASH_SCRIPTS="$INTEG_ROOT/scripts/bash" + +# Load environment variables from config file +if [ ! "${SKIP_TEST_CONFIG-}" = true ]; then + # Load variables from config file + echo "Loading config..." + source "$INTEG_ROOT/test-config.sh" +fi + +# Set variables from script +source $BASH_SCRIPTS/set-test-variables.sh + +# Make sure SSPL license has been accepted if running repository test +if [ ! "${SKIP_deadline_01_repository_TEST-}" = true ]; then + if [ $USER_ACCEPTS_SSPL_FOR_RFDK_TESTS != true ]; then + echo "Error: SSPL license has not been accepted for repository test; test will not run. See README.md for details" + exit 1 + fi +fi + +# Create temp directory +export INTEG_TEMP_DIR="$INTEG_ROOT/.e2etemp" +mkdir -p $INTEG_TEMP_DIR + +# Stage deadline from script +$BASH_SCRIPTS/stage-deadline.sh + +# If executing worker fleet tests, find Deadline AMIs based on supplied version +if [ ! "${SKIP_deadline_03_repository_TEST-}" = true ]; then + source $BASH_SCRIPTS/fetch-worker-amis.sh +fi # Create a unique tag to add to stack names and some resources if [ -z ${INTEG_STACK_TAG+x} ]; then - # Create a unique tag to add to stack names and some resources export INTEG_STACK_TAG="$(date +%s%N)" fi -# Set location of output file -mkdir -p "test-output" -export OUTPUT_FILE="${root}/test-output/output-${INTEG_STACK_TAG}.txt" +# Mark pretest finish time +export PRETEST_FINISH_TIME=$SECONDS -echo "Starting RFDK-integ end-to-end tests" > "$OUTPUT_FILE" +echo "Starting RFDK-integ end-to-end tests" -# Run preflight checks to make sure necessary variables, etc. are set -jest --passWithNoTests --silent "preflight" - -cd "$infrastructure" +# Define cleanup function for deployment failure +cleanup_on_failure () { + yarn run tear-down + exit 1 +} # Deploy the infrastructure app, a cdk app containing only a VPC to be supplied to the following tests -echo "Deploying RFDK-integ infrastructure..." >> "$OUTPUT_FILE" -npx cdk deploy "*" --require-approval=never -echo "RFDK-integ infrastructure deployed." >> "$OUTPUT_FILE" -cd "$root" +$BASH_SCRIPTS/deploy-infrastructure.sh || cleanup_on_failure + +# Mark infrastructure deploy finish time +export INFRASTRUCTURE_DEPLOY_FINISH_TIME=$SECONDS # Pull the top level directory for each cdk app in the components directory -for component in **/cdk.json; do - component_root="$(dirname "$component")" +for COMPONENT in **/cdk.json; do + COMPONENT_ROOT="$(dirname "$COMPONENT")" + COMPONENT_NAME=$(basename "$COMPONENT_ROOT") + # Invoke hook function if it is exported and name is defined in PRE_COMPONENT_HOOK variable + if [ ! -z "${PRE_COMPONENT_HOOK+x}" ] && [ "$(type -t $PRE_COMPONENT_HOOK)" == "function" ] + then + $PRE_COMPONENT_HOOK $COMPONENT_NAME + fi + # Use a pattern match to exclude the infrastructure app from the results - if [[ "$(basename "$component_root")" != _* ]]; then + export ${COMPONENT_NAME}_START_TIME=$SECONDS + if [[ "$COMPONENT_NAME" != _* ]]; then # Excecute the e2e test in the component's scripts directory - cd "${root}/${component_root}" && "./scripts/bash/e2e.sh" + cd "$INTEG_ROOT/$COMPONENT_ROOT" && ../common/scripts/bash/component_e2e.sh "$COMPONENT_NAME" || cleanup_on_failure fi + export ${COMPONENT_NAME}_FINISH_TIME=$SECONDS done +# Mark infrastructure destroy start time +export INFRASTRUCTURE_DESTROY_START_TIME=$SECONDS + # Destroy the infrastructure stack on completion -echo "Test suites completed. Destroying infrastructure stack..." >> "$OUTPUT_FILE" -cd "$infrastructure" -npx cdk destroy "*" -f +cd $INTEG_ROOT +$BASH_SCRIPTS/teardown-infrastructure.sh || cleanup_on_failure -echo "Infrastructure stack destroyed." >> "$OUTPUT_FILE" -cd "$root" +# Mark infrastructure destroy finish time +export INFRASTRUCTURE_DESTROY_FINISH_TIME=$SECONDS + +cd "$INTEG_ROOT" + +echo "Complete!" + +# Report results +$BASH_SCRIPTS/report-test-results.sh echo "Cleaning up folders..." yarn run clean -echo "Complete!" >> "$OUTPUT_FILE" +echo "Exiting..." + exit 0 diff --git a/integ/scripts/bash/set-test-variables.sh b/integ/scripts/bash/set-test-variables.sh new file mode 100755 index 000000000..64563b207 --- /dev/null +++ b/integ/scripts/bash/set-test-variables.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +echo "Setting test variables..." + +# Get region from CDK_DEFAULT_REGION; assume us-west-2 if it's not set +if [ -z ${CDK_DEFAULT_REGION+x} ]; then + export AWS_REGION="us-west-2" +else + export AWS_REGION=$CDK_DEFAULT_REGION +fi + +if [ -z ${USER_ACCEPTS_SSPL_FOR_RFDK_TESTS+x} ]; then + export USER_ACCEPTS_SSPL_FOR_RFDK_TESTS=false +fi + + +# Set staging path to default if not overridden +if [ -z ${DEADLINE_STAGING_PATH+x} ]; then + export DEADLINE_STAGING_PATH="$INTEG_ROOT/stage" +elif [ $(ls "$DEADLINE_STAGING_PATH/manifest.json" 2> /dev/null) ]; then + #If path is set, extract the Deadline version to use for Deadline installations on the farm. This will override any other Deadline version provided. + export DEADLINE_VERSION=$(node -e $'const json = require(process.argv[1] + \'/manifest.json\'); console.log(json.version)' "$DEADLINE_STAGING_PATH") +fi + +# Set Deadline version to default if not overridden +if [ -z ${DEADLINE_VERSION+x} ]; then + export DEADLINE_VERSION="10.1.9.2" +fi diff --git a/integ/scripts/bash/stage-deadline.sh b/integ/scripts/bash/stage-deadline.sh new file mode 100755 index 000000000..b24c61370 --- /dev/null +++ b/integ/scripts/bash/stage-deadline.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +# Check if Deadline assets are staged at configured path +if [ ! $(ls "$DEADLINE_STAGING_PATH/manifest.json" 2> /dev/null) ]; then + # Stage Deadline assets + npx ../packages/aws-rfdk/bin/stage-deadline --deadlineInstallerURI "s3://thinkbox-installers/Deadline/$DEADLINE_VERSION/Linux/DeadlineClient-$DEADLINE_VERSION-linux-x64-installer.run" --dockerRecipesURI "s3://thinkbox-installers/DeadlineDocker/$DEADLINE_VERSION/DeadlineDocker-$DEADLINE_VERSION.tar.gz" --output "$DEADLINE_STAGING_PATH" +fi + +exit 0 diff --git a/integ/scripts/bash/tear-down.sh b/integ/scripts/bash/tear-down.sh index 413466082..bae9689dd 100755 --- a/integ/scripts/bash/tear-down.sh +++ b/integ/scripts/bash/tear-down.sh @@ -10,28 +10,37 @@ set -euo pipefail shopt -s globstar -root="$(pwd)" -infrastructure="${root}/components/_infrastructure" -source test-config.sh +INTEG_ROOT="$(pwd)" +BASH_SCRIPTS="$INTEG_ROOT/scripts/bash" +INFRASTRUCTURE_APP="$INTEG_ROOT/components/_infrastructure" if [ -z ${INTEG_STACK_TAG+x} ]; then echo "INTEG_STACK_TAG must be set, exiting..." exit 1 fi -for component in **/cdk.json; do - component_root="$(dirname "$component")" +# Load environment variables from config file +if [ ! "${SKIP_TEST_CONFIG-}" = true ]; then + # Load variables from config file + echo "Loading config..." + source "$INTEG_ROOT/test-config.sh" +fi + +# Set variables from script +source $BASH_SCRIPTS/set-test-variables.sh + +for COMPONENT in **/cdk.json; do + COMPONENT_ROOT="$(dirname "$COMPONENT")" + COMPONENT_NAME=$(basename "$COMPONENT_ROOT") # Use a pattern match to exclude the infrastructure app from the results - if [[ "$(basename "$component_root")" != _* ]]; then + if [[ "$(basename "$COMPONENT_ROOT")" != _* ]]; then # Excecute the e2e test in the component's scripts directory - cd "${root}/${component_root}" && "./scripts/bash/destroy-stacks.sh" + cd "$INTEG_ROOT/$COMPONENT_ROOT" && ../common/scripts/bash/component_e2e.sh "$COMPONENT_NAME" --destroy-only fi done -if [ -z ${SAVE_INFRASTRUCTURE+x} ]; then - cd "$infrastructure" && npx cdk destroy "*" -f -fi +cd "$INFRASTRUCTURE_APP" && npx cdk destroy "*" -f -cd "$root" +cd "$INTEG_ROOT" && yarn run clean -yarn run clean +exit 0 diff --git a/integ/scripts/bash/teardown-infrastructure.sh b/integ/scripts/bash/teardown-infrastructure.sh new file mode 100755 index 000000000..c6c43342a --- /dev/null +++ b/integ/scripts/bash/teardown-infrastructure.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +echo "Test suites completed. Destroying infrastructure stack..." +INFRASTRUCTURE_APP="$INTEG_ROOT/components/_infrastructure" +cd "$INFRASTRUCTURE_APP" +npx cdk destroy "*" -f +echo "Infrastructure stack destroyed." + +exit 0 diff --git a/integ/test-config.sh b/integ/test-config.sh index 3a9b77506..b3b2774ce 100755 --- a/integ/test-config.sh +++ b/integ/test-config.sh @@ -3,16 +3,25 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -# Options for Deadline test suite -export EXECUTE_DEADLINE_REPOSITORY_TEST_SUITE=true -export EXECUTE_DEADLINE_RENDERQ_TEST_SUITE=true -export EXECUTE_DEADLINE_WORKER_TEST_SUITE=true -export DEADLINE_STAGING_PATH +# Accept SSPL license to install MongoDB +# - If not set to `true` here, the Repository test component will fail immediately on execution +export USER_ACCEPTS_SSPL_FOR_RFDK_TESTS=false + +# Version of Deadline to install on farm resources. +# - If not set here, will default to 10.1.9.2 export DEADLINE_VERSION -# Options for Deadline Repository test component -export USER_ACCEPTS_SSPL_FOR_RFDK_TESTS=false +# Qualified path to staged Deadline assets. +# - If not set here, assets will stage automatically to `aws-rfdk/integ/stage` +# - If set here, the version found in `manifest.json` at this path will override any value supplied for DEADLINE_VERSION +export DEADLINE_STAGING_PATH -# Options for Deadline WorkerFleet test component +# EC2 AMIs to use for Deadline workers +# - If not set here, the appropriate basic worker AMI for the version of Deadline and region will be pulled from the public directory export LINUX_DEADLINE_AMI_ID export WINDOWS_DEADLINE_AMI_ID + +# Configure test suites to include in end-to-end test +export SKIP_deadline_01_repository_TEST +export SKIP_deadline_02_renderQueue_TEST +export SKIP_deadline_03_workerFleet_TEST diff --git a/lambda-layers/package.json b/lambda-layers/package.json index bd6aef15e..3e3eaef7f 100644 --- a/lambda-layers/package.json +++ b/lambda-layers/package.json @@ -1,6 +1,6 @@ { "name": "lambda-layers", - "version": "0.17.0", + "version": "0.18.0", "private": false, "description": "Package containing scripts for building and publishing Lambda Layers", "main": "lib/index.js", @@ -29,10 +29,10 @@ "stability": "stable", "maturity": "stable", "devDependencies": { - "@types/node": "^14.0.12", - "typescript": "~3.9.6" + "@types/node": "^14.6.1", + "typescript": "~4.0.3" }, "dependencies": { - "aws-sdk": "^2.693.0" + "aws-sdk": "^2.741.0" } } diff --git a/lambda-layers/yarn.lock b/lambda-layers/yarn.lock index 0e8f5d89a..bc3847e02 100644 --- a/lambda-layers/yarn.lock +++ b/lambda-layers/yarn.lock @@ -2,15 +2,15 @@ # yarn lockfile v1 -"@types/node@^14.0.12": - version "14.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499" - integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== - -aws-sdk@^2.693.0: - version "2.740.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.740.0.tgz#3ed1a9ad27d7f3e4fd289266f6e6d63d34dfd5ff" - integrity sha512-cSedIe7g5/S5o23jHvm9+vWhcYysmuKrmbML1Z0pO9KxlqOA9s4Z5f6Il7ZmvAktfmrxu1SyQu4YEoP5DL4/zw== +"@types/node@^14.6.1": + version "14.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.1.tgz#fdf6f6c6c73d3d8eee9c98a9a0485bc524b048d7" + integrity sha512-HnYlg/BRF8uC1FyKRFZwRaCPTPYKa+6I8QiUZFLredaGOou481cgFS4wKRFyKvQtX8xudqkSdBczJHIYSQYKrQ== + +aws-sdk@^2.741.0: + version "2.742.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.742.0.tgz#02373d324ca8201cd3fc8c1b82eff8b48b593f4c" + integrity sha512-zntDB0BpMn/y+B4RQvXuqY8DmJDYPkeFjZ6BbZ6vdNrsdB5TRz8p53ats4D3mLG068RB4M4AmVioFnU69nDXyQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -76,10 +76,10 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -typescript@~3.9.6: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5" + integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg== url@0.10.3: version "0.10.3" diff --git a/lerna.json b/lerna.json index 7a8fe89fb..13f0ead66 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "integ/" ], "rejectCycles": "true", - "version": "0.17.0" + "version": "0.18.0" } diff --git a/package.json b/package.json index e51ea46c1..6d96cd4c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws-rfdk-project", - "version": "0.17.0", + "version": "0.18.0", "license": "Apache-2.0", "author": { "name": "Amazon Web Services", @@ -20,86 +20,81 @@ "release": "standard-version" }, "standard-version": { - "releaseCommitMessageFormat": "v{{currentTag}}", - "commitUrlFormat": ") (full hash: {{hash}}", - "compareUrlFormat": ") (Link not implemented", - "issueUrlFormat": ") (Link not implemented", - "userUrlFormat": ") (Link not implemented", "scripts": { "prebump": "echo $(node -pe \"require('./lerna.json').version\")", "precommit": "git add ." } }, "devDependencies": { - "@aws-cdk/assets": "1.57.0", - "@aws-cdk/aws-apigateway": "1.57.0", - "@aws-cdk/aws-applicationautoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling-common": "1.57.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.57.0", - "@aws-cdk/aws-batch": "1.57.0", - "@aws-cdk/aws-certificatemanager": "1.57.0", - "@aws-cdk/aws-cloudformation": "1.57.0", - "@aws-cdk/aws-cloudfront": "1.57.0", - "@aws-cdk/aws-cloudwatch": "1.57.0", - "@aws-cdk/aws-cloudwatch-actions": "1.57.0", - "@aws-cdk/aws-codebuild": "1.57.0", - "@aws-cdk/aws-codecommit": "1.57.0", - "@aws-cdk/aws-codeguruprofiler": "1.57.0", - "@aws-cdk/aws-codepipeline": "1.57.0", - "@aws-cdk/aws-cognito": "1.57.0", - "@aws-cdk/aws-docdb": "1.57.0", - "@aws-cdk/aws-dynamodb": "1.57.0", - "@aws-cdk/aws-ec2": "1.57.0", - "@aws-cdk/aws-ecr": "1.57.0", - "@aws-cdk/aws-ecr-assets": "1.57.0", - "@aws-cdk/aws-ecs": "1.57.0", - "@aws-cdk/aws-ecs-patterns": "1.57.0", - "@aws-cdk/aws-efs": "1.57.0", - "@aws-cdk/aws-elasticloadbalancing": "1.57.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.57.0", - "@aws-cdk/aws-events": "1.57.0", - "@aws-cdk/aws-events-targets": "1.57.0", - "@aws-cdk/aws-iam": "1.57.0", - "@aws-cdk/aws-kinesis": "1.57.0", - "@aws-cdk/aws-kms": "1.57.0", - "@aws-cdk/aws-lambda": "1.57.0", - "@aws-cdk/aws-logs": "1.57.0", - "@aws-cdk/aws-route53": "1.57.0", - "@aws-cdk/aws-route53-targets": "1.57.0", - "@aws-cdk/aws-s3": "1.57.0", - "@aws-cdk/aws-s3-assets": "1.57.0", - "@aws-cdk/aws-sam": "1.57.0", - "@aws-cdk/aws-secretsmanager": "1.57.0", - "@aws-cdk/aws-servicediscovery": "1.57.0", - "@aws-cdk/aws-sns": "1.57.0", - "@aws-cdk/aws-sns-subscriptions": "1.57.0", - "@aws-cdk/aws-sqs": "1.57.0", - "@aws-cdk/aws-ssm": "1.57.0", - "@aws-cdk/aws-stepfunctions": "1.57.0", - "@aws-cdk/cloud-assembly-schema": "1.57.0", - "@aws-cdk/core": "1.57.0", - "@aws-cdk/custom-resources": "1.57.0", - "@aws-cdk/cx-api": "1.57.0", - "@aws-cdk/region-info": "1.57.0", - "@types/jest": "^26.0.4", - "@types/node": "^14.0.14", + "@aws-cdk/assets": "1.66.0", + "@aws-cdk/aws-apigateway": "1.66.0", + "@aws-cdk/aws-applicationautoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling-common": "1.66.0", + "@aws-cdk/aws-autoscaling-hooktargets": "1.66.0", + "@aws-cdk/aws-batch": "1.66.0", + "@aws-cdk/aws-certificatemanager": "1.66.0", + "@aws-cdk/aws-cloudformation": "1.66.0", + "@aws-cdk/aws-cloudfront": "1.66.0", + "@aws-cdk/aws-cloudwatch": "1.66.0", + "@aws-cdk/aws-cloudwatch-actions": "1.66.0", + "@aws-cdk/aws-codebuild": "1.66.0", + "@aws-cdk/aws-codecommit": "1.66.0", + "@aws-cdk/aws-codeguruprofiler": "1.66.0", + "@aws-cdk/aws-codepipeline": "1.66.0", + "@aws-cdk/aws-cognito": "1.66.0", + "@aws-cdk/aws-docdb": "1.66.0", + "@aws-cdk/aws-dynamodb": "1.66.0", + "@aws-cdk/aws-ec2": "1.66.0", + "@aws-cdk/aws-ecr": "1.66.0", + "@aws-cdk/aws-ecr-assets": "1.66.0", + "@aws-cdk/aws-ecs": "1.66.0", + "@aws-cdk/aws-ecs-patterns": "1.66.0", + "@aws-cdk/aws-efs": "1.66.0", + "@aws-cdk/aws-elasticloadbalancing": "1.66.0", + "@aws-cdk/aws-elasticloadbalancingv2": "1.66.0", + "@aws-cdk/aws-events": "1.66.0", + "@aws-cdk/aws-events-targets": "1.66.0", + "@aws-cdk/aws-iam": "1.66.0", + "@aws-cdk/aws-kinesis": "1.66.0", + "@aws-cdk/aws-kms": "1.66.0", + "@aws-cdk/aws-lambda": "1.66.0", + "@aws-cdk/aws-logs": "1.66.0", + "@aws-cdk/aws-route53": "1.66.0", + "@aws-cdk/aws-route53-targets": "1.66.0", + "@aws-cdk/aws-s3": "1.66.0", + "@aws-cdk/aws-s3-assets": "1.66.0", + "@aws-cdk/aws-sam": "1.66.0", + "@aws-cdk/aws-secretsmanager": "1.66.0", + "@aws-cdk/aws-servicediscovery": "1.66.0", + "@aws-cdk/aws-sns": "1.66.0", + "@aws-cdk/aws-sns-subscriptions": "1.66.0", + "@aws-cdk/aws-sqs": "1.66.0", + "@aws-cdk/aws-ssm": "1.66.0", + "@aws-cdk/aws-stepfunctions": "1.66.0", + "@aws-cdk/cloud-assembly-schema": "1.66.0", + "@aws-cdk/core": "1.66.0", + "@aws-cdk/custom-resources": "1.66.0", + "@aws-cdk/cx-api": "1.66.0", + "@aws-cdk/region-info": "1.66.0", + "@types/jest": "^26.0.10", + "@types/node": "^14.6.1", "@types/nodeunit": "^0.0.31", - "aws-cdk": "1.57.0", - "aws-sdk": "^2.709.0", - "constructs": "^3.0.2", - "conventional-changelog-cli": "^2.0.34", + "aws-cdk": "1.66.0", + "aws-sdk": "^2.741.0", + "constructs": "^3.0.4", + "conventional-changelog-cli": "^2.1.0", "fs-extra": "^9.0.1", - "jest": "^25.5.4", - "jsii-diff": "^1.9.0", - "jsii-pacmak": "^1.9.0", - "jest-junit": "^11.0.1", + "jest": "^26.4.2", + "jest-junit": "^11.1.0", + "jsii-diff": "^1.12.0", + "jsii-pacmak": "^1.12.0", "lerna": "^3.22.1", "nodeunit": "^0.11.3", "nyc": "^15.1.0", - "standard-version": "^8.0.2", - "ts-jest": "^25.5.1", - "typescript": "~3.9.6" + "standard-version": "^9.0.0", + "ts-jest": "^26.2.0", + "typescript": "~4.0.3" }, "workspaces": { "packages": [ diff --git a/packages/aws-rfdk/bin/index-test.json b/packages/aws-rfdk/bin/index-test.json new file mode 100644 index 000000000..927d7e677 --- /dev/null +++ b/packages/aws-rfdk/bin/index-test.json @@ -0,0 +1,49 @@ +{ + "Deadline": { + "versions": { + "10": { + "1": { + "8": { + "5": { + "linux": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.8.5/Linux/Deadline-10.1.8.5-linux-installers.tar", + "clientInstaller": "s3://thinkbox-installers/Deadline/10.1.8.5/Linux/DeadlineClient-10.1.8.5-linux-x64-installer.run", + "repositoryInstaller": "s3://thinkbox-installers/Deadline/10.1.8.5/Linux/DeadlineRepository-10.1.8.5-linux-x64-installer.run" + }, + "mac": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.8.5/Mac/Deadline-10.1.8.5-osx-installers.dmg" + }, + "windows": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.8.5/Windows/Deadline-10.1.8.5-windows-installers.zip", + "clientInstaller": "s3://thinkbox-installers/Deadline/10.1.8.5/Windows/DeadlineClient-10.1.8.5-windows-installer.exe", + "repositoryInstaller": "s3://thinkbox-installers/Deadline/10.1.8.5/Windows/DeadlineRepository-10.1.8.5-windows-installer.exe" + } + } + }, + "9": { + "2": { + "linux": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.9.2/Linux/Deadline-10.1.9.2-linux-installers.tar", + "clientInstaller": "s3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineClient-10.1.9.2-linux-x64-installer.run", + "repositoryInstaller": "s3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineRepository-10.1.9.2-linux-x64-installer.run" + }, + "mac": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.9.2/Mac/Deadline-10.1.9.2-osx-installers.dmg" + }, + "windows": { + "bundle": "s3://thinkbox-installers/Deadline/10.1.9.2/Windows/Deadline-10.1.9.2-windows-installers.zip", + "clientInstaller": "s3://thinkbox-installers/Deadline/10.1.9.2/Windows/DeadlineClient-10.1.9.2-windows-installer.exe", + "repositoryInstaller": "s3://thinkbox-installers/Deadline/10.1.9.2/Windows/DeadlineRepository-10.1.9.2-windows-installer.exe" + } + } + } + } + } + }, + "latest": { + "linux": "10.1.9.2", + "mac": "10.1.9.2", + "windows": "10.1.8.5" + } + } +} diff --git a/packages/aws-rfdk/bin/stage-deadline.ts b/packages/aws-rfdk/bin/stage-deadline.ts index 3e39ba73f..fb9d2cdbe 100644 --- a/packages/aws-rfdk/bin/stage-deadline.ts +++ b/packages/aws-rfdk/bin/stage-deadline.ts @@ -12,11 +12,14 @@ import * as fs from 'fs'; import * as path from 'path'; import * as url from 'url'; import { types } from 'util'; +import {IUris, Platform, Product, VersionProvider } from '../lib/core/lambdas/nodejs/version-provider'; +import { Version } from '../lib/deadline'; const args = process.argv.slice(2); let deadlineInstallerURI = ''; let dockerRecipesURI = ''; +let deadlineReleaseVersion = ''; let outputFolder = './stage'; let verbose = false; @@ -43,68 +46,149 @@ while (n < args.length) { verbose = true; break; default: - console.error(`Unexpected command parameter ${args[n]}`); - process.exit(1); + if (!deadlineReleaseVersion){ + deadlineReleaseVersion = args[n]; + } else { + console.error(`Unexpected command parameter ${args[n]}`); + process.exit(1); + } + break; } n++; } -// Show help if URI for deadline installer or URI for docker is not specified. -if (deadlineInstallerURI === '' || dockerRecipesURI === '') { - usage(1); +if (!fs.existsSync(outputFolder)) { + fs.mkdirSync(outputFolder); +} else if (fs.readdirSync(outputFolder).length > 0) { + console.error('The target directory is not empty.'); + process.exit(1); } -const deadlineInstallerURL = new url.URL(deadlineInstallerURI); -const dockerRecipeURL = new url.URL(dockerRecipesURI); - -if (deadlineInstallerURL.protocol !== 's3:') { - console.error(`ERROR: Invalid URI protocol ("${deadlineInstallerURL.protocol}") for --deadlineInstallerURI. Only "s3:" URIs are supported.`); - usage(1); +const handler = new VersionProvider(); + +// populate installer URI +if (deadlineInstallerURI === '') { + handler.getVersionUris({ platform: Platform.linux, product: Product.deadline, versionString: deadlineReleaseVersion}) + .then(result => { + const installerVersion = result.get(Platform.linux); + if (installerVersion) { + validateDeadlineVersion(`${installerVersion.MajorVersion}.${installerVersion.MinorVersion}.${installerVersion.ReleaseVersion}.${installerVersion.PatchVersion}`); + const installerUrl = (installerVersion.Uris).clientInstaller; + if (installerUrl) { + getDeadlineInstaller(installerUrl); + } + } + else { + console.error(`Deadline installer for version ${deadlineReleaseVersion} was not found.`); + exitAndCleanup(1); + } + }) + .catch(error => { + console.error(error.message); + exitAndCleanup(error.code); + }); } - -if (dockerRecipeURL.protocol !== 's3:') { - console.error(`ERROR: Invalid URI protocol ("${dockerRecipeURL.protocol}") for --dockerRecipeURL. Only "s3:" URIs are supported.`); - usage(1); +else { + getDeadlineInstaller(deadlineInstallerURI); } -if (!validateBucketName(deadlineInstallerURL.hostname) || !validateBucketName(dockerRecipeURL.hostname)) { - usage(1); + +// populate docker recipe URI +if (dockerRecipesURI === '') { + handler.getVersionUris({ platform: Platform.linux, product: Product.deadlineDocker, versionString: deadlineReleaseVersion}) + .then(result => { + const installerVersion = result.get(Platform.linux); + if (installerVersion) { + getDockerRecipe((installerVersion.Uris).bundle); + } + else { + console.error(`Docker recipies for version ${deadlineReleaseVersion} was not found.`); + exitAndCleanup(1); + } + }) + .catch(error => { + console.error(error.message); + exitAndCleanup(error.code); + }); +} +else { + getDockerRecipe(dockerRecipesURI); } -if (!fs.existsSync(outputFolder)) { - fs.mkdirSync(outputFolder); -} else if (fs.readdirSync(outputFolder).length > 0) { - console.error('The target directory is not empty.'); - process.exit(1); +/** + * Download Deadline installer + * + * @param deadlineInstallerUri - Specifies a URI pointing to the Deadline Linux Client installer. This currently supports S3 URIs. + */ +function getDeadlineInstaller(deadlineInstallerUri: string) { + const deadlineInstallerURL = new url.URL(deadlineInstallerUri); + + if (deadlineInstallerURL.protocol !== 's3:') { + console.error(`ERROR: Invalid URI protocol ("${deadlineInstallerURL.protocol}") for --deadlineInstallerURI. Only "s3:" URIs are supported.`); + usage(1); + } + + if (!validateBucketName(deadlineInstallerURL.hostname)) { + usage(1); + } + + try { + // Get Deadline client installer + const deadlineInstallerPath = getFile({ + uri: deadlineInstallerURL, + targetFolder: path.join(outputFolder, 'bin'), + verbose, + }); + + // Make installer executable + makeExecutable(deadlineInstallerPath); + } catch (e) { + let errorMsg: string; + if (types.isNativeError(e)) { + errorMsg = e.message; + } else { + errorMsg = e.toString(); + } + console.error(`ERROR: ${errorMsg}`); + exitAndCleanup(1); + } } -try { - // Get Docker recipe - getAndExtractArchive({ - uri: dockerRecipeURL, - targetFolder: outputFolder, - verbose, - tarOptions: [`-x${verbose ? 'v' : ''}z`], - }); +/** + * Download and extract Docker recipe. + * + * @param dockerRecipesUri - Specifies a URI pointing to the Deadline Docker recipes. This currently supports S3 URIs. + */ +function getDockerRecipe(dockerRecipesUri: string) { + const dockerRecipeURL = new url.URL(dockerRecipesUri); - // Get Deadline client installer - const deadlineInstallerPath = getFile({ - uri: deadlineInstallerURL, - targetFolder: path.join(outputFolder, 'bin'), - verbose, - }); + if (dockerRecipeURL.protocol !== 's3:') { + console.error(`ERROR: Invalid URI protocol ("${dockerRecipeURL.protocol}") for --dockerRecipeURL. Only "s3:" URIs are supported.`); + usage(1); + } - // Make installer executable - makeExecutable(deadlineInstallerPath); -} catch (e) { - let errorMsg: string; - if (types.isNativeError(e)) { - errorMsg = e.message; - } else { - errorMsg = e.toString(); + if (!validateBucketName(dockerRecipeURL.hostname)) { + usage(1); + } + + try { + // Get Docker recipe + getAndExtractArchive({ + uri: dockerRecipeURL, + targetFolder: outputFolder, + verbose, + tarOptions: [`-x${verbose ? 'v' : ''}z`], + }); + } catch (e) { + let errorMsg: string; + if (types.isNativeError(e)) { + errorMsg = e.message; + } else { + errorMsg = e.toString(); + } + console.error(`ERROR: ${errorMsg}`); + exitAndCleanup(1); } - console.error(`ERROR: ${errorMsg}`); - process.exit(1); } /** @@ -179,20 +263,33 @@ The AWS CLI must be configured to authenticate using your AWS account. This can See https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html for documentation on how to configure the AWS CLI. Usage: stage-deadline [--output ] [--verbose] + + OR + stage-deadline [--output ] [--verbose] -d -c + Arguments: + + Specifies the official release of Deadline that should be staged. This must be of the form "a.b.c.d", "a.b.c", "a.b" or "a". + + Note: The minimum supported deadline version is ${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION} + -d, --deadlineInstallerURI Specifies a URI pointing to the Deadline Linux Client installer. This currently supports S3 URIs of the form: s3://thinkbox-installers/Deadline/10.1.x.y/Linux/DeadlineClient-10.1.x.y-linux-x64-installer.run + If this argument is provided will be ignored for Deadline Linux Client. + -c, --dockerRecipesURI Specifies a URI pointing to the Deadline Docker recipes. This currently supports S3 URIs of the form: s3://thinkbox-installers/DeadlineDocker/10.1.x.y/DeadlineDocker-10.1.x.y.tar.gz + If this argument is provided will be ignored for Deadline Docker recipes. + Options: -o, --output Specifies a path to an output directory where Deadline will be staged. The default is to use a "stage" @@ -201,6 +298,16 @@ Options: --verbose Increases the verbosity of the output `.trimLeft()); + exitAndCleanup(errorCode); +} + +/** + * Exit with error code and remove output folder. + * + * @param errorCode - THe code of error that will be returned. + */ +function exitAndCleanup(errorCode: number) { + fs.rmdirSync(outputFolder, {recursive: true}); process.exit(errorCode); } @@ -251,7 +358,7 @@ function getFile(props: GetFileProps) { const success = spawnCommand('aws', props.verbose, cmdArgs); if (!success) { - throw new Error(`Could not fetch ${props.uri.href}`); + throw new Error(`Could not fetch ${props.uri.href} (Are you authenticated with the AWS CLI?)`); } return path.join(props.targetFolder, uriFilename(props.uri)); @@ -307,3 +414,17 @@ function getAndExtractArchive(props: GetExtractArchiveProps) { throw new Error(`File ${tarPath} has not been extracted successfully.`); } } + +function validateDeadlineVersion(versionString: string) { + // Automatically populate the installer & recipe URI using the version, if it is provided. + try { + const version = Version.parse(versionString); + if(version.isLessThan(Version.MINIMUM_SUPPORTED_DEADLINE_VERSION)) { + console.error(`ERROR: Unsupported Deadline Version ${version.toString()}. Minimum supported version is ${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION} \n`); + usage(1); + } + } catch(e) { + console.error(`ERROR: ${(e as Error).message} \n`); + usage(1); + } +} diff --git a/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/handler.ts b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/handler.ts new file mode 100644 index 000000000..b8cca78d9 --- /dev/null +++ b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/handler.ts @@ -0,0 +1,59 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable no-console */ + +import { LambdaContext } from '../lib/aws-lambda'; +import { CfnRequestEvent, SimpleCustomResource } from '../lib/custom-resource'; +import { + VersionProvider, + IVersionProviderProperties, + IVersionedUris, + Platform, +} from './version-provider'; + + +export class VersionProviderResource extends SimpleCustomResource { + readonly versionProvider: VersionProvider; + + constructor(indexFilePath?: string) { + super(); + this.versionProvider = new VersionProvider(indexFilePath); + } + + /** + * @inheritdoc + */ + /* istanbul ignore next */ // @ts-ignore + public validateInput(data: object): boolean { + return this.versionProvider.implementsIVersionProviderProperties(data); + } + + /** + * @inheritdoc + */ + // @ts-ignore -- we do not use the physicalId + public async doCreate(physicalId: string, resourceProperties: IVersionProviderProperties): Promise> { + return await this.versionProvider.getVersionUris(resourceProperties); + } + + /** + * @inheritdoc + */ + /* istanbul ignore next */ // @ts-ignore + public async doDelete(physicalId: string, resourceProperties: IVersionProviderProperties): Promise { + // Nothing to do -- we don't modify anything. + return; + } +} + +/** + * The handler used to provide the installer links for the requested version + */ +/* istanbul ignore next */ +export async function handler(event: CfnRequestEvent, context: LambdaContext): Promise { + const versionProvider = new VersionProviderResource(); + return await versionProvider.handler(event, context); +} diff --git a/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/index.ts b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/index.ts new file mode 100644 index 000000000..9b8a8b5eb --- /dev/null +++ b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/index.ts @@ -0,0 +1,7 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './handler'; +export * from './version-provider'; diff --git a/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/test/version-provider.test.ts b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/test/version-provider.test.ts new file mode 100644 index 000000000..6ecebe3b6 --- /dev/null +++ b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/test/version-provider.test.ts @@ -0,0 +1,243 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable no-console */ +/* eslint-disable dot-notation */ + +import { Platform, Product, VersionProvider } from '../version-provider'; + +const versionProvider = new VersionProvider('bin/index-test.json'); +const indexTest = versionProvider['readInstallersIndex'](); + +const productSection = indexTest[Product.deadline]; + +test('version parsing', () => { + const result = versionProvider['parseVersionString']('10.1.10.6'); + + expect(result).not.toBeNull(); + + if (result === null) { return; } + expect(result[0]).toEqual('10.1.10.6'); + expect(result[1]).toEqual('10'); + expect(result[2]).toEqual('1'); + expect(result[3]).toEqual('10'); + expect(result[4]).toEqual('6'); +}); + +test('partial version parsing', () => { + const result = versionProvider['parseVersionString']('10.1'); + + expect(result).not.toBeNull(); + + if (result === null) { return; } + expect(result[0]).toEqual('10.1'); + expect(result[1]).toEqual('10'); + expect(result[2]).toEqual('1'); + expect(result[3]).toBeUndefined(); + expect(result[4]).toBeUndefined(); +}); + +test.each(['10.1.9.2.1', '10.', '10.1.', '10.-1', 'a.b.c'])('incorrect version %s parsing', (versionString: string) => { + const result = versionProvider['parseVersionString'](versionString); + expect(result).toBeNull(); +}); + +test.each([[Platform.linux, '10.1.9.2'], + [Platform.mac, '10.1.9.2'], + [Platform.windows, '10.1.8.5'], +])('latest version ', (platform: Platform, versionString: string) => { + const result = versionProvider['getLatestVersion'](platform, productSection); + + expect(result).toEqual(versionString); +}); + +test.each([ + [Platform.linux, { + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/Deadline-10.1.9.2-linux-installers.tar', + clientInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineClient-10.1.9.2-linux-x64-installer.run', + repositoryInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineRepository-10.1.9.2-linux-x64-installer.run', + } ], + [Platform.windows, { + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Windows/Deadline-10.1.9.2-windows-installers.zip', + clientInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Windows/DeadlineClient-10.1.9.2-windows-installer.exe', + repositoryInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Windows/DeadlineRepository-10.1.9.2-windows-installer.exe', + } ], + [Platform.mac, { + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Mac/Deadline-10.1.9.2-osx-installers.dmg', + } ], +])('get Uri for platform', (platform: Platform, versionedUris: any) => { + versionProvider['getUrisForPlatform']( + Product.deadline, + productSection, + platform, + '10.1.9.2', + ).then(result => { + expect(result).not.toBeNull(); + + expect(result?.Uris).toEqual(versionedUris); + }, + ).catch(error => { + process.stderr.write(`${error.toString()}\n`); + process.exit(1); + }); +}); + +test('get deadline version', async () => { + const result = await versionProvider.getVersionUris({ + product: Product.deadline, + platform: Platform.linux, + versionString: '10.1', + }); + + expect(result).not.toBeNull(); + const installerVersion = result.get(Platform.linux); + expect(installerVersion).not.toBeNull(); + + if (result === null) { return; } + expect(installerVersion?.Uris).toEqual({ + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/Deadline-10.1.9.2-linux-installers.tar', + clientInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineClient-10.1.9.2-linux-x64-installer.run', + repositoryInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineRepository-10.1.9.2-linux-x64-installer.run', + }); + expect(installerVersion?.MajorVersion).toEqual('10'); + expect(installerVersion?.MinorVersion).toEqual('1'); + expect(installerVersion?.ReleaseVersion).toEqual('9'); + expect(installerVersion?.PatchVersion).toEqual('2'); +}); + +test('product is not in file', async () => { + await expect(versionProvider.getVersionUris({ + product: Product.deadlineDocker, + })).rejects.toThrowError(/Information about product DeadlineDocker can't be found/); +}); + +test('get deadline version for all platforms', async () => { + const result = await versionProvider.getVersionUris({ + product: Product.deadline, + }); + + expect(result).not.toBeNull(); + const linuxInstallerVersion = result.get(Platform.linux); + expect(linuxInstallerVersion).not.toBeNull(); + + if (result === null) { return; } + expect(linuxInstallerVersion?.Uris).toEqual({ + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/Deadline-10.1.9.2-linux-installers.tar', + clientInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineClient-10.1.9.2-linux-x64-installer.run', + repositoryInstaller: 's3://thinkbox-installers/Deadline/10.1.9.2/Linux/DeadlineRepository-10.1.9.2-linux-x64-installer.run', + }); + expect(linuxInstallerVersion?.MajorVersion).toEqual('10'); + expect(linuxInstallerVersion?.MinorVersion).toEqual('1'); + expect(linuxInstallerVersion?.ReleaseVersion).toEqual('9'); + expect(linuxInstallerVersion?.PatchVersion).toEqual('2'); + + const macInstallerVersion = result.get(Platform.mac); + expect(macInstallerVersion).not.toBeNull(); + + if (result === null) { return; } + expect(macInstallerVersion?.Uris).toEqual({ + bundle: 's3://thinkbox-installers/Deadline/10.1.9.2/Mac/Deadline-10.1.9.2-osx-installers.dmg', + }); + expect(macInstallerVersion?.MajorVersion).toEqual('10'); + expect(macInstallerVersion?.MinorVersion).toEqual('1'); + expect(macInstallerVersion?.ReleaseVersion).toEqual('9'); + expect(macInstallerVersion?.PatchVersion).toEqual('2'); + + const windowsInstallerVersion = result.get(Platform.windows); + expect(windowsInstallerVersion).not.toBeNull(); + + if (result === null) { return; } + expect(windowsInstallerVersion?.Uris).toEqual({ + bundle: 's3://thinkbox-installers/Deadline/10.1.8.5/Windows/Deadline-10.1.8.5-windows-installers.zip', + clientInstaller: 's3://thinkbox-installers/Deadline/10.1.8.5/Windows/DeadlineClient-10.1.8.5-windows-installer.exe', + repositoryInstaller: 's3://thinkbox-installers/Deadline/10.1.8.5/Windows/DeadlineRepository-10.1.8.5-windows-installer.exe', + }); + expect(windowsInstallerVersion?.MajorVersion).toEqual('10'); + expect(windowsInstallerVersion?.MinorVersion).toEqual('1'); + expect(windowsInstallerVersion?.ReleaseVersion).toEqual('8'); + expect(windowsInstallerVersion?.PatchVersion).toEqual('5'); +}); + +test('validate correct input', async () => { + expect(versionProvider.implementsIVersionProviderProperties({ + product: Product.deadline, + versionString: '10.1.9.2', + platform: 'linux', + })).toBeTruthy(); +}); + +test('validate non-object input', async () => { + expect(versionProvider['implementsIVersionProviderProperties']('test')).toEqual(false); +}); + +test('validate input without product', async () => { + expect(versionProvider.implementsIVersionProviderProperties({ + versionString: 'version', + })).toEqual(false); +}); + +test('validate input with invalid versionString', async () => { + expect(versionProvider.implementsIVersionProviderProperties({ + product: Product.deadline, + versionString: 'version', + })).toEqual(false); +}); + +test('validate input with invalid platform', async () => { + expect(versionProvider['implementsIVersionProviderProperties']({ + product: Product.deadline, + platform: 'test', + })).toEqual(false); +}); + +test('not defined file path', () => { + expect(() => (new VersionProvider())['readInstallersIndex']()).toThrowError(/File path should be defined./); +}); + +test('invalid file path', () => { + expect(() => (new VersionProvider('test.txt'))['readInstallersIndex']()).toThrowError(/File test.txt was not found/); +}); + +test('get latest version without latest section', () => { + expect(() => versionProvider['getLatestVersion']('linux',{})).toThrowError(/Information about latest version can not be found/); +}); + +test('get latest version without informtion for platform', () => { + expect(() => versionProvider['getLatestVersion']('linux',{latest: {}})).toThrowError(/Information about latest version for platform linux can not be found/); +}); + +test('get requested Uri version for existing product.', () => { + const requestedVersion = versionProvider['parseVersionString']('10.1.9.2'); + expect(versionProvider['getRequestedUriVersion'](requestedVersion, { + 10: { + 1: { + 9: { + 2: { + linux: 's3://thinkbox-installers/DeadlineDocker/10.1.9.2/DeadlineDocker-10.1.9.2.tar.gz', + }, + }, + }, + }}, Platform.linux, Product.deadlineDocker )).toEqual({ + MajorVersion: '10', + MinorVersion: '1', + ReleaseVersion: '9', + PatchVersion: '2', + Uris: {bundle: 's3://thinkbox-installers/DeadlineDocker/10.1.9.2/DeadlineDocker-10.1.9.2.tar.gz'}, + }); +}); + +test('get requested Uri version for not existing product.', () => { + const requestedVersion = versionProvider['parseVersionString']('10.1.9.2'); + expect(versionProvider['getRequestedUriVersion'](requestedVersion, { + 10: { + 1: { + 9: { + 2: { + linux: 's3://thinkbox-installers/DeadlineDocker/10.1.9.2/DeadlineDocker-10.1.9.2.tar.gz', + }, + }, + }, + }}, Platform.windows, Product.deadlineDocker )).toEqual(undefined); +}); diff --git a/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/version-provider.ts b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/version-provider.ts new file mode 100644 index 000000000..6a27d2dd0 --- /dev/null +++ b/packages/aws-rfdk/lib/core/lambdas/nodejs/version-provider/version-provider.ts @@ -0,0 +1,323 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable no-console */ + +import * as fs from 'fs'; +import * as http from 'http'; +import * as url from 'url'; + +export enum Platform { + linux = 'linux', + + mac = 'mac', + + windows = 'windows', +} + +export enum Product { + deadline = 'Deadline', + + deadlineDocker = 'DeadlineDocker', +} + +export interface IVersionProviderProperties { + readonly versionString?: string + + readonly product: Product; + + readonly platform?: Platform; +} + +export interface IUris { + readonly bundle: string; + + readonly clientInstaller?: string; + + readonly repositoryInstaller?: string; + + readonly certificateInstaller?: string; +} + +export interface IVersionedUris { + /** + * The major version number. + */ + readonly MajorVersion: string; + + /** + * The minor version number. + */ + readonly MinorVersion: string; + + /** + * The release version number. + */ + readonly ReleaseVersion: string; + + /** + * The patch version number. + */ + readonly PatchVersion: string; + + /** + * The URLs to installers + */ + readonly Uris: IUris; +} + +/** + * The version provider parse index JSON which can be downloaded or loaded from local file + * and returns URIs for specific product. + * By default returns the last version of URIs or specified full or partial version. + * If platform is not defined returns URIs for each platform. + */ +export class VersionProvider { + private readonly indexFilePath: string|undefined; + private readonly VALID_VERSION_REGEX = /^(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?$/; + constructor(indexFilePath?: string) { + this.indexFilePath = indexFilePath; + } + + /** + * Returns URIs for specified product + * + * @param resourceProperties + */ + public async getVersionUris(resourceProperties: IVersionProviderProperties): Promise> { + /* istanbul ignore next */ + const indexJson = this.indexFilePath ? this.readInstallersIndex() : await this.downloadInstallerIndex(); + + const productSection = indexJson[resourceProperties.product]; + + if (!productSection) { + throw new Error(`Information about product ${resourceProperties.product} can't be found`); + } + + let installers = new Map(); + if (resourceProperties.platform) { + const versionedUris = await this.getUrisForPlatform( + resourceProperties.product, + productSection, + resourceProperties.platform, + resourceProperties.versionString); + + if (versionedUris) { + installers.set(resourceProperties.platform, versionedUris); + } + } else { + Object.values(Platform).forEach(async p => { + const versionedUris = await this.getUrisForPlatform( + resourceProperties.product, + productSection, + p, + resourceProperties.versionString); + + if (versionedUris) { + installers.set(p, versionedUris); + } + }); + } + + return installers; + } + + public implementsIVersionProviderProperties(value: any): boolean { + if (!value || typeof(value) !== 'object') { return false; } + + if (!value.product || !Object.values(Product).includes(value.product)) { + return false; + } + + if (value.versionString) { + if (null === this.parseVersionString(value.versionString)) { return false; } + } + + if (value.platform) { + if (!Object.values(Platform).includes(value.platform.toLowerCase())) { return false; } + } + + return true; + } + + /* istanbul ignore next */ // @ts-ignore + private async downloadInstallerIndex() { + const productionInfoURL = 'https://downloads.thinkboxsoftware.com/version_info.json'; + + const parsedUrl = url.parse(productionInfoURL); + + const options = { + host: parsedUrl.hostname, + path: parsedUrl.path, + }; + + return new Promise((resolve, reject) => { + http.get(options, (res: http.IncomingMessage) => { + let json = ''; + + res.on('data', (chunk: any) => { + // keep appending the response chunks until we get 'end' event. + json += chunk; + }); + + res.on('end', () => { + // complete response is available here: + if (res.statusCode === 200) { + try { + // convert the response to a json object and return. + const data = JSON.parse(json); + resolve(data); + } catch (e) { + reject(e); + } + } else { + reject(new Error(`Expected status code 200, but got ${res.statusCode}`)); + } + }); + }).on('error', (err: Error) => { + reject(err); + }); + }); + } + + /** + * This method reads index file and return parsed JSON object from this file content. + */ + private readInstallersIndex(): any { + if (!this.indexFilePath) { + throw new Error('File path should be defined.'); + } + if (!fs.existsSync(this.indexFilePath)) { + throw new Error(`File ${this.indexFilePath} was not found`); + } + const data = fs.readFileSync(this.indexFilePath, 'utf8'); + + // convert the response to a json object and return. + const json = JSON.parse(data); + return json; + } + + private parseVersionString(versionString: string): RegExpExecArray | null { + return this.VALID_VERSION_REGEX.exec(versionString); + } + + /** + * This method returns IVersionedUris for specific platform + * + * @param product + * @param productSection + * @param platform + * @param version + */ + private async getUrisForPlatform( + product: Product, + productSection: any, + platform: Platform, + version?: string, + ): Promise { + const versionString: string = version ? version : this.getLatestVersion(platform, productSection); + + const requestedVersion = this.parseVersionString( versionString ); + + // Based on the requested version, fetches the latest patch and its installer file paths. + return this.getRequestedUriVersion( + requestedVersion, + productSection.versions, + platform, + product, + ); + } + + /** + * This method returns the latest version for specified platform. + * + * @param platform + * @param indexedVersionInfo + */ + private getLatestVersion(platform: string, indexedVersionInfo: any): string { + const latestSection = indexedVersionInfo.latest; + if (!latestSection) { + throw new Error('Information about latest version can not be found'); + } + + const latestVersion = latestSection[platform]; + if (!latestVersion) { + throw new Error(`Information about latest version for platform ${platform} can not be found`); + } + + return latestVersion; + } + + /** + * This method looks for the requested version (partial or complete) in the + * indexed version information. Based on the input, it iterates through all + * four numbers in the version string and compares the requested version + * with the indexed info. + * If any of the requested version number is missing, it fetches the latest + * (highest) available version for it. + * + * @param requestedVersion + * @param indexedVersionInfo + */ + private getRequestedUriVersion( + requestedVersion: RegExpExecArray | null, + indexedVersionInfo: any, + platform: Platform, + product: Product, + ): IVersionedUris | undefined { + + let versionMap = indexedVersionInfo; + const versionArray: string[] = []; + + // iterate through all 4 major, minor, release and patch numbers, + // and get the matching version from the indexed version map. + for (let versionIndex = 0; versionIndex < 4; versionIndex++) { + let version: string; + if (requestedVersion?.[versionIndex + 1] == null) { + + // version is not provided, get the max version. + const numberValues: number[] = (Object.keys(versionMap)).map((val: string) => { + return parseInt(val, 10); + }); + version = (Math.max(...numberValues)).toString(); + + } else { + version = requestedVersion[versionIndex + 1]; + } + versionArray[versionIndex] = version; + versionMap = versionMap[version]; + } + + let uriIndex: IUris | undefined; + if ((platform in versionMap)) { + if (product == Product.deadline) { + const platformVersion = versionMap[platform]; + uriIndex = { + bundle: platformVersion.bundle, + clientInstaller: versionMap[platform].clientInstaller, + repositoryInstaller: versionMap[platform].repositoryInstaller, + certificateInstaller: versionMap[platform].certificateInstaller, + }; + + } else { // Product.deadlineDocker + uriIndex = { + bundle: versionMap[platform], + }; + } + } + + if (uriIndex) { + return { + MajorVersion: versionArray[0], + MinorVersion: versionArray[1], + ReleaseVersion: versionArray[2], + PatchVersion: versionArray[3], + Uris: uriIndex, + }; + } else { + return undefined; + } + } +} diff --git a/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts b/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts index 8f83211d5..bc40d500e 100644 --- a/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts +++ b/packages/aws-rfdk/lib/core/lib/cloudwatch-agent.ts @@ -47,10 +47,16 @@ export interface CloudWatchAgentProps { * * Resources Deployed * ------------------------ - * 1) String SSM Parameter in Systems Manager Parameter Store to store the cloudwatch agent configuration; - * 2) A script Asset which is uploaded to S3 bucket. + * - String SSM Parameter in Systems Manager Parameter Store to store the cloudwatch agent configuration; + * - A script Asset which is uploaded to S3 bucket. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - Using this construct on an instance will result in that instance dynamically downloading and running scripts + * from your CDK bootstrap bucket when that instance is launched. You must limit write access to your CDK bootstrap + * bucket to prevent an attacker from modifying the actions performed by these scripts. We strongly recommend that + * you either enable Amazon S3 server access logging on your CDK bootstrap bucket, or enable AWS CloudTrail on your + * account to assist in post-incident analysis of compromised production environments. */ export class CloudWatchAgent extends Construct { 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 f9d40d307..e7c9c30f4 100644 --- a/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts +++ b/packages/aws-rfdk/lib/core/lib/exporting-log-group.ts @@ -60,13 +60,20 @@ export interface ExportingLogGroupProps { * * Resources Deployed * ------------------------ - * 1) The Lambda SingletonFunction that checks for the existence of the LogGroup; - * 2) The CloudWatch LogGroup (if it didn't exist already); - * 3) The CloudWatch Alarm watching log exportation failures; - * 4) The CloudWatch Event Rule to schedule log exportation; - * 5) The Lambda SingletonFunction, with role, to export log groups to S3 by schedule. + * - The Lambda SingletonFunction that checks for the existence of the LogGroup. + * - The CloudWatch LogGroup (if it didn't exist already). + * - The CloudWatch Alarm watching log exportation failures. + * - The CloudWatch Event Rule to schedule log exportation. + * - The Lambda SingletonFunction, with role, to export log groups to S3 by schedule. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. */ export class ExportingLogGroup extends Construct { /** diff --git a/packages/aws-rfdk/lib/core/lib/health-monitor.ts b/packages/aws-rfdk/lib/core/lib/health-monitor.ts index 4d1ccdf95..2a102f404 100644 --- a/packages/aws-rfdk/lib/core/lib/health-monitor.ts +++ b/packages/aws-rfdk/lib/core/lib/health-monitor.ts @@ -32,6 +32,7 @@ import { Duration, IResource, RemovalPolicy, + ResourceEnvironment, Stack, } from '@aws-cdk/core'; import {LoadBalancerFactory} from './load-balancer-manager'; @@ -212,6 +213,11 @@ abstract class HealthMonitorBase extends Construct implements IHealthMonitor { */ public abstract readonly stack: Stack; + /** + * The environment this resource belongs to. + */ + public abstract readonly env: ResourceEnvironment; + /** * Attaches the load-balancing target to the ELB for instance-level * monitoring. @@ -257,14 +263,30 @@ abstract class HealthMonitorBase extends Construct implements IHealthMonitor { * * Resources Deployed * ------------------------ - * 1) Application Load Balancer(s) doing frequent pings to the workers; - * 2) KMS Key to encrypt SNS messages - If no encryption key is provided; - * 3) SNS topic for all unhealthy fleet notifications; - * 4) The Alarm if the node is unhealthy for a long period; - * 5) The Alarm if the healthy host percentage if lower than allowed; - * 4) A single Lambda function that sets fleet size to 0 when triggered. + * - Application Load Balancer(s) doing frequent pings to the workers. + * - An Amazon Simple Notification Service (SNS) topic for all unhealthy fleet notifications. + * - An AWS Key Management Service (KMS) Key to encrypt SNS messages - If no encryption key is provided. + * - An Amazon CloudWatch Alarm that triggers if a worker fleet is unhealthy for a long period. + * - Another CloudWatch Alarm that triggers if the healthy host percentage of a worker fleet is lower than allowed. + * - A single AWS Lambda function that sets fleet size to 0 when triggered in response to messages on the SNS Topic. + * - Execution logs of the AWS Lambda function are published to a log group in Amazon CloudWatch. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The AWS Lambda that is created by this construct to terminate unhealthy worker fleets has permission to + * UpdateAutoScalingGroup ( https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_UpdateAutoScalingGroup.html ) + * on all of the fleets that this construct is monitoring. You should not grant any additional actors/principals the + * ability to modify or execute this Lambda. + * - Execution of the AWS Lambda for terminating unhealthy workers is triggered by messages to the Amazon Simple + * Notification Service (SNS) Topic that is created by this construct. Any principal that is able to publish notification + * to this SNS Topic can cause the Lambda to execute and reduce one of your worker fleets to zero instances. You should + * not grant any additional principals permissions to publish to this SNS Topic. */ export class HealthMonitor extends HealthMonitorBase { @@ -327,6 +349,11 @@ export class HealthMonitor extends HealthMonitorBase { */ public readonly stack: Stack; + /** + * The environment this resource belongs to. + */ + public readonly env: ResourceEnvironment; + /** * SNS topic for all unhealthy fleet notifications. This is triggered by * the grace period and hard terminations alarms for the registered fleets. @@ -346,6 +373,10 @@ export class HealthMonitor extends HealthMonitorBase { constructor(scope: Construct, id: string, props: HealthMonitorProps) { super(scope, id); this.stack = Stack.of(scope); + this.env = { + account: this.stack.account, + region: this.stack.region, + }; this.props = props; this.lbFactory = new LoadBalancerFactory(this, props.vpc); 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 935140734..9b2b39471 100644 --- a/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts +++ b/packages/aws-rfdk/lib/core/lib/imported-acm-certificate.ts @@ -26,6 +26,7 @@ import { CustomResource, Duration, RemovalPolicy, + ResourceEnvironment, Stack, Tag, Token, @@ -68,17 +69,27 @@ export interface ImportedAcmCertificateProps { } /** - * A Construct that holds a Custom Resource modelling a certificate that was imported into ACM. It uses a Lambda - * Function to extract the certificate from Secrets and then import it into ACM. It is intended to be used with the - * X509CertificatePem Construct. + * A Construct that creates an AWS CloudFormation Custom Resource that models a certificate that is imported into + * AWS Certificate Manager (ACM). It uses an AWS Lambda Function to extract the certificate from Secrets in AWS SecretsManager + * and then import it into ACM. The interface is intended to be used with the {@link X509CertificatePem} Construct. * * Resources Deployed * ------------------------ - * 1) DynamoDB Table - Used for tracking resources created by the CustomResource. - * 2) Lambda Function, with Role - Used to create/update/delete the CustomResource. - * 3) ACM Certificate - Created by the CustomResource. + * - DynamoDB Table - Used for tracking resources created by the Custom Resource. + * - An AWS Lambda Function, with IAM Role - Used to create/update/delete the Custom Resource. + * - AWS Certificate Manager Certificate - Created by the Custom Resource. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The AWS Lambda for this construct also has broad IAM permissions to delete any Certificate that is stored + * in AWS Certificate Manager. You should not grant any additional actors/principals the ability to modify or + * execute this Lambda. */ export class ImportedAcmCertificate extends Construct implements ICertificate { private static IMPORTER_UUID = '2d20d8f2-7b84-444e-b738-c75b499a9eaa'; @@ -88,6 +99,7 @@ export class ImportedAcmCertificate extends Construct implements ICertificate { */ public readonly certificateArn: string; public readonly stack: Stack; + public readonly env: ResourceEnvironment; // The DynamoDB Table that is used as a backing store for the CustomResource utilized in this construct. protected readonly database: Table; protected readonly uniqueTag: Tag; @@ -96,6 +108,10 @@ export class ImportedAcmCertificate extends Construct implements ICertificate { super(scope, id); this.stack = Stack.of(this); + this.env = { + account: this.stack.account, + region: this.stack.region, + }; this.database = new Table(this, 'Table', { partitionKey: { name: 'PhysicalId', type: AttributeType.STRING }, diff --git a/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts b/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts index 9f5f0121f..3584a7f08 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-installer.ts @@ -86,7 +86,17 @@ export interface MongoDbInstallerProps { * ------------------------ * - A CDK Asset package containing the installation scripts is deployed to your CDK staging bucket. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - Since this class installs MongoDB from official sources dynamically during instance start-up, it is succeptable + * to an attacker compromising the official MongoDB Inc. distribution channel for MongoDB. Such a compromise may + * result in the installation of unauthorized MongoDB binaries. Executing this attack would require an attacker + * compromise both the official installation packages and the MongoDB Inc. gpg key with which they are signed. + * - Using this construct on an instance will result in that instance dynamically downloading and running scripts + * from your CDK bootstrap bucket when that instance is launched. You must limit write access to your CDK bootstrap + * bucket to prevent an attacker from modifying the actions performed by these scripts. We strongly recommend that + * you either enable Amazon S3 server access logging on your CDK bootstrap bucket, or enable AWS CloudTrail on your + * account to assist in post-incident analysis of compromised production environments. */ export class MongoDbInstaller { diff --git a/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts b/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts index e8c4d8e5d..ecea8a4bd 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-instance.ts @@ -106,7 +106,10 @@ export interface MongoDbInstanceVolumeProps { * The Volume must not be partitioned. The volume will be mounted to /var/lib/mongo on this instance, * and all files on it will be changed to be owned by the mongod user on the instance. * - * @default A new volume is created for use by the instance. + * This volume will contain all of the data that you store in MongoDB, so we recommend that you + * encrypt this volume. + * + * @default A new encrypted volume is created for use by the instance. */ readonly volume?: IVolume; @@ -304,12 +307,27 @@ export interface IMongoDb extends IConnectable, IConstruct { * Resources Deployed * ------------------------ * - {@link StaticPrivateIpServer} that hosts MongoDB. - * - An A Record in the provided PrivateHostedZone to create a DNS entry for this server's static private IP. - * - A Secret containing the administrator credentials for MongoDB. - * - An encrypted EBS Volume on which the MongoDB data is stored. + * - An A-Record in the provided PrivateHostedZone to create a DNS entry for this server's static private IP. + * - A Secret in AWS SecretsManager that contains the administrator credentials for MongoDB. + * - An encrypted Amazon Elastic Block Store (EBS) Volume on which the MongoDB data is stored. * - Amazon CloudWatch log group that contains instance-launch and MongoDB application logs. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The administrator credentials for MongoDB are stored in a Secret within AWS SecretsManager. You must strictly limit + * access to this secret to only entities that require it. + * - The instances deployed by this construct download and run scripts from your CDK bootstrap bucket when that instance + * is launched. You must limit write access to your CDK bootstrap bucket to prevent an attacker from modifying the actions + * performed by these scripts. We strongly recommend that you either enable Amazon S3 server access logging on your CDK + * bootstrap bucket, or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The EBS Volume that is created by, or provided to, this construct is used to store the contents of your MongoDB data. To + * protect the sensitive data in your database, you should not grant access to this EBS Volume to any principal or instance + * other than the instance created by this construct. Furthermore, we recommend that you ensure that the volume that is + * used for this purpose is encrypted at rest. + * - This construct uses this package's {@link StaticPrivateIpServer}, {@link MongoDbInstaller}, {@link CloudWatchAgent}, + * {@link ExportingLogGroup}, and {@link MountableBlockVolume}. Security considerations that are outlined by the documentation + * for those constructs should also be taken into account. */ export class MongoDbInstance extends Construct implements IMongoDb, IGrantable { // How often Cloudwatch logs will be flushed. 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 1131cc8e3..1dca3a999 100644 --- a/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts +++ b/packages/aws-rfdk/lib/core/lib/mongodb-post-install.ts @@ -145,7 +145,18 @@ export interface MongoDbPostInstallSetupProps { * - A CloudFormation Custom Resource that triggers execution of the Lambda on stack deployment, update, and deletion. * - An Amazon CloudWatch log group that records history of the AWS Lambda's execution. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The AWS Lambda function that is created by this resource has access to both the MongoDB administrator credentials, + * and the MongoDB application port. An attacker that can find a way to modify and execute this lambda could use it to + * modify or read any data in the database. You should not grant any additional actors/principals the ability to modify + * or execute this Lambda. */ export class MongoDbPostInstallSetup extends Construct { constructor(scope: Construct, id: string, props: MongoDbPostInstallSetupProps) { diff --git a/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts b/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts index 7b9c5d27a..c85a548d5 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-ebs.ts @@ -101,6 +101,14 @@ export interface MountableBlockVolumeProps { * Note: This does **NOT** support multiple partitions on the EBS Volume; the script will exit with a failure code * when it detects multiple partitions on the device. It is expected that the whole block device is a single partition. * + * Security Considerations + * ------------------------ + * - Using this construct on an instance will result in that instance dynamically downloading and running scripts + * from your CDK bootstrap bucket when that instance is launched. You must limit write access to your CDK bootstrap + * bucket to prevent an attacker from modifying the actions performed by these scripts. We strongly recommend that + * you either enable Amazon S3 server access logging on your CDK bootstrap bucket, or enable AWS CloudTrail on your + * account to assist in post-incident analysis of compromised production environments. + * * @remark If using this script with an instance within an AWS Auto Scaling Group (ASG) and you resize * the EBS volume, then you can terminate the instance to let the ASG replace the instance and benefit * from the larger volume size when this script resizes the filesystem on instance launch. diff --git a/packages/aws-rfdk/lib/core/lib/mountable-efs.ts b/packages/aws-rfdk/lib/core/lib/mountable-efs.ts index f009c673e..2744877b5 100644 --- a/packages/aws-rfdk/lib/core/lib/mountable-efs.ts +++ b/packages/aws-rfdk/lib/core/lib/mountable-efs.ts @@ -53,6 +53,14 @@ export interface MountableEfsProps { * This class encapsulates scripting that can be used to mount an Amazon Elastic File System onto * an instance. * + * Security Considerations + * ------------------------ + * - Using this construct on an instance will result in that instance dynamically downloading and running scripts + * from your CDK bootstrap bucket when that instance is launched. You must limit write access to your CDK bootstrap + * bucket to prevent an attacker from modifying the actions performed by these scripts. We strongly recommend that + * you either enable Amazon S3 server access logging on your CDK bootstrap bucket, or enable AWS CloudTrail on your + * account to assist in post-incident analysis of compromised production environments. + * * @remark The default access point is writeable only by the root user. * @todo Add support for specifying an AccessPoint for the EFS filesystem to enforce user and group information for all file system requests. */ diff --git a/packages/aws-rfdk/lib/core/lib/runtime-info.ts b/packages/aws-rfdk/lib/core/lib/runtime-info.ts index acf2326e9..302d20512 100644 --- a/packages/aws-rfdk/lib/core/lib/runtime-info.ts +++ b/packages/aws-rfdk/lib/core/lib/runtime-info.ts @@ -7,7 +7,7 @@ import * as path from 'path'; import { Construct, - Tag, + Tags, } from '@aws-cdk/core'; /** @@ -37,5 +37,5 @@ export function tagConstruct(scope: T) { // The constructor property is a reference to the "function" used to create const className = scope.constructor.name; const value = `${RFDK_VERSION}:${className}`; - Tag.add(scope, TAG_NAME, value); + Tags.of(scope).add(TAG_NAME, value); } diff --git a/packages/aws-rfdk/lib/core/lib/script-assets.ts b/packages/aws-rfdk/lib/core/lib/script-assets.ts index be3430bf7..6b213629f 100644 --- a/packages/aws-rfdk/lib/core/lib/script-assets.ts +++ b/packages/aws-rfdk/lib/core/lib/script-assets.ts @@ -125,9 +125,15 @@ export interface ScriptAssetProps extends AssetProps {} * * Resources Deployed * ------------------------ - * 1) An Asset which is uploaded to the bootstrap S3 bucket. + * - An Asset which is uploaded to the bootstrap S3 bucket. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - Using this construct on an instance will result in that instance dynamically downloading and running scripts + * from your CDK bootstrap bucket when that instance is launched. You must limit write access to your CDK bootstrap + * bucket to prevent an attacker from modifying the actions performed by these scripts. We strongly recommend that + * you either enable Amazon S3 server access logging on your CDK bootstrap bucket, or enable AWS CloudTrail on your + * account to assist in post-incident analysis of compromised production environments. */ export class ScriptAsset extends Asset { /** diff --git a/packages/aws-rfdk/lib/core/lib/staticip-server.ts b/packages/aws-rfdk/lib/core/lib/staticip-server.ts index c7e852b43..32fe70722 100644 --- a/packages/aws-rfdk/lib/core/lib/staticip-server.ts +++ b/packages/aws-rfdk/lib/core/lib/staticip-server.ts @@ -32,7 +32,6 @@ import { Role, ServicePrincipal, } from '@aws-cdk/aws-iam'; -import {Key} from '@aws-cdk/aws-kms'; import { Code, Function as LambdaFunction, @@ -52,9 +51,8 @@ import { Construct, Duration, Lazy, - RemovalPolicy, Stack, - Tag, + Tags, } from '@aws-cdk/core'; @@ -159,14 +157,27 @@ export interface StaticPrivateIpServerProps { * * Resources Deployed * ------------------------ - * 1) Auto Scaling Group (ASG) with min & max capacity of 1 instance; - * 2) Elastic Network Interface (ENI); - * 3) Security Group for the ASG; - * 4) Instance Role and corresponding IAM Policy - * 5) SNS Topic & Role for instance-launch lifecycle events -- max one of each per stack; and - * 6) Lambda function, with role, to attach the ENI in response to instance-launch lifecycle events -- max one per stack. + * - Auto Scaling Group (ASG) with min & max capacity of 1 instance. + * - Elastic Network Interface (ENI). + * - Security Group for the ASG. + * - Instance Role and corresponding IAM Policy. + * - SNS Topic & Role for instance-launch lifecycle events -- max one of each per stack. + * - Lambda function, with role, to attach the ENI in response to instance-launch lifecycle events -- max one per stack. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The AWS Lambda that is deployed through this construct has broad IAM permissions to attach any Elastic + * Network Interface (ENI) to any instance. You should not grant any additional actors/principals the ability + * to modify or execute this Lambda. + * - The SNS Topic that is deployed through this construct controls the execution of the Lambda discussed above. + * Principals that can publish messages to this SNS Topic will be able to trigger the Lambda to run. You should + * not allow any additional principals to publish messages to this SNS Topic. */ export class StaticPrivateIpServer extends Construct implements IConnectable, IGrantable { @@ -329,7 +340,7 @@ export class StaticPrivateIpServer extends Construct implements IConnectable, IG const tagValue = eventHandler.node.uniqueId; const grantCondition: { [key: string]: string } = {}; grantCondition[`autoscaling:ResourceTag/${tagKey}`] = tagValue; - Tag.add(this.autoscalingGroup, tagKey, tagValue); + Tags.of(this.autoscalingGroup).add(tagKey, tagValue); // Allow the lambda to complete the lifecycle action for only tagged ASGs. const iamCompleteLifecycle = new PolicyStatement({ @@ -390,21 +401,10 @@ export class StaticPrivateIpServer extends Construct implements IConnectable, IG assumedBy: new ServicePrincipal('autoscaling.amazonaws.com'), }); - const notificationTopicEncryptKeyUniqueId = 'SNSEncryptionKey' + this.removeHyphens('255e9e52-ad03-4ddf-8ff8-274bc10d63d1'); - const notificationTopicEncryptKey = new Key(stack, notificationTopicEncryptKeyUniqueId, { - description: `This key is used to encrypt SNS messages for ${notificationTopicUniqueId}.`, - enableKeyRotation: true, - removalPolicy: RemovalPolicy.DESTROY, - trustAccountIdentities: true, - }); - notificationTopic = new Topic(stack, notificationTopicUniqueId, { displayName: `For RFDK instance-launch notifications for stack '${stack.stackName}'`, - masterKey: notificationTopicEncryptKey, }); - notificationTopicEncryptKey.grant(notificationRole, 'kms:Decrypt', 'kms:GenerateDataKey'); - notificationTopic.addSubscription(new LambdaSubscription(lambdaHandler)); notificationTopic.grantPublish(notificationRole); } else { diff --git a/packages/aws-rfdk/lib/core/lib/x509-certificate.ts b/packages/aws-rfdk/lib/core/lib/x509-certificate.ts index 531add13c..e307edaf0 100644 --- a/packages/aws-rfdk/lib/core/lib/x509-certificate.ts +++ b/packages/aws-rfdk/lib/core/lib/x509-certificate.ts @@ -236,11 +236,20 @@ abstract class X509CertificateBase extends Construct { * * Resources Deployed * ------------------------ - * 1) DynamoDB Table - Used for tracking resources created by the Custom Resource. - * 2) Secrets - 4 in total, for the certificate, it's private key, the passphrase to the key, and the cert chain. - * 3) Lambda Function, with role - Used to create/update/delete the Custom Resource + * - DynamoDB Table - Used for tracking resources created by the Custom Resource. + * - Secrets - 4 in total, for the certificate, it's private key, the passphrase to the key, and the cert chain. + * - Lambda Function, with role - Used to create/update/delete the Custom Resource * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - Access to the AWS SecretsManager Secrets that are created by this construct should be tightly restricted + * to only the principal(s) that require access. */ export class X509CertificatePem extends X509CertificateBase implements IX509CertificatePem { public readonly cert: ISecret; @@ -379,11 +388,20 @@ export interface IX509CertificatePkcs12 extends IConstruct { * * Resources Deployed * ------------------------ - * 1) DynamoDB Table - Used for tracking resources created by the CustomResource. - * 2) Secrets - 2 in total, The binary of the PKCS #12 certificate and its passphrase. - * 3) Lambda Function, with role - Used to create/update/delete the CustomResource. + * - DynamoDB Table - Used for tracking resources created by the CustomResource. + * - Secrets - 2 in total, The binary of the PKCS #12 certificate and its passphrase. + * - Lambda Function, with role - Used to create/update/delete the CustomResource. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The AWS Lambda that is deployed through this construct will be created from a deployment package + * that is uploaded to your CDK bootstrap bucket during deployment. You must limit write access to + * your CDK bootstrap bucket to prevent an attacker from modifying the actions performed by this Lambda. + * We strongly recommend that you either enable Amazon S3 server access logging on your CDK bootstrap bucket, + * or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - Access to the AWS SecretsManager Secrets that are created by this construct should be tightly restricted + * to only the principal(s) that require access. */ export class X509CertificatePkcs12 extends X509CertificateBase implements IX509CertificatePkcs12 { diff --git a/packages/aws-rfdk/lib/core/scripts/mongodb/3.6/setupMongodStorage.py b/packages/aws-rfdk/lib/core/scripts/mongodb/3.6/setupMongodStorage.py index a1964f3ee..cbe5283d0 100644 --- a/packages/aws-rfdk/lib/core/scripts/mongodb/3.6/setupMongodStorage.py +++ b/packages/aws-rfdk/lib/core/scripts/mongodb/3.6/setupMongodStorage.py @@ -60,23 +60,26 @@ import os import yaml + def modify_storage_path(mongod_conf, storage_path): - # Should never happen that this isn't set, but play it safe. Set to out-of-the-box default. - storage_conf = mongod_conf.setdefault('storage', { - 'journal': { 'enabled': 'true' } - }) - storage_conf['dbPath'] = storage_path + # Should never happen that this isn't set, but play it safe. Set to out-of-the-box default. + storage_conf = mongod_conf.setdefault('storage', { + 'journal': {'enabled': 'true'} + }) + storage_conf['dbPath'] = storage_path + def main(): - if (len(sys.argv) < 2): - raise "ERROR -- Require the storage path as an argument." - storage_path = sys.argv[1] - if (not os.path.isdir(storage_path)): - raise "ERROR -- " + storage_path + " is not a directory." - - mongod_conf = yaml.load(sys.stdin) - modify_storage_path(mongod_conf, storage_path) - print yaml.dump(mongod_conf, default_flow_style=False) + if len(sys.argv) < 2: + raise Exception("ERROR -- Require the storage path as an argument.") + storage_path = sys.argv[1] + if not os.path.isdir(storage_path): + raise Exception("ERROR -- {storage_path} is not a directory.".format(storage_path=storage_path)) + + mongod_conf = yaml.load(sys.stdin) + modify_storage_path(mongod_conf, storage_path) + print(yaml.dump(mongod_conf, default_flow_style=False)) + if __name__ == '__main__': - main() \ No newline at end of file + main() 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 68f99cf17..113c8919c 100644 --- a/packages/aws-rfdk/lib/core/test/health-monitor.test.ts +++ b/packages/aws-rfdk/lib/core/test/health-monitor.test.ts @@ -192,7 +192,10 @@ describe('HealthMonitor', () => { })); expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Topic', { KmsMasterKeyId: { - Ref: `${hmStack.getLogicalId(healthMonitor.node.findChild('SNSEncryptionKey').node.defaultChild as CfnElement)}`, + 'Fn::GetAtt': [ + `${hmStack.getLogicalId(healthMonitor.node.findChild('SNSEncryptionKey').node.defaultChild as CfnElement)}`, + 'Arn', + ], }, })); expectCDK(hmStack).to(haveResource('AWS::Lambda::Function')); @@ -220,7 +223,7 @@ describe('HealthMonitor', () => { expectCDK(hmStack).notTo(haveResource('AWS::ElasticLoadBalancingV2::LoadBalancer')); expectCDK(hmStack).notTo(haveResource('AWS::KMS::Key')); expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Topic', { - KmsMasterKeyId: 'testarn', + KmsMasterKeyId: 'arn:aws:kms:us-west-2:123456789012:key/testarn', })); expectCDK(hmStack).to(haveResource('AWS::Lambda::Function')); expectCDK(hmStack).to(haveResourceLike('AWS::SNS::Subscription', { 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 d1986c757..046ba8dae 100644 --- a/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts +++ b/packages/aws-rfdk/lib/core/test/mongodb-instance.test.ts @@ -139,7 +139,7 @@ describe('Test MongoDbInstance', () => { Tags: arrayWith( objectLike({ Key: 'VolumeGrantAttach-dff922f1fb3c0287b3759d461a48c4b8', - Value: 'b0381797ae9723313d35ad6f9aa815f2', + Value: '6238d22b121db8094cb816e2a49d2b61', }), ), })); @@ -671,13 +671,15 @@ describe('Test MongoDbInstance', () => { })); }); - test('is created with correct LogGroup prefix', () => { + test.each([ + 'test-prefix/', + '', + ])('is created with correct LogGroup prefix %s', (testPrefix: string) => { // GIVEN - const logGroupPrefix = 'test-prefix/'; - const uniqueId = 'MongoDbInstance'; + const id = 'MongoDbInstance'; // WHEN - new MongoDbInstance(stack, uniqueId, { + new MongoDbInstance(stack, id, { mongoDb: { version, dnsZone, @@ -687,45 +689,13 @@ describe('Test MongoDbInstance', () => { }, vpc, logGroupProps: { - logGroupPrefix, + logGroupPrefix: testPrefix, }, }); // THEN cdkExpect(stack).to(haveResource('Custom::LogRetention', { - LogGroupName: logGroupPrefix + uniqueId, - })); - }); - - test('not using default LogGroup prefix if prefix is empty', () => { - // GIVEN - const logGroupPrefix = ''; - const uniqueId = 'MongoDbInstance'; - const expectedLogGroupName = logGroupPrefix + uniqueId; - const defaultLogGroupName = '/renderfarm/' + uniqueId; - - // WHEN - new MongoDbInstance(stack, uniqueId, { - mongoDb: { - version, - dnsZone, - hostname, - serverCertificate: serverCert, - userSsplAcceptance, - }, - vpc, - logGroupProps: { - logGroupPrefix, - }, - }); - - // THEN - cdkExpect(stack).to(haveResource('Custom::LogRetention', { - LogGroupName: expectedLogGroupName, - })); - - cdkExpect(stack).notTo(haveResource('Custom::LogRetention', { - LogGroupName: defaultLogGroupName, + LogGroupName: testPrefix + id, })); }); 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 cd01e413f..22d3764c8 100644 --- a/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts +++ b/packages/aws-rfdk/lib/core/test/mountable-ebs.test.ts @@ -127,7 +127,7 @@ describe('Test MountableBlockVolume', () => { ], Condition: { 'ForAnyValue:StringEquals': { - 'ec2:ResourceTag/VolumeGrantAttach-a47ec0afb147979ebdf4265080024b2c': 'd9a17c1c9e8ef6866e4dbeef41c741b2', + 'ec2:ResourceTag/VolumeGrantAttach-a47ec0afb147979ebdf4265080024b2c': '274f1fe7e3ac0d55b2991dd00242f5ea', }, }, }, 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 9833fef73..8fe615b27 100644 --- a/packages/aws-rfdk/lib/core/test/staticip-server.test.ts +++ b/packages/aws-rfdk/lib/core/test/staticip-server.test.ts @@ -8,7 +8,6 @@ import { countResources, countResourcesLike, expect as cdkExpect, - expect as expectCDK, haveResourceLike, objectLike, ResourcePart, @@ -93,45 +92,8 @@ describe('Test StaticIpServer', () => { Description: 'Created by RFDK StaticPrivateIpServer to process instance launch lifecycle events in stack \'StackName\'. This lambda attaches an ENI to newly launched instances.', })); - expectCDK(stack).to(haveResourceLike('AWS::KMS::Key', { - UpdateReplacePolicy: 'Delete', - DeletionPolicy: 'Delete', - }, ResourcePart.CompleteDefinition)); - expectCDK(stack).to(haveResourceLike('AWS::KMS::Key', { - KeyPolicy: { - Statement: [ - { - Action: 'kms:*', - Effect: 'Allow', - Principal: { - AWS: { - 'Fn::Join': [ - '', - [ - 'arn:', - { - Ref: 'AWS::Partition', - }, - ':iam::', - { - Ref: 'AWS::AccountId', - }, - ':root', - ], - ], - }, - }, - Resource: '*', - }, - ], - }, - EnableKeyRotation: true, - })); cdkExpect(stack).to(haveResourceLike('AWS::SNS::Topic', { DisplayName: 'For RFDK instance-launch notifications for stack \'StackName\'', - KmsMasterKeyId: { - Ref: 'SNSEncryptionKey255e9e52ad034ddf8ff8274bc10d63d1EDF79FFE', - }, })); cdkExpect(stack).to(haveResourceLike('AWS::SNS::Subscription', { @@ -211,19 +173,6 @@ describe('Test StaticIpServer', () => { cdkExpect(stack).to(countResourcesLike('AWS::IAM::Policy', 1, { PolicyDocument: { Statement: [ - { - Action: [ - 'kms:Decrypt', - 'kms:GenerateDataKey', - ], - Effect: 'Allow', - Resource: { - 'Fn::GetAtt': [ - 'SNSEncryptionKey255e9e52ad034ddf8ff8274bc10d63d1EDF79FFE', - 'Arn', - ], - }, - }, { Action: 'sns:Publish', Effect: 'Allow', 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 8e068ec0c..95c484d11 100644 --- a/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts +++ b/packages/aws-rfdk/lib/core/test/x509-certificate.test.ts @@ -9,16 +9,20 @@ import { haveResourceLike, InspectionFailure, } from '@aws-cdk/assert'; +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'; -import { AwsCustomResource } from '@aws-cdk/custom-resources'; import { X509CertificatePem, X509CertificatePkcs12, } from '../lib/x509-certificate'; + test('Generate cert', () => { const stack = new Stack(undefined, 'Stack', { env: { region: 'us-west-2' } }); const subject = { cn: 'testCN' }; @@ -313,14 +317,9 @@ test('Generate cert, all options set', () => { test('Grant cert read', () => { const stack = new Stack(); - const grantable = new AwsCustomResource( - stack, - 'Grantable', - { - policy: { statements: [] }, - onDelete: { action: 'none', service: 'none' }, - }, - ); + const grantable = new Role(stack, 'TestRole', { + assumedBy: new ServicePrincipal('ec2.amazonaws.com'), + }); const subject = { cn: 'testCN' }; const cert = new X509CertificatePem(stack, 'Cert', { @@ -341,10 +340,6 @@ test('Grant cert read', () => { expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { PolicyDocument: { Statement: [ - { - Action: 'none:None', - Effect: 'Allow', - }, { Action: [ 'secretsmanager:GetSecretValue', @@ -401,14 +396,9 @@ test('Grant cert read', () => { test('Grant full read', () => { const stack = new Stack(); - const grantable = new AwsCustomResource( - stack, - 'Grantable', - { - policy: { statements: [] }, - onDelete: { action: 'none', service: 'none' }, - }, - ); + const grantable = new Role(stack, 'TestRole', { + assumedBy: new ServicePrincipal('ec2.amazonaws.com'), + }); const subject = { cn: 'testCN' }; const cert = new X509CertificatePem(stack, 'Cert', { diff --git a/packages/aws-rfdk/lib/deadline/README.md b/packages/aws-rfdk/lib/deadline/README.md index e1f17eab8..36156da9d 100644 --- a/packages/aws-rfdk/lib/deadline/README.md +++ b/packages/aws-rfdk/lib/deadline/README.md @@ -6,6 +6,12 @@ The `aws-rfdk/deadline` sub-module contains Deadline-specific constructs that ca import * as deadline from 'aws-rfdk/deadline'; ``` +--- + +_**Note:** RFDK constructs currently support Deadline 10.1.9 and later._ + +--- + - [Render Queue](#render-queue) - [Docker Container Images](#render-queue-docker-container-images) - [Encryption](#render-queue-encryption) diff --git a/packages/aws-rfdk/lib/deadline/lib/database-connection.ts b/packages/aws-rfdk/lib/deadline/lib/database-connection.ts index c606b5aea..c90004d4d 100644 --- a/packages/aws-rfdk/lib/deadline/lib/database-connection.ts +++ b/packages/aws-rfdk/lib/deadline/lib/database-connection.ts @@ -84,8 +84,6 @@ export abstract class DatabaseConnection { * Resources Deployed * ------------------------ * This construct does not deploy any resources - * - * @ResourcesDeployed */ public static forDocDB(options: DocDBConnectionOptions): DatabaseConnection { return new DocDBDatabaseConnection(options); @@ -97,8 +95,6 @@ export abstract class DatabaseConnection { * Resources Deployed * ------------------------ * This construct does not deploy any resources - * - * @ResourcesDeployed */ public static forMongoDbInstance(options: MongoDbInstanceConnectionOptions): DatabaseConnection { return new MongoDbInstanceDatabaseConnection(options); diff --git a/packages/aws-rfdk/lib/deadline/lib/render-queue.ts b/packages/aws-rfdk/lib/deadline/lib/render-queue.ts index d06358e44..871c640ef 100644 --- a/packages/aws-rfdk/lib/deadline/lib/render-queue.ts +++ b/packages/aws-rfdk/lib/deadline/lib/render-queue.ts @@ -39,6 +39,7 @@ import { import { IGrantable, IPrincipal, + ManagedPolicy, PolicyStatement, ServicePrincipal, } from '@aws-cdk/aws-iam'; @@ -131,13 +132,25 @@ abstract class RenderQueueBase extends Construct implements IRenderQueue { * * Resources Deployed * ------------------------ - * 1) An ECS cluster - * 2) An EC2 auto-scaling group that provides the EC2 container instances that host the ECS service - * 3) An ECS service with a task definition that deploys the RCS container - * 4) A CloudWatch bucket for streaming logs from the RCS container - * 5) An application load balancer, listener and target group that balance incoming traffic among the RCS containers + * - An Amazon Elastic Container Service (ECS) cluster. + * - An AWS EC2 auto-scaling group that provides the instances that host the ECS service. + * - An ECS service with a task definition that deploys the Deadline Remote Connetion Server (RCS) in a container. + * - A Amazon CloudWatch log group for streaming logs from the Deadline RCS. + * - An application load balancer, listener and target group that balance incoming traffic among the RCS containers. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The instances deployed by this construct download and run scripts from your CDK bootstrap bucket when that instance + * is launched. You must limit write access to your CDK bootstrap bucket to prevent an attacker from modifying the actions + * performed by these scripts. We strongly recommend that you either enable Amazon S3 server access logging on your CDK + * bootstrap bucket, or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - Care must be taken to secure what can connect to the RenderQueue. The RenderQueue does not authenticate API + * requests made against it. You must limit access to the RenderQueue endpoint to only trusted hosts. Those hosts + * should be governed carefully, as malicious software could use the API to remotely execute code across the entire render farm. + * - The RenderQueue can be deployed with network encryption through Transport Layer Security (TLS) or without it. Unencrypted + * network communications can be eavesdropped upon or modified in transit. We strongly recommend deploying the RenderQueue + * with TLS enabled in production environments. */ export class RenderQueue extends RenderQueueBase implements IGrantable { /** @@ -446,6 +459,23 @@ export class RenderQueue extends RenderQueueBase implements IGrantable { this.rqConnection.configureClientInstance(param); } + /** + * Adds AWS Managed Policies to the Render Queue so it is able to control Deadlines Spot Event Plugin. + * + * See: https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/event-spot.html for additonal information. + * + * @param includeResourceTracker Whether or not the Resource tracker admin policy should also be addd (Default: True) + */ + public addSEPPolicies( includeResourceTracker: boolean = true): void { + const sepPolicy = ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineSpotEventPluginAdminPolicy'); + this.taskDefinition.taskRole.addManagedPolicy(sepPolicy); + + if (includeResourceTracker) { + const rtPolicy = ManagedPolicy.fromAwsManagedPolicyName('AWSThinkboxDeadlineResourceTrackerAdminPolicy'); + this.taskDefinition.taskRole.addManagedPolicy(rtPolicy); + } + } + /** * Add an ordering dependency to another Construct. * diff --git a/packages/aws-rfdk/lib/deadline/lib/repository.ts b/packages/aws-rfdk/lib/deadline/lib/repository.ts index 22bdc9161..7f646cc93 100644 --- a/packages/aws-rfdk/lib/deadline/lib/repository.ts +++ b/packages/aws-rfdk/lib/deadline/lib/repository.ts @@ -46,7 +46,7 @@ import { IConstruct, RemovalPolicy, Stack, - Tag, + Tags, } from '@aws-cdk/core'; import { CloudWatchAgent, @@ -347,20 +347,34 @@ export interface RepositoryProps { * After the installation is complete the instance will be shutdown. * * Whenever the stack is updated if a change is detected in the installer a new instance will be started, which will perform - * a check on the existing Deadline Repository. If they are compatible with the new installer an update will be performed + * a check on the existing Deadline Repository. If they are compatible with the new installer an update will be performed * and the deployment will continue, otherwise the the deployment will be cancelled. * In either case the instance will be cleaned up. * * Resources Deployed * ------------------------ - * 1) Encrypted EFS File System - If no IFileSystem is provided; - * 2) DocumentDB and DatabaseConnection - If no database connection is provided; - * 3) Auto Scaling Group (ASG) with min & max capacity of 1 instance; - * 4) Instance Role and corresponding IAM Policy - * 5) A Script Asset which is uploaded to your deployment bucket to run the installer - * 6) An aws-rfdk.CloudWatchAgent to configure sending logs to cloudwatch. + * - Encrypted Amazon Elastic File System (EFS) - If no file system is provided. + * - An Amazon DocumentDB - If no database connection is provided. + * - Auto Scaling Group (ASG) with min & max capacity of 1 instance. + * - Instance Role and corresponding IAM Policy. + * - An Amazon CloudWatch log group that contains the Deadline Repository installation logs. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The instances deployed by this construct download and run scripts from your CDK bootstrap bucket when that instance + * is launched. You must limit write access to your CDK bootstrap bucket to prevent an attacker from modifying the actions + * performed by these scripts. We strongly recommend that you either enable Amazon S3 server access logging on your CDK + * bootstrap bucket, or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The file system that is created by, or provided to, this construct contains the data for Deadline's Repository file + * system. This file system contains information about your submitted jobs, and the plugin scripts that are run by the + * Deadline applications in your render farm. An actor that can modify the contents of this file system can cause your + * Deadline applications to run code of their choosing. You should restrict access to this file system to only those who + * require it. + * - The database that is created by, or provided to, this construct is used by Deadline to store data about its configuration, + * submitted jobs, machine information and status, and so on. An actor with access to this database can read any information + * that is entered into Deadline, and modify the bevavior of your render farm. You should restrict access to this database + * to only those who require it. */ export class Repository extends Construct implements IRepository { /** @@ -697,7 +711,7 @@ export class Repository extends Construct implements IRepository { * @param logGroupProps */ private configureCloudWatchLogStream(installerGroup: AutoScalingGroup, groupName: string, logGroupProps?: LogGroupFactoryProps) { - const prefix = logGroupProps?.logGroupPrefix ? logGroupProps.logGroupPrefix : Repository.DEFAULT_LOG_GROUP_PREFIX; + const prefix = logGroupProps?.logGroupPrefix ?? Repository.DEFAULT_LOG_GROUP_PREFIX; const defaultedLogGroupProps = { ...logGroupProps, logGroupPrefix: prefix, @@ -730,7 +744,7 @@ export class Repository extends Construct implements IRepository { const tagCondition: { [key: string]: any } = {}; tagCondition[`autoscaling:ResourceTag/${tagKey}`] = this.node.uniqueId; - Tag.add(this.installerGroup, tagKey, this.node.uniqueId); + Tags.of(this.installerGroup).add(tagKey, this.node.uniqueId); this.installerGroup.addToRolePolicy(new PolicyStatement({ actions: [ diff --git a/packages/aws-rfdk/lib/deadline/lib/stage.ts b/packages/aws-rfdk/lib/deadline/lib/stage.ts index f78283424..cc8e6529a 100644 --- a/packages/aws-rfdk/lib/deadline/lib/stage.ts +++ b/packages/aws-rfdk/lib/deadline/lib/stage.ts @@ -9,7 +9,10 @@ import * as path from 'path'; import { DockerImageAsset } from '@aws-cdk/aws-ecr-assets'; import { Construct } from '@aws-cdk/core'; -import { VersionQuery } from './version'; +import { + Version, + VersionQuery, +} from './version'; /** * Build arguments to supply to a Docker image build @@ -99,6 +102,8 @@ export interface StageProps { * requires to deploy Deadline. It should contain a manifest file, the Deadline * installers, and any supporting files required for building the Deadline * container. + * + * Note: Current version of RFDK supports Deadline v10.1.9.2 and later. */ export class Stage { /** @@ -154,6 +159,12 @@ export class Stage { throw new TypeError(`Expected a string "version" but got: ${typeof version}`); } + // Do minimum supported deadline version check + const stagedVersion = Version.parse(version); + if (stagedVersion.isLessThan(Version.MINIMUM_SUPPORTED_DEADLINE_VERSION)) { + throw new TypeError(`Staged Deadline Version (${version}) is less than the minimum supported version (${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()})`); + } + return true; } 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 80e1f53b6..d7511c921 100644 --- a/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts +++ b/packages/aws-rfdk/lib/deadline/lib/usage-based-licensing.ts @@ -440,12 +440,21 @@ export interface UsageBasedLicensingProps { * * Resources Deployed * ------------------------ - * 1) The Auto Scaling Group (ASG) added to the Amazon ECS cluster that is hosting the Deadline License Forwarder for UBL. - * By default, creates one instance. The default instance type is C5 Large. - * 2) Elastic Block Store device(s) associated with the EC2 instance(s) in the ASG. The default volume size is 30 GiB. - * 3) The LogGroup if it doesn't exist already. + * - The Auto Scaling Group (ASG) added to the Amazon Elastic Container Service cluster that is hosting the Deadline + * License Forwarder for UBL. This creates one C5 Large instance by default. + * - Amazon Elastic Block Store (EBS) device(s) associated with the EC2 instance(s) in the ASG. The default volume size is 30 GiB. + * - An Amazon CloudWatch log group that contains the logs from the Deadline License Forwarder application. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The instances deployed by this construct download and run scripts from your CDK bootstrap bucket when that instance + * is launched. You must limit write access to your CDK bootstrap bucket to prevent an attacker from modifying the actions + * performed by these scripts. We strongly recommend that you either enable Amazon S3 server access logging on your CDK + * bootstrap bucket, or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The Deadline License Forwarder is designed to be secured by restricting network access to it. For security, only the Deadline + * Workers that require access to Usage-based Licenses should be granted network access to the instances deployed by this construct. + * Futhermore, you should restrict that access to only the product(s) that those workers require when deploying this construct. */ export class UsageBasedLicensing extends Construct implements IGrantable { /** @@ -523,7 +532,7 @@ export class UsageBasedLicensing extends Construct implements IGrantable { containerEnv.UBL_CERTIFICATES_URI = props.certificateSecret.secretArn; props.certificateSecret.grantRead(taskDefinition.taskRole); - const prefix = props.logGroupProps?.logGroupPrefix ? props.logGroupProps.logGroupPrefix : UsageBasedLicensing.DEFAULT_LOG_GROUP_PREFIX; + const prefix = props.logGroupProps?.logGroupPrefix ?? UsageBasedLicensing.DEFAULT_LOG_GROUP_PREFIX; const defaultedLogGroupProps: LogGroupFactoryProps = { ...props.logGroupProps, logGroupPrefix: prefix, diff --git a/packages/aws-rfdk/lib/deadline/lib/version.ts b/packages/aws-rfdk/lib/deadline/lib/version.ts index 0b0a80aa2..cf97ad064 100644 --- a/packages/aws-rfdk/lib/deadline/lib/version.ts +++ b/packages/aws-rfdk/lib/deadline/lib/version.ts @@ -72,6 +72,166 @@ abstract class VersionQueryBase extends Construct implements IVersion { } } +/** + * This class is reposonsible to do basic operations on version format. + */ +export class Version implements IPatchVersion { + + /** + * This variable holds the value for minimum supported deadline version. + */ + public static readonly MINIMUM_SUPPORTED_DEADLINE_VERSION = new Version([10, 1, 9, 2]); + + /** + * This method parses the input string and returns the version object. + * + * @param version version string to parse + */ + public static parse(version: string): Version { + if (!Version.validateVersionFormat(version)) { + throw new TypeError(`Invalid version format. Expected format 'a.b.c.d', found '${version}'`); + } + + return new Version(version.split('.').map(x => parseInt(x))); + } + + /** + * This method validates the given string for a sequence '.' separated numbers. + * + * @param version the string to be validated. + * + * @returns true if the format is correct, else false. + */ + private static validateVersionFormat(version: string): boolean { + /** + * Regex: ^\d+(?:\.\d+){3}$ + * Matches a sequence of '.' separated numbers with exactly 4 digits. + * - ^ asserts position at start of a line. + * - \d+ Matches one or more digits. + * - (?:\.\d+) Matches a dot and the following one or more digits. + * - {3} Matches previous pattern exactly 3 times. + * - $ asserts position at the end of a line + */ + if (version.match(/^\d+(?:\.\d+){3}$/)) { + return true; + } + return false; + } + + /** + * Numeric components of version. + */ + private readonly components: number[]; + + /** + * @inheritdoc + */ + public get majorVersion(): number { + return this.components[0]; + } + + /** + * @inheritdoc + */ + public get minorVersion(): number { + return this.components[1]; + } + + /** + * @inheritdoc + */ + public get releaseVersion(): number { + return this.components[2]; + } + + /** + * @inheritdoc + */ + public get patchVersion(): number { + return this.components[3]; + } + + constructor(components: number[]) { + // validations + if(components.length != 4) { + throw new Error('Invalid version format. Version should contain exactly 4 components.'); + } + components.forEach((component) => { + if (component < 0) { + throw new RangeError('Invalid version format. None of the version components can be negative.'); + } + }); + + this.components = components; + } + + /** + * This method compares two version strings + * + * @param version + * + * @returns true if this version is greater than the provided version; + * false if this version is less than or equal to the provided verison. + */ + public isGreaterThan(version: Version): boolean { + return this.compare(version) > 0; + } + + /** + * This method compares two version strings + * + * @param version + * + * @returns true if this version is less than the provided version; + * false if this version is greater than or equal to the provided verison. + */ + public isLessThan(version: Version): boolean { + return this.compare(version) < 0; + } + + /** + * This method compares two version strings + * + * @param version + * + * @returns true if this version is equal to the provided version; + * false otherwise. + */ + public isEqual(version: Version): boolean { + return this.compare(version) == 0; + } + + /** + * The method returns the version components in dot separated string format. + */ + public toString(): string { + return this.components.join('.'); + } + + /** + * This method compares 2 versions. + * + * @param version version to compare + * + * @returns negative value if this version is less than the provided version; + * 0 if both the versions are equal; + * positive value if this version is greater than the provided verison. + */ + private compare(version: Version): number { + if (this.components.length != version.components.length) { + throw new TypeError('Component count in both the versions should be same.'); + } + + for (let i = 0; i < version.components.length; i++) { + const diff = this.components[i] - version.components[i]; + if (diff != 0) { + return diff; + } + } + return 0; + } +} + /** * This class encapsulates information about a particular version of Thinkbox's Deadline software. * Information such as the version number, and where to get installers for that version from Amazon S3. @@ -90,29 +250,6 @@ abstract class VersionQueryBase extends Construct implements IVersion { * constructs which version of Deadline you want them to use, and be configured for. */ export class VersionQuery extends VersionQueryBase { - /** - * Parses a version string of the format: - * - * ... - * - * and extracts the components. - * - * @param versionstr The input version string - */ - public static parseVersionString(versionstr: string): IPatchVersion { - const match = VersionQuery.RE_FULL_VERSION.exec(versionstr); - if (!match) { - throw new Error(`"${versionstr}" is not a valid version`); - } - - return { - majorVersion: parseInt(match.groups!.major, 10), - minorVersion: parseInt(match.groups!.minor, 10), - releaseVersion: parseInt(match.groups!.release, 10), - patchVersion: parseInt(match.groups!.patch, 10), - }; - } - /** * Specify a Deadline version from a fully-qualified Deadline patch version. * @@ -188,14 +325,9 @@ export class VersionQuery extends VersionQueryBase { * @param versionString A fully qualified version string (e.g. 10.1.9.2) */ public static exactString(scope: Construct, id: string, versionString: string) { - return VersionQuery.exact(scope, id, VersionQuery.parseVersionString(versionString)); + return VersionQuery.exact(scope, id, Version.parse(versionString)); } - /** - * Regular expression for matching a Deadline release version number - */ - private static readonly RE_FULL_VERSION = /^(?\d+)\.(?\d+)\.(?\d+)\.(?\d+)$/; - /** * @inheritdoc */ diff --git a/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts b/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts index 635634249..4e64dac9c 100644 --- a/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts +++ b/packages/aws-rfdk/lib/deadline/lib/worker-fleet.ts @@ -36,6 +36,7 @@ import { Construct, Duration, IResource, + ResourceEnvironment, Stack, } from '@aws-cdk/core'; import { @@ -55,6 +56,7 @@ import { import { IRenderQueue, } from './render-queue'; +import { Version } from './version'; /** * Interface for Deadline Worker Fleet. @@ -180,12 +182,16 @@ export interface WorkerInstanceFleetProps { /** * Health Monitor component to monitor the health of instances. * + * Note: The health-check feature is supported with Deadline Client v10.1.9 and later. + * * @default - Health Monitoring is turned-off */ readonly healthMonitor?: IHealthMonitor; /** - * Properties for configuring a health check + * Properties for configuring a health check. + * + * Note: The health-check feature is supported with Deadline Client v10.1.9 and later. * * @default properties of HealthCheckConfig applies */ @@ -227,6 +233,11 @@ abstract class WorkerInstanceFleetBase extends Construct implements IWorkerFleet */ public abstract readonly stack: Stack; + /** + * The environment this resource belongs to. + */ + public abstract readonly env: ResourceEnvironment; + /** * The ASG object created by the construct. */ @@ -279,12 +290,24 @@ abstract class WorkerInstanceFleetBase extends Construct implements IWorkerFleet * * Resources Deployed * ------------------------ - * 1) An AutoScalingGroup to maintain the number of instances; - * 2) An Instance Role and corresponding IAM Policy; - * 3) A script asset which is uploaded to your deployment bucket used to configure the worker so it can connect to the Render Queue - * 4) An aws-rfdk.CloudWatchAgent to configure sending logs to cloudwatch. + * - An EC2 Auto Scaling Group to maintain the number of instances. + * - An Instance Role and corresponding IAM Policy. + * - An Amazon CloudWatch log group that contains the Deadline Worker, Deadline Launcher, and instance-startup logs for the instances + * in the fleet. * - * @ResourcesDeployed + * Security Considerations + * ------------------------ + * - The instances deployed by this construct download and run scripts from your CDK bootstrap bucket when that instance + * is launched. You must limit write access to your CDK bootstrap bucket to prevent an attacker from modifying the actions + * performed by these scripts. We strongly recommend that you either enable Amazon S3 server access logging on your CDK + * bootstrap bucket, or enable AWS CloudTrail on your account to assist in post-incident analysis of compromised production + * environments. + * - The data that is stored on your Worker's local EBS volume can include temporary working files from the applications + * that are rendering your jobs and tasks. That data can be sensitive or privileged, so we recommend that you encrypt + * the data volumes of these instances using either the provided option or by using an encrypted AMI as your source. + * - The software on the AMI that is being used by this construct may pose a security risk. We recommend that you adopt a + * patching strategy to keep this software current with the latest security patches. Please see + * https://docs.aws.amazon.com/rfdk/latest/guide/patching-software.html for more information. */ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { @@ -337,6 +360,11 @@ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { */ public readonly stack: Stack; + /** + * The environment this resource belongs to. + */ + public readonly env: ResourceEnvironment; + /** * This field implements the base capacity metric of the fleet against * which, the healthy percent will be calculated. @@ -375,6 +403,10 @@ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { constructor(scope: Construct, id: string, props: WorkerInstanceFleetProps) { super(scope, id); this.stack = Stack.of(scope); + this.env = { + account: this.stack.account, + region: this.stack.region, + }; this.validateProps(props); @@ -463,7 +495,7 @@ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { } private configureCloudWatchLogStream(fleetInstance: AutoScalingGroup, id: string, logGroupProps?: LogGroupFactoryProps) { - const prefix = logGroupProps?.logGroupPrefix ? logGroupProps.logGroupPrefix : WorkerInstanceFleet.DEFAULT_LOG_GROUP_PREFIX; + const prefix = logGroupProps?.logGroupPrefix ?? WorkerInstanceFleet.DEFAULT_LOG_GROUP_PREFIX; const defaultedLogGroupProps = { ...logGroupProps, logGroupPrefix: prefix, @@ -521,6 +553,7 @@ export class WorkerInstanceFleet extends WorkerInstanceFleetBase { `'${groups}'`, `'${pools}'`, `'${props.region || ''}'`, + `'${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION.toString()}'`, ], }); } diff --git a/packages/aws-rfdk/lib/deadline/scripts/bash/configureWorker.sh b/packages/aws-rfdk/lib/deadline/scripts/bash/configureWorker.sh index a53813983..ddd39e717 100644 --- a/packages/aws-rfdk/lib/deadline/scripts/bash/configureWorker.sh +++ b/packages/aws-rfdk/lib/deadline/scripts/bash/configureWorker.sh @@ -9,6 +9,7 @@ # $2: comma separated groups # $3: comma separated pools # $4: region +# $5: minimum supported deadline version # exit when any command fails set -xeuo pipefail @@ -17,6 +18,7 @@ HEALTH_CHECK_PORT="$1" WORKER_GROUPS=(${2//,/ }) WORKER_POOLS=(${3//,/ }) WORKER_REGION="$4" +MINIMUM_SUPPORTED_DEADLINE_VERSION=$5 # Cloud-init does not load system environment variables. Cherry-pick the # environment variable installed by the Deadline Client installer. @@ -36,6 +38,21 @@ if [ ! -f "$DEADLINE_COMMAND" ]; then exit 1 fi +isVersionLessThan() { + python -c "import sys;sys.exit(0 if tuple(map(int, sys.argv[-2].split('.'))) < tuple(map(int, sys.argv[-1].split('.'))) else 1)" "$1" "$2" +} + +DEADLINE_VERSION=$("$DEADLINE_COMMAND" -Version | grep -oP '[v]\K\d+\.\d+\.\d+\.\d+\b') +if [ -z "$DEADLINE_VERSION" ]; then + echo "ERROR: Unable to identify the version of installed Deadline Client. Exiting..." + exit 1 +fi + +if isVersionLessThan $DEADLINE_VERSION $MINIMUM_SUPPORTED_DEADLINE_VERSION; then + echo "ERROR: Installed Deadline Version ($DEADLINE_VERSION) is less than the minimum supported version ($MINIMUM_SUPPORTED_DEADLINE_VERSION). Exiting..." + exit 1 +fi + # launch worker at launcher startup "$DEADLINE_COMMAND" -SetIniFileSetting LaunchSlaveAtStartup True # keep worker running diff --git a/packages/aws-rfdk/lib/deadline/scripts/powershell/configureWorker.ps1 b/packages/aws-rfdk/lib/deadline/scripts/powershell/configureWorker.ps1 index 1746cbe20..9f342ca17 100644 --- a/packages/aws-rfdk/lib/deadline/scripts/powershell/configureWorker.ps1 +++ b/packages/aws-rfdk/lib/deadline/scripts/powershell/configureWorker.ps1 @@ -9,7 +9,9 @@ param ( [Parameter(Mandatory=$True)] $workerPools, [Parameter(Mandatory=$True)] - $workerRegion + $workerRegion, + [Parameter(Mandatory=$True)] + $minimumSupportedDeadlineVersion ) Set-PSDebug -Trace 1 @@ -28,6 +30,17 @@ if (!(Test-Path $DEADLINE_COMMAND)) { exit 1 } +$DeadlineVersion = (& $DEADLINE_COMMAND -Version | Out-String) | Select-String -Pattern '[v](\d+\.\d+\.\d+\.\d+)\b' | % {$_.Matches.Groups[1].Value} +if ([string]::IsNullOrEmpty($DeadlineVersion)) { + Write-Host "ERROR: Unable to identify the version of installed Deadline Client. Exiting..." + exit 1 +} + +if([System.Version]$DeadlineVersion -lt [System.Version]$minimumSupportedDeadlineVersion) { + Write-Host "ERROR: Installed Deadline Version ($($DeadlineVersion)) is less than the minimum supported version ($($minimumSupportedDeadlineVersion)). Exiting..." + exit 1 +} + # launch worker at launcher startup & $DEADLINE_COMMAND -SetIniFileSetting LaunchSlaveAtStartup True | Out-Default # keep worker running diff --git a/packages/aws-rfdk/lib/deadline/scripts/python/client-rq-connection.py b/packages/aws-rfdk/lib/deadline/scripts/python/client-rq-connection.py index 73e83d81d..12e8e7d49 100644 --- a/packages/aws-rfdk/lib/deadline/scripts/python/client-rq-connection.py +++ b/packages/aws-rfdk/lib/deadline/scripts/python/client-rq-connection.py @@ -24,7 +24,7 @@ # Regex for counting the number of certificates in a cert chain CERT_COUNT_RE = re.compile(r'-----BEGIN CERTIFICATE-----') -# Named tuples for storing arguments +# Named tuples for storing arguments RenderQueue = namedtuple('RenderQueue','uri,scheme,address') AwsSecret = namedtuple('AwsSecret','arn,region') FileSecret = namedtuple('FileSecret', 'filepath') @@ -42,7 +42,7 @@ def parse_args(args): :param args: A list of command line arguments :return: A configuration object containing the parsed arguments """ - + def _secret(value): """ A type function for converting args that represent secrets into a named Tuple @@ -61,7 +61,7 @@ def _secret(value): if match: named_groups = match.groupdict() return FileSecret( arn=named_groups['FilePath'] ) - + raise argparse.ArgumentTypeError('Given argument "%s" is not a valid secret' % value) def _render_queue(value): @@ -69,7 +69,7 @@ def _render_queue(value): A type function for converting args that represent render queue URI's into a named Tuple :param value: The string representing the argument - :return: A RenderQueue named tuple + :return: A RenderQueue named tuple :exception argparse.ArgumentTypeError: if the argument cannot be converted properly. """ @@ -130,15 +130,17 @@ def configure_deadline( config ): :param config: The parsed configuration object """ - + repo_args = ['ChangeRepository','Proxy',config.render_queue.address] if config.render_queue.scheme == 'http': print( "Configuring Deadline to connect to the Render Queue (%s) using HTTP Traffic" % config.render_queue.address ) - #Ensure SSL is disbaled + #Ensure SSL is disabled call_deadline_command(['SetIniFileSetting','ProxyUseSSL','False']) + call_deadline_command(['SetIniFileSetting', 'ProxySSLCA', '']) + call_deadline_command(['SetIniFileSetting', 'ClientSSLAuthentication', 'NotRequired']) else: - print("Configuring Deadline to connect to the Render Queue using HTTP Traffic") + print("Configuring Deadline to connect to the Render Queue using HTTPS Traffic") call_deadline_command(['SetIniFileSetting','ProxyUseSSL','True']) try: diff --git a/packages/aws-rfdk/lib/deadline/test/asset-constants.ts b/packages/aws-rfdk/lib/deadline/test/asset-constants.ts index 83104a163..17e865690 100644 --- a/packages/aws-rfdk/lib/deadline/test/asset-constants.ts +++ b/packages/aws-rfdk/lib/deadline/test/asset-constants.ts @@ -11,8 +11,8 @@ export {CWA_ASSET_LINUX}; // configureWorker.sh export const CONFIG_WORKER_ASSET_LINUX = { - Bucket: 'AssetParameters2435996be08703cd3819e249890abb41cc0860324e5cfe1b5945704934db7101S3BucketB40BB072', - Key: 'AssetParameters2435996be08703cd3819e249890abb41cc0860324e5cfe1b5945704934db7101S3VersionKey4F3F9A7F', + Bucket: 'AssetParameters3915f098ad4813270754c05c4e236d137da778773dfb13912fa54f387cc5929aS3BucketE7DA333E', + Key: 'AssetParameters3915f098ad4813270754c05c4e236d137da778773dfb13912fa54f387cc5929aS3VersionKey1C0D482D', }; // configureWorker.ps1 @@ -38,6 +38,6 @@ export const REPO_DC_ASSET = { }; export const RQ_CONNECTION_ASSET = { - Bucket: 'AssetParameters63694479464606109bdbd3525fb2bef7b2abfbf196d8a132832c8e5d8a3c4796S3BucketF3231D14', - Key: 'AssetParameters63694479464606109bdbd3525fb2bef7b2abfbf196d8a132832c8e5d8a3c4796S3VersionKeyE501DFB8', + Bucket: 'AssetParameters89a29e05a2a88ec4d4a02e847e3c3c9461d0154b326492f4cad655d4ca0bda98S3BucketC22E185C', + Key: 'AssetParameters89a29e05a2a88ec4d4a02e847e3c3c9461d0154b326492f4cad655d4ca0bda98S3VersionKey0833D670', }; 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 fa8c1e57e..cf249172d 100644 --- a/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/render-queue.test.ts @@ -6,14 +6,14 @@ import { ABSENT, arrayWith, - not, + countResourcesLike, deepObjectLike, expect as expectCDK, haveResource, haveResourceLike, + not, objectLike, ResourcePart, - countResourcesLike, } from '@aws-cdk/assert'; import { Certificate, @@ -170,30 +170,9 @@ describe('RenderQueue', () => { LogDriver: 'awslogs', Options: { 'awslogs-group': { - 'Fn::Select': [ - 6, - { - 'Fn::Split': [ - ':', - { - 'Fn::Join': [ - '', - [ - 'arn:', - { Ref: 'AWS::Partition' }, - ':logs:', - { Ref: 'AWS::Region' }, - ':', - { Ref: 'AWS::AccountId' }, - ':log-group:', - { - 'Fn::GetAtt': arrayWith('LogGroupName'), - }, - ], - ], - }, - ], - }, + 'Fn::GetAtt': [ + 'RenderQueueCommonLogGroupWrapperA0EF7057', + 'LogGroupName', ], }, 'awslogs-stream-prefix': 'RCS', @@ -576,7 +555,7 @@ describe('RenderQueue', () => { describe('externalProtocol is HTTPS', () => { let isolatedStack: Stack; const CERT_ARN = 'certarn'; - const CA_ARN = 'caarn'; + const CA_ARN = 'arn:aws:secretsmanager:123456789012:secret:ca/arn'; const ZONE_NAME = 'renderfarm.local'; beforeEach(() => { @@ -747,7 +726,7 @@ describe('RenderQueue', () => { const isolatedStack = new Stack(app, 'IsolatedStack'); const ZONE_NAME = 'renderfarm.local'; const CERT_ARN = 'certArn'; - const CA_ARN = 'caArn'; + const CA_ARN = 'arn:aws:secretsmanager:123456789012:secret:ca/arn'; const zone = new PrivateHostedZone(isolatedStack, 'RenderQueueZone', { vpc, @@ -1291,8 +1270,8 @@ describe('RenderQueue', () => { let zone: PrivateHostedZone; let rq: RenderQueue; const ZONE_NAME = 'renderfarm.local'; - const CERT_ARN = 'certarn'; - const CA_ARN = 'caarn'; + const CERT_ARN = 'arn:a:b:c:dcertarn'; + const CA_ARN = 'arn:aws:secretsmanager:123456789012:secret:ca/arn'; beforeEach(() => { // GIVEN @@ -1481,7 +1460,7 @@ describe('RenderQueue', () => { 'DNSName', ], }, - ':4433" --tls-ca "caarn"\n' + + `:4433" --tls-ca "${CA_ARN}"\n` + 'rm -f "/tmp/', { 'Fn::Select': [ @@ -1652,7 +1631,7 @@ describe('RenderQueue', () => { 'DNSName', ], }, - ':4433" --tls-ca \"caarn\" 2>&1\n' + + `:4433" --tls-ca \"${CA_ARN}\" 2>&1\n` + 'Remove-Item -Path "C:/temp/', { 'Fn::Select': [ @@ -2219,4 +2198,75 @@ describe('RenderQueue', () => { }, }); }); + + describe('SEP Policies', () => { + test('with resource tracker', () => { + renderQueueCommon.addSEPPolicies(); + expectCDK(stack).to(countResourcesLike('AWS::IAM::Role', 1, { + ManagedPolicyArns: arrayWith( + { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':iam::aws:policy/AWSThinkboxDeadlineSpotEventPluginAdminPolicy', + ], + ], + }, + { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':iam::aws:policy/AWSThinkboxDeadlineResourceTrackerAdminPolicy', + ], + ], + }, + ), + })); + }); + + test('no resource tracker', () => { + renderQueueCommon.addSEPPolicies(false); + expectCDK(stack).to(haveResourceLike('AWS::IAM::Role', { + ManagedPolicyArns: arrayWith( + { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':iam::aws:policy/AWSThinkboxDeadlineSpotEventPluginAdminPolicy', + ], + ], + }, + ), + })); + expectCDK(stack).notTo(haveResourceLike('AWS::IAM::Role', { + ManagedPolicyArns: arrayWith( + { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':iam::aws:policy/AWSThinkboxDeadlineResourceTrackerAdminPolicy', + ], + ], + }, + ), + })); + }); + + }); }); diff --git a/packages/aws-rfdk/lib/deadline/test/repository.test.ts b/packages/aws-rfdk/lib/deadline/test/repository.test.ts index 9107abe4b..b6c151d5a 100644 --- a/packages/aws-rfdk/lib/deadline/test/repository.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/repository.test.ts @@ -825,17 +825,25 @@ test('repository instance is created with correct installer path version', () => expect(script.render()).toMatch(/10\.1\.9\.2/); }); -test('repository instance is created with correct LogGroup prefix', () => { - new Repository(stack, 'repositoryInstaller', { +test.each([ + 'test-prefix/', + '', +])('repository instance is created with correct LogGroup prefix %s', (testPrefix: string) => { + // GIVEN + const id = 'repositoryInstaller'; + + // WHEN + new Repository(stack, id, { vpc, version: deadlineVersion, logGroupProps: { - logGroupPrefix: 'test-prefix/', + logGroupPrefix: testPrefix, }, }); + // THEN expectCDK(stack).to(haveResource('Custom::LogRetention', { - LogGroupName: 'test-prefix/repositoryInstaller', + LogGroupName: testPrefix + id, })); }); @@ -849,7 +857,7 @@ test('validate instance self-termination', () => { const asgLogicalId = stack.getLogicalId(repo.node.defaultChild!.node.defaultChild as CfnElement); // THEN - const expectedString = `function exitTrap(){\nexitCode=$?\nsleep 1m\nINSTANCE=\"$(curl http://169.254.169.254/latest/meta-data/instance-id)\"\nASG=\"$(aws --region \${Token[AWS::Region.4]} ec2 describe-tags --filters \"Name=resource-id,Values=\${INSTANCE}\" \"Name=key,Values=aws:autoscaling:groupName\" --query \"Tags[0].Value\" --output text)\"\naws --region \${Token[AWS::Region.4]} 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 ${asgLogicalId} --region \${Token[AWS::Region.4]} -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}`; + const expectedString = `function exitTrap(){\nexitCode=$?\nsleep 1m\nINSTANCE=\"$(curl http://169.254.169.254/latest/meta-data/instance-id)\"\nASG=\"$(aws --region \${Token[AWS.Region.4]} ec2 describe-tags --filters \"Name=resource-id,Values=\${INSTANCE}\" \"Name=key,Values=aws:autoscaling:groupName\" --query \"Tags[0].Value\" --output text)\"\naws --region \${Token[AWS.Region.4]} 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 ${asgLogicalId} --region \${Token[AWS.Region.4]} -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n}`; expect((repo.node.defaultChild as AutoScalingGroup).userData.render()).toMatch(expectedString); expectCDK(stack).to(haveResourceLike('AWS::IAM::Policy', { PolicyDocument: { diff --git a/packages/aws-rfdk/lib/deadline/test/stage.test.ts b/packages/aws-rfdk/lib/deadline/test/stage.test.ts index b1937e4cb..ff7818cfc 100644 --- a/packages/aws-rfdk/lib/deadline/test/stage.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/stage.test.ts @@ -41,7 +41,7 @@ describe('Stage', () => { // GIVEN const manifest: Manifest = { schema: 1, - version: '1.2.3.4', + version: '10.1.9.2', recipes: {}, }; @@ -77,10 +77,34 @@ describe('Stage', () => { }); }); + describe('.fromDirectory', () => { + test('not supported version failure', () => { + // GIVEN + const manifest: Manifest = { + schema: 1, + version: '10.1.8.0', + recipes: {}, + }; + + // WHEN + const readFileSync = jest.spyOn(fs, 'readFileSync'); + readFileSync.mockReturnValue(JSON.stringify(manifest)); + + // THEN + expect(() => { + require('../lib').Stage.fromDirectory(STAGE_PATH) // eslint-disable-line + }).toThrow('Staged Deadline Version (10.1.8.0) is less than the minimum supported version (10.1.9.2)'); + + readFileSync.mockRestore(); + jest.resetModules(); + }); + + }); + test('has manifest', () => { const manifest: Manifest = { schema: 1, - version: '1.2.3.4', + version: '10.1.9.2', recipes: { a: { title: 'a-title', @@ -131,7 +155,7 @@ describe('Stage', () => { 'missing schema', { manifest: { - version: '1.2.3.4', + version: '10.1.9.2', recipes: {}, }, expectedError: /Manifest contains no "schema" key/, @@ -141,7 +165,7 @@ describe('Stage', () => { 'wrong schema type', { manifest: { schema: 'a', - version: '1.2.3.4', + version: '10.1.9.2', recipes: {}, }, expectedError: /Expected a numeric "schema" but got:/, @@ -156,6 +180,26 @@ describe('Stage', () => { expectedError: /Manifest contains no "version" key/, }, ], + [ + 'incorrect version format', { + manifest: { + schema: 1, + version: '10.1.', + recipes: {}, + }, + expectedError: /Invalid version format/, + }, + ], + [ + 'version not supported', { + manifest: { + schema: 1, + version: '10.1.0.0', + recipes: {}, + }, + expectedError: 'Staged Deadline Version (10.1.0.0) is less than the minimum supported version (10.1.9.2)', + }, + ], ])('%s', (_name, testcase) => { const { manifest, expectedError } = testcase; // WHEN @@ -225,7 +269,7 @@ describe('Stage', () => { recipeName: recipe, }, schema: 1, - version: '1.2.3.4', + version: '10.1.9.2', }; // WHEN @@ -287,7 +331,7 @@ describe('Stage', () => { const stage = new ReloadedStageWithPublicConstructor({ path: STAGE_PATH, manifest: { - version: '1.2.3.4', + version: '10.1.9.2', schema: 1, recipes: { [recipeName]: recipe, @@ -316,7 +360,7 @@ describe('Stage', () => { // GIVEN const manifest: Manifest = { schema: 1, - version: '1.2.3.4', + version: '10.1.9.2', recipes: {}, }; const invalidRecipeName = 'this-recipe-does-not-exist'; @@ -342,7 +386,7 @@ describe('Stage', () => { const stack = new Stack(app, 'Stack'); const manifest: Manifest = { schema: 1, - version: '1.2.3.4', + version: '10.1.9.2', recipes: {}, }; const stage = new StageWithPulicConstructor({ @@ -355,15 +399,15 @@ describe('Stage', () => { const linuxFullVersionString = version.linuxFullVersionString(); // THEN - expect(version.majorVersion).toEqual(1); - expect(version.minorVersion).toEqual(2); - expect(version.releaseVersion).toEqual(3); + expect(version.majorVersion).toEqual(10); + expect(version.minorVersion).toEqual(1); + expect(version.releaseVersion).toEqual(9); expect(version.linuxInstallers).toBeDefined(); - expect(version.linuxInstallers?.patchVersion).toEqual(4); + expect(version.linuxInstallers?.patchVersion).toEqual(2); expect(linuxFullVersionString).toBeDefined(); - expect(linuxFullVersionString).toEqual('1.2.3.4'); + expect(linuxFullVersionString).toEqual('10.1.9.2'); }); }); }); 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 b7df57068..590053bbd 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 @@ -52,8 +52,8 @@ describe('ThinkboxDockerRecipes', () => { const MAJOR_VERSION = 10; const MINOR_VERSION = 1; - const RELEASE_VERSION = 8; - const PATCH_VERSION = 5; + const RELEASE_VERSION = 9; + const PATCH_VERSION = 2; const FULL_VERSION_STRING = `${MAJOR_VERSION}.${MINOR_VERSION}.${RELEASE_VERSION}.${PATCH_VERSION}`; beforeEach(() => { 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 0569f2914..3710a1e6c 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 @@ -6,6 +6,7 @@ import { arrayWith, expect as expectCDK, + haveResource, haveResourceLike, stringLike, } from '@aws-cdk/assert'; @@ -424,6 +425,32 @@ describe('UsageBasedLicensing', () => { })); }); + test.each([ + 'test-prefix/', + '', + ])('License Forwarder is created with correct LogGroup prefix %s', (testPrefix: string) => { + // GIVEN + stack = new Stack(app, 'IsolatedStack', { env }); + const id = 'licenseForwarder'; + + // WHEN + new UsageBasedLicensing(stack, id, { + certificateSecret, + images, + licenses, + renderQueue, + vpc, + logGroupProps: { + logGroupPrefix: testPrefix, + }, + }); + + // THEN + expectCDK(stack).to(haveResource('Custom::LogRetention', { + LogGroupName: testPrefix + id, + })); + }); + describe('license limits', () => { test('multiple licenses with limits', () => { // GIVEN diff --git a/packages/aws-rfdk/lib/deadline/test/version.test.ts b/packages/aws-rfdk/lib/deadline/test/version.test.ts index 6253a86b1..3c8c0eeec 100644 --- a/packages/aws-rfdk/lib/deadline/test/version.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/version.test.ts @@ -13,11 +13,228 @@ import { } from '@aws-cdk/core'; import { IVersion, + Version, VersionQuery, } from '../lib'; let stack: Stack; +describe('Version', () => { + describe('.isGreaterThan', () => { + test.each<[string, { firstVersion: string, secondVersion: string, expectedValue: boolean }]>([ + [ + 'equal version', + { + firstVersion: '1.1.1.1', + secondVersion: '1.1.1.1', + expectedValue: false, + }, + ], [ + 'less than', + { + firstVersion: '10.0.9.2', + secondVersion: '10.1.9.2', + expectedValue: false, + }, + ], [ + 'less than', + { + firstVersion: '1.1.1.1', + secondVersion: '1.1.1.2', + expectedValue: false, + }, + ], [ + 'greater than', + { + firstVersion: '2.0.0.1', + secondVersion: '2.0.0.0', + expectedValue: true, + }, + ], + ])('%s', (_name, testcase) => { + const { firstVersion, secondVersion, expectedValue } = testcase; + + // WHEN + const lhs = Version.parse(firstVersion); + const result = lhs.isGreaterThan(Version.parse(secondVersion)); + + expect(result).toEqual(expectedValue); + }); + }); + + describe('.isGreaterThan constructor', () => { + + // WHEN + const lhs = new Version([10, 1, 9, 2]); + const result = lhs.isGreaterThan(Version.parse('10.0.9.2')); + + expect(result).toEqual(true); + + }); + + describe('.isLessThan', () => { + test.each<[string, { firstVersion: string, secondVersion: string, expectedValue: boolean }]>([ + [ + 'equal version', + { + firstVersion: '1.1.1.1', + secondVersion: '1.1.1.1', + expectedValue: false, + }, + ], [ + 'greater minor version', + { + firstVersion: '10.1.9.2', + secondVersion: '10.0.9.2', + expectedValue: false, + }, + ], [ + 'greater patch version', + { + firstVersion: '1.1.1.2', + secondVersion: '1.1.1.1', + expectedValue: false, + }, + ], [ + 'less than', + { + firstVersion: '2.0.0.0', + secondVersion: '2.0.0.1', + expectedValue: true, + }, + ], + ])('%s', (_name, testcase) => { + const { firstVersion, secondVersion, expectedValue } = testcase; + + // WHEN + const lhs = Version.parse(firstVersion); + const result = lhs.isLessThan(Version.parse(secondVersion)); + + expect(result).toEqual(expectedValue); + }); + }); + + describe('.isEqual', () => { + test.each<[string, { firstVersion: string, secondVersion: string, expectedValue: boolean }]>([ + [ + 'equal version', + { + firstVersion: '1.1.1.1', + secondVersion: '1.1.1.1', + expectedValue: true, + }, + ], [ + 'unequal', + { + firstVersion: '2.1.1.1', + secondVersion: '1.1.1.1', + expectedValue: false, + }, + ], [ + 'less than', + { + firstVersion: '1.1.1.1', + secondVersion: '1.1.1.2', + expectedValue: false, + }, + ], + ])('%s', (_name, testcase) => { + const { firstVersion, secondVersion, expectedValue } = testcase; + + // WHEN + const lhs = Version.parse(firstVersion); + const result = lhs.isEqual(Version.parse(secondVersion)); + + expect(result).toEqual(expectedValue); + }); + }); + + describe('.isLessThan using constructor', () => { + + // WHEN + const lhs = new Version([10, 0, 9, 2]); + const result = lhs.isLessThan(Version.parse('10.1.9.2')); + + expect(result).toEqual(true); + }); + + describe('constructor validation', () => { + test.each<[string, { version: number[], expectedException?: RegExp }]>([ + [ + 'incorrect component count', + { + version: [10, 1, 9], + expectedException: /Invalid version format/, + }, + ], [ + 'negative value', + { + version: [10, -1, 9], + expectedException: /Invalid version format/, + }, + ], [ + 'decimal value', + { + version: [10, 1, 9.2], + expectedException: /Invalid version format/, + }, + ], [ + 'correct value', + { + version: [10, 1, 9, 2], + }, + ], + ])('%s', (_name, testcase) => { + const { version, expectedException } = testcase; + + // WHEN + if (expectedException) { + expect(() => new Version(version)).toThrow(expectedException); + } else { + expect(() => new Version(version)).not.toThrow(); + } + }); + }); + + describe('.parse throws exception', () => { + test.each<[string, { version: string, expectedException?: RegExp }]>([ + [ + 'ending with .', + { + version: '10.1.9.', + expectedException: /Invalid version format/, + }, + ], [ + 'empty string', + { + version: '', + expectedException: /Invalid version format/, + }, + ], [ + 'negative value', + { + version: '10.-1.9.2', + expectedException: /Invalid version format/, + }, + ], [ + 'correct version', + { + version: '10.1.9.2', + }, + ], + ])('%s', (_name, testcase) => { + const { version, expectedException } = testcase; + + // WHEN + if(expectedException) { + expect(() => Version.parse(version)).toThrow(expectedException); + } else { + expect(() => Version.parse(version)).not.toThrow(); + } + }); + }); +}); + describe('VersionQuery', () => { beforeEach(() => { stack = new Stack(undefined, undefined); @@ -41,7 +258,7 @@ describe('VersionQuery', () => { test('throws not implemented error for valid version string', () => { // WHEN - expect( () => { + expect(() => { new VersionQuery(stack, 'version', { version: '1.2', }); @@ -151,7 +368,7 @@ describe('VersionQuery', () => { } // THEN - expect(when).toThrowError(new RegExp(`^"${versionStr}" is not a valid version$`)); + expect(when).toThrowError(new RegExp(`^Invalid version format. Expected format 'a.b.c.d', found '${versionStr}'$`)); }); }); }); 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 5ddcdcaf9..a538ec83d 100644 --- a/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts +++ b/packages/aws-rfdk/lib/deadline/test/worker-fleet.test.ts @@ -44,6 +44,7 @@ import { IRenderQueue, RenderQueue, Repository, + Version, VersionQuery, WorkerInstanceFleet, } from '../lib'; @@ -255,20 +256,28 @@ test('default worker fleet is created correctly custom Instance type', () => { })); }); -test('default worker fleet is created correctly with custom LogGroup prefix', () => { +test.each([ + 'test-prefix/', + '', +])('default worker fleet is created correctly with custom LogGroup prefix %s', (testPrefix: string) => { + // GIVEN + const id = 'workerFleet'; + // WHEN - new WorkerInstanceFleet(stack, 'workerFleet', { + new WorkerInstanceFleet(stack, id, { vpc, workerMachineImage: new GenericLinuxImage({ 'us-east-1': '123', }), renderQueue, - logGroupProps: {logGroupPrefix: 'test-prefix'}, + logGroupProps: { + logGroupPrefix: testPrefix, + }, }); expectCDK(stack).to(haveResource('Custom::LogRetention', { RetentionInDays: 3, - LogGroupName: 'test-prefixworkerFleet', + LogGroupName: testPrefix + id, })); }); @@ -677,7 +686,7 @@ test('default worker fleet is created correctly custom subnet values', () => { }, ], }, - "' '6161' '' '' ''", + `' '6161' '' '' '' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION}'`, ], ], }); @@ -1077,7 +1086,7 @@ test('default worker fleet is created correctly with groups, pools and region', }, ], }, - "' '63415' 'a,b' 'c,d' 'E'", + `' '63415' 'a,b' 'c,d' 'E' '${Version.MINIMUM_SUPPORTED_DEADLINE_VERSION}'`, ]], }); }); diff --git a/packages/aws-rfdk/package.json b/packages/aws-rfdk/package.json index 39b6b14d0..a66560aa3 100644 --- a/packages/aws-rfdk/package.json +++ b/packages/aws-rfdk/package.json @@ -1,6 +1,6 @@ { "name": "aws-rfdk", - "version": "0.17.0", + "version": "0.18.0", "private": false, "description": "Package for core render farm constructs", "main": "lib/index.js", @@ -65,123 +65,123 @@ "jest": true }, "devDependencies": { - "@aws-cdk/assert": "1.57.0", - "@types/aws-lambda": "^8.10.57", - "@types/sinon": "^9.0.4", - "aws-sdk": "^2.709.0", + "@aws-cdk/assert": "1.66.0", + "@types/aws-lambda": "^8.10.63", + "@types/sinon": "^9.0.8", + "aws-sdk": "^2.741.0", "aws-sdk-mock": "^5.1.0", - "cdk-build-tools": "0.17.0", - "dynalite": "^3.2.0", - "pkglint": "0.17.0", - "sinon": "^9.0.2" + "cdk-build-tools": "0.18.0", + "dynalite": "^3.2.1", + "pkglint": "0.18.0", + "sinon": "^9.2.0" }, "dependencies": { - "@aws-cdk/assets": "1.57.0", - "@aws-cdk/aws-apigateway": "1.57.0", - "@aws-cdk/aws-applicationautoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling-common": "1.57.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.57.0", - "@aws-cdk/aws-batch": "1.57.0", - "@aws-cdk/aws-certificatemanager": "1.57.0", - "@aws-cdk/aws-cloudformation": "1.57.0", - "@aws-cdk/aws-cloudfront": "1.57.0", - "@aws-cdk/aws-cloudwatch": "1.57.0", - "@aws-cdk/aws-cloudwatch-actions": "1.57.0", - "@aws-cdk/aws-codebuild": "1.57.0", - "@aws-cdk/aws-codecommit": "1.57.0", - "@aws-cdk/aws-codeguruprofiler": "1.57.0", - "@aws-cdk/aws-codepipeline": "1.57.0", - "@aws-cdk/aws-cognito": "1.57.0", - "@aws-cdk/aws-docdb": "1.57.0", - "@aws-cdk/aws-dynamodb": "1.57.0", - "@aws-cdk/aws-ec2": "1.57.0", - "@aws-cdk/aws-ecr": "1.57.0", - "@aws-cdk/aws-ecr-assets": "1.57.0", - "@aws-cdk/aws-ecs": "1.57.0", - "@aws-cdk/aws-ecs-patterns": "1.57.0", - "@aws-cdk/aws-efs": "1.57.0", - "@aws-cdk/aws-elasticloadbalancing": "1.57.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.57.0", - "@aws-cdk/aws-events": "1.57.0", - "@aws-cdk/aws-events-targets": "1.57.0", - "@aws-cdk/aws-iam": "1.57.0", - "@aws-cdk/aws-kinesis": "1.57.0", - "@aws-cdk/aws-kms": "1.57.0", - "@aws-cdk/aws-lambda": "1.57.0", - "@aws-cdk/aws-logs": "1.57.0", - "@aws-cdk/aws-route53": "1.57.0", - "@aws-cdk/aws-route53-targets": "1.57.0", - "@aws-cdk/aws-s3": "1.57.0", - "@aws-cdk/aws-s3-assets": "1.57.0", - "@aws-cdk/aws-sam": "1.57.0", - "@aws-cdk/aws-secretsmanager": "1.57.0", - "@aws-cdk/aws-servicediscovery": "1.57.0", - "@aws-cdk/aws-sns": "1.57.0", - "@aws-cdk/aws-sns-subscriptions": "1.57.0", - "@aws-cdk/aws-sqs": "1.57.0", - "@aws-cdk/aws-ssm": "1.57.0", - "@aws-cdk/aws-stepfunctions": "1.57.0", - "@aws-cdk/cloud-assembly-schema": "1.57.0", - "@aws-cdk/core": "1.57.0", - "@aws-cdk/custom-resources": "1.57.0", - "@aws-cdk/cx-api": "1.57.0", - "@aws-cdk/region-info": "1.57.0", - "constructs": "^3.0.2" + "@aws-cdk/assets": "1.66.0", + "@aws-cdk/aws-apigateway": "1.66.0", + "@aws-cdk/aws-applicationautoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling-common": "1.66.0", + "@aws-cdk/aws-autoscaling-hooktargets": "1.66.0", + "@aws-cdk/aws-batch": "1.66.0", + "@aws-cdk/aws-certificatemanager": "1.66.0", + "@aws-cdk/aws-cloudformation": "1.66.0", + "@aws-cdk/aws-cloudfront": "1.66.0", + "@aws-cdk/aws-cloudwatch": "1.66.0", + "@aws-cdk/aws-cloudwatch-actions": "1.66.0", + "@aws-cdk/aws-codebuild": "1.66.0", + "@aws-cdk/aws-codecommit": "1.66.0", + "@aws-cdk/aws-codeguruprofiler": "1.66.0", + "@aws-cdk/aws-codepipeline": "1.66.0", + "@aws-cdk/aws-cognito": "1.66.0", + "@aws-cdk/aws-docdb": "1.66.0", + "@aws-cdk/aws-dynamodb": "1.66.0", + "@aws-cdk/aws-ec2": "1.66.0", + "@aws-cdk/aws-ecr": "1.66.0", + "@aws-cdk/aws-ecr-assets": "1.66.0", + "@aws-cdk/aws-ecs": "1.66.0", + "@aws-cdk/aws-ecs-patterns": "1.66.0", + "@aws-cdk/aws-efs": "1.66.0", + "@aws-cdk/aws-elasticloadbalancing": "1.66.0", + "@aws-cdk/aws-elasticloadbalancingv2": "1.66.0", + "@aws-cdk/aws-events": "1.66.0", + "@aws-cdk/aws-events-targets": "1.66.0", + "@aws-cdk/aws-iam": "1.66.0", + "@aws-cdk/aws-kinesis": "1.66.0", + "@aws-cdk/aws-kms": "1.66.0", + "@aws-cdk/aws-lambda": "1.66.0", + "@aws-cdk/aws-logs": "1.66.0", + "@aws-cdk/aws-route53": "1.66.0", + "@aws-cdk/aws-route53-targets": "1.66.0", + "@aws-cdk/aws-s3": "1.66.0", + "@aws-cdk/aws-s3-assets": "1.66.0", + "@aws-cdk/aws-sam": "1.66.0", + "@aws-cdk/aws-secretsmanager": "1.66.0", + "@aws-cdk/aws-servicediscovery": "1.66.0", + "@aws-cdk/aws-sns": "1.66.0", + "@aws-cdk/aws-sns-subscriptions": "1.66.0", + "@aws-cdk/aws-sqs": "1.66.0", + "@aws-cdk/aws-ssm": "1.66.0", + "@aws-cdk/aws-stepfunctions": "1.66.0", + "@aws-cdk/cloud-assembly-schema": "1.66.0", + "@aws-cdk/core": "1.66.0", + "@aws-cdk/custom-resources": "1.66.0", + "@aws-cdk/cx-api": "1.66.0", + "@aws-cdk/region-info": "1.66.0", + "constructs": "^3.0.4" }, "peerDependencies": { - "@aws-cdk/assets": "1.57.0", - "@aws-cdk/aws-apigateway": "1.57.0", - "@aws-cdk/aws-applicationautoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling": "1.57.0", - "@aws-cdk/aws-autoscaling-common": "1.57.0", - "@aws-cdk/aws-autoscaling-hooktargets": "1.57.0", - "@aws-cdk/aws-batch": "1.57.0", - "@aws-cdk/aws-certificatemanager": "1.57.0", - "@aws-cdk/aws-cloudformation": "1.57.0", - "@aws-cdk/aws-cloudfront": "1.57.0", - "@aws-cdk/aws-cloudwatch": "1.57.0", - "@aws-cdk/aws-cloudwatch-actions": "1.57.0", - "@aws-cdk/aws-codebuild": "1.57.0", - "@aws-cdk/aws-codecommit": "1.57.0", - "@aws-cdk/aws-codeguruprofiler": "1.57.0", - "@aws-cdk/aws-codepipeline": "1.57.0", - "@aws-cdk/aws-cognito": "1.57.0", - "@aws-cdk/aws-docdb": "1.57.0", - "@aws-cdk/aws-dynamodb": "1.57.0", - "@aws-cdk/aws-ec2": "1.57.0", - "@aws-cdk/aws-ecr": "1.57.0", - "@aws-cdk/aws-ecr-assets": "1.57.0", - "@aws-cdk/aws-ecs": "1.57.0", - "@aws-cdk/aws-ecs-patterns": "1.57.0", - "@aws-cdk/aws-efs": "1.57.0", - "@aws-cdk/aws-elasticloadbalancing": "1.57.0", - "@aws-cdk/aws-elasticloadbalancingv2": "1.57.0", - "@aws-cdk/aws-events": "1.57.0", - "@aws-cdk/aws-events-targets": "1.57.0", - "@aws-cdk/aws-iam": "1.57.0", - "@aws-cdk/aws-kinesis": "1.57.0", - "@aws-cdk/aws-kms": "1.57.0", - "@aws-cdk/aws-lambda": "1.57.0", - "@aws-cdk/aws-logs": "1.57.0", - "@aws-cdk/aws-route53": "1.57.0", - "@aws-cdk/aws-route53-targets": "1.57.0", - "@aws-cdk/aws-s3": "1.57.0", - "@aws-cdk/aws-s3-assets": "1.57.0", - "@aws-cdk/aws-sam": "1.57.0", - "@aws-cdk/aws-secretsmanager": "1.57.0", - "@aws-cdk/aws-servicediscovery": "1.57.0", - "@aws-cdk/aws-sns": "1.57.0", - "@aws-cdk/aws-sns-subscriptions": "1.57.0", - "@aws-cdk/aws-sqs": "1.57.0", - "@aws-cdk/aws-ssm": "1.57.0", - "@aws-cdk/aws-stepfunctions": "1.57.0", - "@aws-cdk/cloud-assembly-schema": "1.57.0", - "@aws-cdk/core": "1.57.0", - "@aws-cdk/custom-resources": "1.57.0", - "@aws-cdk/cx-api": "1.57.0", - "@aws-cdk/region-info": "1.57.0", - "constructs": "^3.0.2" + "@aws-cdk/assets": "1.66.0", + "@aws-cdk/aws-apigateway": "1.66.0", + "@aws-cdk/aws-applicationautoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling": "1.66.0", + "@aws-cdk/aws-autoscaling-common": "1.66.0", + "@aws-cdk/aws-autoscaling-hooktargets": "1.66.0", + "@aws-cdk/aws-batch": "1.66.0", + "@aws-cdk/aws-certificatemanager": "1.66.0", + "@aws-cdk/aws-cloudformation": "1.66.0", + "@aws-cdk/aws-cloudfront": "1.66.0", + "@aws-cdk/aws-cloudwatch": "1.66.0", + "@aws-cdk/aws-cloudwatch-actions": "1.66.0", + "@aws-cdk/aws-codebuild": "1.66.0", + "@aws-cdk/aws-codecommit": "1.66.0", + "@aws-cdk/aws-codeguruprofiler": "1.66.0", + "@aws-cdk/aws-codepipeline": "1.66.0", + "@aws-cdk/aws-cognito": "1.66.0", + "@aws-cdk/aws-docdb": "1.66.0", + "@aws-cdk/aws-dynamodb": "1.66.0", + "@aws-cdk/aws-ec2": "1.66.0", + "@aws-cdk/aws-ecr": "1.66.0", + "@aws-cdk/aws-ecr-assets": "1.66.0", + "@aws-cdk/aws-ecs": "1.66.0", + "@aws-cdk/aws-ecs-patterns": "1.66.0", + "@aws-cdk/aws-efs": "1.66.0", + "@aws-cdk/aws-elasticloadbalancing": "1.66.0", + "@aws-cdk/aws-elasticloadbalancingv2": "1.66.0", + "@aws-cdk/aws-events": "1.66.0", + "@aws-cdk/aws-events-targets": "1.66.0", + "@aws-cdk/aws-iam": "1.66.0", + "@aws-cdk/aws-kinesis": "1.66.0", + "@aws-cdk/aws-kms": "1.66.0", + "@aws-cdk/aws-lambda": "1.66.0", + "@aws-cdk/aws-logs": "1.66.0", + "@aws-cdk/aws-route53": "1.66.0", + "@aws-cdk/aws-route53-targets": "1.66.0", + "@aws-cdk/aws-s3": "1.66.0", + "@aws-cdk/aws-s3-assets": "1.66.0", + "@aws-cdk/aws-sam": "1.66.0", + "@aws-cdk/aws-secretsmanager": "1.66.0", + "@aws-cdk/aws-servicediscovery": "1.66.0", + "@aws-cdk/aws-sns": "1.66.0", + "@aws-cdk/aws-sns-subscriptions": "1.66.0", + "@aws-cdk/aws-sqs": "1.66.0", + "@aws-cdk/aws-ssm": "1.66.0", + "@aws-cdk/aws-stepfunctions": "1.66.0", + "@aws-cdk/cloud-assembly-schema": "1.66.0", + "@aws-cdk/core": "1.66.0", + "@aws-cdk/custom-resources": "1.66.0", + "@aws-cdk/cx-api": "1.66.0", + "@aws-cdk/region-info": "1.66.0", + "constructs": "^3.0.4" }, "engines": { "node": ">= 10.13.0 <13 || >=13.7.0" diff --git a/scripts/generate-aggregate-tsconfig.sh b/scripts/generate-aggregate-tsconfig.sh index b117217b8..d47ae0601 100755 --- a/scripts/generate-aggregate-tsconfig.sh +++ b/scripts/generate-aggregate-tsconfig.sh @@ -12,7 +12,7 @@ echo ' "references": [' # if we have more than one package, # we set $comma to an actual comma comma=' ' -for package in $(node_modules/.bin/lerna ls -ap); do +for package in $(node_modules/.bin/lerna ls -ap --ignore 'all-in-farm**'); do relpath=${package#"$prefix"} echo ' '"$comma"'{ "path": "'"$relpath"'" }' comma=', ' diff --git a/tools/awslint/.gitignore b/tools/awslint/.gitignore deleted file mode 100644 index 7164f5d83..000000000 --- a/tools/awslint/.gitignore +++ /dev/null @@ -1,95 +0,0 @@ -*.js -*.d.ts -jsii - -# Created by https://www.gitignore.io/api/node -# Edit at https://www.gitignore.io/?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -#DynamoDB Local files -.dynamodb/ - -# End of https://www.gitignore.io/api/node - -dist -.LAST_PACKAGE -.LAST_BUILD -*.snk -.nycrc diff --git a/tools/awslint/.npmignore b/tools/awslint/.npmignore deleted file mode 100644 index bc9fd0e49..000000000 --- a/tools/awslint/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ - -dist -.LAST_PACKAGE -.LAST_BUILD -*.snk \ No newline at end of file diff --git a/tools/awslint/LICENSE b/tools/awslint/LICENSE deleted file mode 100644 index b71ec1688..000000000 --- a/tools/awslint/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-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/tools/awslint/NOTICE b/tools/awslint/NOTICE deleted file mode 100644 index bfccac9a7..000000000 --- a/tools/awslint/NOTICE +++ /dev/null @@ -1,2 +0,0 @@ -AWS Cloud Development Kit (AWS CDK) -Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/tools/awslint/README.md b/tools/awslint/README.md deleted file mode 100644 index 585a2b79a..000000000 --- a/tools/awslint/README.md +++ /dev/null @@ -1,130 +0,0 @@ -# awslint - -A linter for the AWS Construct Library's API. It reflects a construct library's -module via it's `.jsii` manifest and checks that the module adheres to the [AWS -Resource Construct Design Guidelines](../../design/aws-guidelines.md). - -## Usage - -First, the module must be built through `jsii` (the linter reads the `.jsii` -manifest). - -Now, if you simply run `awslint` from a module directory, you will -see a list of diagnostic messages. - -For example: - -```console -$ cd @aws-cdk/aws-sns -$ npm run awslint -warning: [awslint:resource-interface:@aws-cdk/aws-sns.Subscription] every resource must have a resource interface -warning: [awslint:resource-interface:@aws-cdk/aws-sns.TopicPolicy] every resource must have a resource interface -``` - -Each diagnostics includes the following elements: - -``` -warning: [awslint:resource-interface:@aws-cdk/aws-sns.Subscription] every resource must have a resource interface -[------] [-------------------------] [----------------------------] [-------------------------------------------] - ^ ^ ^ ^ - | | | | - level rule scope message -``` - -## Options and Configuration - -`awslint` accepts options either through the command-line (i.e. `--debug`) or -via an `awslint` key in the module's `package.json`. - -```json -{ - "awslint": { - "debug": true - } -} -``` - -## Include/Exclude - -The `i`/`--include` and `-x`/`--exclude` options can be used to specify which rules will -be evaluated. - -For example: - -```console -# evaluate only the "resource-props" and "import" rules in all scopes -$ npm run awslint -- -i resource-props -i import - -# evaluate only the "import" rule in all scopes besides ones that begin with "@aws-cdk/aws-s3" -$ npm run awslint -- -i import -x "*:@aws-cdk/aws-s3*" -``` - - -Filters are specified using the following pattern: - - rule[*][:scope[*]] - -If a `"*"` suffix is provided, the component is treated as a prefix. Otherwise, -it is evaluated as a full match. - -If scope is not specified, all scopes are implied (`*`). - -Examples: - -* `*:*` - matches all rules in all scopes -* `*:@aws-cdk/aws-apigateway.IRestApi*` - matches all rules in scopes that begin with `@aws-cdk/aws-apigateway.IRestApi` -* `resource-props` - matches the `resource-props` rule in all scopes -* `resource-*` - matches all rules that begin with `resource-`. -* `resource-*:@aws-cdk/aws-sns*` - matches all `resource-` rules with scope that - begins with `@aws-cdk/aws-sns`. - -When a rule is excluded, it will be displayed as `skipped:` in the output and -will always considered to pass. - -## Saving State - -The `--save` option can be used to capture all failed linting rules and save them as `exclude`s -in the module's `package.json` file. This is useful to bootstrap the linting process and \ -progressively fix errors. - -```console -$ npm run awslint -- --save -[shows errors] - -$ cat package.json -{ - ... - "awslint": { - "exclude": [ - "...", // added by awslint --save - "...", // added by awslint --save - ] - } -} - -$ npm run awslint -[no errors] -``` - -If `--save` is specified, `awslint` will always exit with status code 0. - -## Output Options - -* Use `--verbose` to print all passing linter rules (disabled by default). -* Use `--quiet` to hide all warnings and skips (just prints errors) - -## Listing Rules - -To list all linter rules: - -```console -$ npm run awslint list -module-name: module name must be @aws-cdk/aws- -construct-ctor: signature of all construct constructors should be "scope, id, props" -resource-class: every resource must have a resource class (L2) -... -``` - -The [AWS Resource Construct Design Guidelines](../../design/aws-guidelines.md) document -includes references for all rules. For example, see [#resource-class](../../design/aws-guidelines.md#resource-class) -for a discussion about the "resource-class" rule. diff --git a/tools/awslint/bin/awslint b/tools/awslint/bin/awslint deleted file mode 100755 index 6aa8e684f..000000000 --- a/tools/awslint/bin/awslint +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('./awslint.js'); \ No newline at end of file diff --git a/tools/awslint/bin/awslint.ts b/tools/awslint/bin/awslint.ts deleted file mode 100644 index a009da634..000000000 --- a/tools/awslint/bin/awslint.ts +++ /dev/null @@ -1,265 +0,0 @@ -// tslint:disable:max-line-length -import * as child_process from 'child_process'; -import * as colors from 'colors'; -import * as fs from 'fs-extra'; -import * as reflect from 'jsii-reflect'; -import * as path from 'path'; -import * as yargs from 'yargs'; -import { ALL_RULES_LINTER, DiagnosticLevel } from '../lib'; - -let stackTrace = false; - -async function main() { - const argv = yargs - .env('AWSLINT') - .usage('awslint [options] [command]') - .showHelpOnFail(true) - .command('', 'lint the current module (default)') - .command('list', 'list all available rules') - .option('include', { alias: 'i', type: 'array', desc: 'evaluate only this rule(s)', default: [ '*' ] }) - .option('exclude', { alias: 'x', type: 'array', desc: 'do not evaludate these rules (takes priority over --include)', default: [ ] }) - .option('save', { type: 'boolean', desc: 'updates package.json with "exclude" statements for all failing rules', default: false }) - .option('verbose', { alias: 'v', type: 'boolean', desc: 'verbose output (prints all assertions)', default: false }) - .option('quiet', { alias: 'q', type: 'boolean', desc: 'quiet mode - shows only errors', default: false }) - .option('force', { type: 'boolean', desc: 'succeed silently if this is not a jsii module', default: true }) - .option('config', { type: 'boolean', desc: 'reads options from the "awslint" section in package.json', default: true }) - .option('debug', { type: 'boolean', desc: 'debug output', default: false }) - .option('compile', { alias: 'c', type: 'boolean', desc: 'always run the jsii compiler (use "--no-compile" to never run the compiler, even if .jsii doesn\'t exist)' }) - .group('include', 'Filtering') - .group('exclude', 'Filtering') - .group('config', 'Configuration') - .group('save', 'Configuration') - .group('verbose', 'Output') - .group('quiet', 'Output') - .group('debug', 'Output') - .group('compile', 'Build') - .example('awslint', 'lints the current module against all rules') - .example('awslint -v -i "resource*" -i "import*"', 'lints against all rules that start with "resource" or "import" and print successes') - .example('awslint -x "*:@aws-cdk/aws-s3*"', 'evaluate all rules in all scopes besides ones that begin with "@aws-cdk/aws-s3"') - .example('awslint --save', 'updated "package.json" with "exclude"s for all failing rules'); - - if (!process.stdout.isTTY) { - colors.disable(); - } - - const args = argv.argv; - - stackTrace = args.verbose || args.debug; - - if (args._.length > 1) { - argv.showHelp(); - process.exit(1); - } - - const command = args._[0] || 'lint'; - const workdir = process.cwd(); - - const config = path.join(workdir, 'package.json'); - - if (command === 'list') { - for (const rule of ALL_RULES_LINTER.rules) { - console.info(`${colors.cyan(rule.code)}: ${rule.message}`); - } - return; - } - - // if no package.json and force is true (default), just don't do anything - if (!await fs.pathExists(config) && args.force) { - return; - } - - const pkg = await fs.readJSON(config); - - // if this is not a jsii module we have nothing to look for - if (!pkg.jsii) { - if (args.force) { - return; // just silently succeed - } - - throw new Error(`Module in ${workdir} is not a jsii module (no "jsii" section in package.json)`); - } - - // if package.json contains a `jsii` section but there is no .jsii file - // it means we haven't compiled the module. - if (await shouldCompile()) { - await shell('jsii'); - } - - // read "awslint" from package.json - if (args.config) { - mergeOptions(args, pkg.awslint); - } - - if (args.debug) { - console.error('command: ' + command); - console.error('options: ' + JSON.stringify(args, undefined, 2)); - } - - if (command === 'lint') { - const assembly = await loadModule(workdir); - if (!assembly) { - return; - } - - const excludesToSave = new Array(); - let errors = 0; - - const results = []; - - results.push(...ALL_RULES_LINTER.eval(assembly, { - include: args.include, - exclude: args.exclude, - })); - - // Sort errors to the top (highest severity first) - results.sort((a, b) => b.level - a.level); - - // process results - - for (const diag of results) { - const suppressionKey = `${diag.rule.code}:${diag.scope}`; - - let color; - switch (diag.level) { - case DiagnosticLevel.Success: - if (args.verbose) { - color = colors.gray; - } - break; - case DiagnosticLevel.Error: - errors++; - color = colors.red; - if (args.save) { - excludesToSave.push(suppressionKey); - } - break; - case DiagnosticLevel.Warning: - if (!args.quiet) { - color = colors.yellow; - } - break; - case DiagnosticLevel.Skipped: - if (!args.quiet) { - color = colors.blue; - } - break; - } - - if (color) { - console.error(color(`${DiagnosticLevel[diag.level].toLowerCase()}: [${colors.bold(`awslint:${diag.rule.code}`)}:${colors.bold(diag.scope)}] ${diag.message}`)); - } - } - - if (excludesToSave.length > 0) { - if (!pkg.awslint) { - pkg.awslint = { }; - } - - if (!pkg.awslint.exclude) { - pkg.awslint.exclude = []; - } - - const excludes: string[] = pkg.awslint.exclude; - - for (const exclude of excludesToSave) { - if (excludes.indexOf(exclude) === -1) { - excludes.push(exclude); - } - } - - if (excludes.length > 0) { - await fs.writeJSON(config, pkg, { spaces: 2 }); - } - } - - if (errors && !args.save) { - process.exit(1); - } - - return; - } - - argv.showHelp(); - throw new Error(`Invalid command: ${command}`); - - async function shouldCompile() { - - // if --compile is explicitly enabled then just compile always - if (args.compile === true) { - return true; - } - - // if we have a .jsii file and we are not forced to compile, then don't compile - if (await fs.pathExists(path.join(workdir, '.jsii'))) { - return false; - } - - // we don't have a .jsii file, and --no-compile is explicily set, then it's an error - if (args.compile === false) { - throw new Error(`No .jsii file and --no-compile is set`); - } - - // compile! - return true; - } - -} - -main().catch(e => { - console.error(colors.red(e.message)); - if (stackTrace) { - console.error(e.stack); - } - process.exit(1); -}); - -async function loadModule(dir: string) { - const ts = new reflect.TypeSystem(); - await ts.load(dir, { validate: false }); // Don't validate to save 66% of execution time (20s vs 1min). - // We run 'awslint' during build time, assemblies are guaranteed to be ok. - - if (ts.roots.length !== 1) { - throw new Error(`Expecting only a single root assembly`); - } - - return ts.roots[0]; -} - -function mergeOptions(dest: any, pkg?: any) { - if (!pkg) { return; } // no options in package.json - - for (const [key, value] of Object.entries(pkg)) { - - // if this is an array option, then add values to destination - if (Array.isArray(value)) { - const arr = dest[key] || [ ]; - arr.push(...value); - dest[key] = arr; - continue; - } - - // objects are not allowed - if (typeof value === 'object') { - throw new Error(`Invalid option "${key}" in package.json: ${JSON.stringify(value)}`); - } - - // primitives simply override - dest[key] = value; - } - - return dest; -} - -async function shell(command: string) { - const child = child_process.spawn(command, [], { stdio: [ 'inherit', 'inherit', 'inherit' ]}); - return new Promise((ok, ko) => { - child.once('exit', (status: any) => { - if (status === 0) { - return ok(); - } else { - return ko(new Error(`${command} exited with status ${status}`)); - } - }); - child.once('error', ko); - }); -} diff --git a/tools/awslint/lib/index.ts b/tools/awslint/lib/index.ts deleted file mode 100644 index 6c12fbf0e..000000000 --- a/tools/awslint/lib/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './linter'; -export * from './rules'; diff --git a/tools/awslint/lib/linter.ts b/tools/awslint/lib/linter.ts deleted file mode 100644 index a8b3da0b4..000000000 --- a/tools/awslint/lib/linter.ts +++ /dev/null @@ -1,333 +0,0 @@ -import * as reflect from 'jsii-reflect'; -import { PrimitiveType } from '@jsii/spec'; -import * as util from 'util'; - -export interface LinterOptions { - /** - * List of rules to include. - * @default all rules - */ - include?: string[]; - - /** - * List of rules to exclude (takes precedence on "include") - * @default none - */ - exclude?: string[]; -} - -export abstract class LinterBase { - public abstract rules: Rule[]; - public abstract eval(assembly: reflect.Assembly, options: LinterOptions | undefined): Diagnostic[]; -} - -export class AggregateLinter extends LinterBase { - private linters: LinterBase[]; - - constructor(...linters: LinterBase[]) { - super(); - this.linters = linters; - } - - public get rules(): Rule[] { - const ret = new Array(); - for (const linter of this.linters) { - ret.push(...linter.rules); - } - return ret; - } - - public eval(assembly: reflect.Assembly, options: LinterOptions | undefined): Diagnostic[] { - const diags = new Array(); - for (const linter of this.linters) { - diags.push(...linter.eval(assembly, options)); - } - return diags; - } -} - -/** - * Evaluates a bunch of rules against some context. - */ -export class Linter extends LinterBase { - private readonly _rules: { [name: string]: ConcreteRule } = { }; - - constructor(private readonly init: (assembly: reflect.Assembly) => T | readonly T[] | undefined) { - super(); - } - - public get rules() { - return Object.values(this._rules); - } - - /** - * Install another rule. - */ - public add(rule: ConcreteRule) { - if (rule.code in this._rules) { - throw new Error(`rule "${rule.code}" already exists`); - } - - this._rules[rule.code] = rule; - } - - /** - * Evaluate all rules against the context. - */ - public eval(assembly: reflect.Assembly, options: LinterOptions | undefined): Diagnostic[] { - options = options || { }; - - let ctxs = this.init(assembly); - if (!ctxs) { - return []; // skip - } - - if (!Array.isArray(ctxs)) { - ctxs = [ctxs] as readonly T[]; - } - - const diag = new Array(); - - for (const ctx of ctxs) { - for (const rule of Object.values(this._rules)) { - const evaluation = new Evaluation(ctx, rule, diag, options); - rule.eval(evaluation); - } - } - - return diag; - } -} - -/** - * Passed in to each rule during evaluation. - */ -export class Evaluation { - public readonly ctx: T; - public readonly options: LinterOptions; - - private readonly curr: ConcreteRule; - private readonly diagnostics: Diagnostic[]; - - constructor(ctx: T, rule: ConcreteRule, diagnostics: Diagnostic[], options: LinterOptions) { - this.ctx = ctx; - this.options = options; - this.curr = rule; - this.diagnostics = diagnostics; - } - - /** - * Record a failure if `condition` is not truthy. - * - * @param condition The condition to assert. - * @param scope Used to diagnose the location in the source, and is used in the - * ignore pattern. - * @param extra Used to replace %s in the default message format string. - */ - public assert(condition: any, scope: string, extra?: string): condition is true { - // deduplicate: skip if this specific assertion ("rule:scope") was already examined - if (this.diagnostics.find(d => d.rule.code === this.curr.code && d.scope === scope)) { - return condition; - } - - const include = this.shouldEvaluate(this.curr.code, scope); - const message = util.format(this.curr.message, extra || ''); - - // Don't add a "Success" diagnostic. It will break if we run a compound - // linter rule which consists of 3 checks with the same scope (such - // as for example `assertSignature()`). If the first check fails, we would - // add a "Success" diagnostic and all other diagnostics would be skipped because - // of the deduplication check above. Changing the scope makes it worse, since - // the scope is also the ignore pattern and they're all conceptually the same rule. - // - // Simplest solution is to not record successes -- why do we even need them? - if (include && condition) { return condition; } - - let level: DiagnosticLevel; - if (!include) { - level = DiagnosticLevel.Skipped; - } else if (this.curr.warning) { - level = DiagnosticLevel.Warning; - } else { - level = DiagnosticLevel.Error; - } - - const diag: Diagnostic = { - level, - rule: this.curr, - scope, - message, - }; - - this.diagnostics.push(diag); - - return condition; - } - - public assertEquals(actual: any, expected: any, scope: string) { - return this.assert(actual === expected, scope, ` (expected="${expected}",actual="${actual}")`); - } - - public assertTypesEqual(ts: reflect.TypeSystem, actual: TypeSpecifier, expected: TypeSpecifier, scope: string) { - const a = typeReferenceFrom(ts, actual); - const e = typeReferenceFrom(ts, expected); - return this.assert(a.toString() === e.toString(), scope, ` (expected="${e}",actual="${a}")`); - } - - public assertTypesAssignable(ts: reflect.TypeSystem, actual: TypeSpecifier, expected: TypeSpecifier, scope: string) { - const a = typeReferenceFrom(ts, actual); - const e = typeReferenceFrom(ts, expected); - return this.assert(a.toString() === e.toString() || (a.fqn && e.fqn && a.type!.extends(e.type!)), scope, ` ("${a}" not assignable to "${e}")`); - } - - public assertParameterOptional(actual: boolean, expected: boolean, scope: string) { - return this.assert(actual === expected, scope, ` (${scope} should be ${expected ? 'optional' : 'mandatory'})`); - } - - public assertSignature(method: reflect.Callable, expectations: MethodSignatureExpectations) { - const scope = method.parentType.fqn + '.' + method.name; - if (expectations.returns && reflect.Method.isMethod(method)) { - this.assertTypesEqual(method.system, method.returns.type, expectations.returns, scope); - } - - if (expectations.parameters) { - const expectedCount = expectations.parameters.length; - const actualCount = method.parameters.length; - if (this.assertEquals(actualCount, expectedCount, scope)) { - for (let i = 0; i < expectations.parameters.length; ++i) { - const expect = expectations.parameters[i]; - const actual = method.parameters[i]; - const pscope = scope + `.params[${i}]`; - if (expect.name) { - const expectedName = expect.name; - const actualName = actual.name; - this.assertEquals(actualName, expectedName, pscope); - } - if (expect.type) { - if (expect.subtypeAllowed) { - this.assertTypesAssignable(method.system, actual.type, expect.type, pscope); - } else { - this.assertTypesEqual(method.system, actual.type, expect.type, pscope); - } - } - if (expect.optional !== undefined) { - this.assertParameterOptional(actual.optional, expect.optional, pscope); - } - } - } - } - } - - /** - * Evaluates whether the rule should be evaluated based on the filters applied. - */ - private shouldEvaluate(code: string, scope: string) { - if (!this.options.include || this.options.include.length === 0) { - return true; - } - - for (const include of this.options.include) { - // match include - if (matchRule(include)) { - for (const exclude of this.options.exclude || []) { - // match exclude - if (matchRule(exclude)) { - return false; - } - } - return true; - } - } - - return false; - - function matchRule(filter: string) { - if (filter.indexOf(':') === -1) { - filter += ':*'; // add "*" scope filter if there isn't one - } - - // filter format is "code:scope" and both support "*" suffix to indicate startsWith - const [ codeFilter, scopeFilter ] = filter.split(':'); - return matchPattern(code, codeFilter) && matchPattern(scope, scopeFilter); - } - - function matchPattern(s: string, pattern: string) { - if (pattern.endsWith('*')) { - const prefix = pattern.substr(0, pattern.length - 1); - return s.startsWith(prefix); - } else { - return s === pattern; - } - } - } - -} - -export interface Rule { - code: string, - message: string; - warning?: boolean; -} - -export interface ConcreteRule extends Rule { - eval(linter: Evaluation): void; -} - -/** - * A type constraint - * - * Be super flexible about how types can be represented. Ultimately, we will - * compare what you give to a TypeReference, because that's what's in the JSII - * Reflect model. However, if you already have a real Type, or just a string to - * a user-defined type, that's fine too. We'll Do The Right Thing. - */ -export type TypeSpecifier = reflect.TypeReference | reflect.Type | string; - -export interface MethodSignatureParameterExpectation { - name?: string; - type?: TypeSpecifier; - subtypeAllowed?: boolean; - - /** should this param be optional? */ - optional?: boolean; -} - -export interface MethodSignatureExpectations { - parameters?: MethodSignatureParameterExpectation[]; - returns?: TypeSpecifier; -} - -export enum DiagnosticLevel { - Skipped, - Success, - Warning, - Error, -} - -export interface Diagnostic { - level: DiagnosticLevel; - rule: Rule; - scope: string; - message: string; -} - -/** - * Convert a type specifier to a TypeReference - */ -function typeReferenceFrom(ts: reflect.TypeSystem, x: TypeSpecifier): reflect.TypeReference { - if (isTypeReference(x)) { return x; } - - if (typeof x === 'string') { - if (x.indexOf('.') === -1) { - return new reflect.TypeReference(ts, { primitive: x as PrimitiveType }); - } else { - return new reflect.TypeReference(ts, { fqn: x }); - } - } - - return new reflect.TypeReference(ts, x); -} - -function isTypeReference(x: any): x is reflect.TypeReference { - return x instanceof reflect.TypeReference; -} diff --git a/tools/awslint/lib/rules/api.ts b/tools/awslint/lib/rules/api.ts deleted file mode 100644 index ea4c4818a..000000000 --- a/tools/awslint/lib/rules/api.ts +++ /dev/null @@ -1,145 +0,0 @@ -import reflect = require('jsii-reflect'); -import { Linter } from '../linter'; -import { ConstructReflection } from './construct'; -import { CoreTypes } from './core-types'; - -const EXCLUDE_ANNOTATION_REF_VIA_INTERFACE = '[disable-awslint:ref-via-interface]'; - -// lint all constructs that are not L1 resources -export const apiLinter = new Linter(a => ConstructReflection - .findAllConstructs(a) - .filter(c => !CoreTypes.isCfnResource(c.classType))); - -apiLinter.add({ - code: 'ref-via-interface', - message: 'API should use interface and not the concrete class (%s). ' + - `If this is intentional, add "${EXCLUDE_ANNOTATION_REF_VIA_INTERFACE}" to element's jsdoc`, - eval: e => { - const cls = e.ctx.classType; - const visited = new Set(); - - assertClass(cls); - - function assertClass(type: reflect.ClassType): void { - if (visited.has(type.fqn)) { return; } - visited.add(type.fqn); - - for (const method of type.allMethods) { - assertMethod(method); - } - - if (type.initializer) { - assertMethod(type.initializer); - } - } - - function assertDataType(type: reflect.InterfaceType): void { - for (const property of type.allProperties) { - assertProperty(property); - } - } - - function assertInterface(type: reflect.InterfaceType): void { - if (visited.has(type.fqn)) { return; } - visited.add(type.fqn); - - if (type.datatype) { - assertDataType(type); - } - - for (const method of type.allMethods) { - assertMethod(method); - } - } - - function assertProperty(property: reflect.Property) { - - if (property.protected) { - return; - } - - const site = property.overrides ? property.overrides : property.parentType; - assertType(property.type, property.docs, `${site.fqn}.${property.name}`); - } - - function assertMethod(method: reflect.Callable) { - - if (method.protected) { - return; - } - - const site = method.overrides ? method.overrides : method.parentType; - const scope = `${site.fqn}.${method.name}`; - - let firstMethod: reflect.Callable | undefined = site.isClassType() || site.isInterfaceType() - ? site.allMethods.find(m => m.name === method.name) - : undefined; - - if (!firstMethod) { - firstMethod = method; - } - - for (const param of firstMethod.parameters) { - assertType(param.type, param.docs, `${scope}.${param.name}`); - } - - // note that we do not require that return values will use an interface - } - - function assertType(type: reflect.TypeReference, docs: reflect.Docs, scope: string): void { - if (type.primitive) { - return; - } - - if (type.void) { - return; - } - - if (type.arrayOfType) { - return assertType(type.arrayOfType, docs, scope); - } - - if (type.mapOfType) { - return assertType(type.mapOfType, docs, scope); - } - - if (type.unionOfTypes) { - for (const t of type.unionOfTypes) { - assertType(t, docs, scope); - } - return; - } - - // interfaces are okay - if (type.type && type.type.isInterfaceType()) { - return assertInterface(type.type); - } - - // enums are okay - if (type.type && type.type.isEnumType()) { - return; - } - - // classes are okay as long as they are not resource constructs - if (type.type && type.type.isClassType()) { - if (!CoreTypes.isResourceClass(type.type)) { - return; - } - - if (type.type.fqn === e.ctx.core.constructClass.fqn) { - return; - } - - // allow exclusion of this rule - if (docs.summary.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE) || docs.remarks.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE)) { - return; - } - - e.assert(false, scope, type.type.fqn); - return; - } - - throw new Error(`invalid type reference: ${type.toString()}`); - } - } -}); diff --git a/tools/awslint/lib/rules/attributes.ts b/tools/awslint/lib/rules/attributes.ts deleted file mode 100644 index bd47ded6e..000000000 --- a/tools/awslint/lib/rules/attributes.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Linter } from '../linter'; -import { Attribute, ResourceReflection } from './resource'; - -export const attributesLinter = new Linter(a => { - const result = new Array(); - for (const resource of ResourceReflection.findAll(a)) { - for (const attr of resource.attributes) { - result.push(new AttributeReflection(resource, attr)); - } - } - return result; -}); - -class AttributeReflection { - public readonly fqn: string; - - constructor(public readonly resource: ResourceReflection, public readonly attr: Attribute) { - this.fqn = resource.fqn + '.' + attr.property.name; - } -} - -attributesLinter.add({ - code: 'attribute-readonly', - message: 'attribute property must be readonly', - eval: e => { - e.assert(e.ctx.attr.property.immutable, e.ctx.fqn); - } -}); - -attributesLinter.add({ - code: 'attribute-tag', - message: 'attribute properties must have an "@attribute" doctag on: ', - eval: e => { - const tag = e.ctx.attr.property.docs.customTag('attribute'); - e.assert(tag, e.ctx.fqn, `${e.ctx.attr.property.parentType.fqn}.${e.ctx.attr.property.name}`); - } -}); diff --git a/tools/awslint/lib/rules/cfn-resource.ts b/tools/awslint/lib/rules/cfn-resource.ts deleted file mode 100644 index 168cfbf95..000000000 --- a/tools/awslint/lib/rules/cfn-resource.ts +++ /dev/null @@ -1,86 +0,0 @@ -import * as camelcase from 'camelcase'; -import * as reflect from 'jsii-reflect'; -import { Linter } from '../linter'; -import { CoreTypes } from './core-types'; -import { ResourceReflection } from './resource'; - -// this linter verifies that we have L2 coverage. it finds all "Cfn" classes and verifies -// that we have a corresponding L1 class for it that's identified as a resource. -export const cfnResourceLinter = new Linter(a => CfnResourceReflection.findAll(a)); - -cfnResourceLinter.add({ - code: 'resource-class', - message: `every resource must have a resource class (L2), add '@resource %s' to its docstring`, - warning: true, - eval: e => { - const l2 = ResourceReflection.findAll(e.ctx.classType.assembly).find(r => r.cfn.fullname === e.ctx.fullname); - e.assert(l2, e.ctx.fullname); - } -}); - -export class CfnResourceReflection { - /** - * Finds a Cfn resource class by full CloudFormation resource name (e.g. `AWS::S3::Bucket`) - * @param fullName first two components are case-insensitive (e.g. `aws::s3::Bucket` is equivalent to `Aws::S3::Bucket`) - */ - public static findByName(sys: reflect.TypeSystem, fullName: string) { - for (const cls of sys.classes) { - if (cls.docs.customTag('cloudformationResource')?.toLocaleLowerCase() === fullName.toLocaleLowerCase()) { - return new CfnResourceReflection(cls); - } - } - - return undefined; - } - - /** - * Returns all CFN resource classes within an assembly. - */ - public static findAll(assembly: reflect.Assembly) { - return assembly.classes - .filter(c => CoreTypes.isCfnResource(c)) - .map(c => new CfnResourceReflection(c)); - } - - public readonly classType: reflect.ClassType; - public readonly fullname: string; // AWS::S3::Bucket - public readonly namespace: string; // AWS::S3 - public readonly basename: string; // Bucket - public readonly attributeNames: string[]; // (normalized) bucketArn, bucketName, queueUrl - public readonly doc: string; // link to CloudFormation docs - - constructor(cls: reflect.ClassType) { - this.classType = cls; - - this.basename = cls.name.substr('Cfn'.length); - - // HACK: extract full CFN name from initializer docs - const initializerDoc = (cls.initializer && cls.initializer.docs.docs.summary) || ''; - const out = /a new `([^`]+)`/.exec(initializerDoc); - const fullname = out && out[1]; - if (!fullname) { - throw new Error(`Unable to extract CloudFormation resource name from initializer documentation of ${cls}`); - } - - this.fullname = fullname; - - this.namespace = fullname.split('::').slice(0, 2).join('::'); - - this.attributeNames = cls.ownProperties - .filter(p => (p.docs.docs.custom || {}).cloudformationAttribute) - .map(p => p.docs.customTag('cloudformationAttribute') || '') - .map(p => this.attributePropertyNameFromCfnName(p)); - - this.doc = cls.docs.docs.see || ''; - } - - private attributePropertyNameFromCfnName(name: string): string { - - // special case (someone was smart), special case copied from cfn2ts - if (this.basename === 'SecurityGroup' && name === 'GroupId') { - return 'Id'; - } - - return camelcase(name, { pascalCase: true }); - } -} diff --git a/tools/awslint/lib/rules/cloudwatch-events.ts b/tools/awslint/lib/rules/cloudwatch-events.ts deleted file mode 100644 index 5557d4851..000000000 --- a/tools/awslint/lib/rules/cloudwatch-events.ts +++ /dev/null @@ -1,75 +0,0 @@ -import * as reflect from 'jsii-reflect'; -import { Linter } from '../linter'; -import { ConstructReflection } from './construct'; -import { CoreTypes } from './core-types'; - -export const eventsLinter = new Linter(assembly => assembly.classes - .filter(t => CoreTypes.isConstructClass(t)) - .map(construct => new EventsReflection(construct))); - -export class EventsReflection extends ConstructReflection { - public get directEventMethods() { - return this.classType.allMethods.filter(isDirectEventMethod); - } - - public get cloudTrailEventMethods() { - return this.classType.allMethods.filter(isCloudTrailEventMethod); - } -} - -const ON_EVENT_OPTIONS_FQN = '@aws-cdk/aws-events.OnEventOptions'; -const EVENT_RULE_FQN = '@aws-cdk/aws-events.Rule'; - -eventsLinter.add({ - code: 'events-in-interface', - message: `'onXxx()' methods should also be defined on construct interface`, - eval: e => { - for (const method of e.ctx.directEventMethods.concat(e.ctx.cloudTrailEventMethods)) { - e.assert(!e.ctx.interfaceType || e.ctx.interfaceType.allMethods.filter(m => !m.protected).some(m => m.name === method.name), `${e.ctx.fqn}.${method.name}`); - } - } -}); - -eventsLinter.add({ - code: 'events-generic', - message: `if there are specific 'onXxx()' methods, there should also be a generic 'onEvent()' method`, - eval: e => { - e.assert(e.ctx.directEventMethods.length === 0 || e.ctx.classType.allMethods.some(m => m.name === 'onEvent'), e.ctx.fqn); - } -}); - -eventsLinter.add({ - code: 'events-generic-cloudtrail', - message: `if there are specific 'onCloudTrailXxx()' methods, there should also be a generic 'onCloudTrailEvent()' method`, - eval: e => { - e.assert(e.ctx.cloudTrailEventMethods.length === 0 || e.ctx.classType.allMethods.some(m => m.name === 'onCloudTrailEvent'), e.ctx.fqn); - } -}); - -eventsLinter.add({ - code: 'events-method-signature', - message: `all 'onXxx()' methods should have the CloudWatch Events signature (id: string, options: events.OnEventOptions = {}) => events.Rule`, - eval: e => { - for (const method of e.ctx.directEventMethods) { - // give slack to protected methods like "onSynthesize", "onPrepare", ... - if (method.protected) { - continue; - } - e.assertSignature(method, { - parameters: [ - { type: 'string' }, - { type: ON_EVENT_OPTIONS_FQN, subtypeAllowed: true, optional: true }, - ], - returns: EVENT_RULE_FQN - }); - } - } -}); - -function isDirectEventMethod(m: reflect.Method) { - return !m.protected && m.name.startsWith('on') && ! m.name.startsWith('onCloudTrail'); -} - -function isCloudTrailEventMethod(m: reflect.Method) { - return m.name.startsWith('onCloudTrail'); -} diff --git a/tools/awslint/lib/rules/construct.ts b/tools/awslint/lib/rules/construct.ts deleted file mode 100644 index 6d91a6622..000000000 --- a/tools/awslint/lib/rules/construct.ts +++ /dev/null @@ -1,278 +0,0 @@ -import reflect = require('jsii-reflect'); -import { Linter, MethodSignatureParameterExpectation } from '../linter'; -import { CoreTypes } from './core-types'; - -export const constructLinter = new Linter(assembly => assembly.classes - .filter(t => CoreTypes.isConstructClass(t)) - .map(construct => new ConstructReflection(construct))); - -export class ConstructReflection { - - public static findAllConstructs(assembly: reflect.Assembly) { - return assembly.classes - .filter(c => CoreTypes.isConstructClass(c)) - .map(c => new ConstructReflection(c)); - } - - public static getFqnFromTypeRef(typeRef: reflect.TypeReference) { - if (typeRef.arrayOfType) { - return typeRef.arrayOfType.fqn; - } else if (typeRef.mapOfType) { - return typeRef.mapOfType.fqn; - } - - return typeRef.fqn; - } - - public readonly ROOT_CLASS: reflect.ClassType; // cdk.Construct - - public readonly fqn: string; - public readonly interfaceFqn: string; - public readonly propsFqn: string; - public readonly interfaceType?: reflect.InterfaceType; - public readonly propsType?: reflect.InterfaceType; - public readonly initializer?: reflect.Initializer; - public readonly hasPropsArgument: boolean; - public readonly sys: reflect.TypeSystem; - public readonly core: CoreTypes; - - constructor(public readonly classType: reflect.ClassType) { - this.fqn = classType.fqn; - this.sys = classType.system; - this.core = new CoreTypes(this.sys); - this.ROOT_CLASS = this.sys.findClass(this.core.constructClass.fqn); - this.interfaceFqn = `${classType.assembly.name}.I${classType.name}`; - this.propsFqn = `${classType.assembly.name}.${classType.name}Props`; - this.interfaceType = this.tryFindInterface(); - this.propsType = this.tryFindProps(); - this.initializer = classType.initializer; - this.hasPropsArgument = this.initializer != null && this.initializer.parameters.length >= 3; - } - - private tryFindInterface() { - const sys = this.classType.system; - const found = sys.tryFindFqn(this.interfaceFqn); - if (!found) { - return undefined; - } - - if (!found.isInterfaceType()) { - throw new Error(`Expecting type ${this.interfaceFqn} to be an interface`); - } - - return found; - } - - private tryFindProps() { - const found = this.sys.tryFindFqn(this.propsFqn); - if (!found) { - return undefined; - } - - if (!found.isInterfaceType()) { - throw new Error(`Expecting props struct ${this.propsFqn} to be an interface`); - } - - return found; - } -} - -constructLinter.add({ - code: 'construct-ctor', - message: 'signature of all construct constructors should be "scope, id, props"', - eval: e => { - // only applies to non abstract classes - if (e.ctx.classType.abstract) { - return; - } - - const initializer = e.ctx.initializer; - if (!e.assert(initializer, e.ctx.fqn)) { - return; - } - - const expectedParams = new Array(); - - expectedParams.push({ - name: 'scope', - type: e.ctx.core.constructClass.fqn - }); - - expectedParams.push({ - name: 'id', - type: 'string' - }); - - // it's okay for a construct not to have a "props" argument so we only - // assert the "props" argument if there are more than two parameters - if (initializer.parameters.length > 2) { - expectedParams.push({ - name: 'props', - }); - } - - e.assertSignature(initializer, { - parameters: expectedParams - }); - } -}); - -constructLinter.add({ - code: 'props-struct-name', - message: 'all constructs must have a props struct', - eval: e => { - if (!e.ctx.hasPropsArgument) { - return; - } - - // abstract classes are exempt - if (e.ctx.classType.abstract) { - return; - } - - e.assert(e.ctx.propsType, e.ctx.interfaceFqn); - } -}); - -constructLinter.add({ - code: 'construct-ctor-props-type', - message: 'construct "props" type should use the props struct %s', - eval: e => { - if (!e.ctx.initializer) { return; } - if (e.ctx.initializer.parameters.length < 3) { return; } - - e.assert( - e.ctx.initializer.parameters[2].type.type === e.ctx.propsType, - e.ctx.fqn, - e.ctx.propsFqn); - } -}); - -constructLinter.add({ - code: 'construct-ctor-props-optional', - message: 'construct "props" must be optional since all props are optional', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.initializer) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule applies only if all properties are optional - const allOptional = e.ctx.propsType.allProperties.every(p => p.optional); - if (!allOptional) { - return; - } - - e.assert(e.ctx.initializer.parameters[2].optional, e.ctx.fqn); - } -}); - -constructLinter.add({ - code: 'construct-interface-extends-iconstruct', - message: 'construct interface must extend core.IConstruct', - eval: e => { - if (!e.ctx.interfaceType) { return; } - const interfaceBase = e.ctx.sys.findInterface(e.ctx.core.constructInterface.fqn); - e.assert(e.ctx.interfaceType.extends(interfaceBase), e.ctx.interfaceType.fqn); - } -}); - -constructLinter.add({ - code: 'construct-base-is-private', - message: 'prefer that the construct base class is private', - warning: true, - eval: e => { - if (!e.ctx.interfaceType) { return; } - const baseFqn = `${e.ctx.classType.fqn}Base`; - e.assert(!e.ctx.sys.tryFindFqn(baseFqn), baseFqn); - } -}); - -constructLinter.add({ - code: 'props-no-unions', - message: 'props must not use TypeScript unions', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnResource(e.ctx.classType)) { return; } - - for (const property of e.ctx.propsType.ownProperties) { - e.assert(!property.type.unionOfTypes, `${e.ctx.propsFqn}.${property.name}`); - } - } -}); - -constructLinter.add({ - code: 'props-no-arn-refs', - message: 'props must use strong types instead of attributes. props should not have "arn" suffix', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnResource(e.ctx.classType)) { return; } - - for (const property of e.ctx.propsType.ownProperties) { - e.assert(!property.name.toLowerCase().endsWith('arn'), `${e.ctx.propsFqn}.${property.name}`); - } - } -}); - -constructLinter.add({ - code: 'props-no-tokens', - message: 'props must not use the "Token" type', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnResource(e.ctx.classType)) { return; } - - for (const property of e.ctx.propsType.allProperties) { - const fqn = ConstructReflection.getFqnFromTypeRef(property.type); - - const found = (fqn && e.ctx.sys.tryFindFqn(fqn)); - if (found) { - e.assert(!(fqn === e.ctx.core.tokenInterface.fqn), `${e.ctx.propsFqn}.${property.name}`); - } - } - } -}); - -constructLinter.add({ - code: 'props-no-cfn-types', - message: 'props must not expose L1 types (types which start with "Cfn")', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnResource(e.ctx.classType)) { return; } - - for (const property of e.ctx.propsType.ownProperties) { - const fqn = ConstructReflection.getFqnFromTypeRef(property.type); - - const found = (fqn && e.ctx.sys.tryFindFqn(fqn)); - if (found) { - e.assert(!found.name.toLowerCase().startsWith('cfn'), `${e.ctx.propsFqn}.${property.name}`); - } - } - } -}); - -constructLinter.add({ - code: 'props-no-any', - message: 'props must not use Typescript "any" type', - eval: e => { - if (!e.ctx.propsType) { return; } - if (!e.ctx.hasPropsArgument) { return; } - - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnResource(e.ctx.classType)) { return; } - - for (const property of e.ctx.propsType.ownProperties) { - e.assert(!property.type.isAny, `${e.ctx.propsFqn}.${property.name}`); - } - } -}); diff --git a/tools/awslint/lib/rules/core-types.ts b/tools/awslint/lib/rules/core-types.ts deleted file mode 100644 index 7902efee4..000000000 --- a/tools/awslint/lib/rules/core-types.ts +++ /dev/null @@ -1,142 +0,0 @@ -import reflect = require("jsii-reflect"); -import { TypeSystem } from "jsii-reflect"; -import { getDocTag } from "./util"; - -const CORE_MODULE = "@aws-cdk/core"; -enum CoreTypesFqn { - CfnResource = "@aws-cdk/core.CfnResource", - Construct = "@aws-cdk/core.Construct", - ConstructInterface = "@aws-cdk/core.IConstruct", - Resource = "@aws-cdk/core.Resource", - ResourceInterface = "@aws-cdk/core.IResource", - ResolvableInterface = "@aws-cdk/core.IResolvable", - PhysicalName = "@aws-cdk/core.PhysicalName" -} - -export class CoreTypes { - - /** - * @returns true if assembly has the Core module - */ - public static hasCoreModule(assembly: reflect.Assembly) { - return (!assembly.system.assemblies.find(a => a.name === CORE_MODULE)); - } - - /** - * @returns true if `classType` represents an L1 Cfn Resource - */ - public static isCfnResource(c: reflect.ClassType) { - if (!c.system.includesAssembly(CORE_MODULE)) { - return false; - } - - // skip CfnResource itself - if (c.fqn === CoreTypesFqn.CfnResource) { - return false; - } - - if (!this.isConstructClass(c)) { - return false; - } - - const cfnResourceClass = c.system.findFqn(CoreTypesFqn.CfnResource); - if (!c.extends(cfnResourceClass)) { - return false; - } - - if (!c.name.startsWith("Cfn")) { - return false; - } - - return true; - } - - /** - * @returns true if `classType` represents a Construct - */ - public static isConstructClass(c: reflect.ClassType) { - if (!c.system.includesAssembly(CORE_MODULE)) { - return false; - } - - if (!c.isClassType()) { - return false; - } - - if (c.abstract) { - return false; - } - - return c.extends(c.system.findFqn(CoreTypesFqn.Construct)); - } - - /** - * @returns true if `classType` represents an AWS resource (i.e. extends `cdk.Resource`). - */ - public static isResourceClass(classType: reflect.ClassType) { - const baseResource = classType.system.findClass(CoreTypesFqn.Resource); - return classType.extends(baseResource) || getDocTag(classType, "resource"); - } - - /** - * Return true if the given interface type is a CFN class or prop type - */ - public static isCfnType(interfaceType: reflect.Type) { - return interfaceType.name.startsWith('Cfn') || (interfaceType.namespace && interfaceType.namespace.startsWith('Cfn')); - } - - /** - * @returns `classType` for the core type Construct - */ - public get constructClass() { - return this.sys.findClass(CoreTypesFqn.Construct); - } - - /** - * @returns `interfacetype` for the core type Construct - */ - public get constructInterface() { - return this.sys.findInterface(CoreTypesFqn.ConstructInterface); - } - - /** - * @returns `classType` for the core type Construct - */ - public get resourceClass() { - return this.sys.findClass(CoreTypesFqn.Resource); - } - - /** - * @returns `interfaceType` for the core type Resource - */ - public get resourceInterface() { - return this.sys.findInterface(CoreTypesFqn.ResourceInterface); - } - - /** - * @returns `classType` for the core type Token - */ - public get tokenInterface() { - return this.sys.findInterface(CoreTypesFqn.ResolvableInterface); - } - - public get physicalNameClass() { - return this.sys.findClass(CoreTypesFqn.PhysicalName) - } - - private readonly sys: TypeSystem; - - constructor(sys: reflect.TypeSystem) { - this.sys = sys; - if (!sys.includesAssembly(CORE_MODULE)) { - // disable-all-checks - return; - } - - for (const fqn of Object.values(CoreTypesFqn)) { - if (!this.sys.tryFindFqn(fqn)) { - throw new Error(`core FQN type not found: ${fqn}`); - } - } - } -} diff --git a/tools/awslint/lib/rules/docs.ts b/tools/awslint/lib/rules/docs.ts deleted file mode 100644 index 17d51359f..000000000 --- a/tools/awslint/lib/rules/docs.ts +++ /dev/null @@ -1,117 +0,0 @@ -import reflect = require('jsii-reflect'); -import { Linter } from '../linter'; -import { CoreTypes } from './core-types'; - -type DocsLinterContext = { - readonly assembly: reflect.Assembly; - readonly errorKey: string; -} & ({ readonly kind: 'type'; documentable: reflect.Type } - | { readonly kind: 'interface-property'; containingType: reflect.InterfaceType; documentable: reflect.Property } - | { readonly kind: 'class-property'; containingType: reflect.ClassType; documentable: reflect.Property } - | { readonly kind: 'method'; containingType: reflect.ReferenceType; documentable: reflect.Method } - | { readonly kind: 'enum-member'; containingType: reflect.EnumType; documentable: reflect.EnumMember } -); - -export const docsLinter = new Linter(assembly => { - return [ - ...flatMap(assembly.classes, classType => [ - { assembly, kind: 'type', documentable: classType, errorKey: classType.fqn }, - ...classType.ownProperties.map(property => ({ assembly, kind: 'class-property', containingType: classType, documentable: property, errorKey: `${classType.fqn}.${property.name}` })), - ...classType.ownMethods.map(method => ({ assembly, kind: 'method', containingType: classType, documentable: method, errorKey: `${classType.fqn}.${method.name}` })), - ]), - ...flatMap(assembly.interfaces, interfaceType => [ - { assembly, kind: 'type', documentable: interfaceType, errorKey: interfaceType.fqn }, - // tslint:disable-next-line:max-line-length - ...interfaceType.ownProperties.map(property => ({ assembly, kind: 'interface-property', containingType: interfaceType, documentable: property, errorKey: `${interfaceType.fqn}.${property.name}` })), - ...interfaceType.ownMethods.map(method => ({ assembly, kind: 'method', containingType: interfaceType, documentable: method, errorKey: `${interfaceType.fqn}.${method.name}` })), - ]), - ...flatMap(assembly.enums, enumType => [ - { assembly, kind: 'type', documentable: enumType, errorKey: enumType.fqn }, - ...enumType.members.map(member => ({ assembly, kind: 'enum-member', containingType: enumType, documentable: member, errorKey: `${enumType.fqn}.${member.name}` })) - ]), - ] as DocsLinterContext[]; -}); - -docsLinter.add({ - code: 'docs-public-apis', - message: 'Public API element must have a docstring', - eval: e => { - if (!isPublic(e.ctx)) { return; } - // this rule does not apply to L1 constructs - if (isCfnType(e.ctx)) { return; } - - if (!e.ctx.documentable.docs.summary) { - e.assert(e.ctx.documentable.docs.summary, e.ctx.errorKey); - } - } -}); - -docsLinter.add({ - code:'docs-constructs-resourcesDeployed', - message: 'Constructs must contain an @ResourcesDeployed tag', - eval: e => { - if (e.ctx.kind !== 'type') { return; } - if (isCfnType(e.ctx)) { return; } - const ConstructClass = e.ctx.assembly.system.findFqn("@aws-cdk/core.Construct"); - const property = e.ctx.documentable; - if (!property.extends(ConstructClass)) { return; } - - e.assert(property.docs.docs.custom?.['ResourcesDeployed'], e.ctx.errorKey) - } -}); - -docsLinter.add({ - code: 'props-default-doc', - message: 'Optional property must have @default documentation', - eval: e => { - if (e.ctx.kind !== 'interface-property') { return; } - if (!e.ctx.containingType.isDataType()) { return; } - // this rule does not apply to L1 constructs - if (CoreTypes.isCfnType(e.ctx.containingType)) { return; } - - const property = e.ctx.documentable; - e.assert(!property.optional || property.docs.docs.default !== undefined, e.ctx.errorKey); - } -}); - -docsLinter.add({ - code: 'props-no-undefined-default', - message: `'@default undefined' is not helpful. Users will know the VALUE is literally 'undefined' if they don't specify it, but what is the BEHAVIOR if they do so?`, - eval: e => { - if (e.ctx.kind !== 'interface-property') { return; } - if (!e.ctx.containingType.isDataType()) { return; } - - const property = e.ctx.documentable; - e.assert(property.docs.docs.default !== 'undefined', e.ctx.errorKey); - } -}); - -function isPublic(ctx: DocsLinterContext) { - switch (ctx.kind) { - case "class-property": - case "interface-property": - case "method": - return !ctx.documentable.protected; - - case "enum-member": - case "type": - return true; - } -} - -function isCfnType(ctx: DocsLinterContext) { - switch (ctx.kind) { - case "class-property": - case "interface-property": - case "method": - case "enum-member": - return CoreTypes.isCfnType(ctx.containingType); - - case "type": - return CoreTypes.isCfnType(ctx.documentable); - } -} - -function flatMap(array: readonly T[], callbackfn: (value: T, index: number, array: readonly T[]) => U[]): U[] { - return Array.prototype.concat(...array.map(callbackfn)); -} diff --git a/tools/awslint/lib/rules/durations.ts b/tools/awslint/lib/rules/durations.ts deleted file mode 100644 index 111f3d864..000000000 --- a/tools/awslint/lib/rules/durations.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Property } from 'jsii-reflect'; -import { Linter } from '../linter'; - -const DURATION_FQN = '@aws-cdk/core.Duration'; -const DURATION_SUFFIX = /(Days|Milli(?:(?:S|s)econd)?s?|Sec(?:ond)?s?)$/; - -export const durationsLinter = new Linter(assm => { - const result = new Array(); - const generatedClassesPrefix = `${assm.name}.Cfn`; - for (const type of assm.types) { - // L1 classes are exempted from this rule, doing basic name matching here... - if (type.fqn.startsWith(generatedClassesPrefix)) { continue; } - if (!type.isClassType() && !type.isDataType() && !type.isInterfaceType()) { continue; } - for (const property of type.allProperties) { - if (isDurationProperty(property)) { - result.push(property); - } - } - } - return result; - - function isDurationProperty(prop: Property): boolean { - const lowerCaseName = prop.name.toLowerCase(); - // No lookbehind in JS regexes, so excluding "*PerSecond" by hand here... - return (DURATION_SUFFIX.test(prop.name) && !/PerSecond$/.test(prop.name)) - || lowerCaseName.endsWith('duration') - || lowerCaseName.endsWith('period') - || lowerCaseName.endsWith('timeout') - || lowerCaseName.endsWith('ttl') - || prop.type.fqn === DURATION_FQN; - } -}); - -durationsLinter.add({ - code: 'duration-prop-type', - message: `property must be typed ${DURATION_FQN}`, - eval: evaluation => { - evaluation.assert(evaluation.ctx.type.fqn === DURATION_FQN, - `${evaluation.ctx.parentType.fqn}.${evaluation.ctx.name}`); - }, -}); - -durationsLinter.add({ - code: 'duration-prop-name', - message: 'property must not use time-unit suffix', - eval: evaluation => { - evaluation.assert(!DURATION_SUFFIX.test(evaluation.ctx.name), - `${evaluation.ctx.parentType.fqn}.${evaluation.ctx.name}`, - `(suggested name: "${evaluation.ctx.name.replace(DURATION_SUFFIX, '')}")`); - }, -}); diff --git a/tools/awslint/lib/rules/exports.ts b/tools/awslint/lib/rules/exports.ts deleted file mode 100644 index 1f2ef01d3..000000000 --- a/tools/awslint/lib/rules/exports.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Linter } from '../linter'; - -export const exportsLinter = new Linter(assembly => assembly.types); - -exportsLinter.add({ - code: 'no-export', - message: 'the "export" methods are deprecated', - eval: e => { - if (e.ctx.isClassType() || e.ctx.isInterfaceType()) { - e.assert(!e.ctx.allMethods.some(m => m.name === 'export'), e.ctx.fqn); - } - } -}); diff --git a/tools/awslint/lib/rules/imports.ts b/tools/awslint/lib/rules/imports.ts deleted file mode 100644 index 1c60d2cc0..000000000 --- a/tools/awslint/lib/rules/imports.ts +++ /dev/null @@ -1,113 +0,0 @@ -import * as reflect from 'jsii-reflect'; -import { Linter } from '../linter'; -import { AttributeSite, ResourceReflection } from './resource'; - -export const importsLinter = new Linter(assembly => ResourceReflection - .findAll(assembly) - .filter(r => r.construct && r.construct.interfaceType) // only resources that have an interface can have "fromXxx" methods - .map(construct => new ImportsReflection(construct))); - -class ImportsReflection { - public readonly fromMethods: reflect.Method[]; - public readonly prefix: string; - public readonly fromAttributesMethodName: string; - public readonly fromAttributesMethod?: reflect.Method; - public readonly attributesStructName: string; - public readonly attributesStruct?: reflect.InterfaceType; - - constructor(public readonly resource: ResourceReflection) { - const sys = resource.sys; - this.prefix = `from${resource.basename}`; - const classType = resource.construct.classType; - this.fromAttributesMethodName = `${this.prefix}Attributes`; - this.fromAttributesMethod = classType.allMethods.find(x => x.name === this.fromAttributesMethodName); - - this.fromMethods = classType.allMethods.filter(x => - x.static - && x.name.match(`^${this.prefix}[A-Z]`) - && x.name !== this.fromAttributesMethodName); - - const attributesStructFqn = `${classType.fqn}Attributes`; - const attributesStruct = sys.tryFindFqn(attributesStructFqn); - if (attributesStruct) { - if (!attributesStruct.isInterfaceType() || !attributesStruct.isDataType()) { - throw new Error(`Attributes type ${attributesStructFqn} must be an interface struct`); - } - } - this.attributesStructName = attributesStructFqn; - this.attributesStruct = attributesStruct; - } -} - -importsLinter.add({ - code: 'no-static-import', - message: 'static "import" methods are deprecated in favor of "fromAttributes" (see guidelines)', - eval: e => { - const hasImport = e.ctx.resource.construct.classType.allMethods.find(x => x.static && x.name === 'import'); - e.assert(!hasImport, e.ctx.resource.fqn + '.import'); - } -}); - -importsLinter.add({ - code: 'from-method', - message: 'resource should have at least one "fromXxx" static method or "fromXxxAttributes"', - eval: e => { - // no attributes are defined on the interface, so we don't expect any "from" methods. - if (!e.ctx.resource.attributes.some(a => a.site === AttributeSite.Interface)) { - return; - } - - e.assert(e.ctx.fromMethods.length > 0 || e.ctx.fromAttributesMethod, e.ctx.resource.fqn); - } -}); - -importsLinter.add({ - code: 'from-signature', - message: 'invalid method signature for fromXxx method', - eval: e => { - for (const method of e.ctx.fromMethods) { - - // "fromRoleArn" => "roleArn" - const argName = e.ctx.resource.basename[0].toLocaleLowerCase() + method.name.slice('from'.length + 1); - - e.assertSignature(method, { - parameters: [ - { name: 'scope', type: e.ctx.resource.construct.ROOT_CLASS }, - { name: 'id', type: 'string' }, - { name: argName, type: 'string' } - ], - returns: e.ctx.resource.construct.interfaceType - }); - } - } -}); - -importsLinter.add({ - code: 'from-attributes', - message: 'static fromXxxAttributes is a factory of IXxx from its primitive attributes', - eval: e => { - if (!e.ctx.fromAttributesMethod) { - return; - } - - e.assertSignature(e.ctx.fromAttributesMethod, { - parameters: [ - { name: 'scope', type: e.ctx.resource.construct.ROOT_CLASS }, - { name: 'id', type: 'string' }, - { name: 'attrs', type: e.ctx.attributesStruct } - ] - }); - } -}); - -importsLinter.add({ - code: 'from-attributes-struct', - message: 'resource should have an XxxAttributes struct', - eval: e => { - if (!e.ctx.fromAttributesMethod) { - return; // no "fromAttributes" method - } - - e.assert(e.ctx.attributesStruct, e.ctx.attributesStructName); - } -}); diff --git a/tools/awslint/lib/rules/index.ts b/tools/awslint/lib/rules/index.ts deleted file mode 100644 index c1ca11250..000000000 --- a/tools/awslint/lib/rules/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AggregateLinter } from '../linter'; -import { apiLinter } from './api'; -import { attributesLinter } from './attributes'; -import { cfnResourceLinter } from './cfn-resource'; -import { eventsLinter } from './cloudwatch-events'; -import { constructLinter } from './construct'; -import { docsLinter } from './docs'; -import { durationsLinter } from './durations'; -import { exportsLinter } from './exports'; -import { importsLinter } from './imports'; -import { integrationLinter } from './integrations'; -import { moduleLinter } from './module'; -import { noUnusedTypeLinter } from './no-unused-type'; -import { publicStaticPropertiesLinter } from './public-static-properties'; -import { resourceLinter } from './resource'; - -export const ALL_RULES_LINTER = new AggregateLinter( - moduleLinter, - constructLinter, - cfnResourceLinter, - resourceLinter, - apiLinter, - importsLinter, - attributesLinter, - exportsLinter, - eventsLinter, - integrationLinter, - noUnusedTypeLinter, - durationsLinter, - publicStaticPropertiesLinter, - docsLinter -); diff --git a/tools/awslint/lib/rules/integrations.ts b/tools/awslint/lib/rules/integrations.ts deleted file mode 100644 index 8f1978cc7..000000000 --- a/tools/awslint/lib/rules/integrations.ts +++ /dev/null @@ -1,32 +0,0 @@ -import reflect = require('jsii-reflect'); -import { Linter } from '../linter'; -import { memberFqn } from './util'; - -export const integrationLinter = new Linter(assembly => assembly.interfaces - .filter(IntegrationReflection.isIntegrationInterface) - .map(construct => new IntegrationReflection(construct))); - -const BIND_METHOD_NAME = 'bind'; - -class IntegrationReflection { - public static isIntegrationInterface(x: reflect.InterfaceType): boolean { - return x.allMethods.some(m => m.name === BIND_METHOD_NAME); - } - - constructor(public readonly integrationInterface: reflect.InterfaceType) { - } - - public get bindMethod(): reflect.Method { - return this.integrationInterface.allMethods.find(m => m.name === BIND_METHOD_NAME)!; - } -} - -integrationLinter.add({ - code: 'integ-return-type', - message: `'bind(...)' should return a type named 'XxxConfig'`, - eval: e => { - const returnsFqn = e.ctx.bindMethod.returns.type.fqn; - - e.assert(returnsFqn && returnsFqn.endsWith('Config'), memberFqn(e.ctx.bindMethod)); - } -}); diff --git a/tools/awslint/lib/rules/module.ts b/tools/awslint/lib/rules/module.ts deleted file mode 100644 index 1b631015d..000000000 --- a/tools/awslint/lib/rules/module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import reflect = require('jsii-reflect'); -import { Linter } from '../linter'; -import { CfnResourceReflection } from './cfn-resource'; - -interface ModuleLinterContext { - readonly assembly: reflect.Assembly; - readonly namespace: string; -} - -export const moduleLinter = new Linter(assembly => { - const cfnResources = CfnResourceReflection.findAll(assembly); - if (cfnResources.length === 0) { - return undefined; // no resources - } - - return [ { - assembly, - namespace: cfnResources[0].namespace - } ]; -}); - -moduleLinter.add( { - code: 'module-name', - message: 'module name must be @aws-cdk/aws-', - eval: e => { - if (!e.ctx.namespace) { return; } - if (!e.ctx.assembly) { return; } - const namespace = overrideNamespace(e.ctx.namespace.toLocaleLowerCase().replace('::', '-')); - e.assertEquals(e.ctx.assembly.name, `@aws-cdk/${namespace}`, e.ctx.assembly.name); - } -}); - -/** - * Overrides special-case namespaces like aws-serverless=>aws-sam - */ -function overrideNamespace(namespace: string) { - if (namespace === 'aws-serverless') { - return 'aws-sam'; - } - return namespace; -} diff --git a/tools/awslint/lib/rules/no-unused-type.ts b/tools/awslint/lib/rules/no-unused-type.ts deleted file mode 100644 index 7cf59b8b0..000000000 --- a/tools/awslint/lib/rules/no-unused-type.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Assembly, SourceLocation, Type, TypeReference } from 'jsii-reflect'; -import { Linter } from '../linter'; - -export const noUnusedTypeLinter = new Linter(assm => { - // Only care about AWS Construct Library here... - if (!assm.name.startsWith('@aws-cdk/aws-')) { - return []; - } - const usedTypes = _collectUsedTypes(assm); - const generatedFqnPrefix = `${assm.name}.Cfn`; - return assm.types.filter(type => !type.isClassType()) - .filter(type => !type.fqn.startsWith(generatedFqnPrefix)) - .map(inspectedType => ({ inspectedType, usedTypes })); -}); - -noUnusedTypeLinter.add({ - code: 'no-unused-type', - message: 'type or enum is not used by exported classes', - eval: evaluation => { - evaluation.assert(evaluation.ctx.usedTypes.has(evaluation.ctx.inspectedType.fqn), - evaluation.ctx.inspectedType.fqn, - _formatLocation(evaluation.ctx.inspectedType.locationInModule)); - } -}); - -function _collectUsedTypes(assm: Assembly): Set { - const result = new Set(); - assm.types.filter(type => type.isClassType()) - .forEach(_visitType); - return result; - - function _visitType(type: Type) { - if (typeof type === 'string') { - const resolvedType = assm.tryFindType(type); - if (!resolvedType) { - return; - } - type = resolvedType; - } - if (result.has(type.fqn)) { return; } - result.add(type.fqn); - - // Nothing else to do for enums - if (type.isEnumType()) { return; } - - if (type.isClassType()) { - if (type.base) { _visitType(type.base); } - if (type.initializer) { - for (const param of type.initializer.parameters) { - _visitTypeRef(param.type); - } - } - } - if (type.isClassType() || type.isInterfaceType()) { - type.interfaces.forEach(_visitType); - for (const prop of type.ownProperties) { - _visitTypeRef(prop.type); - } - for (const meth of type.ownMethods) { - _visitTypeRef(meth.returns.type); - for (const param of meth.parameters) { - _visitTypeRef(param.type); - } - } - } - } - - function _visitTypeRef(typeRef: TypeReference) { - if (typeRef.fqn) { - const type = assm.tryFindType(typeRef.fqn); - if (type) { _visitType(type); } - } else if (typeRef.arrayOfType) { - _visitTypeRef(typeRef.arrayOfType); - } else if (typeRef.mapOfType) { - _visitTypeRef(typeRef.mapOfType); - } else if (typeRef.unionOfTypes) { - typeRef.unionOfTypes.forEach(_visitTypeRef); - } - } -} - -function _formatLocation(location: SourceLocation | undefined): string | undefined { - if (!location) { return undefined; } - return `(declared at ${location.filename}:${location.line})`; -} diff --git a/tools/awslint/lib/rules/public-static-properties.ts b/tools/awslint/lib/rules/public-static-properties.ts deleted file mode 100644 index acf78d7ee..000000000 --- a/tools/awslint/lib/rules/public-static-properties.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Property } from 'jsii-reflect'; -import { Linter } from '../linter'; - -const UPPER_SNAKE_CASE_ALLOWED_PATTERN = new RegExp('^[A-Z0-9][A-Z0-9_]*[A-Z0-9]+$'); - -export const publicStaticPropertiesLinter = new Linter(assembly => { - const result = new Array(); - for (const c of assembly.classes) { - for (const property of c.allProperties) { - if (property.const && property.static) { - result.push(property); - } - } - } - return result; -}); - -publicStaticPropertiesLinter.add({ - code: 'public-static-props-all-caps', - message: 'public static properties must be named using ALL_CAPS', - eval: e => { - const name = e.ctx.name; - e.assert(UPPER_SNAKE_CASE_ALLOWED_PATTERN.test(name), `${e.ctx.parentType.fqn}.${name}`); - } -}); diff --git a/tools/awslint/lib/rules/resource.ts b/tools/awslint/lib/rules/resource.ts deleted file mode 100644 index aeabbc18e..000000000 --- a/tools/awslint/lib/rules/resource.ts +++ /dev/null @@ -1,279 +0,0 @@ -import camelcase = require('camelcase'); -import reflect = require('jsii-reflect'); -import { Linter } from '../linter'; -import { CfnResourceReflection } from './cfn-resource'; -import { ConstructReflection } from './construct'; -import { CoreTypes } from './core-types'; -import { getDocTag } from './util'; - -const GRANT_RESULT_FQN = '@aws-cdk/aws-iam.Grant'; - -export const resourceLinter = new Linter(a => ResourceReflection.findAll(a)); - -export interface Attribute { - site: AttributeSite; - property: reflect.Property; - cfnAttributeNames: string[]; // bucketArn -} - -export enum AttributeSite { - Interface = 'interface', - Class = 'class' -} - -export class ResourceReflection { - - /** - * @returns all resource constructs (everything that extends `cdk.Resource`) - */ - public static findAll(assembly: reflect.Assembly) { - if (CoreTypes.hasCoreModule(assembly)) { - return []; // not part of the dep stack - } - - return ConstructReflection - .findAllConstructs(assembly) - .filter(c => CoreTypes.isResourceClass(c.classType)) - .map(c => new ResourceReflection(c)); - } - - public readonly attributes: Attribute[]; // actual attribute props - public readonly fqn: string; // expected fqn of resource class - - public readonly assembly: reflect.Assembly; - public readonly sys: reflect.TypeSystem; - public readonly cfn: CfnResourceReflection; - public readonly basename: string; // i.e. Bucket - public readonly core: CoreTypes; - public readonly physicalNameProp?: reflect.Property; - - constructor(public readonly construct: ConstructReflection) { - this.assembly = construct.classType.assembly; - this.sys = this.assembly.system; - - const cfn = tryResolveCfnResource(construct.classType); - if (!cfn) { - throw new Error(`Cannot find L1 class for L2 ${construct.fqn}. ` + - `Is "${guessResourceName(construct.fqn)}" an actual CloudFormation resource. ` + - `If not, use the "@resource" doc tag to indicate the full resource name (e.g. "@resource AWS::Route53::HostedZone")`); - } - - this.core = new CoreTypes(this.sys); - this.cfn = cfn; - this.basename = construct.classType.name; - this.fqn = construct.fqn; - this.attributes = this.findAttributeProperties(); - this.physicalNameProp = this.findPhysicalNameProp(); - } - - private findPhysicalNameProp() { - if (!this.construct.propsType) { - return undefined; - } - - const resourceName = camelcase(this.cfn.basename); - - // if resource name ends with "Name" (e.g. DomainName, then just use it as-is, otherwise append "Name") - const physicalNameProp = resourceName.endsWith('Name') ? resourceName : `${resourceName}Name`; - return this.construct.propsType.allProperties.find(x => x.name === physicalNameProp); - } - - /** - * Attribute properties are all the properties that begin with the type name (e.g. bucketXxx). - */ - private findAttributeProperties(): Attribute[] { - const result = new Array(); - - for (const p of this.construct.classType.allProperties) { - if (p.protected) { - continue; // skip any protected properties - } - - const basename = camelcase(this.cfn.basename); - - // an attribute property is a property which starts with the type name - // (e.g. "bucketXxx") and/or has an @attribute doc tag. - const tag = getDocTag(p, 'attribute'); - if (!p.name.startsWith(basename) && !tag) { - continue; - } - - let cfnAttributeNames; - if (tag && tag !== 'true') { - // if there's an `@attribute` doc tag with a value other than "true" - // it should be used as the CFN attribute name instead of the property name - // multiple attribute names can be listed as a comma-delimited list - cfnAttributeNames = tag.split(','); - } else { - // okay, we don't have an explicit CFN attribute name, so we'll guess it - // from the name of the property. - - const name = camelcase(p.name, { pascalCase: true }); - if (this.cfn.attributeNames.includes(name)) { - // special case: there is a cloudformation resource type in the attribute name - // for example 'RoleId'. - cfnAttributeNames = [ name ]; - } else if (p.name.startsWith(basename)) { - // begins with the resource name, just trim it - cfnAttributeNames = [ name.substring(this.cfn.basename.length) ]; - } else { - // we couldn't determine CFN attribute name, so we don't account for this - // as an attribute. this could be, for example, when a construct implements - // an interface that represents another resource (e.g. `lambda.Alias` implements `IFunction`). - continue; - } - } - - // check if this attribute is defined on an interface or on a class - const property = findDeclarationSite(p); - const site = property.parentType.isInterfaceType() ? AttributeSite.Interface : AttributeSite.Class; - - result.push({ - site, - cfnAttributeNames, - property - }); - } - - return result; - } -} - -function findDeclarationSite(prop: reflect.Property): reflect.Property { - if (!prop.overrides || (!prop.overrides.isClassType() && !prop.overrides.isInterfaceType())) { - if (!prop.parentType.isClassType() && !prop.parentType.isInterfaceType()) { - throw new Error('invalid parent type'); - } - return prop; - } - - const overridesProp = prop.overrides.allProperties.find(p => p.name === prop.name); - if (!overridesProp) { - throw new Error(`Cannot find property ${prop.name} in override site ${prop.overrides.fqn}`); - } - return findDeclarationSite(overridesProp); -} - -resourceLinter.add({ - code: 'resource-class-extends-resource', - message: `resource classes must extend "cdk.Resource" directly or indirectly`, - eval: e => { - const resourceBase = e.ctx.sys.findClass(e.ctx.core.resourceClass.fqn); - e.assert(e.ctx.construct.classType.extends(resourceBase), e.ctx.construct.fqn); - } -}); - -resourceLinter.add({ - code: 'resource-interface', - warning: true, - message: 'every resource must have a resource interface', - eval: e => { - e.assert(e.ctx.construct.interfaceType, e.ctx.construct.fqn); - } -}); - -resourceLinter.add({ - code: 'resource-interface-extends-resource', - message: 'construct interfaces of AWS resources must extend cdk.IResource', - eval: e => { - const resourceInterface = e.ctx.construct.interfaceType; - if (!resourceInterface) { return; } - - const resourceInterfaceFqn = e.ctx.core.resourceInterface.fqn; - const interfaceBase = e.ctx.sys.findInterface(resourceInterfaceFqn); - e.assert(resourceInterface.extends(interfaceBase), resourceInterface.fqn); - } -}); - -resourceLinter.add({ - code: 'resource-attribute', - message: - 'resources must represent all cloudformation attributes as attribute properties. ' + - '"@attribute ATTR[,ATTR]" can be used to tag non-standard attribute names. ' + - 'missing property:', - eval: e => { - for (const name of e.ctx.cfn.attributeNames) { - const expected = camelcase(name).startsWith(camelcase(e.ctx.cfn.basename)) - ? camelcase(name) - : camelcase(e.ctx.cfn.basename + name); - - const found = e.ctx.attributes.find(a => a.cfnAttributeNames.includes(name)); - e.assert(found, `${e.ctx.fqn}.${expected}`, expected); - } - } -}); - -resourceLinter.add({ - code: 'grant-result', - message: `"grant" method must return ${GRANT_RESULT_FQN}`, - eval: e => { - const grantResultType = e.ctx.sys.findFqn(GRANT_RESULT_FQN); - const grantMethods = e.ctx.construct.classType.allMethods.filter(m => m.name.startsWith('grant')); - - for (const grantMethod of grantMethods) { - e.assertSignature(grantMethod, { - returns: grantResultType - }); - } - } -}); - -resourceLinter.add({ - code: 'props-physical-name', - message: "Every Resource must have a single physical name construction property, " + - "with a name that is an ending substring of Name", - eval: e => { - if (!e.ctx.construct.propsType) { return; } - e.assert(e.ctx.physicalNameProp, e.ctx.construct.propsFqn); - } -}); - -resourceLinter.add({ - code: 'props-physical-name-type', - message: 'The type of the physical name prop should always be a "string"', - eval: e => { - if (!e.ctx.physicalNameProp) { return; } - const prop = e.ctx.physicalNameProp; - e.assertTypesEqual(e.ctx.sys, prop.type, 'string', `${e.ctx.construct.propsFqn}.${prop.name}`); - } -}); - -function tryResolveCfnResource(resourceClass: reflect.ClassType): CfnResourceReflection | undefined { - const sys = resourceClass.system; - - // if there is a @resource doc tag, it takes precedece - const tag = resourceClass.docs.customTag('resource'); - if (tag) { - return CfnResourceReflection.findByName(sys, tag); - } - - // parse the FQN of the class name and see if we can find a matching CFN resource - const guess = guessResourceName(resourceClass.fqn); - if (guess) { - const cfn = CfnResourceReflection.findByName(sys, guess); - if (cfn) { - return cfn; - } - } - - // try to resolve through ancestors - for (const base of resourceClass.getAncestors()) { - const ret = tryResolveCfnResource(base); - if (ret) { - return ret; - } - } - - // failed misrably - return undefined; -} - -function guessResourceName(fqn: string) { - const match = /@aws-cdk\/([a-z]+)-([a-z0-9]+)\.([A-Z][a-zA-Z0-9]+)/.exec(fqn); - if (!match) { return undefined; } - - const [ , org, ns, rs ] = match; - if (!org || !ns || !rs) { return undefined; } - - return `${org}::${ns}::${rs}`; -} diff --git a/tools/awslint/lib/rules/util.ts b/tools/awslint/lib/rules/util.ts deleted file mode 100644 index 9e9c39134..000000000 --- a/tools/awslint/lib/rules/util.ts +++ /dev/null @@ -1,45 +0,0 @@ -import reflect = require('jsii-reflect'); - -/** - * Returns a documentation tag. Looks it up in inheritance hierarchy. - * @param documentable starting point - * @param tag the tag to search for - */ -export function getDocTag(documentable: reflect.Documentable, tag: string): string | undefined { - const t = documentable.docs.customTag(tag); - if (t) { return t; } - - if ((documentable instanceof reflect.Property || documentable instanceof reflect.Method) && documentable.overrides) { - if (documentable.overrides.isClassType() || documentable.overrides.isInterfaceType()) { - const baseMembers = documentable.overrides.allMembers.filter(m => m.name === documentable.name); - for (const base of baseMembers) { - const baseTag = getDocTag(base, tag); - if (baseTag) { - return baseTag; - } - } - } - } - - if (documentable instanceof reflect.ClassType || documentable instanceof reflect.InterfaceType) { - for (const base of documentable.interfaces) { - const baseTag = getDocTag(base, tag); - if (baseTag) { - return baseTag; - } - } - } - - if (documentable instanceof reflect.ClassType && documentable.base) { - const baseTag = getDocTag(documentable.base, tag); - if (baseTag) { - return baseTag; - } - } - - return undefined; -} - -export function memberFqn(m: reflect.Method | reflect.Property) { - return `${m.parentType.fqn}.${m.name}`; -} diff --git a/tools/awslint/load.sh b/tools/awslint/load.sh deleted file mode 100644 index 35a3769d8..000000000 --- a/tools/awslint/load.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# given an aws-cdk bundle archive (the one published to github releases), extract -# all .jsii manifests and places them under "jsii/*.jsii" -# now they can be used with jsii-reflect - -zip=${1:-} -if [ -z "${zip}" ]; then - echo "Usage: $(basename $0) " - exit 1 -fi - -outdir=$PWD/jsii -rm -fr ${outdir} -mkdir -p ${outdir} - -workdir=$(mktemp -d) -(cd ${workdir} && unzip -q ${zip} js/*) - -for tarball in $(find ${workdir} -name *.jsii.tgz); do - basename=$(basename ${tarball} .jsii.tgz) - ( - staging=$(mktemp -d) - cd ${staging} - if tar -xzv --strip-components=1 -f ${tarball} package/.jsii 2> /dev/null; then - echo ${basename} - mv .jsii ${outdir}/${basename}.jsii - fi - rm -fr ${staging} - ) -done diff --git a/tools/awslint/package.json b/tools/awslint/package.json deleted file mode 100644 index 2c76af923..000000000 --- a/tools/awslint/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "awslint", - "private": true, - "version": "0.17.0", - "description": "Enforces the AWS Construct Library guidelines", - "main": "index.js", - "scripts": { - "build": "tsc -b && chmod +x bin/awslint", - "lint": "tslint -p . && pkglint", - "test": "echo ok", - "watch": "tsc -b -w", - "build+test+package": "npm run build+test", - "build+test": "npm run build && npm test" - }, - "bin": { - "awslint": "bin/awslint" - }, - "dependencies": { - "@jsii/spec": "^1.5.0", - "camelcase": "^6.0.0", - "colors": "^1.4.0", - "fs-extra": "^8.1.0", - "jsii-reflect": "^1.5.0", - "yargs": "^15.3.1" - }, - "devDependencies": { - "@types/fs-extra": "^8.1.0", - "@types/yargs": "^15.0.5", - "tslint": "^5.20.1", - "typescript": "~3.8.3" - }, - "repository": { - "type": "git", - "url": "https://github.com/aws/aws-rfdk.git" - }, - "homepage": "https://github.com/aws/aws-cdk", - "license": "Apache-2.0", - "author": { - "name": "Amazon Web Services", - "url": "https://aws.amazon.com", - "organization": true - }, - "keywords": [ - "aws", - "cdk" - ], - "engines": { - "node": ">= 10.13.0 <13 || >=13.7.0" - }, - "pkglint": { - "exclude": [ - "license/notice-file" - ] - } -} diff --git a/tools/awslint/tsconfig.json b/tools/awslint/tsconfig.json deleted file mode 100644 index 41c87f390..000000000 --- a/tools/awslint/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/cdk-build-tools/.eslintrc.js b/tools/cdk-build-tools/.eslintrc.js index fa32e1d6a..cd7a30278 100644 --- a/tools/cdk-build-tools/.eslintrc.js +++ b/tools/cdk-build-tools/.eslintrc.js @@ -1,4 +1,7 @@ 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/config/eslintrc.js b/tools/cdk-build-tools/config/eslintrc.js index f37e16ada..a906a1f8c 100644 --- a/tools/cdk-build-tools/config/eslintrc.js +++ b/tools/cdk-build-tools/config/eslintrc.js @@ -33,7 +33,7 @@ module.exports = { 'import/resolver': { node: {}, typescript: { - directory: './tsconfig.json' + project: './tsconfig.json' } } }, @@ -42,6 +42,28 @@ module.exports = { // Require use of the `import { foo } from 'bar';` form instead of `import foo = require('bar');` '@typescript-eslint/no-require-imports': [ 'error' ], '@typescript-eslint/indent': [ 'error', 2 ], + // Rule to lint white-space between the TyepScript type annotation syntax + // e.g. + // const foo: number; // Good + // const foo :number; // Bad + // const foo:number; // Bad + '@typescript-eslint/type-annotation-spacing': [ + // Error level (fail the lint) + 'error', + // Rule options + { + // No whitespace before the colon + before: false, + // Must have whitespace after the colon + after: true, + overrides: { + arrow: { + before: true, + after: true, + }, + }, + }, + ], // Style 'quotes': [ 'error', 'single', { avoidEscape: true } ], diff --git a/tools/cdk-build-tools/package.json b/tools/cdk-build-tools/package.json index d273b67a3..759b5d5a8 100644 --- a/tools/cdk-build-tools/package.json +++ b/tools/cdk-build-tools/package.json @@ -1,7 +1,7 @@ { "name": "cdk-build-tools", "private": true, - "version": "0.17.0", + "version": "0.18.0", "description": "Tools package with shared build scripts for CDK packages", "main": "lib/index.js", "repository": { @@ -34,30 +34,30 @@ }, "license": "Apache-2.0", "devDependencies": { - "@types/fs-extra": "^8.1.0", - "@types/jest": "^26.0.4", - "@types/yargs": "^15.0.5", + "@types/fs-extra": "^9.0.1", + "@types/jest": "^26.0.10", + "@types/yargs": "^15.0.7", "eslint-plugin-license-header": "^0.2.0", - "pkglint": "0.17.0" + "pkglint": "0.18.0" }, "dependencies": { - "@typescript-eslint/eslint-plugin": "^3.6.1", - "@typescript-eslint/parser": "^3.5.0", - "awslint": "0.17.0", + "@typescript-eslint/eslint-plugin": "^3.10.1", + "@typescript-eslint/parser": "^3.10.1", + "awslint": "1.66.0", "colors": "^1.4.0", - "eslint": "^6.8.0", + "eslint": "^7.7.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-import-resolver-typescript": "^2.0.0", + "eslint-import-resolver-typescript": "^2.2.1", "eslint-plugin-import": "^2.22.0", "fs-extra": "^9.0.1", - "jest": "^25.5.4", - "jsii": "^1.9.0", - "jsii-pacmak": "^1.9.0", + "jest": "^26.4.2", + "jsii": "^1.12.0", + "jsii-pacmak": "^1.12.0", "nodeunit": "^0.11.3", "nyc": "^15.1.0", - "ts-jest": "^26.1.3", - "typescript": "~3.9.6", - "yargs": "^15.3.1" + "ts-jest": "^26.2.0", + "typescript": "~4.0.3", + "yargs": "^16.0.3" }, "keywords": [ "aws", diff --git a/tools/pkglint/.eslintrc.js b/tools/pkglint/.eslintrc.js index 84f8195ae..1d089488a 100644 --- a/tools/pkglint/.eslintrc.js +++ b/tools/pkglint/.eslintrc.js @@ -1,4 +1,7 @@ const baseConfig = require('cdk-build-tools/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/pkglint/lib/rules.ts b/tools/pkglint/lib/rules.ts index c94743223..12a41c327 100644 --- a/tools/pkglint/lib/rules.ts +++ b/tools/pkglint/lib/rules.ts @@ -925,7 +925,7 @@ export class ConstructsDependency extends ValidationRule { public readonly name = 'constructs/dependency'; public validate(pkg: PackageJson) { - const REQUIRED_VERSION = '^3.0.2'; + const REQUIRED_VERSION = '^3.0.4'; if (pkg.devDependencies?.constructs && pkg.devDependencies?.constructs !== REQUIRED_VERSION) { pkg.report({ diff --git a/tools/pkglint/package.json b/tools/pkglint/package.json index 3e54d5049..50372a80e 100644 --- a/tools/pkglint/package.json +++ b/tools/pkglint/package.json @@ -1,6 +1,6 @@ { "name": "pkglint", - "version": "0.17.0", + "version": "0.18.0", "private": true, "description": "Validate and fix package.json files", "main": "lib/index.js", @@ -35,16 +35,16 @@ }, "license": "Apache-2.0", "devDependencies": { - "@types/fs-extra": "^8.1.0", - "@types/semver": "^7.3.1", - "@types/yargs": "^15.0.5", - "typescript": "~3.9.6" + "@types/fs-extra": "^9.0.1", + "@types/semver": "^7.3.4", + "@types/yargs": "^15.0.7", + "typescript": "~4.0.3" }, "dependencies": { "case": "^1.6.3", "colors": "^1.4.0", "fs-extra": "^9.0.1", - "semver": "^7.2.2", - "yargs": "^15.3.1" + "semver": "^7.3.2", + "yargs": "^16.0.3" } } diff --git a/yarn.lock b/yarn.lock index 5a9fb898d..f7a510ca4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,822 +2,836 @@ # yarn lockfile v1 -"@aws-cdk/assert@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/assert/-/assert-1.57.0.tgz#a9e961ca090a259a19581f650e836c230c06d82f" - integrity sha512-sl/Zwcwo3G8unfz3RZ5I3EsUSgKnCYqakNVRYbTVZm9wObBZsbQ81QhmpAxiHCws9Z8rrbRYOJ5UI7vZ1y+U7w== - dependencies: - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/cloudformation-diff" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/assets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/assets/-/assets-1.57.0.tgz#e37a61552b0c2680a09dae435a97a24a2996480b" - integrity sha512-+yn4YWU7LCDbL6GsvnXgY0pe7TaH8Ib+o4zowsLuMnS2l5ShtHy7dpqJj+VVO0/YR9upvmlvMg6QY6UQRpA0cA== - dependencies: - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-apigateway@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigateway/-/aws-apigateway-1.57.0.tgz#2701fdf3da90c50195a317c6ef6624fae3a194d1" - integrity sha512-y04kG/h4lQq5TQTyOogLzdt61mdDOaXcSnQrOEBMKgMyDOpcT9mETlfxPfvn55tdrw6XwlC8d1qB6Jo6GJQf4w== - dependencies: - "@aws-cdk/assets" "1.57.0" - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/aws-s3-assets" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-applicationautoscaling@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.57.0.tgz#1d8abcc75f994696ecec2f0563d1cdffd3e54c69" - integrity sha512-frlqBtUcrJfZ5NTyW4DpAPnQFcHAioUQKj65/XEwCZvq6g44S9z+ARAIT0hEisUfFDFnJ1p6Fm/Wn+M6fyLQFA== - dependencies: - "@aws-cdk/aws-autoscaling-common" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-autoscaling-common@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.57.0.tgz#481f4413518ddda679c25cb6c5b5f42e83a03c3f" - integrity sha512-FYcqcby+ObhZEaP4za+JhwShQVAWAXQDq0DoDlYd30RgWcr7yz6gbz56G2N+/ngxFWQ42SkS+T1BqR3hsQdTmg== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-autoscaling-hooktargets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-hooktargets/-/aws-autoscaling-hooktargets-1.57.0.tgz#3dc475171f206f1ade5575f8ef1561a3428dd22b" - integrity sha512-PIkBKiZSN+OpeSYdFcBWKgnyYrBvmhsgAAQmKiV/OP0FeM87+jh7hjlaREA/WuRIbv3vj/rcEpWcVih8vzgTLw== - dependencies: - "@aws-cdk/aws-autoscaling" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/aws-sns-subscriptions" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-autoscaling@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling/-/aws-autoscaling-1.57.0.tgz#ff662c82e5d2ecf01bfe665597ba5f6901b04465" - integrity sha512-UYFW/ksiOPV7aHFixOYZMqddduf39skeBb8zxZBNPEKQ2PmUzSx3ygPf5XQMKngnuf47IUKd0O7Za4fBHex9Mg== - dependencies: - "@aws-cdk/aws-autoscaling-common" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-elasticloadbalancing" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-batch@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-batch/-/aws-batch-1.57.0.tgz#dca3f507bc0db49a46c911a57674d63cc4565f27" - integrity sha512-jckHpmHVEdfEBFLAk8u+W9UYOTkDvefbrTmdW9wA0361jujxC6lYyp2lkF53i75L0kdBpJpGlhlSyyofESTk3w== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-ecr" "1.57.0" - "@aws-cdk/aws-ecs" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-certificatemanager@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.57.0.tgz#7768b83db7b60bad051229c39b560e687c19dc3a" - integrity sha512-CMRhikcHziPrKhe/CHgQ4boCa+rG19QtF7wzTMHlAeEd7E8ruJMH9yNFtS1+MFrwLgp0hMS+H/Gyz9arJtfCrA== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-route53" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-cloudformation@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.57.0.tgz#c55928ed65c1883e1d4015232e9dc65212539970" - integrity sha512-rEjjXOoXNJ4kPSkdlKuhA1VYIRhByqZJ5PqWhGCYB+PlAlOFiAzOH63xbDkhn4g4S+PIi2h9AYNIkqniqtjceA== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-cloudfront@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudfront/-/aws-cloudfront-1.57.0.tgz#259b072fcc08f65f24ac1205633e299c4934a13d" - integrity sha512-OWXJ6X2mxtN/EbXavr4icidamSmj588Pcjb2vvcK8XC//wOOlUZh/mAA26zTilFbFeGrCxRh62itJauRjlA6hw== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-cloudwatch-actions@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch-actions/-/aws-cloudwatch-actions-1.57.0.tgz#4c2704dd117603cdc1de6c5b84faafa46af58de8" - integrity sha512-yr1YrgocJ0+/zeMm9HI9SQO1YrVVpYrTPqwRB+QvcQ764twVK3V1xTGTMjmMVSVXu6t7OnHWnnCnCfHW9QIyPw== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.57.0" - "@aws-cdk/aws-autoscaling" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-cloudwatch@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.57.0.tgz#43ee7a14b869f698ffcd3e72624bb2b2f673b1d0" - integrity sha512-sKS0LURGmL1jbgrG9UGUxh0q+yxGVDmsds3eoJWLc0qyVrD9KN3wxU+QuSLqQdZGGun/tDIv39UQ1l+Y6vodsw== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-codebuild@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codebuild/-/aws-codebuild-1.57.0.tgz#e451e26f23d0bbc1af993ad4178db3004370c577" - integrity sha512-oZhaSP1xvJsMmL1g6NWJB4GZzcKhgailwitA1VT9sNKbAabSrUE8X7x7tOBprdtRDiFdeAtO7oR1gdyuITErtA== - dependencies: - "@aws-cdk/assets" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-codecommit" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-ecr" "1.57.0" - "@aws-cdk/aws-ecr-assets" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/aws-s3-assets" "1.57.0" - "@aws-cdk/aws-secretsmanager" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-codecommit@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codecommit/-/aws-codecommit-1.57.0.tgz#477dcb9f468edb8e0d1dedc17b772df5fc0479df" - integrity sha512-AAXoDZvvKAfTpnRbqSaR2nkXRLpCdcbv+geJX2HLycgch/wIyMfXKJZXuTtQAtlt5elPGrNt3CT02kvfQKBB4w== - dependencies: - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-codeguruprofiler@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.57.0.tgz#84aea6ae7c39669a4c2ce0ba36317e1af8c2f2b8" - integrity sha512-69KWy67Lo20DcFXSuSxlD5Px08jnDtkLIMroF8Zp9dEF5maxgy41i26FoY4hQQnXiTKopA8IPVxHvkouRxNutQ== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - -"@aws-cdk/aws-codepipeline@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codepipeline/-/aws-codepipeline-1.57.0.tgz#d14fdfaa76ddaad5665550f191b4200e3484f10f" - integrity sha512-oTqN8MdubKKVL24/oU3erA3vBpYUeFQvDPiV1T0ODfvuFxqbgu7iVjw0h70DGyoHoeq1mi8LmdaddkgE6e8RIw== - dependencies: - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-cognito@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cognito/-/aws-cognito-1.57.0.tgz#bdefaa8c8f2120e8db90971e96ccb35a86643925" - integrity sha512-+r9VFKOl1n0/7XuOP9B9DoXZx5IhnkB9y6vgrD1oOBgpOtePf6z8VSyW2nR+slZWQCTgbe2fN3E3afQY9dS1lQ== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/custom-resources" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-docdb@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-docdb/-/aws-docdb-1.57.0.tgz#1adbe3585ac4e459db521bdf0463dbf43e51da87" - integrity sha512-LaphVBw1yUGMeXQlzCdz2eySMpA/4iRJVWB95MAOSFocU8mCDhP+MGMawh+caDc35Eis1qYWXmLk9+5vtZadtw== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-efs" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-secretsmanager" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-dynamodb@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-dynamodb/-/aws-dynamodb-1.57.0.tgz#f2b5e00b30b40306beb1019e8cfdd870c2fe9348" - integrity sha512-upwlzWl1GE/9bktbSTEDIFO1ddjvJNki5emKhIZLTMA3Pb+eYXYjspY/hEgXwWmPkvP1vq6yLr3MpPKRtUt1Tw== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/custom-resources" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-ec2@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ec2/-/aws-ec2-1.57.0.tgz#1f7a9ce5926a1cc35cd0b78cb27f5b03967b9dfa" - integrity sha512-ptqXTCm0YE87YyLovVCmMVoqJ3V4yCTRJPXbA9j+h1eJcnKamTI2FmYqVDGrysAGYLAJyzi233sstfMFbks94g== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/aws-ssm" "1.57.0" - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - "@aws-cdk/region-info" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-ecr-assets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.57.0.tgz#5799a88746788e4a81fdecc0d44e98c3eb81798b" - integrity sha512-5i/b77ImDp+WF3GIIwjO1HHI3o/HPrLXbS/j44v9jxecBlpMj+DroOSn5jnq+J2wGguUS9UrIdgstts0lqCnYA== - dependencies: - "@aws-cdk/assets" "1.57.0" - "@aws-cdk/aws-ecr" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" +"@aws-cdk/assert@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/assert/-/assert-1.66.0.tgz#3cfafbfbabf7e2a4f23008f939a67b78225b157c" + integrity sha512-/BH8eCJr3Mn/XjurqhhbIskFTypPts0zzwtNnE+qhgJ8BaLl6b9OjKrVpeDNBcRWBpYsR7v7nYlzsI+Rat0JfA== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/cloudformation-diff" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/assets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/assets/-/assets-1.66.0.tgz#1330dcaa95c05224bc2410b31059f154e31a1a58" + integrity sha512-oaKTOHReOvQT0qVBSa42kbdVUjKHaohvaKtFrrFxAX4KoFeWebbckRyFdawFLH5Kt0hS5/R1B7BsuRreNMHctg== + dependencies: + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-apigateway@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigateway/-/aws-apigateway-1.66.0.tgz#5411ec8e400b5981cc113bdea1baf3b77e5cdecd" + integrity sha512-15RjBCj4G3XszjREE8DEtJfrTmTWlPvOvaeKB8N5cHbXZAklVS3DPLX8pjMd53W2rnuVVKsDexcxf61IxVpIIA== + dependencies: + "@aws-cdk/assets" "1.66.0" + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/aws-s3-assets" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-applicationautoscaling@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.66.0.tgz#baeb4097005f532c73073c328f50e8b95b8b33d0" + integrity sha512-TVlBOSr/eCAyShHmDzNI7EWg/wsAGZfS5nWNTQTvZxAbrMaB/gSaj9hTiSdsTTIG4LZWhpy5JIl7V+0shBJGPQ== + dependencies: + "@aws-cdk/aws-autoscaling-common" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-autoscaling-common@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.66.0.tgz#b51ac8024e82db203951d84a9a780624f1be6f04" + integrity sha512-Ms5VcVatbCaS1yrQFlzSHXYHE+HFXzWfvzmihQ+SUPmu32B8y/TADzH4WIC/wktz3HKD6Dui8E2wSuFc4aALqg== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-autoscaling-hooktargets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-hooktargets/-/aws-autoscaling-hooktargets-1.66.0.tgz#eea152a3630d823161ad8e1c5d7b14e20fcb45b0" + integrity sha512-pCLJ+qQ+UN38XiMHZDci1PwZ0Fr+jirb83RUd0f5UBBnf2nzFwEHnKmLoynW3okfsVx/Lf5rnjaeq/dnv2g55A== + dependencies: + "@aws-cdk/aws-autoscaling" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/aws-sns-subscriptions" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-autoscaling@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling/-/aws-autoscaling-1.66.0.tgz#d93007516eb71e46032592fbfa19c2d71858cf5b" + integrity sha512-rlJUhz8l5DwKVPiM1gDD63cuzgsMoU7goar+w4Frg9SZaqhnhCmeCHkwEOSW50eeSmeWnnBjOFO1CFj38ILNLw== + dependencies: + "@aws-cdk/aws-autoscaling-common" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-elasticloadbalancing" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-batch@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-batch/-/aws-batch-1.66.0.tgz#3956ed1826d43d4acafe19f9416e4e2bfb49b3b1" + integrity sha512-nzuerv8ao61YPHG8vrwDDq2a8gV9njMTOu5wZHKdq0bGM6x5ZYQSh8B7mnHjxcCakVLac2f7AWzwOQ3STiAzkQ== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-ecr" "1.66.0" + "@aws-cdk/aws-ecs" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-certificatemanager@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.66.0.tgz#35318d9a61b8bbe8dd38c2b6619c7e97e92dd08d" + integrity sha512-tJZpiijlCDUkBk5HRlyRd1+DKzXLO5/n+0EXzcWeE8PcDgX/Z27ZehqWNQ0qY80tLcFEBuHPTZ07USFCDXNKGQ== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-route53" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-cloudformation@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.66.0.tgz#300dbe74a209b6e716e930f1ffbaf099482846c7" + integrity sha512-SZhCE61m9bLjzhcYG+Y0MOZZhu7gndD5+XTu9TnZ/okhh3hNpqD/yhb4CpfPVY2ZIPUokLwUT+Qf/yszoHlXAw== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-cloudfront@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudfront/-/aws-cloudfront-1.66.0.tgz#00f1f419c3fbfeda2bc7426bdc294b80a09f1aa9" + integrity sha512-ohc0FhBFT/2BB3qF7a/JZEmPhiV6SEIcI2Lx6E4K9GNJRGqgiU+lhZy67l49WED7MJ8bXo3OCKRRxRo0UMjUaw== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-cloudwatch-actions@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch-actions/-/aws-cloudwatch-actions-1.66.0.tgz#93ab64122fb0d72acae6848f4c82ad34f76ccc47" + integrity sha512-H+7Z+rC8QKhYRDX9mqj9xq5dyNZ6xZ9SUU2ZJqU6NUyfiHr04cvfPz72+NkrH4Dw0cbFxHIEmP4ljcFnl6g/ag== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.66.0" + "@aws-cdk/aws-autoscaling" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-cloudwatch@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.66.0.tgz#3551ab0edf6827816f9c73a0c41dc49cf8223740" + integrity sha512-xMBMGJcbaEN1a+mnUDdkYOabM2/iabwEarjUUvt41d/7tk9M3kG5Ywpp2XyRgSo6GHMK5bsG+WabopUPCa5FRg== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-codebuild@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codebuild/-/aws-codebuild-1.66.0.tgz#985a604822555e3b5e32f21d4d30309bed0f81ed" + integrity sha512-LfNM4H6ei8oJ+nmuuvP4MTi7njSgV/yjDwyU0jCaeUQIpjlApnL/Bm6+aezyZLQNa3aCBio5Xe1URcQgokqYVw== + dependencies: + "@aws-cdk/assets" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-codecommit" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-ecr" "1.66.0" + "@aws-cdk/aws-ecr-assets" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/aws-s3-assets" "1.66.0" + "@aws-cdk/aws-secretsmanager" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-codecommit@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codecommit/-/aws-codecommit-1.66.0.tgz#bcdb7fe765eda15c353dcdb42f3804169fca20ef" + integrity sha512-LgmB5UCI5IOIDrj4Dk32nTOlkfcXrY6O1tR50QPgxX9VmBclP4jdqrGUGwSy7OWXNVO8YCA52IVVPwq2WPiryw== + dependencies: + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-codeguruprofiler@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.66.0.tgz#40a562bac55c5586cf2fd7e282526b9593175956" + integrity sha512-C94xKsrhmeyjZ6Gs4z1mvDR9ygwDMqa9X0X8NEvfqfHhluX6yuDju7RT5teZv29/8qe2z5X6scvmUaiH+Y5OUg== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-codepipeline@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codepipeline/-/aws-codepipeline-1.66.0.tgz#6b62af2a2785333d4eea47d901ae1e8381887416" + integrity sha512-OR86pRaO2xExo0hcqCGLt0854LSCxPlNVTclZ8rcbbJFiSgLlLD2r/q0eyNcGe6ZVLoZPV2oHytNjxhFfE1BwQ== + dependencies: + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-cognito@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cognito/-/aws-cognito-1.66.0.tgz#7dc1bf0f9d593472798be099a0613474e1349dfb" + integrity sha512-QF+eo7n3huqS8/Tiwv1hQmM27cKYLOAzhWzFa66hLJWym6Wg6qiVFLVlK8T1YaMASBmRzUx+1GBKJIfS7249+w== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/custom-resources" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-docdb@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-docdb/-/aws-docdb-1.66.0.tgz#bcc175a41e5fbc26f2407faaeff11e7ea1cc4bce" + integrity sha512-9vVs7+3I9IIWKzq5u97auBBkckaQLhK6MCR5SFaQ1q8ntBK/428HzvTUiPeJikr5/CVkl2p5905Cu26pU8yekg== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-efs" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-secretsmanager" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-dynamodb@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-dynamodb/-/aws-dynamodb-1.66.0.tgz#f3b8a22b3819dba31ee6a046f4f61248ab66b267" + integrity sha512-Br2zUPxe3BX80hAagoEUv8paje+pbcJmogg+JVuCOUQDP+zR+fZ+fNAj2WomwSI9ElH+1/YFlil0wOUPhbS7rw== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/custom-resources" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-ec2@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ec2/-/aws-ec2-1.66.0.tgz#a9ce9fb7e26b6ea6ee2e0117007a609117249a5e" + integrity sha512-12y2E6rO1rmpG2Y6YtXT6r20prg3s4TbXYxKYz2tsBkjVwKv8D8/EhTUXXanwEAtdTMqFoBH0OkaD1y6rhceyA== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/aws-s3-assets" "1.66.0" + "@aws-cdk/aws-ssm" "1.66.0" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-ecr-assets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.66.0.tgz#bded5e92e6ac70cf51aef87a8d756eff86feb78f" + integrity sha512-/Wb4ylwezqBcbq4yyc/R+UQI4qnbWZpGsn413G9T0Q/rZ5TRpgnmIUmSC9AIagdlhMEZIkB0bCwBDQxAEvkZPg== + dependencies: + "@aws-cdk/assets" "1.66.0" + "@aws-cdk/aws-ecr" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" minimatch "^3.0.4" -"@aws-cdk/aws-ecr@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr/-/aws-ecr-1.57.0.tgz#7779c26bfd31de207d6cd2b830af35c46b5b07f3" - integrity sha512-wZWvYrN1M9bn7txtdertDHcGfKYT/eTzQp/MyH/cu/ZKs+IQQ/Iq1Zh+t8d3nrkfoFPP8LPI3AyVOLAiPw8pGg== - dependencies: - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/custom-resources" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-ecs-patterns@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs-patterns/-/aws-ecs-patterns-1.57.0.tgz#dd860496cc0b9b884b929f9bd6a8e68a41a34bdb" - integrity sha512-FPKNi17th6d88wNkl6WzNi9pEsffTZiWwZ27yazKzP6UzkF+LtV6qK7DKyPnaGdrKxMgVcDNQJGsHMHcyrNLfA== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.57.0" - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-ecs" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-events-targets" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-route53" "1.57.0" - "@aws-cdk/aws-route53-targets" "1.57.0" - "@aws-cdk/aws-servicediscovery" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-ecs@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs/-/aws-ecs-1.57.0.tgz#074719719a66c2135bce09182ab6f40b00ece431" - integrity sha512-uSUNe+K10WcvWhYKY3rvN0C/93yuajbdHMqybemNVU29PFnqTQ6djKsieIAxlPctM6jwQditakLH8S01xscTxw== - dependencies: - "@aws-cdk/aws-applicationautoscaling" "1.57.0" - "@aws-cdk/aws-autoscaling" "1.57.0" - "@aws-cdk/aws-autoscaling-hooktargets" "1.57.0" - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-ecr" "1.57.0" - "@aws-cdk/aws-ecr-assets" "1.57.0" - "@aws-cdk/aws-elasticloadbalancing" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/aws-route53" "1.57.0" - "@aws-cdk/aws-route53-targets" "1.57.0" - "@aws-cdk/aws-secretsmanager" "1.57.0" - "@aws-cdk/aws-servicediscovery" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/aws-ssm" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-efs@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-efs/-/aws-efs-1.57.0.tgz#be9b6b15289c4347f2d9801272e40f27d04901d2" - integrity sha512-vrxQAdG3c4KYGPnE6+eppyKHnqpdP/15VIC8ihFxpqdKBeQK2CguTZuN/dKMHWvhN6F2iyvRoGWSDzqI5uTbrg== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-elasticloadbalancing@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancing/-/aws-elasticloadbalancing-1.57.0.tgz#d050c0784e1e9cb47d836976a49ac49bc56a8cf4" - integrity sha512-pK8fFu7g7MnGz4Dp+qlDEEXF2Vq2UQyVRgVt+wvcMWHbZN35wkhRM8XVvZ/QO7jyk4Dz5+hRy+vUbi5SuVha9w== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-elasticloadbalancingv2@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancingv2/-/aws-elasticloadbalancingv2-1.57.0.tgz#0e388a8e727189749fac13c06f83e3aecebbcf5c" - integrity sha512-fSoqsgWBawL6eYIoAoF7O0QVwqlvAmtKltlUJ4mKS0Umor3MXEGrsdaMKitgNx6/mToJdYtfSe6UDMWI3HdjyQ== - dependencies: - "@aws-cdk/aws-certificatemanager" "1.57.0" - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/region-info" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-events-targets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events-targets/-/aws-events-targets-1.57.0.tgz#12fd0cd274e8126f0267d88b7d9587498ee85776" - integrity sha512-iwCY3CmxdSt0OknZdIO7aGIc/Q3sWLCFDTS1m2K+pf58d+Mim/g/QeifNje/UpUCBbBJkgufFPj3lFQa7w92lA== - dependencies: - "@aws-cdk/aws-batch" "1.57.0" - "@aws-cdk/aws-codebuild" "1.57.0" - "@aws-cdk/aws-codepipeline" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-ecs" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kinesis" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/aws-sns-subscriptions" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/aws-stepfunctions" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-events@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events/-/aws-events-1.57.0.tgz#1bb4c9281b06e9b577d7a02d9ebc7b41b937b3d3" - integrity sha512-d2681DHe+gFQq+o4GXglnaEKmEorCpTYPQIbbRRO3RQzggSLdJMYFoIio3Vft3xeuaxpZCpNwyJ6mROdgiq3eg== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-iam@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-iam/-/aws-iam-1.57.0.tgz#d6c8e901fa81e3c872d209bd46fd41e3f024d6b2" - integrity sha512-vOltgt7CDEZ9Zko5tBhxP6bwuOAJA5ev04w1rwAcDD8W4UGHnz+2D1b0eAHfLhsICVagwfNEG+KmDyyKzrzyFw== - dependencies: - "@aws-cdk/core" "1.57.0" - "@aws-cdk/region-info" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-kinesis@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesis/-/aws-kinesis-1.57.0.tgz#0eb08e31dcab3c90640ee93df1d2480281fa5fbf" - integrity sha512-x7ySlxBV+8I82MeYdNHLOMFi7mO19mkMabP9MrDlINcXpHRwXtUO6LMN+Bl/sda5v2FeVK8tpZm1PQ7lJ3jVCA== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-kms@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kms/-/aws-kms-1.57.0.tgz#6fc0868b142c497d7c70c461596bfb111182c77b" - integrity sha512-kBoOCPEZTTCU2JN9LfVy7qYKI9+XGyCPybcxbrXhYjM1eC2tKEcCub7fQiQ3He+H4QEgfEqoKhwJlLHUDMSKtQ== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-lambda@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda/-/aws-lambda-1.57.0.tgz#430314f57e07529faf1aee37b631b38db91f3a60" - integrity sha512-LNYO32T6ljUbfIEh1rOPFePQfUGF8GzAmazQ8A/G0aE8e919aJexWJ4k2YVcKAoKQRl7nPAZMXWWg2VfxEocDQ== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-codeguruprofiler" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-efs" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/aws-s3-assets" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-logs@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-logs/-/aws-logs-1.57.0.tgz#b1b1b4be8ff1a0041f2c84ce21db78b80d26ffb6" - integrity sha512-q8hmcT7f6ZSHs0qypncTvIag7onKvt3gQIknPDnn3712rP3yz0zJlDfcN/TXRKEPxGVjGB9VCM/9q9pBKwbzQQ== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-route53-targets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53-targets/-/aws-route53-targets-1.57.0.tgz#83416fba073328e223792a2df192efc2e153c324" - integrity sha512-1qE5Zr/y3vF/8h/7coJoyDcjacjVeI3ASXECC/O8hEpDeevqQSTza/l/xyeM8FRpYw/TqtFpJ7EAZbnYk3nJFw== - dependencies: - "@aws-cdk/aws-apigateway" "1.57.0" - "@aws-cdk/aws-cloudfront" "1.57.0" - "@aws-cdk/aws-cognito" "1.57.0" - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-elasticloadbalancing" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-route53" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/region-info" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-route53@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53/-/aws-route53-1.57.0.tgz#3e9be405b55a7b041482fa486e3b90ddc24754e0" - integrity sha512-SR+Q6fxDNzhsrc0gKfdXH5CZYH++7qwj5Hcd5CXKKHi9hw01GrYadTz8eXLFRb6Bt8coY5FN+KDbXc/wCI0H4g== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-s3-assets@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.57.0.tgz#949ef5f3a045a2e728dead6bc935901d82181897" - integrity sha512-zX6xvP9m+InbD0IT40yCBRCtg0EW66WGMrd7yi9p4/kK8SSDdRP5LITJTzNrche24LUV2jWpzSBPVAm8QCp7JQ== - dependencies: - "@aws-cdk/assets" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-s3" "1.57.0" - "@aws-cdk/core" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-s3@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3/-/aws-s3-1.57.0.tgz#5d9d318e0ab78896f28276bf03e94835d483e33e" - integrity sha512-pwqLL6D+2saDNAlue74iBphPJ9E4ejXxrXg3llMLbud6GIjtzXz4G8H7z6OwkgdceEK5Sx3eVQNR4MPREdcO5g== - dependencies: - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-sam@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sam/-/aws-sam-1.57.0.tgz#9a54d0a53b3bbd255c78ca29dd7ab6f9c884dfe2" - integrity sha512-QDfNwvE9fXk6gf99H6GMEMaWUOX6xSfnqLZaRACGD95saNwTtRT00j9gepIxbf8AA1vvZLpw222U4vTnMnU01g== - dependencies: - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-secretsmanager@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-secretsmanager/-/aws-secretsmanager-1.57.0.tgz#d75a361ebc3db43452004a0884eb08b5d1f263bc" - integrity sha512-URWlLfF1PR2BHgwcB1zGMkW1AsF9SrkA7qwyV/MmVvsQf3c2LOR6LWyCWJBRo3QSjrl/J8XVo6V5vBehE8hjow== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-sam" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-servicediscovery@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-servicediscovery/-/aws-servicediscovery-1.57.0.tgz#e29dad5d79b530777d874c703e5fc21074823f4d" - integrity sha512-buRrZNRIrb1X7SHt+s8n2x6Pnj4fQ4L5do4NyC2yvzJk1na7I2quY8Po95GghZAi0JHraq6aI/AR4mOY10uI9w== - dependencies: - "@aws-cdk/aws-ec2" "1.57.0" - "@aws-cdk/aws-elasticloadbalancingv2" "1.57.0" - "@aws-cdk/aws-route53" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-sns-subscriptions@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns-subscriptions/-/aws-sns-subscriptions-1.57.0.tgz#ff6c46eed54dc658b44821a8d63a04eed30215b2" - integrity sha512-86+fW/BKKyiNqZCTdmgf7RJcVrzhwLmZaCp/SatAnf6CPQ7vcf+14JAa8FmRjB0C5kSAeFDKx9eAb5amo9zTzA== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-sns@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns/-/aws-sns-1.57.0.tgz#ea380ded10b8f04b0e768160bd8fbd51f7d59898" - integrity sha512-kJGbpOiUJBJext6DuWPkF6N3k/TzGeS/jXCCTWRbJoNFhyfor0G3IqHsuenLioNFz5IhPXJHEjW2vmGy5zjAlw== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/aws-sqs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-sqs@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sqs/-/aws-sqs-1.57.0.tgz#9ee09b9d9a1a9adb6f28d5e68752ec0fcda5bf42" - integrity sha512-Yu75GtLOykW/LPTp6fArLMsz8msTnnD0afIYcifzMbIU+EoqGtsGLkJat1rqHyU4t6g3cbcK8f7CVWSy+YyTZQ== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-ssm@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ssm/-/aws-ssm-1.57.0.tgz#d684763501ad684d2d0bcbc71ef3378c98ad4ef0" - integrity sha512-nzDqMlqCooRbIZ3BazJMIXmoQWTMjJxP0Xn7bIfyjiTQwVj76h8r7n20uajXfCVMNcDj1Mpq+QBvNdyZPG/R6g== - dependencies: - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-kms" "1.57.0" - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/aws-stepfunctions@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/aws-stepfunctions/-/aws-stepfunctions-1.57.0.tgz#9d5501f6b2d065e7ca240ef8816efdadd5ae51ec" - integrity sha512-4Age9vLLC5s7oeVRIOW/wB+EvAgoIZxO/nlkZ3i5bRWvvRpesELS3DUkSXicbEJP0mn3yCujGnMo85LnTT7o2g== - dependencies: - "@aws-cdk/aws-cloudwatch" "1.57.0" - "@aws-cdk/aws-events" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/cfnspec@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-1.57.0.tgz#57ce94fd4f1475617358a940b957795d27ccbd14" - integrity sha512-UEMmFYCtZuYvRLAkHtMqdhI0ziJA+SYT9o+BeYaVEbpibAYes9ILjEeeigdoJnYwbsCEqGclpKKTQHE7VvsiXA== - dependencies: - md5 "^2.2.1" - -"@aws-cdk/cloud-assembly-schema@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.57.0.tgz#bf9c63cf3ca8cbf0f37886b43b12f5fab5c7c989" - integrity sha512-IJyV3pgMvpbaIVYpUkBGsxIWh+VK7TxuTbEyHfBra5+VgXLoFdSG2UO80b4v6ou+occRqUGbqAnc/VfYr1uuvw== - dependencies: - jsonschema "^1.2.5" - semver "^7.2.2" - -"@aws-cdk/cloudformation-diff@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.57.0.tgz#cebc05d63a5234191524cfa7237d6bdd1716c30c" - integrity sha512-BqFkuEMppF3icWwACjKO/W7SBbnWaAPUjR8Uw7UsP2r6gGhygOY0fOfuB1OfOivs7lZSIkyPy1oxDlw23r7/Zg== - dependencies: - "@aws-cdk/cfnspec" "1.57.0" +"@aws-cdk/aws-ecr@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr/-/aws-ecr-1.66.0.tgz#fca65f2f74b9528d67bc60625928b13d80aad548" + integrity sha512-DbkOZpAJ2wPBADu4fYdO32uABRad/e6O1qxtRwwHVQlvKfg3qRgU7k+cnlj8ohV726QPY5amKfEjSPDNjmGL0g== + dependencies: + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/custom-resources" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-ecs-patterns@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs-patterns/-/aws-ecs-patterns-1.66.0.tgz#e5e8410a82b24c2b1c4bdafb2951620923d5eeb1" + integrity sha512-jFRQx3/AChlOvyPPSdrtg9GB0FnfWU6ZMKvEK6k40s0aylvzjO28dP+Vjz8/5Nx1NinhRjFDrktVPTQy+Vuk4Q== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.66.0" + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-ecs" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-events-targets" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-route53" "1.66.0" + "@aws-cdk/aws-route53-targets" "1.66.0" + "@aws-cdk/aws-servicediscovery" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-ecs@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecs/-/aws-ecs-1.66.0.tgz#b4419094a45523f188259733a43114ed093e1262" + integrity sha512-uRozIgHyB7pgiqULRKyYe9i/BHKOaDqBZtMmlGm8LwgHBt+EpO8o9mYIqjvsQp09sfu5ip+n3QsQK1Q9yRc7FQ== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.66.0" + "@aws-cdk/aws-autoscaling" "1.66.0" + "@aws-cdk/aws-autoscaling-hooktargets" "1.66.0" + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-ecr" "1.66.0" + "@aws-cdk/aws-ecr-assets" "1.66.0" + "@aws-cdk/aws-elasticloadbalancing" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/aws-route53" "1.66.0" + "@aws-cdk/aws-route53-targets" "1.66.0" + "@aws-cdk/aws-secretsmanager" "1.66.0" + "@aws-cdk/aws-servicediscovery" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/aws-ssm" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-efs@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-efs/-/aws-efs-1.66.0.tgz#5a1263f754882b0ea627aa5f8b33cd26d2c97b43" + integrity sha512-Yx+8mKJRy/3JUa7sM5i0G0/l0N5W/RzWHpkY4+Lh71iG0mKHgbQaBAr9RBZ2bMouAIdqN37dAc+Wd8wE6PjRjg== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-elasticloadbalancing@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancing/-/aws-elasticloadbalancing-1.66.0.tgz#305728ba801af3ab948ce340a56ccce87a342696" + integrity sha512-WNMAUpx+vgStqxviDNDIJw7cTMxar6XSdTq5pKlk5VyQMsWTDM3YhlpmHOxUQhfU2kVPHyFVDSsbbgHT02AzrA== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-elasticloadbalancingv2@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancingv2/-/aws-elasticloadbalancingv2-1.66.0.tgz#dcf1c4a935c5c54f8725bb3f602af3276d51280d" + integrity sha512-Ognxbp4CvnuZdq2fSAnBtWFKXTedlvLluZbiFUzzhKNOQUwJXg1sKVgP7Ssa+oAIywbB7D4ZNHcJ2FZgQxRZSA== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-events-targets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events-targets/-/aws-events-targets-1.66.0.tgz#1d23f8bd2d40d9aa0ad75c94a431d08c0a8e3dbd" + integrity sha512-GMD1YOnfWYxRAqDJGWSqmlERwn8VdTT3/lEwrg+JsRlxptgXHzlRlK/kH58rQ/1iQGAoaqcEElujGDfz1TBFtw== + dependencies: + "@aws-cdk/aws-batch" "1.66.0" + "@aws-cdk/aws-codebuild" "1.66.0" + "@aws-cdk/aws-codepipeline" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-ecs" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kinesis" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/aws-sns-subscriptions" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/aws-stepfunctions" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-events@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events/-/aws-events-1.66.0.tgz#b0ec3f7a39e3414141a76a00031a9538a1970406" + integrity sha512-Ec3hzPO85bk7NMiDDc+W8wFbG1ndw8JNeUugHXVZDMJtdm98vIPfH3w/kpp3kEzSByigXyjd/ou3GvnHOqhDJw== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-iam@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-iam/-/aws-iam-1.66.0.tgz#632a949d4ae2500522b8f99dfa4ac12bdd63dbba" + integrity sha512-rWUQVDgCQ31btE9LnsFnNHkUmZmRBF5COOimX2bItXxNQF2lTSKxThP71E0IGCF0Rl3FkjXLo0yoXnIQGJr08Q== + dependencies: + "@aws-cdk/core" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-kinesis@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kinesis/-/aws-kinesis-1.66.0.tgz#3e529267b10dda907f0efc368b19d59641196657" + integrity sha512-N+MAU+RU0lzt9O4Y8nt1vDtTJJ+vCXNkpz0dsnTb1S4mkeuXAyO8l7+izjBAsPRRmLedVSUwpFsc/58zF3UXcg== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-kms@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kms/-/aws-kms-1.66.0.tgz#363529e38eb8b2069830db93ee172638551258da" + integrity sha512-Gfch2aWIfAO0SyCDryQSoyfqlved9+hMCgLoRVhvj9rAZGt5XELULDxRGVxHuU7CV47HeKXgtUbMk58PyuYFtA== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-lambda@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda/-/aws-lambda-1.66.0.tgz#a38f8d4ae7087a8d1d0b9676bd2531ba819f236a" + integrity sha512-aw1LnCBHDkDSWgZyVyoeDoSSUQvbhHFKvvxEKrDMQ10Iy39vuUXz4xSAK/XaqOYCiDH7W1ubwEK9iKiMHYbPtA== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.66.0" + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-codeguruprofiler" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-efs" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/aws-s3-assets" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-logs@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-logs/-/aws-logs-1.66.0.tgz#0c5564d21ed7583e31c249944a0f4951d3e413ef" + integrity sha512-fUjfDtqyWhdj+0RhBZL9pVTtFH7czxUwfn8eQYTE/453JnGWIA8PpRaQwQfbwLnFf8DPdIjkLfV387mBUlOYAA== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-s3-assets" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-route53-targets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53-targets/-/aws-route53-targets-1.66.0.tgz#757c908611eb76f28bb49ab3d13869b81b134dc4" + integrity sha512-Dy9jOgTrOmaFzBy8ODGdPHlbt9TCC4mE/we0EK74Z1t47N0qZFkEXDJdFxNFYbr6liB1mQAS+3vBz1FfiF51ug== + dependencies: + "@aws-cdk/aws-apigateway" "1.66.0" + "@aws-cdk/aws-cloudfront" "1.66.0" + "@aws-cdk/aws-cognito" "1.66.0" + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-elasticloadbalancing" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-route53" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-route53@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53/-/aws-route53-1.66.0.tgz#fe032be2e6c2574062217b59ab715210f47fb2e3" + integrity sha512-S5wkT/GD7FKhwfh6AwbAmTAeXCw/06OWXjTkW4a6OA4uN/9sJsDIekZRVI8uYp9gjS08IzD3PkttQywtLJr68w== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-s3-assets@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.66.0.tgz#50781fff17c142d7f34b04566d85e31122c2843b" + integrity sha512-YKKLPNclFGdR1gREIE97uNWVrHlK7xcA+yUUc4IL9EjEXQDpX1lKO3UsxZIgC6obUhLujWJN1wFXvVdEzl2i+w== + dependencies: + "@aws-cdk/assets" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-s3" "1.66.0" + "@aws-cdk/core" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-s3@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3/-/aws-s3-1.66.0.tgz#2b8ebc6647eec3967f43fbf6b90896c8595c9944" + integrity sha512-e/LNaqj/kVaMPMetYTKvTJODH1a3IKQeRsmY1yHDKSxIVyCrxDMAYpARxft5l4uehZ5GbJEJUn/Jcs5zL0jSNQ== + dependencies: + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-sam@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sam/-/aws-sam-1.66.0.tgz#9e2bd815c1de8f7980ec7ec31006b5231dd2dcde" + integrity sha512-FI5X7E9sWQZ+ApCKuczBf093LNMnGBjtlMAMy2DdKfobG7TQ2y2oxkItdsINwRmoEldccyROzR9fvN+4sCQeaQ== + dependencies: + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-secretsmanager@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-secretsmanager/-/aws-secretsmanager-1.66.0.tgz#ef683dc8566131236868989a1da0b120017fdb3c" + integrity sha512-mRo4iMN/eqP/Bc63HdBH3n3tsAZ553cdadfmp8ckyYGsqcg8gnRyIuuE75GkqbnXxyQcgLf5aIWTC5+p6RfuXA== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-sam" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-servicediscovery@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-servicediscovery/-/aws-servicediscovery-1.66.0.tgz#a597215f4e6fda960ee05c1610e9cb7f8da0e642" + integrity sha512-dJLQm5xmfe4Xc9koQlG6feYiIRqOC5tbgs9sAHWIP9TB30q7PZVviguQEcuiXESlb/CTtQth4LjK8qkHU55Xqw== + dependencies: + "@aws-cdk/aws-ec2" "1.66.0" + "@aws-cdk/aws-elasticloadbalancingv2" "1.66.0" + "@aws-cdk/aws-route53" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-sns-subscriptions@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns-subscriptions/-/aws-sns-subscriptions-1.66.0.tgz#2373813a11f9e95f5eacd4159a2fe7b0155dd494" + integrity sha512-Z2VVRgBegTgQuF5s9xu36Bb5B22V8CIOMIWx/9MlQzdYrUfO47eutkV5OFI2DZQ9nA5ug8eaTkTHBBRtE2avkg== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-sns@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns/-/aws-sns-1.66.0.tgz#b5e91c9951488ddcde4b96c795ceb781746a8bfb" + integrity sha512-nmB4mjSe7EkWZk+SVg4KrZURplqQI1yc5D8cU2CUF0SDlLtoTb36Y/5GjucinIc9ayD/15HopW8DlPLAafHHrw== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/aws-sqs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-sqs@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sqs/-/aws-sqs-1.66.0.tgz#0dfc21ddaea1dcec09301c04a88e23b37509d4b2" + integrity sha512-glRdZLcKpP+C+6pyiotWA1PAva1Yra0fYrsjO+g/BVzxB4q6WjH5X+kwb7OzRTKs88an8U9YpFwRMxijY2Itxg== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-ssm@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ssm/-/aws-ssm-1.66.0.tgz#b22550279920a2a4b2e98bdfdcf10cf67aed11ed" + integrity sha512-5XNuZF46MjsxAl6rz3jwq5GIaO0QwrSYdKNCSnoL/q5LBjqM25kyD0DpSorwlxkPVMLwUllfYIL8jnO/jWFb+Q== + dependencies: + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-kms" "1.66.0" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/aws-stepfunctions@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-stepfunctions/-/aws-stepfunctions-1.66.0.tgz#9618b85b94226a8b4424a979d0a19831fc859162" + integrity sha512-db5fYiGLiUbaB/+K7+46u3MiOyOWOXbKOp8YEI46QKCH/xotCVhPYoW9JPVoSIPVCWVchlChMsyrKbTxy8fv4g== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.66.0" + "@aws-cdk/aws-events" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/cfnspec@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-1.66.0.tgz#ed400b2fbcafcaf8e93ba504b9c42fce0824608d" + integrity sha512-ZRTikzSzT2ho5XWb5QYCJdgTlonsmmrKCMi9XfeMKxriW7GhOkdOYAS7wdk2ptoYJbMq6numZil/gddAIEMVUw== + dependencies: + md5 "^2.3.0" + +"@aws-cdk/cloud-assembly-schema@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.66.0.tgz#60aca3a6191033ef43ba879c9da6a7dbadbecf25" + integrity sha512-r5Iyy93qAj22OKTSHL1fXJ5axqd+7qMFV6qM1EEy7iW+0yw1rDNP9wMtZGeil4Hbd37xXKAv9KTigD3nmORgMQ== + dependencies: + jsonschema "^1.2.7" + semver "^7.3.2" + +"@aws-cdk/cloudformation-diff@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.66.0.tgz#c45835732b180fa487133c50d5001421bfb6ff24" + integrity sha512-/Qupz+MpJRvqTGRjM+o9T9alIi4bRAW06VOVLXnEWDPBaI2YW/3f2zJyIxZ/inLSBtBmu1StJ/SsLttb6yc0ig== + dependencies: + "@aws-cdk/cfnspec" "1.66.0" colors "^1.4.0" diff "^4.0.2" fast-deep-equal "^3.1.3" string-width "^4.2.0" - table "^5.4.6" + table "^6.0.3" -"@aws-cdk/core@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/core/-/core-1.57.0.tgz#44e19a18f05d0b0742e5d406474000ef2f6f5db9" - integrity sha512-NOE9u2tVwEF+EN5CYaoC34csBgKLA9rjCWCB6R64RPQ2MlhBFCvQxdG2ZO26nOOvH+yv/3zlylM7F546mfQMHg== +"@aws-cdk/core@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/core/-/core-1.66.0.tgz#9a177622f3cd1bdd7f58a3dd4f5dc87b43d534b6" + integrity sha512-sGM/Uz4NrH7RaT88P/YJI039fru1rpZPAmtuZ3+x+ciGjCAPwRYdG99xqsaE8OLXjyDL1QokCeeKVs7oRkTVtA== dependencies: - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - constructs "^3.0.2" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + constructs "^3.0.4" fs-extra "^9.0.1" minimatch "^3.0.4" -"@aws-cdk/custom-resources@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/custom-resources/-/custom-resources-1.57.0.tgz#2a82c28040c205c4e0c57aa2ed27e31db242d5a4" - integrity sha512-EEK2aRFRfC5uKWRQLFLjLApipb0NU07fDuATgdhSd1oqDRUvzvpQGJe0QL411c5rZGZa1aUAU9t/rnY1zmd1yQ== - dependencies: - "@aws-cdk/aws-cloudformation" "1.57.0" - "@aws-cdk/aws-iam" "1.57.0" - "@aws-cdk/aws-lambda" "1.57.0" - "@aws-cdk/aws-logs" "1.57.0" - "@aws-cdk/aws-sns" "1.57.0" - "@aws-cdk/core" "1.57.0" - constructs "^3.0.2" - -"@aws-cdk/cx-api@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-1.57.0.tgz#e6ad6936e1781b821317be60978fb20111cb4d16" - integrity sha512-h2qTTofE8cE1rSZB9ny+7AjjmxEdKoxhq+GsQebQ5NZkrN/Rbc+DL77S/GG53koPG4u/ZoA4UcdLz/JqiGgdPA== - dependencies: - "@aws-cdk/cloud-assembly-schema" "1.57.0" - semver "^7.2.2" - -"@aws-cdk/region-info@1.57.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/region-info/-/region-info-1.57.0.tgz#ae45fcf82fe7c66348c8b7ecfbb738dfb08bde9d" - integrity sha512-U2V2f/PdD2VDGVwGGShb+7dqhmEEmShlOOdvDQvTmAg2SW6HwOt/rsz+va6EzvWV7fmxtFEfMiJVpnheZ1Vwyg== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== +"@aws-cdk/custom-resources@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/custom-resources/-/custom-resources-1.66.0.tgz#8e229c9c6d21f75f191e0e123c47dd20aea78b97" + integrity sha512-7z5VMRruiLAiCowHPLbRge3D+uLJW3Uu8DAAYSF/AYI0yCOIVMVhSRwQwe6GdtAFPjJMJr6vnd2kHX59CGBoHg== + dependencies: + "@aws-cdk/aws-cloudformation" "1.66.0" + "@aws-cdk/aws-iam" "1.66.0" + "@aws-cdk/aws-lambda" "1.66.0" + "@aws-cdk/aws-logs" "1.66.0" + "@aws-cdk/aws-sns" "1.66.0" + "@aws-cdk/core" "1.66.0" + constructs "^3.0.4" + +"@aws-cdk/cx-api@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-1.66.0.tgz#b2327641b407901ecc9cd893c29599d6c27e6770" + integrity sha512-uxhoQFReziEOSf9QEBBRQ9rQroNnMY41ZH+gqgQajMKDNPOZVhZg4K3LMNRF8oCexUfzq/u4rZyOk18rb51IJw== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.66.0" + semver "^7.3.2" + +"@aws-cdk/region-info@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/region-info/-/region-info-1.66.0.tgz#b4650157a7ed5bf850b07a9e52ab896f505f83b8" + integrity sha512-jD+hYu1vYZWDBbuhyF7BJ38/PJKOrCQtd3/pOExrEAgbYPQC4XfAI4iMtXIq06PBPUfMMUDR6jE4yg/KxMEdpA== + +"@aws-cdk/yaml-cfn@1.66.0": + version "1.66.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/yaml-cfn/-/yaml-cfn-1.66.0.tgz#b59b47d6d46010ace69723bd9fb056e146ba94ce" + integrity sha512-0tBR2KgzuvDl1pacO/zw8Bk4yLUeY8aMqGA07Mc55skhhXS4gQSaS7xdS/zL4ejGzsLen6hrLUyPzSnrrd69dA== + dependencies: + yaml "1.10.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.8.3" + "@babel/highlight" "^7.10.4" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.0.tgz#a6fe5db77ebfb61e0da6c5c36aaf14aab07b2b44" - integrity sha512-FGgV2XyPoVtYDvbFXlukEWt13Afka4mBRQ2CoTsHxpgVGO6XfgtT6eI+WyjQRGGTL90IDkIVmme8riFCLZ8lUw== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.10.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.10.0" - "@babel/parser" "^7.10.0" - "@babel/template" "^7.10.0" - "@babel/traverse" "^7.10.0" - "@babel/types" "^7.10.0" + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.6" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.0", "@babel/generator@^7.4.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.0.tgz#a238837896edf35ee5fbfb074548d3256b4bc55d" - integrity sha512-ThoWCJHlgukbtCP79nAK4oLqZt5fVo70AHUni/y8Jotyg5rtJiG2FVl+iJjRNKIyl4hppqztLyAoEWcCvqyOFQ== +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6", "@babel/generator@^7.4.0": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== dependencies: - "@babel/types" "^7.10.0" + "@babel/types" "^7.11.5" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-member-expression-to-functions@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.0.tgz#e8cf57470bfd1247f2b41aa621a527e952efa6f1" - integrity sha512-xKLTpbMkJcvwEsDaTfs9h0IlfUiBLPFfybxaPpPPsQDsZTRg+UKh+86oK7sctHF3OUiRQkb10oS9MXSqgyV6/g== - dependencies: - "@babel/types" "^7.10.0" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.0.tgz#6dcfb565842f43bed31b24f3e4277f18826e5e79" - integrity sha512-HgMd8QKA8wMJs5uK/DYKdyzJAEuGt1zyDp9wLMlMR6LitTQTHPUE+msC82ZsEDwq+U3/yHcIXIngRm9MS4IcIg== - dependencies: - "@babel/types" "^7.10.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-replace-supers@^7.8.6": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.0.tgz#26bc22ee1a35450934d2e2a9b27de10a22fac9d6" - integrity sha512-erl4iVeiANf14JszXP7b69bSrz3e3+qW09pVvEmTWwzRQEOoyb1WFlYCA8d/VjVZGYW8+nGpLh7swf9CifH5wg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.0" - "@babel/helper-optimise-call-expression" "^7.10.0" - "@babel/traverse" "^7.10.0" - "@babel/types" "^7.10.0" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/helpers@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.0.tgz#634400a0977b8dcf7b311761a77ca94ed974b3b6" - integrity sha512-lQtFJoDZAGf/t2PgR6Z59Q2MwjvOGGsxZ0BAlsrgyDhKuMbe63EfbQmVmcLfyTBj8J4UtiadQimcotvYVg/kVQ== - dependencies: - "@babel/template" "^7.10.0" - "@babel/traverse" "^7.10.0" - "@babel/types" "^7.10.0" - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.0", "@babel/parser@^7.4.3": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.0.tgz#8eca3e71a73dd562c5222376b08253436bb4995b" - integrity sha512-fnDUl1Uy2gThM4IFVW4ISNHqr3cJrCsRkSCasFgx0XDO9JcttDS5ytyBc4Cu4X1+fjoo3IVvFbRD6TeFlHJlEQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -834,11 +848,18 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -848,11 +869,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" @@ -862,11 +883,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" @@ -889,37 +910,37 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/template@^7.10.0", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.0.tgz#f15d852ce16cd5fb3e219097a75f662710b249b1" - integrity sha512-aMLEQn5tcG49LEWrsEwxiRTdaJmvLem3+JMCMSeCy2TILau0IDVyWdm/18ACx7XOCady64FLt6KkHy28tkDQHQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.10.0" - "@babel/types" "^7.10.0" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.0", "@babel/traverse@^7.4.3": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.0.tgz#290935529881baf619398d94fd453838bef36740" - integrity sha512-NZsFleMaLF1zX3NxbtXI/JCs2RPOdpGru6UBdGsfhdsDsP+kFF+h2QQJnMJglxk0kc69YmMFs4A44OJY0tKo5g== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.10.0" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.10.0" - "@babel/types" "^7.10.0" +"@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.4.3": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" + lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.8.3", "@babel/types@^7.9.0", "@babel/types@^7.9.5": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.0.tgz#d47d92249e42393a5723aad5319035ae411e3e38" - integrity sha512-t41W8yWFyQFPOAAvPvjyRhejcLGnJTA3iRpFcDbEKwVJ3UnHQePFzLk8GagTsucJlImyNwrGikGsYURrWbQG8w== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -935,6 +956,22 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@eslint/eslintrc@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" @@ -1025,195 +1062,93 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb" - integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw== - dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" - jest-message-util "^25.5.0" - jest-util "^25.5.0" - slash "^3.0.0" - -"@jest/console@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.1.0.tgz#f67c89e4f4d04dbcf7b052aed5ab9c74f915b954" - integrity sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A== +"@jest/console@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.5.0.tgz#89a1c5ae8329907fda842ebc5b475d5c9f935766" + integrity sha512-oh59scth4yf8XUgMJb8ruY7BHm0X5JZDNgGGsVnlOt2XQuq9s2NMllIrN4n70Yds+++bjrTGZ9EoOKraaPKPlg== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" + "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.1.0" - jest-util "^26.1.0" - slash "^3.0.0" - -"@jest/core@^25.5.4": - version "25.5.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" - integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA== - dependencies: - "@jest/console" "^25.5.0" - "@jest/reporters" "^25.5.1" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" - ansi-escapes "^4.2.1" - chalk "^3.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^25.5.0" - jest-config "^25.5.4" - jest-haste-map "^25.5.1" - jest-message-util "^25.5.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-resolve-dependencies "^25.5.4" - jest-runner "^25.5.4" - jest-runtime "^25.5.4" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" - jest-watcher "^25.5.0" - micromatch "^4.0.2" - p-each-series "^2.1.0" - realpath-native "^2.0.0" - rimraf "^3.0.0" + jest-message-util "^26.5.0" + jest-util "^26.5.0" slash "^3.0.0" - strip-ansi "^6.0.0" -"@jest/core@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.1.0.tgz#4580555b522de412a7998b3938c851e4f9da1c18" - integrity sha512-zyizYmDJOOVke4OO/De//aiv8b07OwZzL2cfsvWF3q9YssfpcKfcnZAwDY8f+A76xXSMMYe8i/f/LPocLlByfw== +"@jest/core@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.5.0.tgz#32d7caf46a49d4a14cbbd3a2eb3ef39f149e984d" + integrity sha512-hDtgfzYxnrQn54+0JlbqpXM4+bqDfK0ooMlNE4Nn3VBsB4RbmytAn4/kVVIcMa+aYwRr/fwzWuGJwBETVg1sDw== dependencies: - "@jest/console" "^26.1.0" - "@jest/reporters" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/console" "^26.5.0" + "@jest/reporters" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/transform" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.1.0" - jest-config "^26.1.0" - jest-haste-map "^26.1.0" - jest-message-util "^26.1.0" + jest-changed-files "^26.5.0" + jest-config "^26.5.0" + jest-haste-map "^26.5.0" + jest-message-util "^26.5.0" jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-resolve-dependencies "^26.1.0" - jest-runner "^26.1.0" - jest-runtime "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" - jest-watcher "^26.1.0" + jest-resolve "^26.5.0" + jest-resolve-dependencies "^26.5.0" + jest-runner "^26.5.0" + jest-runtime "^26.5.0" + jest-snapshot "^26.5.0" + jest-util "^26.5.0" + jest-validate "^26.5.0" + jest-watcher "^26.5.0" micromatch "^4.0.2" p-each-series "^2.1.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" - integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== - dependencies: - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" - -"@jest/environment@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.1.0.tgz#378853bcdd1c2443b4555ab908cfbabb851e96da" - integrity sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA== +"@jest/environment@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.5.0.tgz#4381b6b2fc291dcff51e248780196bc035da7190" + integrity sha512-0F3G9EyZU2NAP0/c/5EqVx4DmldQtRxj0gMl3p3ciSCdyMiCyDmpdE7O0mKTSiFDyl1kU4TfgEVf0r0vMkmYcw== dependencies: - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - -"@jest/fake-timers@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" - integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== - dependencies: - "@jest/types" "^25.5.0" - jest-message-util "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - lolex "^5.0.0" + "@jest/fake-timers" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" + jest-mock "^26.5.0" -"@jest/fake-timers@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.1.0.tgz#9a76b7a94c351cdbc0ad53e5a748789f819a65fe" - integrity sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA== +"@jest/fake-timers@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.5.0.tgz#107ceeb580bc42dd6e0843df5bbc92cb4fe9cb00" + integrity sha512-sQK6xUembaZ0qLnZpSjJJuJiKvyrjCJhaYjbmatFpj5+cM8h2D7YEkeEBC26BMzvF1O3tNM9OL7roqyBmom0KA== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" "@sinonjs/fake-timers" "^6.0.1" - jest-message-util "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" - -"@jest/globals@^25.5.2": - version "25.5.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" - integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA== - dependencies: - "@jest/environment" "^25.5.0" - "@jest/types" "^25.5.0" - expect "^25.5.0" - -"@jest/globals@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.1.0.tgz#6cc5d7cbb79b76b120f2403d7d755693cf063ab1" - integrity sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/types" "^26.1.0" - expect "^26.1.0" + "@types/node" "*" + jest-message-util "^26.5.0" + jest-mock "^26.5.0" + jest-util "^26.5.0" -"@jest/reporters@^25.5.1": - version "25.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" - integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw== +"@jest/globals@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.5.0.tgz#b9b7d05ee6722c894ce67aff216ed6b04d3fe187" + integrity sha512-TCKx3XWR9h/yyhQbz0C1sXkK2e8WJOnkP40T9bewNpf2Ahr1UEyKXnCoQO0JCpXFkWGTXBNo1QAgTQ3+LhXfcA== dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" - chalk "^3.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^25.5.1" - jest-resolve "^25.5.1" - jest-util "^25.5.0" - jest-worker "^25.5.0" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^3.1.0" - terminal-link "^2.0.0" - v8-to-istanbul "^4.1.3" - optionalDependencies: - node-notifier "^6.0.0" + "@jest/environment" "^26.5.0" + "@jest/types" "^26.5.0" + expect "^26.5.0" -"@jest/reporters@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.1.0.tgz#08952e90c90282e14ff49e927bdf1873617dae78" - integrity sha512-SVAysur9FOIojJbF4wLP0TybmqwDkdnFxHSPzHMMIYyBtldCW9gG+Q5xWjpMFyErDiwlRuPyMSJSU64A67Pazg== +"@jest/reporters@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.5.0.tgz#07c7742993db9d680bcc6cda58106e8d283d2111" + integrity sha512-lUl5bbTHflDO9dQa85ZTHasPBVsyC48t9sg/VN2wC3OJryclFNqN4Xfo2FgnNl/pzCnzO2MVgMyIij5aNkod2w== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/console" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/transform" "^26.5.0" + "@jest/types" "^26.5.0" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -1224,115 +1159,63 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^26.1.0" - jest-resolve "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" + jest-haste-map "^26.5.0" + jest-resolve "^26.5.0" + jest-util "^26.5.0" + jest-worker "^26.5.0" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^4.1.3" + v8-to-istanbul "^5.0.1" optionalDependencies: - node-notifier "^7.0.0" - -"@jest/source-map@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" - integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" + node-notifier "^8.0.0" -"@jest/source-map@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" - integrity sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA== +"@jest/source-map@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.5.0.tgz#98792457c85bdd902365cd2847b58fff05d96367" + integrity sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" - integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A== - dependencies: - "@jest/console" "^25.5.0" - "@jest/types" "^25.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.1.0.tgz#a93fa15b21ad3c7ceb21c2b4c35be2e407d8e971" - integrity sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw== +"@jest/test-result@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.5.0.tgz#d5bdf2eaf12ceddd359c2506fe806afafecc9a9e" + integrity sha512-CaVXxDQi31LPOsz5/+iajNHQlA1Je/jQ8uYH/lCa6Y/UrkO+sDHeEH3x/inbx06PctVDnTwIlCcBvNNbC4FCvQ== dependencies: - "@jest/console" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/console" "^26.5.0" + "@jest/types" "^26.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.5.4": - version "25.5.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" - integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA== - dependencies: - "@jest/test-result" "^25.5.0" - graceful-fs "^4.2.4" - jest-haste-map "^25.5.1" - jest-runner "^25.5.4" - jest-runtime "^25.5.4" - -"@jest/test-sequencer@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz#41a6fc8b850c3f33f48288ea9ea517c047e7f14e" - integrity sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q== +"@jest/test-sequencer@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.5.0.tgz#617808a1fa869c5181e43a5b841db084746b667e" + integrity sha512-23oofRXqPEy37HyHWIYf7lzzOqtGBkai5erZiL6RgxlyXE7a0lCihf6b5DfAvcD3yUtbXmh3EzpjJDVH57zQrg== dependencies: - "@jest/test-result" "^26.1.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.1.0" - jest-runner "^26.1.0" - jest-runtime "^26.1.0" - -"@jest/transform@^25.5.1": - version "25.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" - integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^25.5.0" - babel-plugin-istanbul "^6.0.0" - chalk "^3.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + "@jest/test-result" "^26.5.0" graceful-fs "^4.2.4" - jest-haste-map "^25.5.1" - jest-regex-util "^25.2.6" - jest-util "^25.5.0" - micromatch "^4.0.2" - pirates "^4.0.1" - realpath-native "^2.0.0" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + jest-haste-map "^26.5.0" + jest-runner "^26.5.0" + jest-runtime "^26.5.0" -"@jest/transform@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.1.0.tgz#697f48898c2a2787c9b4cb71d09d7e617464e509" - integrity sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw== +"@jest/transform@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.5.0.tgz#16404eaddf6034fe713da37b236756fc6b956db0" + integrity sha512-Kt4WciOruTyTkJ2DZ+xtZiejRj3v22BrXCYZoGRbI0N6Q6tt2HdsWrrEtn6nlK24QWKC389xKkVk4Xr2gWBZQA== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" babel-plugin-istanbul "^6.0.0" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^26.1.0" + jest-haste-map "^26.5.0" jest-regex-util "^26.0.0" - jest-util "^26.1.0" + jest-util "^26.5.0" micromatch "^4.0.2" pirates "^4.0.1" slash "^3.0.0" @@ -1349,29 +1232,23 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jest/types@^26.1.0": - version "26.1.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.1.0.tgz#f8afaaaeeb23b5cad49dd1f7779689941dcb6057" - integrity sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ== +"@jest/types@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.5.0.tgz#163f6e00c5ac9bb6fc91c3802eaa9d0dd6e1474a" + integrity sha512-nH9DFLqaIhB+RVgjivemvMiFSWw/BKwbZGxBAMv8CCTvUyFoK8RwHhAlmlXIvMBrf5Z3YQ4p9cq3Qh9EDctGvA== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jsii/spec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.5.0.tgz#55a6d7395862c287cff18cf6cf8d166b715d1e49" - integrity sha512-gmqCGiAuXd8XFwy2uqqwoA0VBhADbrPuuowK7Qfy44ZIzv2gm0txlSkKA5elwRFdqlYHCAl6GYcimZemm6x/rQ== - dependencies: - jsonschema "^1.2.6" - -"@jsii/spec@^1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.9.0.tgz#6aad644f106f77aa757b005a744d0d17c24a34a5" - integrity sha512-UrRjk4F+HPr3MtttgbxwJ9AG2hhZCjxsPOuqGQl+8iJ7C1nVNLOAbxZKKbQKd8vu6B04Gl1I/9yu2iTiF2Zr5w== +"@jsii/spec@^1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@jsii/spec/-/spec-1.13.0.tgz#3389e047065b6b7f7fda238a90d58ac577c811bf" + integrity sha512-BeDBk9OqsTjo5Oe5MrXT+dt0WqjzPN5DsYedmnhP65oceuBdx3VKS/nKGQ8DOB+9587Go8i9L+nri1wwQz3bpA== dependencies: - jsonschema "^1.2.6" + jsonschema "^1.2.7" "@lerna/add@3.21.0": version "3.21.0" @@ -2072,20 +1949,20 @@ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@octokit/auth-token@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.1.tgz#375d79eebd03750e6a9b0299e80b8167c7c85655" - integrity sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a" + integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.2.tgz#e876aafe68d7f9b6c6d80bf29458403f9afe7b2b" - integrity sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ== + version "6.0.8" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.8.tgz#91b07e236fdb69929c678c6439f7a560dc6058ac" + integrity sha512-MuRrgv+bM4Q+e9uEvxAB/Kf+Sj0O2JAOBA131uo1o6lgdq1iS8ejKwtqHgdfY91V3rN9R/hdGKFiQYMzVzVBEQ== dependencies: - "@octokit/types" "^4.0.1" - is-plain-object "^3.0.0" - universal-user-agent "^5.0.0" + "@octokit/types" "^5.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -2122,32 +1999,32 @@ once "^1.4.0" "@octokit/request-error@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.1.tgz#49bd71e811daffd5bdd06ef514ca47b5039682d1" - integrity sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0" + integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw== dependencies: - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.1" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.2.0": - version "5.4.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.4.tgz#dc57e85e86284fa016d0c1a2701a70a10cec4ff2" - integrity sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ== + version "5.4.9" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.9.tgz#0a46f11b82351b3416d3157261ad9b1558c43365" + integrity sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^4.0.1" + "@octokit/types" "^5.0.0" deprecation "^2.0.0" - is-plain-object "^3.0.0" - node-fetch "^2.3.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" once "^1.4.0" - universal-user-agent "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/rest@^16.28.4": - version "16.43.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" - integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== + version "16.43.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" + integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/plugin-paginate-rest" "^1.1.1" @@ -2173,17 +2050,17 @@ dependencies: "@types/node" ">= 8" -"@octokit/types@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.0.2.tgz#4e5be1ed1d39532f6b1bc5ad7ce52086a83cf379" - integrity sha512-+4X6qfhT/fk/5FD66395NrFLxCzD6FsGlpPwfwvnukdyfYbhiZB/FJltiT1XM5Q63rGGBSf9FPaNV3WpNHm54A== +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b" + integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ== dependencies: "@types/node" ">= 8" -"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.7.2": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" - integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== dependencies: type-detect "4.0.8" @@ -2202,10 +2079,10 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^5.0.2" -"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" - integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.2.0.tgz#fcff83ab86f83b5498f4a967869c079408d9b5eb" + integrity sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -2216,26 +2093,15 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@types/aws-lambda@^8.10.57": - version "8.10.57" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.57.tgz#39ca3bbe52c5b4e27dc83c2a3b5ed434834568b9" - integrity sha512-LMOA9bJLerYoe2KvzHugfaLTa0jUPWrqwxq5VUZ/ZuAMKLJm6oNdCio38vw8jWEIAkPR3P6mBIwnU1DPgelAKg== - -"@types/babel__core@^7.0.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" +"@types/aws-lambda@^8.10.63": + version "8.10.63" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.63.tgz#3316174e7a23b8505d1b7bdc979a5c3030d5e203" + integrity sha512-XEE+3iJxyeCmZTUoHZRbnxSy8aMxXXwrALgsoDBGcgkbll+8bDfuk4XbIJ9Oaec/Pxee6rno6SGMiV6EbqhF+A== -"@types/babel__core@^7.1.7": - version "7.1.7" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" - integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.10" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" + integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2244,55 +2110,44 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" + integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" - integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" + integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== dependencies: "@babel/types" "^7.3.0" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/fs-extra@^8.1.0": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.1.tgz#1e49f22d09aa46e19b51c0b013cb63d0d923a068" - integrity sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w== +"@types/fs-extra@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918" + integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg== dependencies: "@types/node" "*" "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" @@ -2304,9 +2159,9 @@ "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" - integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2323,18 +2178,25 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.4": - version "26.0.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.5.tgz#23a8eecf4764a770ea8d3a0d1ea16b96c822035d" - integrity sha512-heU+7w8snfwfjtcj2H458aTx3m5unIToOJhx75ebHilBiiQ39OIdA18WkG4LP08YKeAoWAGvWg8s+22w/PeJ6w== +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@26.x", "@types/jest@^26.0.10": + version "26.0.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.14.tgz#078695f8f65cb55c5a98450d65083b2b73e5a3f3" + integrity sha512-Hz5q8Vu0D288x3iWXePSn53W7hAjP0H7EQ6QvDO9c7t46mR0lNOLlfuwQ+JkVxuhygHzlzPX+0jKdA3ZgSh+Vg== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" "@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== "@types/json5@^0.0.29": version "0.0.29" @@ -2351,20 +2213,10 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= -"@types/node@*", "@types/node@>= 8": - version "14.0.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b" - integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA== - -"@types/node@10.17.5": - version "10.17.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.5.tgz#c1920150f7b90708a7d0f3add12a06bc9123c055" - integrity sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA== - -"@types/node@^14.0.12", "@types/node@^14.0.14": - version "14.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" - integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== +"@types/node@*", "@types/node@>= 8", "@types/node@^14.6.1": + version "14.11.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256" + integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA== "@types/nodeunit@^0.0.31": version "0.0.31" @@ -2376,140 +2228,91 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@types/prettier@^1.19.0": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== - "@types/prettier@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz#b6e98083f13faa1e5231bfa3bdb1b0feff536b6d" - integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5" + integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ== -"@types/semver@^7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.1.tgz#7a9a5d595b6d873f338c867dcef64df289468cfa" - integrity sha512-ooD/FJ8EuwlDKOI6D9HWxgIgJjMg2cuziXm/42npDC8y4NjxplBUn9loewZiBNCt44450lHAU0OSb51/UqXeag== - dependencies: - "@types/node" "*" +"@types/semver@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb" + integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ== -"@types/sinon@^9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.4.tgz#e934f904606632287a6e7f7ab0ce3f08a0dad4b1" - integrity sha512-sJmb32asJZY6Z2u09bl0G2wglSxDlROlAejCjsnor+LzBMz17gu8IU7vKC/vWDnv9zEq2wqADHVXFjf4eE8Gdw== +"@types/sinon@^9.0.8": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.8.tgz#1ed0038d356784f75b086104ef83bfd4130bb81b" + integrity sha512-IVnI820FZFMGI+u1R+2VdRaD/82YIQTdqLYC9DLPszZuynAJDtCvCtCs3bmyL66s7FqRM3+LPX7DhHnVTaagDw== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" - integrity sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" + integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== -"@types/yargs@^15.0.0", "@types/yargs@^15.0.5": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== +"@types/yargs@^15.0.0", "@types/yargs@^15.0.7": + version "15.0.7" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.7.tgz#dad50a7a234a35ef9460737a56024287a3de1d2b" + integrity sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.5.0.tgz#e7736e0808b5fb947a5f9dd949ae6736a7226b84" - integrity sha512-m4erZ8AkSjoIUOf8s4k2V1xdL2c1Vy0D3dN6/jC9d7+nEqjY3gxXCkgi3gW/GAxPaA4hV8biaCoTVdQmfAeTCQ== - dependencies: - "@typescript-eslint/experimental-utils" "3.5.0" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/eslint-plugin@^3.6.1": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.0.tgz#0f91aa3c83d019591719e597fbdb73a59595a263" - integrity sha512-4OEcPON3QIx0ntsuiuFP/TkldmBGXf0uKxPQlGtS/W2F3ndYm8Vgdpj/woPJkzUc65gd3iR+qi3K8SDQP/obFg== +"@typescript-eslint/eslint-plugin@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== dependencies: - "@typescript-eslint/experimental-utils" "3.7.0" + "@typescript-eslint/experimental-utils" "3.10.1" debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.5.0.tgz#d09f9ffb890d1b15a7ffa9975fae92eee05597c4" - integrity sha512-zGNOrVi5Wz0jcjUnFZ6QUD0MCox5hBuVwemGCew2qJzUX5xPoyR+0EzS5qD5qQXL/vnQ8Eu+nv03tpeFRwLrDg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/typescript-estree" "3.5.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.0.tgz#0ee21f6c48b2b30c63211da23827725078d5169a" - integrity sha512-xpfXXAfZqhhqs5RPQBfAFrWDHoNxD5+sVB5A46TF58Bq1hRfVROrWHcQHHUM9aCBdy9+cwATcvCbRg8aIRbaHQ== +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.7.0" - "@typescript-eslint/typescript-estree" "3.7.0" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.5.0.tgz#9ff8c11877c48df24e10e19d7bf542ee0359500d" - integrity sha512-sU07VbYB70WZHtgOjH/qfAp1+OwaWgrvD1Km1VXqRpcVxt971PMTU7gJtlrCje0M+Sdz7xKAbtiyIu+Y6QdnVA== +"@typescript-eslint/parser@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.5.0" - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/typescript-estree" "3.5.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/types@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.5.0.tgz#4e3d2a2272268d8ec3e3e4a37152a64956682639" - integrity sha512-Dreqb5idi66VVs1QkbAwVeDmdJG+sDtofJtKwKCZXIaBsINuCN7Jv5eDIHrS0hFMMiOvPH9UuOs4splW0iZe4Q== - -"@typescript-eslint/types@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.0.tgz#09897fab0cb95479c01166b10b2c03c224821077" - integrity sha512-reCaK+hyKkKF+itoylAnLzFeNYAEktB0XVfSQvf0gcVgpz1l49Lt6Vo9x4MVCCxiDydA0iLAjTF/ODH0pbfnpg== - -"@typescript-eslint/typescript-estree@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.5.0.tgz#dfc895db21a381b84f24c2a719f5bf9c600dcfdc" - integrity sha512-Na71ezI6QP5WVR4EHxwcBJgYiD+Sre9BZO5iJK2QhrmRPo/42+b0no/HZIrdD1sjghzlYv7t+7Jis05M1uMxQg== - dependencies: - "@typescript-eslint/types" "3.5.0" - "@typescript-eslint/visitor-keys" "3.5.0" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/typescript-estree@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.0.tgz#66872e6da120caa4b64e6b4ca5c8702afc74738d" - integrity sha512-xr5oobkYRebejlACGr1TJ0Z/r0a2/HUf0SXqPvlgUMwiMqOCu/J+/Dr9U3T0IxpE5oLFSkqMx1FE/dKaZ8KsOQ== +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== dependencies: - "@typescript-eslint/types" "3.7.0" - "@typescript-eslint/visitor-keys" "3.7.0" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" debug "^4.1.1" glob "^7.1.6" is-glob "^4.0.1" @@ -2517,17 +2320,10 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.5.0.tgz#73c1ea2582f814735e4afdc1cf6f5e3af78db60a" - integrity sha512-7cTp9rcX2sz9Z+zua9MCOX4cqp5rYyFD5o8LlbSpXrMTXoRdngTtotRZEkm8+FNMHPWYFhitFK+qt/brK8BVJQ== - dependencies: - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/visitor-keys@3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.0.tgz#ac0417d382a136e4571a0b0dcfe52088cb628177" - integrity sha512-k5PiZdB4vklUpUX4NBncn5RBKty8G3ihTY+hqJsCdMuD0v4jofI5xuqwnVcWxfv6iTm2P/dfEa2wMUnsUY8ODw== +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== dependencies: eslint-visitor-keys "^1.1.0" @@ -2548,10 +2344,10 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.0, abab@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== abbrev@1: version "1.1.1" @@ -2580,14 +2376,6 @@ abstract-leveldown@~6.2.1: level-supports "~1.0.0" xtend "~4.0.0" -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -2597,34 +2385,19 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== acorn-walk@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== - -acorn@^6.0.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -acorn@^7.1.0, acorn@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" - integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.2.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== add-stream@^1.0.0: version "1.0.0" @@ -2653,17 +2426,17 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2715,11 +2488,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" any-promise@^1.0.0: @@ -2783,18 +2555,18 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" -archiver@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-4.0.2.tgz#43c72865eadb4ddaaa2fb74852527b6a450d927c" - integrity sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ== +archiver@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.0.2.tgz#b2c435823499b1f46eb07aa18e7bcb332f6ca3fc" + integrity sha512-Tq3yV/T4wxBsD2Wign8W9VQKhaUxzzRmjEiSoOK0SLqPgDP/N1TKdYyBeIEu56T4I9iO4fKTTR0mN9NWkBA0sg== dependencies: archiver-utils "^2.1.0" async "^3.2.0" buffer-crc32 "^0.2.1" - glob "^7.1.6" readable-stream "^3.6.0" - tar-stream "^2.1.2" - zip-stream "^3.0.1" + readdir-glob "^1.0.0" + tar-stream "^2.1.4" + zip-stream "^4.0.0" archy@^1.0.0: version "1.0.0" @@ -2841,11 +2613,6 @@ array-differ@^2.0.3: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - array-filter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" @@ -2900,11 +2667,6 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -2928,15 +2690,22 @@ assign-symbols@^1.0.0: integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types@0.x.x: - version "0.13.3" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" - integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +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.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -2976,19 +2745,20 @@ available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: dependencies: array-filter "^1.0.0" -aws-cdk@1.57.0: - version "1.57.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-1.57.0.tgz#e3b5b99784234c7a8897f26ffbf59bd28b22f628" - integrity sha512-gU2ZdkRXdcU9COHclEsxtqW1scFfDxgGJbjnP9rQQTi1VKQTKSKBmWiw+9MkTzRyibcFArYDhfgMyr5Ky0Xirw== - dependencies: - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/cloudformation-diff" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - "@aws-cdk/region-info" "1.57.0" - archiver "^4.0.2" - aws-sdk "^2.715.0" +aws-cdk@1.66.0: + version "1.66.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-1.66.0.tgz#dff532ed0832691556463ca48aaaa52bd403ec6d" + integrity sha512-q1HebwAfHMT1XkeF9JIUbLmQ4Ii/lbehlSdGSTtqwWrbhxCeExeaJiqtN1C48RTf4GxJKMXtoVkl+Gx+DmGSKQ== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/cloudformation-diff" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + "@aws-cdk/region-info" "1.66.0" + "@aws-cdk/yaml-cfn" "1.66.0" + archiver "^5.0.2" + aws-sdk "^2.739.0" camelcase "^6.0.0" - cdk-assets "1.57.0" + cdk-assets "1.66.0" colors "^1.4.0" decamelize "^4.0.0" fs-extra "^9.0.1" @@ -2997,13 +2767,12 @@ aws-cdk@1.57.0: minimatch ">=3.0" promptly "^3.0.3" proxy-agent "^3.1.1" - semver "^7.2.2" + semver "^7.3.2" source-map-support "^0.5.19" - table "^5.4.6" - uuid "^8.2.0" + table "^6.0.3" + uuid "^8.3.0" wrap-ansi "^7.0.0" - yaml "^1.10.0" - yargs "^15.3.1" + yargs "^16.0.3" aws-sdk-mock@^5.1.0: version "5.1.0" @@ -3014,55 +2783,10 @@ aws-sdk-mock@^5.1.0: sinon "^9.0.1" traverse "^0.6.6" -aws-sdk@^2.637.0: - version "2.694.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.694.0.tgz#2112fe1be74a8d7bf52db01a05086ca95fb5effa" - integrity sha512-wGPQCf8pWO0UzPsWUfzAFA6KY+VMB8+qfj17QIccmLHS6S59vXxRh3J7V4UiMpl3ixd9FoXw5heAG9d6bRzFZg== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.15.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - uuid "3.3.2" - xml2js "0.4.19" - -aws-sdk@^2.693.0: - version "2.705.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.705.0.tgz#6c42851f0efdfe2685eb2dab72740a01742468bd" - integrity sha512-eD3YD3UgCdFIYlkAVYW1rbriKSNHm7nsZbYsBuo91pbyq4XYT56w2oTyNECorYPoq//Y4LQTTx8cbOuEjsNi3w== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.15.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - uuid "3.3.2" - xml2js "0.4.19" - -aws-sdk@^2.709.0: - version "2.709.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.709.0.tgz#33b0c0fe8b9420c65610545394be047ac2d93c8f" - integrity sha512-F3sKXsCiutj9RglVXdqb/XJ3Ko3G+pX081Nf1YjVJpLydwE2v16FGxrLqE5pqyWMDeUf5nZHnBoMuOYD8ip+Kw== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.15.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - uuid "3.3.2" - xml2js "0.4.19" - -aws-sdk@^2.715.0: - version "2.717.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.717.0.tgz#be68dab4d9016944814ced76580459c4738763ed" - integrity sha512-UTDDXF3kUqhaSMAMe6YcOdp3qK7KMikDIAH5SgUPgTUqC4NRSBmLKPdKkXT0ZwAaEOf9QnD1nAV8+WmVRUX+hw== +aws-sdk@^2.637.0, aws-sdk@^2.739.0, aws-sdk@^2.741.0: + version "2.767.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.767.0.tgz#9863c8bfd5990106b95f38e9345a547fee782470" + integrity sha512-soPZxjNpat0CtuIqm54GO/FDT4SZTlQG0icSptWYfMFYdkXe8b0tJqaPssNn9TzlgoWDCNTdaoepM6TN0rNHkQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -3080,34 +2804,32 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" - integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== -babel-jest@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" - integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== +awslint@1.66.0: + version "1.66.0" + resolved "https://registry.yarnpkg.com/awslint/-/awslint-1.66.0.tgz#642b29585d8a2c717ea411919521c3d9ea581091" + integrity sha512-vpsLqzydkwv/0HLo692Ehu4PR0eR0nHIGPwEsy7gJpNLdnWu+0+Vc1EbJv0BueuM5Wu+PJE0NLxC1wOfCAKDUg== dependencies: - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.5.0" - chalk "^3.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" + "@jsii/spec" "^1.13.0" + camelcase "^6.0.0" + colors "^1.4.0" + fs-extra "^9.0.1" + jsii-reflect "^1.13.0" + yargs "^16.0.3" -babel-jest@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.1.0.tgz#b20751185fc7569a0f135730584044d1cb934328" - integrity sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg== +babel-jest@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.5.0.tgz#afe11a083b4e584f63e9de29d2075cb96f42d2a4" + integrity sha512-Cy16ZJrds81C+JASaOIGNlpCeqW3PTOq36owv+Zzwde5NiWz+zNduwxUNF57vxc/3SnIWo8HHqTczhN8GLoXTw== dependencies: - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/transform" "^26.5.0" + "@jest/types" "^26.5.0" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.1.0" + babel-preset-jest "^26.5.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" @@ -3123,33 +2845,25 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" - integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz#c6a774da08247a28285620a64dfadbd05dd5233a" - integrity sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw== +babel-plugin-jest-hoist@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz#3916b3a28129c29528de91e5784a44680db46385" + integrity sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-preset-current-node-syntax@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" - integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== +babel-preset-current-node-syntax@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz#826f1f8e7245ad534714ba001f84f7e906c3b615" + integrity sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -3158,21 +2872,13 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -babel-preset-jest@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" - integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== - dependencies: - babel-plugin-jest-hoist "^25.5.0" - babel-preset-current-node-syntax "^0.1.2" - -babel-preset-jest@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz#612f714e5b457394acfd863793c564cbcdb7d1c1" - integrity sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w== +babel-preset-jest@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz#f1b166045cd21437d1188d29f7fba470d5bdb0e7" + integrity sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA== dependencies: - babel-plugin-jest-hoist "^26.1.0" - babel-preset-current-node-syntax "^0.1.2" + babel-plugin-jest-hoist "^26.5.0" + babel-preset-current-node-syntax "^0.1.3" balanced-match@^1.0.0: version "1.0.0" @@ -3219,10 +2925,10 @@ bind-obj-methods@^2.0.0: resolved "https://registry.yarnpkg.com/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz#0178140dbe7b7bb67dc74892ace59bc0247f06f0" integrity sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw== -bl@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a" - integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ== +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== dependencies: buffer "^5.5.0" inherits "^2.0.4" @@ -3269,13 +2975,6 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3322,11 +3021,6 @@ buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3500,19 +3194,19 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cdk-assets@1.57.0: - version "1.57.0" - resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-1.57.0.tgz#a682a7feca928a497616fc55c87e13dc0f44905b" - integrity sha512-xUFuYXebdY8ADH8XYv2JEx+BTs/FjpZh0MS+uwj25IlULdvMXoZwOtsGtazh3CjprNWdJjbDb8QTDkxhwoD0LA== +cdk-assets@1.66.0: + version "1.66.0" + resolved "https://registry.yarnpkg.com/cdk-assets/-/cdk-assets-1.66.0.tgz#ec1f9f8d75196275506c736c7a7b69910fe4ada9" + integrity sha512-2LHUHTilbWI9IWVRI+xcC8LoueXKDWmVcQOaqaSBVh/OTGH56eURP2+9JsuKhFJR5JcRVP0jTFUdlvBzYRQfsw== dependencies: - "@aws-cdk/cloud-assembly-schema" "1.57.0" - "@aws-cdk/cx-api" "1.57.0" - archiver "^4.0.2" - aws-sdk "^2.715.0" + "@aws-cdk/cloud-assembly-schema" "1.66.0" + "@aws-cdk/cx-api" "1.66.0" + archiver "^5.0.2" + aws-sdk "^2.739.0" glob "^7.1.6" - yargs "^15.3.1" + yargs "^16.0.3" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3530,9 +3224,9 @@ chalk@^3.0.0: supports-color "^7.1.0" chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + 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" @@ -3547,7 +3241,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charenc@~0.0.1: +charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= @@ -3596,13 +3290,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.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-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -3626,6 +3313,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.1.tgz#a4cb67aad45cd83d8d05128fc9f4d8fbb887e6b3" + integrity sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -3655,10 +3351,10 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codemaker@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/codemaker/-/codemaker-1.9.0.tgz#0c4a56b15be0dc4748429cfb8a587d70efb0a831" - integrity sha512-RQCMZB5TputppZELnV7NQRgFStOLTBcfKlXbgwwuVjSieZnKR/zrXnjqouLRQyeuUIC/9BIcRYNh3biHd4iS1Q== +codemaker@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/codemaker/-/codemaker-1.13.0.tgz#1b6885305644c6487d68c3f5329f4d1d1c5ee1b3" + integrity sha512-Tr6GcuAYJHAPHMhU5OaRhzJkeJdSqkPL/R8gpSvlQa0EQ2C44W5cWqXYMLy09+pkEVmVm5suMc406opObV1N3A== dependencies: camelcase "^6.0.0" decamelize "^4.0.0" @@ -3726,48 +3422,43 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.12.1, commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - 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.29.1: - version "0.29.1" - resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.29.1.tgz#fdbf5970ca23600f4a27487e30eed43b66b83ef5" - integrity sha512-DafPdNYFXoEhsSiR4O+dJ45UJBfDL4cBTks4B+agKiaWt7qjG0bIhg5xuCE0RqU71ikJcBIf4/sRHh9vYQVF8Q== +commonmark@^0.29.2: + version "0.29.2" + resolved "https://registry.yarnpkg.com/commonmark/-/commonmark-0.29.2.tgz#e7bd5582400f2a45421f2f64eca19fc89cbd4e1b" + integrity sha512-spe43MvEIaPpHss1T7z4yQaFQfLGmMu+yvCwv6xqhELIwkG/ZGgDpxOPzKxnuYzYT2c+aziCCc8m2rBVLA7jUA== dependencies: - entities "~1.1.1" + entities "~2.0" mdurl "~1.0.1" - minimist "~1.2.0" + minimist ">=1.2.2" string.prototype.repeat "^0.2.0" -compare-func@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.4.tgz#6b07c4c5e8341119baf44578085bda0f4a823516" - integrity sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q== +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" - dot-prop "^3.0.0" + dot-prop "^5.1.0" component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compress-commons@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-3.0.0.tgz#833944d84596e537224dd91cf92f5246823d4f1d" - integrity sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg== +compress-commons@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.1.tgz#c5fa908a791a0c71329fba211d73cd2a32005ea8" + integrity sha512-xZm9o6iikekkI0GnXCmAl3LQGZj5TBDj0zLowsqi7tJtEa3FMGSEcHcqrSJIrOAk1UG/NBbDn/F1q+MG/p/EsA== dependencies: buffer-crc32 "^0.2.13" - crc32-stream "^3.0.1" + crc32-stream "^4.0.0" normalize-path "^3.0.0" - readable-stream "^2.3.7" + readable-stream "^3.6.0" concat-map@0.0.1: version "0.0.1" @@ -3807,22 +3498,22 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -constructs@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/constructs/-/constructs-3.0.3.tgz#76687d6e3783b0b6864d72aaae5b0bacd824d52e" - integrity sha512-JrYLpTlz92Un1jxkwoGiOiGoDjzIWtxo64sLC5FD4mQN1H9mAqZNvgxWYWaJIiWUXNkl5L5sO3GFf6peTj7UMQ== +constructs@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-3.0.5.tgz#31c0b8ff9e9ace002378f06bdd3d3482fb229bf0" + integrity sha512-ZAw7X6B7voC2t1A2KNNAcekr7xQuHYPLeouyxBplW6ltyZ6VaWRgwtYmpena57whFVEpo7woZuB8jvqFCcaiMg== contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -conventional-changelog-angular@^5.0.10, conventional-changelog-angular@^5.0.3: - version "5.0.10" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz#5cf7b00dd315b6a6a558223c80d5ef24ddb34205" - integrity sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA== +conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.3: + version "5.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz#99a3ca16e4a5305e0c2c2fae3ef74fd7631fc3fb" + integrity sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-atom@^2.0.7: @@ -3832,13 +3523,13 @@ conventional-changelog-atom@^2.0.7: dependencies: q "^1.5.1" -conventional-changelog-cli@^2.0.34: - version "2.0.34" - resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.0.34.tgz#3d9da6011aaaf24f331b606ddc5087a6b811464b" - integrity sha512-HDDIhhpsMKiiAfH/mbj7wApgN7uA33Nk4hISY3/7ijlfqXc/bmP3v4o3Yialoxz0iTBibc94xi6kfTH7XIvwDw== +conventional-changelog-cli@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.1.0.tgz#5da5be32203ca8382815afc85b7f9151115d5e97" + integrity sha512-hZ8EcpxV4LcGOZwH+U5LJQDnyA4o/uyUdmIGzmFZMB4caujavvDBo/iTgVihk0m1QKkEhJgulagrILSm1JCakA== dependencies: add-stream "^1.0.0" - conventional-changelog "^3.1.21" + conventional-changelog "^3.1.23" lodash "^4.17.15" meow "^7.0.0" tempfile "^3.0.0" @@ -3855,12 +3546,12 @@ conventional-changelog-config-spec@2.1.0: resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz#874a635287ef8b581fd8558532bf655d4fb59f2d" integrity sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ== -conventional-changelog-conventionalcommits@4.3.0, conventional-changelog-conventionalcommits@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz#c4205a659f7ca9d7881f29ee78a4e7d6aeb8b3c2" - integrity sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg== +conventional-changelog-conventionalcommits@4.4.0, conventional-changelog-conventionalcommits@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz#8d96687141c9bbd725a89b95c04966d364194cd4" + integrity sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" @@ -3883,19 +3574,19 @@ conventional-changelog-core@^3.1.6: read-pkg-up "^3.0.0" through2 "^3.0.0" -conventional-changelog-core@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.7.tgz#6b5cdadda4430895cc4a75a73dd8b36e322ab346" - integrity sha512-UBvSrQR2RdKbSQKh7RhueiiY4ZAIOW3+CSWdtKOwRv+KxIMNFKm1rOcGBFx0eA8AKhGkkmmacoTWJTqyz7Q0VA== +conventional-changelog-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.0.tgz#d8befd1e1f5126bf35a17668276cc8c244650469" + integrity sha512-8+xMvN6JvdDtPbGBqA7oRNyZD4od1h/SIzrWqHcKZjitbVXrFpozEeyn4iI4af1UwdrabQpiZMaV07fPUTGd4w== dependencies: add-stream "^1.0.0" - conventional-changelog-writer "^4.0.16" + conventional-changelog-writer "^4.0.17" conventional-commits-parser "^3.1.0" dateformat "^3.0.0" get-pkg-repo "^1.0.0" git-raw-commits "2.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^4.0.0" + git-semver-tags "^4.1.0" lodash "^4.17.15" normalize-package-data "^2.3.5" q "^1.5.1" @@ -3932,12 +3623,12 @@ conventional-changelog-jquery@^3.0.10: dependencies: q "^1.5.1" -conventional-changelog-jshint@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.7.tgz#955a69266951cd31e8afeb3f1c55e0517fdca943" - integrity sha512-qHA8rmwUnLiIxANJbz650+NVzqDIwNtc0TcpIa0+uekbmKHttidvQ1dGximU3vEDdoJVKFgR3TXFqYuZmYy9ZQ== +conventional-changelog-jshint@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.8.tgz#3fff4df8cb46037f77b9dc3f8e354c7f99332f13" + integrity sha512-hB/iI0IiZwnZ+seYI+qEQ4b+EMQSEC8jGIvhO2Vpz1E5p8FgLz75OX8oB1xJWl+s4xBMB6f8zJr0tC/BL7YOjw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-preset-loader@^2.1.1, conventional-changelog-preset-loader@^2.3.4: @@ -3945,12 +3636,12 @@ conventional-changelog-preset-loader@^2.1.1, conventional-changelog-preset-loade resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== -conventional-changelog-writer@^4.0.16, conventional-changelog-writer@^4.0.6: - version "4.0.16" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz#ca10f2691a8ea6d3c2eb74bd35bcf40aa052dda5" - integrity sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ== +conventional-changelog-writer@^4.0.17, conventional-changelog-writer@^4.0.6: + version "4.0.17" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz#4753aaa138bf5aa59c0b274cb5937efcd2722e21" + integrity sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" conventional-commits-filter "^2.0.6" dateformat "^3.0.0" handlebars "^4.7.6" @@ -3961,21 +3652,21 @@ conventional-changelog-writer@^4.0.16, conventional-changelog-writer@^4.0.6: split "^1.0.0" through2 "^3.0.0" -conventional-changelog@3.1.21, conventional-changelog@^3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.21.tgz#4a774e6bf503acfd7e4685bb750da8c0eccf1e0d" - integrity sha512-ZGecVZPEo3aC75VVE4nu85589dDhpMyqfqgUM5Myq6wfKWiNqhDJLSDMsc8qKXshZoY7dqs1hR0H/15kI/G2jQ== +conventional-changelog@3.1.23, conventional-changelog@^3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.23.tgz#d696408021b579a3814aba79b38729ed86478aea" + integrity sha512-sScUu2NHusjRC1dPc5p8/b3kT78OYr95/Bx7Vl8CPB8tF2mG1xei5iylDTRjONV5hTlzt+Cn/tBWrKdd299b7A== dependencies: - conventional-changelog-angular "^5.0.10" + conventional-changelog-angular "^5.0.11" conventional-changelog-atom "^2.0.7" conventional-changelog-codemirror "^2.0.7" - conventional-changelog-conventionalcommits "^4.3.0" - conventional-changelog-core "^4.1.7" + conventional-changelog-conventionalcommits "^4.4.0" + conventional-changelog-core "^4.2.0" conventional-changelog-ember "^2.0.8" conventional-changelog-eslint "^3.0.8" conventional-changelog-express "^2.0.5" conventional-changelog-jquery "^3.0.10" - conventional-changelog-jshint "^2.0.7" + conventional-changelog-jshint "^2.0.8" conventional-changelog-preset-loader "^2.3.4" conventional-commits-filter@^2.0.2, conventional-commits-filter@^2.0.6: @@ -3999,17 +3690,17 @@ conventional-commits-parser@^3.0.3, conventional-commits-parser@^3.1.0: through2 "^3.0.0" trim-off-newlines "^1.0.0" -conventional-recommended-bump@6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.9.tgz#49ee74f52fbafcc63e89e2297d020279fea318f0" - integrity sha512-DpRmW1k8CpRrcsXHOPGgHgOd4BMGiq2gtXAveGM8B9pSd9b4r4WKnqp1Fd0vkDtk8l973mIk8KKKUYnKRr9SFw== +conventional-recommended-bump@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.10.tgz#ac2fb3e31bad2aeda80086b345bf0c52edd1d1b3" + integrity sha512-2ibrqAFMN3ZA369JgVoSbajdD/BHN6zjY7DZFKTHzyzuQejDUCjQ85S5KHxCRxNwsbDJhTPD5hOKcis/jQhRgg== dependencies: concat-stream "^2.0.0" conventional-changelog-preset-loader "^2.3.4" conventional-commits-filter "^2.0.6" conventional-commits-parser "^3.1.0" git-raw-commits "2.0.0" - git-semver-tags "^4.0.0" + git-semver-tags "^4.1.0" meow "^7.0.0" q "^1.5.1" @@ -4088,10 +3779,10 @@ cp-file@^6.2.0: pify "^4.0.1" safe-buffer "^5.0.1" -crc32-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85" - integrity sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w== +crc32-stream@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.0.tgz#05b7ca047d831e98c215538666f372b756d91893" + integrity sha512-tyMw2IeUX6t9jhgXI6um0eKfWq4EIDpfv5m7GX4Jzp7eVelQ360xd8EPXJhp2mHwLQIkqlnMLjzqSZI3a+0wRw== dependencies: crc "^3.4.4" readable-stream "^3.4.0" @@ -4111,7 +3802,7 @@ cross-spawn@^4: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -4131,12 +3822,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -crypt@~0.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.1, cssom@^0.4.4: +cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -4146,7 +3837,7 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0, cssstyle@^2.2.0: +cssstyle@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -4184,15 +3875,6 @@ data-uri-to-buffer@1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -4232,11 +3914,11 @@ debug@3.1.0: ms "2.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@^3.1.0: version "3.2.6" @@ -4269,9 +3951,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== decode-uri-component@^0.2.0: version "0.2.0" @@ -4284,21 +3966,21 @@ dedent@^0.7.0: integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-equal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" - integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.4.tgz#6b0b407a074666033169df3acaf128e1c6f3eab6" + integrity sha512-BUfaXrVoCfgkOQY/b09QdO9L3XNoF2XH0A3aY9IQwQL/ZjLOe8FQgCNVl1wiolhsFo8kFdO9zdPViCPbmaJA5w== dependencies: - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" es-get-iterator "^1.1.0" is-arguments "^1.0.4" is-date-object "^1.0.2" - is-regex "^1.0.5" + is-regex "^1.1.1" isarray "^2.0.5" - object-is "^1.1.2" + object-is "^1.1.3" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" + side-channel "^1.0.3" which-boxed-primitive "^1.0.1" which-collection "^1.0.1" which-typed-array "^1.1.2" @@ -4342,7 +4024,7 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -4438,10 +4120,10 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== -diff-sequences@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" - integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg== +diff-sequences@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd" + integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q== diff@^1.3.2: version "1.4.0" @@ -4487,13 +4169,6 @@ domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -4501,19 +4176,19 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= +dot-prop@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" -dot-prop@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" dotgitignore@^2.1.0: version "2.1.0" @@ -4531,9 +4206,9 @@ dreamopt@~0.6.0: wordwrap ">=0.0.2" duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -4545,10 +4220,10 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -dynalite@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/dynalite/-/dynalite-3.2.0.tgz#dd9eeac7fd69e36ff71d11cb2e7920c1f4110f5b" - integrity sha512-ONNyuMiOX1ETiVYc4bj/Bd7lA78Su8VgO1EdLEhSpJr+xJ6DjzTvKZlmIq3mmuuEvc8VyFkjif2eEzV4SPZIOg== +dynalite@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/dynalite/-/dynalite-3.2.1.tgz#24f0f8db65ffe910b4e70b5cde3cbbd2203e1381" + integrity sha512-PgpagYk1ecSzhjGuFMuFHEuWJ0BNddqTrG89ra+Jhs0zgjr/IPoNCmrAdBUumy2Ds2hx8V3aNuLKpPbaGcVwtQ== dependencies: async "^2.6.3" big.js "^5.2.2" @@ -4576,6 +4251,11 @@ ejs@^2.5.2: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +emittery@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" + integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -4597,11 +4277,11 @@ encoding-down@^6.2.0: level-errors "^2.0.0" encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" @@ -4617,10 +4297,10 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@~2.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== env-paths@^2.2.0: version "2.2.0" @@ -4628,9 +4308,9 @@ env-paths@^2.2.0: integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== envinfo@^7.3.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.1.tgz#93c26897225a00457c75e734d354ea9106a72236" - integrity sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ== + version "7.7.3" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" + integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== err-code@^1.0.0: version "1.1.2" @@ -4652,21 +4332,39 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-get-iterator@^1.1.0: version "1.1.0" @@ -4712,6 +4410,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escalade@^3.0.2, escalade@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== + escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -4727,10 +4430,10 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@1.x.x, escodegen@^1.11.1, escodegen@^1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== +escodegen@1.x.x, escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -4739,14 +4442,6 @@ escodegen@1.x.x, escodegen@^1.11.1, escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" -eslint-import-resolver-node@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" @@ -4755,15 +4450,15 @@ eslint-import-resolver-node@^0.3.4: debug "^2.6.9" resolve "^1.13.1" -eslint-import-resolver-typescript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.0.0.tgz#e95f126cc12d3018b9cc11692b4dbfd3e17d3ea6" - integrity sha512-bT5Frpl8UWoHBtY25vKUOMoVIMlJQOMefHLyQ4Tz3MQpIZ2N6yYKEEIHMo38bszBNUuMBW6M3+5JNYxeiGFH4w== +eslint-import-resolver-typescript@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.3.0.tgz#0870988098bc6c6419c87705e6b42bee89425445" + integrity sha512-MHSXvmj5e0SGOOBhBbt7C+fWj1bJbtSYFAD85Xeg8nvUtuooTod2HQb8bfhE9f5QyyNxEfgzqOYFCvmdDIcCuw== dependencies: debug "^4.1.1" + glob "^7.1.6" is-glob "^4.0.1" - resolve "^1.12.0" - tiny-glob "^0.2.6" + resolve "^1.17.0" tsconfig-paths "^3.9.0" eslint-module-utils@^2.6.0: @@ -4775,16 +4470,16 @@ eslint-module-utils@^2.6.0: pkg-dir "^2.0.0" eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" @@ -4800,105 +4495,43 @@ eslint-plugin-license-header@^0.2.0: dependencies: requireindex "^1.2.0" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +eslint-utils@^2.0.0, 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== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -eslint-visitor-keys@^1.2.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@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -eslint@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f" - integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g== +eslint@^7.7.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.10.0.tgz#494edb3e4750fb791133ca379e786a8f648c72b9" + integrity sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.2.0" - espree "^7.1.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -4912,7 +4545,7 @@ eslint@^7.4.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -4930,23 +4563,14 @@ esm@^3.2.5: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" - integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== dependencies: - acorn "^7.2.0" + acorn "^7.4.0" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.2.0" + eslint-visitor-keys "^1.3.0" esprima@3.x.x: version "3.1.3" @@ -4958,29 +4582,29 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.2.0: +esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: version "2.0.3" @@ -5020,26 +4644,10 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" - integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -5069,28 +4677,16 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba" - integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA== - dependencies: - "@jest/types" "^25.5.0" - ansi-styles "^4.0.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-regex-util "^25.2.6" - -expect@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.1.0.tgz#8c62e31d0f8d5a8ebb186ee81473d15dd2fbf7c8" - integrity sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw== +expect@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.5.0.tgz#089c0cc4d6c545c7388ddefffa0f1e2e8e38d282" + integrity sha512-oIOy3mHWjnF5ZICuaui5kdtJZQ+D7XHWyUQDxk1WhIRCkcIYc24X23bOfikgCNU6i9wcSqLQhwPOqeRp09naxg== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" ansi-styles "^4.0.0" - jest-get-type "^26.0.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.5.0" + jest-message-util "^26.5.0" jest-regex-util "^26.0.0" extend-shallow@^2.0.1: @@ -5146,12 +4742,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== - -fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "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== @@ -5197,7 +4788,7 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0, figures@^3.1.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== @@ -5359,9 +4950,9 @@ from2@^2.1.0: readable-stream "^2.0.0" fromentries@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" - integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" + integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== fs-access@^1.0.1: version "1.0.1" @@ -5389,16 +4980,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - fs-extra@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" @@ -5483,7 +5064,7 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, 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== @@ -5522,9 +5103,9 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -5579,26 +5160,26 @@ git-semver-tags@^2.0.3: meow "^4.0.0" semver "^6.0.0" -git-semver-tags@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.0.0.tgz#a9dd58a0dd3561a4a9898b7e9731cf441c98fc38" - integrity sha512-LajaAWLYVBff+1NVircURJFL8TQ3EMIcLAfHisWYX/nPoMwnTYfWAznQDmMujlLqoD12VtLmoSrF1sQ5MhimEQ== +git-semver-tags@^4.0.0, git-semver-tags@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.0.tgz#0146c9bc24ee96104c99f443071c8c2d7dc848e3" + integrity sha512-TcxAGeo03HdErzKzi4fDD+xEL7gi8r2Y5YSxH6N2XYdVSV5UkBwfrt7Gqo1b+uSHCjy/sa9Y6BBBxxFLxfbhTg== dependencies: meow "^7.0.0" semver "^6.0.0" git-up@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" - integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.2.tgz#10c3d731051b366dc19d3df454bfca3f77913a7c" + integrity sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ== dependencies: is-ssh "^1.3.0" parse-url "^5.0.0" git-url-parse@^11.1.2: - version "11.1.2" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" - integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== + version "11.3.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.3.0.tgz#1515b4574c4eb2efda7d25cc50b29ce8beaefaae" + integrity sha512-i3XNa8IKmqnUqWBcdWBjOcnyZYfN3C1WRvnKI6ouFWwsXCZEnlgbwbm55ZpJ3OJMhfEP/ryFhqW8bBhej3C5Ug== dependencies: git-up "^4.0.0" @@ -5653,11 +5234,6 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -globalyzer@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" - integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== - globby@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -5672,11 +5248,6 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" -globrex@^0.1.1: - 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.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.2, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -5705,11 +5276,11 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" hard-rejection@^2.1.0: @@ -5727,7 +5298,7 @@ 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-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -5783,9 +5354,9 @@ hasha@^3.0.0: is-stream "^1.0.1" hasha@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" - integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== + version "5.2.1" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.1.tgz#0e5b492aa40de3819e80955f221d2fccef55b5aa" + integrity sha512-x15jnRSHTi3VmH+oHtVb9kgU/HuKOK8mjK8iCL3dPQXh4YJlUb9YSI8ZLiiqLAIvY2wuDIlZYZppy8vB2XISkQ== dependencies: is-stream "^2.0.0" type-fest "^0.8.0" @@ -5800,13 +5371,6 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -5880,13 +5444,20 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@1.1.13, ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -5927,7 +5498,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -6029,29 +5600,10 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== ip-regex@^2.1.0: version "2.1.0" @@ -6097,15 +5649,15 @@ is-boolean-object@^1.0.0: resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-buffer@^1.1.5, 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.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^2.0.0: version "2.0.0" @@ -6157,9 +5709,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -6224,6 +5776,11 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-number-object@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" @@ -6246,6 +5803,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -6258,24 +5820,22 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-set@^2.0.1: version "2.0.1" @@ -6283,9 +5843,9 @@ is-set@^2.0.1: integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== is-ssh@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" - integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" + integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== dependencies: protocols "^1.1.0" @@ -6353,7 +5913,7 @@ is-windows@^1.0.0, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.1: +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== @@ -6392,11 +5952,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6515,113 +6070,59 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c" - integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw== +jest-changed-files@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.5.0.tgz#181b901368decb4fc21d3cace9b4c4819232b667" + integrity sha512-RAHoXqxa7gO1rZz88qpsLpzJ2mQU12UaFWadacKHuMbBZwFK+yl0j9YoD9Y/wBpv1ILG2SdCuxFHggX+9VU7qA== dependencies: - "@jest/types" "^25.5.0" - execa "^3.2.0" - throat "^5.0.0" - -jest-changed-files@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.1.0.tgz#de66b0f30453bca2aff98e9400f75905da495305" - integrity sha512-HS5MIJp3B8t0NRKGMCZkcDUZo36mVRvrDETl81aqljT1S9tqiHRSpyoOvWg9ZilzZG9TDisDNaN1IXm54fLRZw== - dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" execa "^4.0.0" throat "^5.0.0" -jest-cli@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" - integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw== - dependencies: - "@jest/core" "^25.5.4" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^25.5.4" - jest-util "^25.5.0" - jest-validate "^25.5.0" - prompts "^2.0.1" - realpath-native "^2.0.0" - yargs "^15.3.1" - -jest-cli@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.1.0.tgz#eb9ec8a18cf3b6aa556d9deaa9e24be12b43ad87" - integrity sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw== +jest-cli@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.5.0.tgz#4404fb5cbdfb250946160374d5e3fc9655f9b57f" + integrity sha512-bI0h6GQGbyN0SSZu3nPilwrkrZ8dBC93erwTiEoJ+kGjtNuXsB183hTZ0HCiHLzf88oE0SQB1hYp8RgyytH+Bg== dependencies: - "@jest/core" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/core" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/types" "^26.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" + jest-config "^26.5.0" + jest-util "^26.5.0" + jest-validate "^26.5.0" prompts "^2.0.1" - yargs "^15.3.1" + yargs "^16.0.3" -jest-config@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" - integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg== +jest-config@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.5.0.tgz#3959e47223496e2ae2605e073578a359cab99445" + integrity sha512-OM6eXIEmQXAuonCk8aNPMRjPFcKWa3IIoSlq5BPgIflmQBzM/COcI7XsWSIEPWPa9WcYTJBWj8kNqEYjczmIFw== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.5.4" - "@jest/types" "^25.5.0" - babel-jest "^25.5.1" - chalk "^3.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^25.5.0" - jest-environment-node "^25.5.0" - jest-get-type "^25.2.6" - jest-jasmine2 "^25.5.4" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" - micromatch "^4.0.2" - pretty-format "^25.5.0" - realpath-native "^2.0.0" - -jest-config@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.1.0.tgz#9074f7539acc185e0113ad6d22ed589c16a37a73" - integrity sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.1.0" - "@jest/types" "^26.1.0" - babel-jest "^26.1.0" + "@jest/test-sequencer" "^26.5.0" + "@jest/types" "^26.5.0" + babel-jest "^26.5.0" chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.1.0" - jest-environment-node "^26.1.0" - jest-get-type "^26.0.0" - jest-jasmine2 "^26.1.0" + jest-environment-jsdom "^26.5.0" + jest-environment-node "^26.5.0" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.5.0" jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" + jest-resolve "^26.5.0" + jest-util "^26.5.0" + jest-validate "^26.5.0" micromatch "^4.0.2" - pretty-format "^26.1.0" + pretty-format "^26.5.0" -jest-diff@^25.2.1, jest-diff@^25.5.0: +jest-diff@^25.2.1: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== @@ -6631,22 +6132,15 @@ jest-diff@^25.2.1, jest-diff@^25.5.0: jest-get-type "^25.2.6" pretty-format "^25.5.0" -jest-diff@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.1.0.tgz#00a549bdc936c9691eb4dc25d1fbd78bf456abb2" - integrity sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg== +jest-diff@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.5.0.tgz#bd01cef2d00b2668a0207ef47ab8eb1e33613253" + integrity sha512-CmDMMPkVMxrrh0Dv/4M9kh1tsYsZnYTQMMTvIFpePBSk9wMVfcyfg30TCq+oR9AzGbw8vsI50Gk1HmlMMlhoJg== dependencies: chalk "^4.0.0" - diff-sequences "^26.0.0" - jest-get-type "^26.0.0" - pretty-format "^26.1.0" - -jest-docblock@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" - integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== - dependencies: - detect-newline "^3.0.0" + diff-sequences "^26.5.0" + jest-get-type "^26.3.0" + pretty-format "^26.5.0" jest-docblock@^26.0.0: version "26.0.0" @@ -6655,594 +6149,322 @@ jest-docblock@^26.0.0: dependencies: detect-newline "^3.0.0" -jest-each@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" - integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA== +jest-each@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.5.0.tgz#39197a9d1abdd32ff5b8a9931507ab117c551c02" + integrity sha512-+oO3ykDgypHSyyK2xOsh8XDUwMtg3HoJ4wMNFNHxhcACFbUgaCOfLy+eTCn5pIKhtigU3BmkYt7k3MtTb5pJOQ== dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" - jest-get-type "^25.2.6" - jest-util "^25.5.0" - pretty-format "^25.5.0" - -jest-each@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.1.0.tgz#e35449875009a22d74d1bda183b306db20f286f7" - integrity sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA== - dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" chalk "^4.0.0" - jest-get-type "^26.0.0" - jest-util "^26.1.0" - pretty-format "^26.1.0" - -jest-environment-jsdom@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" - integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== - dependencies: - "@jest/environment" "^25.5.0" - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - jsdom "^15.2.1" - -jest-environment-jsdom@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz#9dc7313ffe1b59761dad1fedb76e2503e5d37c5b" - integrity sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" - jsdom "^16.2.2" - -jest-environment-node@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" - integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA== - dependencies: - "@jest/environment" "^25.5.0" - "@jest/fake-timers" "^25.5.0" - "@jest/types" "^25.5.0" - jest-mock "^25.5.0" - jest-util "^25.5.0" - semver "^6.3.0" - -jest-environment-node@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.1.0.tgz#8bb387b3eefb132eab7826f9a808e4e05618960b" - integrity sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg== - dependencies: - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/types" "^26.1.0" - jest-mock "^26.1.0" - jest-util "^26.1.0" + jest-get-type "^26.3.0" + jest-util "^26.5.0" + pretty-format "^26.5.0" + +jest-environment-jsdom@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.5.0.tgz#f9a6726402fde787632a69df5ff3390ab04337a3" + integrity sha512-Xuqh3bx8egymaJR566ECkiztIIVOIWWPGIxo++ziWyCOqQChUguRCH1hRXBbfINPbb/SRFe7GCD+SunaUgTmCw== + dependencies: + "@jest/environment" "^26.5.0" + "@jest/fake-timers" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" + jest-mock "^26.5.0" + jest-util "^26.5.0" + jsdom "^16.4.0" + +jest-environment-node@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.5.0.tgz#3f49ba40abe87209df96f7991015cac996e04563" + integrity sha512-LaYl/ek5mb1VDP1/+jMH2N1Ec4fFUhSYmc8EZqigBgMov/2US8U5l7D3IlOf78e+wARUxPxUpTcybVVzAOu3jg== + dependencies: + "@jest/environment" "^26.5.0" + "@jest/fake-timers" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" + jest-mock "^26.5.0" + jest-util "^26.5.0" jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-get-type@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" - integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg== +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-haste-map@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" - integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== +jest-haste-map@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.5.0.tgz#ba4c48dbf69e0529709bd0d76660d87eefce820a" + integrity sha512-AjB1b53uqN7Cf2VN80x0wJajVZ+BMZC+G2CmWoG143faaMw7IhIcs3FTPuSgOx7cn3/bag7lgCq93naAvLO6EQ== dependencies: - "@jest/types" "^25.5.0" - "@types/graceful-fs" "^4.1.2" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-serializer "^25.5.0" - jest-util "^25.5.0" - jest-worker "^25.5.0" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" - which "^2.0.2" - optionalDependencies: - fsevents "^2.1.2" - -jest-haste-map@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.1.0.tgz#ef31209be73f09b0d9445e7d213e1b53d0d1476a" - integrity sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA== - dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" "@types/graceful-fs" "^4.1.2" + "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" - jest-serializer "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" + jest-regex-util "^26.0.0" + jest-serializer "^26.5.0" + jest-util "^26.5.0" + jest-worker "^26.5.0" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" - which "^2.0.2" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" - integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.5.0" - "@jest/source-map" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" - co "^4.6.0" - expect "^25.5.0" - is-generator-fn "^2.0.0" - jest-each "^25.5.0" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-runtime "^25.5.4" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - pretty-format "^25.5.0" - throat "^5.0.0" - -jest-jasmine2@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz#4dfe349b2b2d3c6b3a27c024fd4cb57ac0ed4b6f" - integrity sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ== +jest-jasmine2@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.5.0.tgz#49d57db63f49a183813263b41e61e2a5f988e6a3" + integrity sha512-NOA6PLORHTRTROOp5VysKCUVpFAjMMXUS1Xw7FvTMeYK5Ewx4rpxhFqiJ7JT4pENap9g9OuXo4cWR/MwCDTEeQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.1.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/environment" "^26.5.0" + "@jest/source-map" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.1.0" + expect "^26.5.0" is-generator-fn "^2.0.0" - jest-each "^26.1.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" - jest-runtime "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - pretty-format "^26.1.0" + jest-each "^26.5.0" + jest-matcher-utils "^26.5.0" + jest-message-util "^26.5.0" + jest-runtime "^26.5.0" + jest-snapshot "^26.5.0" + jest-util "^26.5.0" + pretty-format "^26.5.0" throat "^5.0.0" -jest-junit@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-11.0.1.tgz#944b997b7318efd1f021b4f0fce4937f8d66f392" - integrity sha512-stgc0mBoiSg/F9qWd4KkmR3K7Nk2u+M/dc1oup7gxz9mrzGcEaU2YL9/0QscVqqg3IOaA1P5ZXtozG/XR6j6nw== +jest-junit@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-11.1.0.tgz#79cd53948e44d62b2b30fa23ea0d7a899d2c8d7a" + integrity sha512-c2LFOyKY7+ZxL5zSu+WHmHfsJ2wqbOpeYJ4Uu26yMhFxny2J2NQj6AVS7M+Eaxji9Q/oIDDK5tQy0DGzDp9xOw== dependencies: mkdirp "^1.0.4" strip-ansi "^5.2.0" uuid "^3.3.3" xml "^1.0.1" -jest-leak-detector@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" - integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA== +jest-leak-detector@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.5.0.tgz#a5671ffbc6308e45ad31b42cb2ef0722488a4e57" + integrity sha512-xZHvvTBbj3gUTtunLjPqP594BT6IUEpwA0AQpEQjVR8eBq8+R3qgU/KhoAcVcV0iqRM6pXtX7hKPZ5mLdynVSQ== dependencies: - jest-get-type "^25.2.6" - pretty-format "^25.5.0" + jest-get-type "^26.3.0" + pretty-format "^26.5.0" -jest-leak-detector@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz#039c3a07ebcd8adfa984b6ac015752c35792e0a6" - integrity sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw== - dependencies: - jest-get-type "^26.0.0" - pretty-format "^26.1.0" - -jest-matcher-utils@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" - integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== - dependencies: - chalk "^3.0.0" - jest-diff "^25.5.0" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" - -jest-matcher-utils@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz#cf75a41bd413dda784f022de5a65a2a5c73a5c92" - integrity sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA== +jest-matcher-utils@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.5.0.tgz#1195d6a35c4c710ad286b775b966f3fdb7a2102d" + integrity sha512-QgbbxqFT8wiTi4o/7MWj2vHlcmMjACG8vnJ9pJ7svVDmkzEnTUGdHXWLKB1aZhbnyXetMNRF+TSMcDS9aGfuzA== dependencies: chalk "^4.0.0" - jest-diff "^26.1.0" - jest-get-type "^26.0.0" - pretty-format "^26.1.0" + jest-diff "^26.5.0" + jest-get-type "^26.3.0" + pretty-format "^26.5.0" -jest-message-util@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" - integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== +jest-message-util@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.5.0.tgz#87f8c440dace55095d247442638c70b892836895" + integrity sha512-UEOqdoTfX0AFyReL4q5N3CfDBWt+AtQzeszZuuGapU39vwEk90rTSBghCA/3FFEZzvGfH2LE4+0NaBI81Cu2Ow== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^25.5.0" - "@types/stack-utils" "^1.0.1" - chalk "^3.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - slash "^3.0.0" - stack-utils "^1.0.1" - -jest-message-util@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.1.0.tgz#52573fbb8f5cea443c4d1747804d7a238a3e233c" - integrity sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.1.0" - "@types/stack-utils" "^1.0.1" + "@jest/types" "^26.5.0" + "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^2.0.2" -jest-mock@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" - integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== - dependencies: - "@jest/types" "^25.5.0" - -jest-mock@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.1.0.tgz#80d8286da1f05a345fbad1bfd6fa49a899465d3d" - integrity sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw== +jest-mock@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.5.0.tgz#56efcea2dfd550b77ceb5ef280cf8c6114ef32db" + integrity sha512-8D1UmbnmjdkvTdYygTW26KZr95Aw0/3gEmMZQWkxIEAgEESVDbwDG8ygRlXSY214x9hFjtKezvfQUp36Ogl75w== dependencies: - "@jest/types" "^26.1.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + "@jest/types" "^26.5.0" + "@types/node" "*" -jest-regex-util@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" - integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^26.0.0: version "26.0.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" - integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw== - dependencies: - "@jest/types" "^25.5.0" - jest-regex-util "^25.2.6" - jest-snapshot "^25.5.1" - -jest-resolve-dependencies@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.1.0.tgz#1ce36472f864a5dadf7dc82fa158e1c77955691b" - integrity sha512-fQVEPHHQ1JjHRDxzlLU/buuQ9om+hqW6Vo928aa4b4yvq4ZHBtRSDsLdKQLuCqn5CkTVpYZ7ARh2fbA8WkRE6g== +jest-resolve-dependencies@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.5.0.tgz#6c4a863685e6c63b225e903c6006a70fb8ecac0a" + integrity sha512-2e3YdS+dlTY00s0CEiMAa7Ap/mPfPaQV7d6Fzp7BQqHXO/2QhXn/yVTxnxR+dOIo/NOh7pqXZTQSn+2iWwPQQA== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" jest-regex-util "^26.0.0" - jest-snapshot "^26.1.0" + jest-snapshot "^26.5.0" -jest-resolve@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" - integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ== +jest-resolve@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.5.0.tgz#31f68344dd88af70f00bc8bb531de6687565c680" + integrity sha512-c34L8Lrw4fFzRiCLzwePziKRfHitjsAnY15ID0e9Se4ISikmZ5T9icLEFAGHnfaxfb+9r8EKdrbg89gjRdrQvw== dependencies: - "@jest/types" "^25.5.0" - browser-resolve "^1.11.3" - chalk "^3.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.1" - read-pkg-up "^7.0.1" - realpath-native "^2.0.0" - resolve "^1.17.0" - slash "^3.0.0" - -jest-resolve@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.1.0.tgz#a530eaa302b1f6fa0479079d1561dd69abc00e68" - integrity sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg== - dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" chalk "^4.0.0" + escalade "^3.1.0" graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.1" - jest-util "^26.1.0" - read-pkg-up "^7.0.1" + jest-pnp-resolver "^1.2.2" + jest-util "^26.5.0" resolve "^1.17.0" slash "^3.0.0" -jest-runner@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" - integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg== +jest-runner@^26.5.0: + version "26.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.5.1.tgz#a56c1e1fbed7470ae69ebd5456ba4d4443c8701f" + integrity sha512-gFHXehvMZD8qwNzaIl2MDFFI99m4kKk06H2xh2u4IkC+tHYIJjE5J175l9cbL3RuU2slfS2m57KZgcPZfbTavQ== dependencies: - "@jest/console" "^25.5.0" - "@jest/environment" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - chalk "^3.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^25.5.4" - jest-docblock "^25.3.0" - jest-haste-map "^25.5.1" - jest-jasmine2 "^25.5.4" - jest-leak-detector "^25.5.0" - jest-message-util "^25.5.0" - jest-resolve "^25.5.1" - jest-runtime "^25.5.4" - jest-util "^25.5.0" - jest-worker "^25.5.0" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runner@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.1.0.tgz#457f7fc522afe46ca6db1dccf19f87f500b3288d" - integrity sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw== - dependencies: - "@jest/console" "^26.1.0" - "@jest/environment" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/console" "^26.5.0" + "@jest/environment" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" chalk "^4.0.0" + emittery "^0.7.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.1.0" + jest-config "^26.5.0" jest-docblock "^26.0.0" - jest-haste-map "^26.1.0" - jest-jasmine2 "^26.1.0" - jest-leak-detector "^26.1.0" - jest-message-util "^26.1.0" - jest-resolve "^26.1.0" - jest-runtime "^26.1.0" - jest-util "^26.1.0" - jest-worker "^26.1.0" + jest-haste-map "^26.5.0" + jest-leak-detector "^26.5.0" + jest-message-util "^26.5.0" + jest-resolve "^26.5.0" + jest-runtime "^26.5.0" + jest-util "^26.5.0" + jest-worker "^26.5.0" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" - integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ== - dependencies: - "@jest/console" "^25.5.0" - "@jest/environment" "^25.5.0" - "@jest/globals" "^25.5.2" - "@jest/source-map" "^25.5.0" - "@jest/test-result" "^25.5.0" - "@jest/transform" "^25.5.1" - "@jest/types" "^25.5.0" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^25.5.4" - jest-haste-map "^25.5.1" - jest-message-util "^25.5.0" - jest-mock "^25.5.0" - jest-regex-util "^25.2.6" - jest-resolve "^25.5.1" - jest-snapshot "^25.5.1" - jest-util "^25.5.0" - jest-validate "^25.5.0" - realpath-native "^2.0.0" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^15.3.1" - -jest-runtime@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.1.0.tgz#45a37af42115f123ed5c51f126c05502da2469cb" - integrity sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA== - dependencies: - "@jest/console" "^26.1.0" - "@jest/environment" "^26.1.0" - "@jest/fake-timers" "^26.1.0" - "@jest/globals" "^26.1.0" - "@jest/source-map" "^26.1.0" - "@jest/test-result" "^26.1.0" - "@jest/transform" "^26.1.0" - "@jest/types" "^26.1.0" +jest-runtime@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.5.0.tgz#c9b3eeb5ead70710ea17f6058df405cac31bb926" + integrity sha512-CujjQWpMcsvSg0L+G3iEz6s7Th5IbiZseAaw/5R7Eb+IfnJdyPdjJ+EoXNV8n07snvW5nZTwV9QIfy6Vjris8A== + dependencies: + "@jest/console" "^26.5.0" + "@jest/environment" "^26.5.0" + "@jest/fake-timers" "^26.5.0" + "@jest/globals" "^26.5.0" + "@jest/source-map" "^26.5.0" + "@jest/test-result" "^26.5.0" + "@jest/transform" "^26.5.0" + "@jest/types" "^26.5.0" "@types/yargs" "^15.0.0" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.1.0" - jest-haste-map "^26.1.0" - jest-message-util "^26.1.0" - jest-mock "^26.1.0" + jest-config "^26.5.0" + jest-haste-map "^26.5.0" + jest-message-util "^26.5.0" + jest-mock "^26.5.0" jest-regex-util "^26.0.0" - jest-resolve "^26.1.0" - jest-snapshot "^26.1.0" - jest-util "^26.1.0" - jest-validate "^26.1.0" + jest-resolve "^26.5.0" + jest-snapshot "^26.5.0" + jest-util "^26.5.0" + jest-validate "^26.5.0" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.3.1" + yargs "^16.0.3" -jest-serializer@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" - integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== +jest-serializer@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.5.0.tgz#f5425cc4c5f6b4b355f854b5f0f23ec6b962bc13" + integrity sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA== dependencies: + "@types/node" "*" graceful-fs "^4.2.4" -jest-serializer@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.1.0.tgz#72a394531fc9b08e173dc7d297440ac610d95022" - integrity sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w== - dependencies: - graceful-fs "^4.2.4" - -jest-snapshot@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" - integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^25.5.0" - "@types/prettier" "^1.19.0" - chalk "^3.0.0" - expect "^25.5.0" - graceful-fs "^4.2.4" - jest-diff "^25.5.0" - jest-get-type "^25.2.6" - jest-matcher-utils "^25.5.0" - jest-message-util "^25.5.0" - jest-resolve "^25.5.1" - make-dir "^3.0.0" - natural-compare "^1.4.0" - pretty-format "^25.5.0" - semver "^6.3.0" - -jest-snapshot@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.1.0.tgz#c36ed1e0334bd7bd2fe5ad07e93a364ead7e1349" - integrity sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw== +jest-snapshot@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.5.0.tgz#2b76366e2d621775f39733e5764492b2e44b0bcd" + integrity sha512-WTNJef67o7cCvwAe5foVCNqG3MzIW/CyU4FZvMrhBPZsJeXwfBY7kfOlydZigxtcytnvmNE2pqznOfD5EcQgrQ== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" + "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.0.0" chalk "^4.0.0" - expect "^26.1.0" + expect "^26.5.0" graceful-fs "^4.2.4" - jest-diff "^26.1.0" - jest-get-type "^26.0.0" - jest-haste-map "^26.1.0" - jest-matcher-utils "^26.1.0" - jest-message-util "^26.1.0" - jest-resolve "^26.1.0" + jest-diff "^26.5.0" + jest-get-type "^26.3.0" + jest-haste-map "^26.5.0" + jest-matcher-utils "^26.5.0" + jest-message-util "^26.5.0" + jest-resolve "^26.5.0" natural-compare "^1.4.0" - pretty-format "^26.1.0" + pretty-format "^26.5.0" semver "^7.3.2" -jest-util@26.x, jest-util@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.1.0.tgz#80e85d4ba820decacf41a691c2042d5276e5d8d8" - integrity sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg== +jest-util@^26.1.0, jest-util@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.5.0.tgz#f4e0fb80cf82db127d68c7c5b2749a427a80b450" + integrity sha512-CSQ0uzE7JdHDCQo3K8jlyWRIF2xNLdpu9nbjo8okGDanaNsF7WonhusFvjOg7QiWn1SThe7wFRh8Jx2ls1Gx4Q== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" + "@types/node" "*" chalk "^4.0.0" graceful-fs "^4.2.4" is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" - integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== - dependencies: - "@jest/types" "^25.5.0" - chalk "^3.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - make-dir "^3.0.0" - -jest-validate@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" - integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ== +jest-validate@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.5.0.tgz#6e417ec5066e315752da1350797a89fc5907f97a" + integrity sha512-603+CHUJD4nAZ+tY/A+wu3g8KEcBey2a7YOMU9W8e4u7mCezhaDasw20ITaZHoR2R2MZhThL6jApPSj0GvezrQ== dependencies: - "@jest/types" "^25.5.0" - camelcase "^5.3.1" - chalk "^3.0.0" - jest-get-type "^25.2.6" - leven "^3.1.0" - pretty-format "^25.5.0" - -jest-validate@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.1.0.tgz#942c85ad3d60f78250c488a7f85d8f11a29788e7" - integrity sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw== - dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" camelcase "^6.0.0" chalk "^4.0.0" - jest-get-type "^26.0.0" + jest-get-type "^26.3.0" leven "^3.1.0" - pretty-format "^26.1.0" + pretty-format "^26.5.0" -jest-watcher@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" - integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q== +jest-watcher@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.5.0.tgz#3aedd339ee3dfb5801e71ae9a00da08369679317" + integrity sha512-INLKhpc9QbO5zy2HkS1CJUncByrCLFDZQOY30d9ojiuGO02ofL1BygDRDRtFvT/oWSZ8Y0fbkrr1oXU2ay/MqA== dependencies: - "@jest/test-result" "^25.5.0" - "@jest/types" "^25.5.0" - ansi-escapes "^4.2.1" - chalk "^3.0.0" - jest-util "^25.5.0" - string-length "^3.1.0" - -jest-watcher@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.1.0.tgz#99812a0cd931f0cb3d153180426135ab83e4d8f2" - integrity sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ== - dependencies: - "@jest/test-result" "^26.1.0" - "@jest/types" "^26.1.0" + "@jest/test-result" "^26.5.0" + "@jest/types" "^26.5.0" + "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.1.0" + jest-util "^26.5.0" string-length "^4.0.1" -jest-worker@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.1.0.tgz#65d5641af74e08ccd561c240e7db61284f82f33d" - integrity sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ== +jest-worker@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.5.0.tgz#87deee86dbbc5f98d9919e0dadf2c40e3152fa30" + integrity sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug== dependencies: + "@types/node" "*" merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^25.5.4: - version "25.5.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" - integrity sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ== +jest@^26.4.2: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.5.0.tgz#d973c13a3843587b89b02dab1fbcd1f3bf111f09" + integrity sha512-yW1QTkdpxVWTV2M5cOwVdEww8dRGqL5bb7FOG3YQoMtf7oReCEawmU0+tOKkZUSfcOymbXmCfdBQLzuwOLCx0w== dependencies: - "@jest/core" "^25.5.4" + "@jest/core" "^26.5.0" import-local "^3.0.2" - jest-cli "^25.5.4" - -jest@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.1.0.tgz#2f3aa7bcffb9bfd025473f83bbbf46a3af026263" - integrity sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw== - dependencies: - "@jest/core" "^26.1.0" - import-local "^3.0.2" - jest-cli "^26.1.0" + jest-cli "^26.5.0" jmespath@0.15.0: version "0.15.0" @@ -7267,42 +6489,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" - xml-name-validator "^3.0.0" - -jsdom@^16.2.2: - version "16.2.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b" - integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg== +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== dependencies: abab "^2.0.3" acorn "^7.1.1" @@ -7324,7 +6514,7 @@ jsdom@^16.2.2: tough-cookie "^3.0.1" w3c-hr-time "^1.0.2" w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.0.0" + webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" @@ -7336,76 +6526,65 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsii-diff@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/jsii-diff/-/jsii-diff-1.9.0.tgz#56102a1983b32c4a25d0b062fa4ffc5cdf5e8c96" - integrity sha512-kBnAZ4oTRDthPRwpM60XWsAE2O6lUw2+WZgLiPRKWgMK1t5wnXeZvj+W8oeBt/SzRM6trcEHPzkL3rKaJFi7+A== +jsii-diff@^1.12.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jsii-diff/-/jsii-diff-1.13.0.tgz#91f3276dda151fdae2c9a0262666ecdcf44576ea" + integrity sha512-8yc4QjmXzoMjAPVMUD+BJNvBKhqM4sEXR3XUGz3/gCa8tbqvpEGsBjXHEnWlU5BHJU5uUpt0HFF+yEVpDg9YuQ== dependencies: - "@jsii/spec" "^1.9.0" + "@jsii/spec" "^1.13.0" fs-extra "^9.0.1" - jsii-reflect "^1.9.0" + jsii-reflect "^1.13.0" log4js "^6.3.0" - typescript "~3.9.6" - yargs "^15.4.0" + typescript "~3.9.7" + yargs "^16.0.3" -jsii-pacmak@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/jsii-pacmak/-/jsii-pacmak-1.9.0.tgz#4acc92991e65a7d308a5d029c39fe78b0050abf5" - integrity sha512-rfOslRr+w0EcN4GnT8CqAOHnRf9DRQLH4QAPUuyHKfzXESARn4BIZwL7fbuGxzvuFSM53MoXd1fBvvUfx8mL5g== +jsii-pacmak@^1.12.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jsii-pacmak/-/jsii-pacmak-1.13.0.tgz#28cc1cd4013142aa6169a4e04fd14abe8a42c559" + integrity sha512-I297/yAdNnEyEIE2X+Vv2KVdxBOT7KCF/9ZPpPyReAsPfh0RULbUyUH+qhfS9DnblmvjMF8fOjoJHGC5DcZlFQ== dependencies: - "@jsii/spec" "^1.9.0" + "@jsii/spec" "^1.13.0" clone "^2.1.2" - codemaker "^1.9.0" - commonmark "^0.29.1" + codemaker "^1.13.0" + commonmark "^0.29.2" escape-string-regexp "^4.0.0" fs-extra "^9.0.1" - jsii-reflect "^1.9.0" - jsii-rosetta "^1.9.0" + jsii-reflect "^1.13.0" + jsii-rosetta "^1.13.0" semver "^7.3.2" - spdx-license-list "^6.2.0" + spdx-license-list "^6.3.0" xmlbuilder "^15.1.1" - yargs "^15.4.0" + yargs "^16.0.3" -jsii-reflect@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.5.0.tgz#f6007bbb3b262832d93a1b5b87b1c8d570e5c2fc" - integrity sha512-+kDzb9ariTFrox1GaLfclU1Gxs1b40hr5BSBhVBzq03F+opMyTXp2gBPotsTm8Se44wcptDbTPwEmSx1ZxR+rQ== - dependencies: - "@jsii/spec" "^1.5.0" - colors "^1.4.0" - fs-extra "^9.0.0" - oo-ascii-tree "^1.5.0" - yargs "^15.3.1" - -jsii-reflect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.9.0.tgz#57a8dcf867b9f329b3bb62057d62aef5f2743762" - integrity sha512-jvay0EzZT1VvqK0h6AlvyTstQd1SVKTN4jpi9ZdDzyb6/nJ4sKUZYJPTFNzZv/+2ee/eH/ZuYiZ9Keu0STWq8A== +jsii-reflect@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jsii-reflect/-/jsii-reflect-1.13.0.tgz#773531fd5f449094a3fec102f741922a68391424" + integrity sha512-HQPjqIWAkMGg/SbiX+m/3MMdMo0p9wejosQNuiynvOYV9LqCRRbRi7MK3BuK4QeOaUHvJw4b+0bu6eCaD3cWxw== dependencies: - "@jsii/spec" "^1.9.0" + "@jsii/spec" "^1.13.0" colors "^1.4.0" fs-extra "^9.0.1" - oo-ascii-tree "^1.9.0" - yargs "^15.4.0" + oo-ascii-tree "^1.13.0" + yargs "^16.0.3" -jsii-rosetta@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/jsii-rosetta/-/jsii-rosetta-1.9.0.tgz#fbb2017b2fba87bf0050662a369a68bea316861a" - integrity sha512-xtFTxxg/RimWSOehxcIEq/lPEPEGxrLQwTzCbsDMDPO/+gK+foojz+P0ACyo6ZiR3LhXs6y66JR9NCQcy8YixQ== +jsii-rosetta@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jsii-rosetta/-/jsii-rosetta-1.13.0.tgz#b422ac25f882432aea898facdd8f558086827274" + integrity sha512-WN95UohWdG+LYr3VG3Sug2qtcvpXcQTY/Pd68XH3+WW1jmxfoa/P7zu18zofi7zOVA5IFmip+r63ahfs7TIyOw== dependencies: - "@jsii/spec" "^1.9.0" - commonmark "^0.29.1" + "@jsii/spec" "^1.13.0" + commonmark "^0.29.2" fs-extra "^9.0.1" - typescript "~3.9.6" + typescript "~3.9.7" xmldom "^0.3.0" - yargs "^15.4.0" + yargs "^16.0.3" -jsii@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/jsii/-/jsii-1.9.0.tgz#3a039b4fb9838460d9f996484b48cf89283de664" - integrity sha512-vtzzgYDF6WGnAbTP4+ko4QUmz3O4rS8BN5iCYOf5Kh87VVhb3+vkdijSR7esnWJCT7/a+rJfMX5pztec8O/mvw== +jsii@^1.12.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jsii/-/jsii-1.13.0.tgz#8a2ac2f60cd666d0ed76dc39204321caa7c9c775" + integrity sha512-SA4YEegodByqI04BrRbR29QE+MGHGVQ5wG7byLDjVle0zRfRaJYc2nH13Jy4nhkC1aqBkRwHI9atKUrNDiNa0w== dependencies: - "@jsii/spec" "^1.9.0" + "@jsii/spec" "^1.13.0" case "^1.6.3" colors "^1.4.0" deep-equal "^2.0.3" @@ -7414,9 +6593,9 @@ jsii@^1.9.0: semver "^7.3.2" semver-intersect "^1.4.0" sort-json "^2.0.0" - spdx-license-list "^6.2.0" - typescript "~3.9.6" - yargs "^15.4.0" + spdx-license-list "^6.3.0" + typescript "~3.9.7" + yargs "^16.0.3" json-diff@^0.5.4: version "0.5.4" @@ -7432,6 +6611,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7487,10 +6671,10 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -jsonschema@^1.2.5, jsonschema@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.6.tgz#52b0a8e9dc06bbae7295249d03e4b9faee8a0c0b" - integrity sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA== +jsonschema@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.8.tgz#76efb90aa6062f9bd24ba4414965089b948e35ce" + integrity sha512-HZrVvnv9Ri3WK3t53Anu55eS+IYiQm+UcGE23oBEYi3gD1qODW+I7y4R28q2FyVhzGTDhxAEqTjbe5+jNkqmeQ== jsprim@^1.2.2: version "1.4.1" @@ -7503,9 +6687,9 @@ jsprim@^1.2.2: verror "1.10.0" just-extend@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" - integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" + integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -7644,14 +6828,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -7660,6 +6836,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -7820,10 +7004,10 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.2.1: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.2.1: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== log-driver@^1.2.7: version "1.2.7" @@ -7839,14 +7023,7 @@ log4js@^6.3.0: debug "^4.1.1" flatted "^2.0.1" rfdc "^1.1.4" - streamroller "^2.2.4" - -lolex@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== - dependencies: - "@sinonjs/commons" "^1.7.0" + streamroller "^2.2.4" loud-rejection@^1.0.0: version "1.6.0" @@ -7877,9 +7054,9 @@ ltgt@~2.2.0: integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== make-dir@^1.0.0: version "1.3.0" @@ -7959,14 +7136,14 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -md5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= +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.1" - crypt "~0.0.1" - is-buffer "~1.1.1" + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" mdurl@~1.0.1: version "1.0.1" @@ -8017,17 +7194,15 @@ meow@^4.0.0: trim-newlines "^2.0.0" meow@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" - integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== dependencies: "@types/minimist" "^1.2.0" - arrify "^2.0.1" - camelcase "^6.0.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" - minimist-options "^4.0.2" + minimist-options "4.1.0" normalize-package-data "^2.5.0" read-pkg-up "^7.0.1" redent "^3.0.0" @@ -8048,17 +7223,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@4.x, micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" @@ -8079,6 +7246,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -8102,9 +7277,9 @@ mimic-fn@^2.1.0: integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@>=3.0, minimatch@^3.0.4: version "3.0.4" @@ -8113,15 +7288,7 @@ minimatch@>=3.0, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist-options@^4.0.2: +minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== @@ -8130,7 +7297,15 @@ minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.0: +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@>=1.2.2, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8186,7 +7361,7 @@ mkdirp@*, mkdirp@1.x, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -8215,7 +7390,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.0.0, ms@^2.1.1: +ms@2.1.2, ms@^2.0.0, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -8235,7 +7410,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@0.0.8, mute-stream@~0.0.4: +mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== @@ -8277,9 +7452,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nested-error-stacks@^2.0.0: version "2.1.0" @@ -8296,10 +7471,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.3.tgz#9f79ff02fa002ed5ffbc538ad58518fa011dc913" - integrity sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg== +nise@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/fake-timers" "^6.0.0" @@ -8316,10 +7491,10 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@^2.3.0, node-fetch@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.5.0, node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-gyp-build@~4.1.0: version "4.1.1" @@ -8353,27 +7528,16 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" - integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== - dependencies: - growly "^1.3.0" - is-wsl "^2.1.1" - semver "^6.3.0" - shellwords "^0.1.1" - which "^1.3.1" - -node-notifier@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.1.tgz#a355e33e6bebacef9bf8562689aed0f4230ca6f9" - integrity sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg== +node-notifier@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620" + integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA== dependencies: growly "^1.3.0" - is-wsl "^2.1.1" - semver "^7.2.1" + is-wsl "^2.2.0" + semver "^7.3.2" shellwords "^0.1.1" - uuid "^7.0.3" + uuid "^8.3.0" which "^2.0.2" node-preload@^0.2.1: @@ -8602,20 +7766,20 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== -object-is@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== +object-is@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +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" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8627,15 +7791,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: version "2.1.0" @@ -8682,28 +7846,23 @@ onetime@^2.0.0: mimic-fn "^1.0.0" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -oo-ascii-tree@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.5.0.tgz#e462474b98910dd33fec6518629358c74845ce1a" - integrity sha512-6s+nBxOutQeDvForKX5oFUchFSDpD2KGFIkqyv4VDX0FZl79iCx8E9R4Y/7o2umjTjuK9CrBJzO0kFKNKWbZQA== - -oo-ascii-tree@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.9.0.tgz#e4612f188a77b45ce68b44ed66d6aa7db6db1886" - integrity sha512-IuxxWmKSuzVNxHsAmLQTTj0tN9TdxQww2lrNeqObhXKjkjvfQGAdSO9ft6prieR0BDyfowZv3ntnmeaUlqM0Tg== +oo-ascii-tree@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.13.0.tgz#6abe2a34a4d7b1fb4aa5b8488eb00ae58ab67f3a" + integrity sha512-z4OE5yHSNO3F3SDGwNnN4IiTqxiAca0TahL3TbvFzp659UkG0k9PizhQyqmDgPflfyh1C0ULIr0s7b6y7TgBMQ== opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8775,11 +7934,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8950,38 +8104,33 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" - integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.2.tgz#ef14f0d3d77bae8dd4bc66563a4c151aac9e65aa" + integrity sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w== dependencies: is-ssh "^1.3.0" protocols "^1.4.0" parse-url@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" - integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + version "5.0.2" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.2.tgz#856a3be1fcdf78dc93fc8b3791f169072d898b59" + integrity sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA== dependencies: is-ssh "^1.3.0" normalize-url "^3.3.0" parse-path "^4.0.0" protocols "^1.4.0" -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" @@ -9129,11 +8278,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -9159,12 +8303,12 @@ pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-format@^26.1.0: - version "26.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.1.0.tgz#272b9cd1f1a924ab5d443dc224899d7a65cb96ec" - integrity sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg== +pretty-format@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.5.0.tgz#3320e4952f8e6918fc8c26c6df7aad9734818ac2" + integrity sha512-NcgRuuTutUJ9+Br4P19DFThpJYnYBiugfRmZEA6pXrUeG+IcMSmppb88rU+iPA+XAJcjTYlCb5Ed6miHg/Qqqw== dependencies: - "@jest/types" "^26.1.0" + "@jest/types" "^26.5.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -9228,9 +8372,9 @@ proto-list@~1.2.1: integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= protocols@^1.1.0, protocols@^1.4.0: - version "1.4.7" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" - integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + version "1.4.8" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" + integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== protoduck@^5.0.1: version "5.0.1" @@ -9366,16 +8510,14 @@ read-cmd-shim@^1.0.1: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" read-package-tree@^5.1.6: version "5.3.1" @@ -9471,7 +8613,7 @@ read@1, read@^1.0.4, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@2, readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@^2.3.7, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@2, readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9503,6 +8645,13 @@ readable-stream@1.1.x: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdir-glob@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.0.tgz#a3def6f7b61343e8a1274dbb872b9a2ad055d086" + integrity sha512-KgT0oXPIDQRRRYFf+06AUaodICTep2Q5635BORLzTEzp7rEqcR14a47j3Vzm3ix7FeI1lp8mYyG7r8lTB06Pyg== + dependencies: + minimatch "^3.0.4" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -9513,11 +8662,6 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -realpath-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" - integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -9565,11 +8709,6 @@ regexp.prototype.flags@^1.3.0: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -9604,19 +8743,19 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" -request-promise-native@^1.0.7, request-promise-native@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -9695,12 +8834,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -9715,14 +8849,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9764,7 +8890,7 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -9776,10 +8902,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0, rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== +rxjs@^6.4.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -9800,7 +8926,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9830,13 +8956,6 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - saxes@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -9851,21 +8970,21 @@ semver-intersect@^1.4.0: dependencies: semver "^5.0.0" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.x, semver@^6.0.0, semver@^6.1.2, semver@^6.2.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.x, semver@^7.1.1, semver@^7.2.1, semver@^7.2.2, semver@^7.3.2: +semver@7.x, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^6.0.0, semver@^6.2.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, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -9931,30 +9050,30 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== +side-channel@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" + integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + es-abstract "^1.18.0-next.0" + object-inspect "^1.8.0" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sinon@^9.0.1, sinon@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" - integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== +sinon@^9.0.1, sinon@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.0.tgz#1d333967e30023609f7347351ebc0dc964c0f3c9" + integrity sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw== dependencies: - "@sinonjs/commons" "^1.7.2" + "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.0.3" + "@sinonjs/samsam" "^5.2.0" diff "^4.0.2" - nise "^4.0.1" + nise "^4.0.4" supports-color "^7.1.0" sisteransi@^1.0.4: @@ -9981,6 +9100,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^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" + slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -10064,7 +9192,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.10, source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6: +source-map-support@^0.5.10, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.6: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -10138,14 +9266,14 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== -spdx-license-list@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/spdx-license-list/-/spdx-license-list-6.2.0.tgz#f81f6e73cb01535012d8014db375567110c652be" - integrity sha512-sHM1eQz+yYrKRIO5j/tzu3yWhbouQc2RYmCn5nNC296nVztW0VSlpJvmgsWPKAMEIqjfghXy3vvIwCbEOJPSHg== +spdx-license-list@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/spdx-license-list/-/spdx-license-list-6.3.0.tgz#29507bdd88e5f1dcf62634d3c7f9051245e7ef07" + integrity sha512-Qz8ru5VVK5T4cFOBrshIzggzrQ15fVBcpjpZLCVz2j9KNnpslGbw8w1r06v2vi6YP6bnUSY5CXsFCfUypLZ2GA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -10195,7 +9323,7 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -stack-utils@^1.0.1, stack-utils@^1.0.2: +stack-utils@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== @@ -10207,16 +9335,16 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" -standard-version@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-8.0.2.tgz#02ed7131f83046bd04358dc54f97d42c4b2fd828" - integrity sha512-L8X9KFq2SmVmaeZgUmWHFJMOsEWpjgFAwqic6yIIoveM1kdw1vH4Io03WWxUDjypjGqGU6qUtcJoR8UvOv5w3g== +standard-version@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-9.0.0.tgz#814055add91eec8679a773768927f927183fc818" + integrity sha512-eRR04IscMP3xW9MJTykwz13HFNYs8jS33AGuDiBKgfo5YrO0qX0Nxb4rjupVwT5HDYL/aR+MBEVLjlmVFmFEDQ== dependencies: chalk "^2.4.2" - conventional-changelog "3.1.21" + conventional-changelog "3.1.23" conventional-changelog-config-spec "2.1.0" - conventional-changelog-conventionalcommits "4.3.0" - conventional-recommended-bump "6.0.9" + conventional-changelog-conventionalcommits "4.4.0" + conventional-recommended-bump "6.0.10" detect-indent "^6.0.0" detect-newline "^3.1.0" dotgitignore "^2.1.0" @@ -10268,14 +9396,6 @@ streamroller@^2.2.4: debug "^4.1.1" fs-extra "^8.1.0" -string-length@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" - integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== - dependencies: - astral-regex "^1.0.0" - strip-ansi "^5.2.0" - string-length@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" @@ -10324,7 +9444,7 @@ string.prototype.repeat@^0.2.0: resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz#aba36de08dcee6a5a337d49b2ea1da1b28fc0ecf" integrity sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8= -string.prototype.trimend@^1.0.0: +string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== @@ -10332,25 +9452,7 @@ string.prototype.trimend@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: +string.prototype.trimstart@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== @@ -10456,10 +9558,10 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strong-log-transformer@^2.0.0: version "2.1.0" @@ -10497,9 +9599,9 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -10511,12 +9613,12 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" -symbol-tree@^3.2.2, symbol-tree@^3.2.4: +symbol-tree@^3.2.4: version "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@^5.2.3, table@^5.4.6: +table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== @@ -10526,6 +9628,16 @@ table@^5.2.3, table@^5.4.6: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123" + integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw== + dependencies: + ajv "^6.12.4" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + tap-mocha-reporter@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz#ea41e741149a94c278d106cbcccc37fec2dfeeaa" @@ -10601,12 +9713,12 @@ tap@^12.0.1: write-file-atomic "^2.4.2" yapool "^1.0.0" -tar-stream@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325" - integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q== +tar-stream@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" + integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== dependencies: - bl "^4.0.1" + bl "^4.0.3" end-of-stream "^1.4.1" fs-constants "^1.0.0" inherits "^2.0.3" @@ -10700,9 +9812,9 @@ thenify-all@^1.0.0: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" @@ -10720,10 +9832,11 @@ through2@^2.0.0, through2@^2.0.2: xtend "~4.0.1" through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: + inherits "^2.0.4" readable-stream "2 || 3" through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: @@ -10736,14 +9849,6 @@ thunkify@^2.1.2: resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= -tiny-glob@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" - integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== - dependencies: - globalyzer "^0.1.0" - globrex "^0.1.1" - tmatch@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tmatch/-/tmatch-4.0.0.tgz#ba178007f30bf6a70f37c643fca5045fb2f8c448" @@ -10864,50 +9969,24 @@ trivial-deferred@^1.0.1: resolved "https://registry.yarnpkg.com/trivial-deferred/-/trivial-deferred-1.0.1.tgz#376d4d29d951d6368a6f7a0ae85c2f4d5e0658f3" integrity sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM= -ts-jest@^25.5.1: - version "25.5.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.5.1.tgz#2913afd08f28385d54f2f4e828be4d261f4337c7" - integrity sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - micromatch "4.x" - mkdirp "0.x" - semver "6.x" - yargs-parser "18.x" - -ts-jest@^26.1.3: - version "26.1.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.1.3.tgz#aac928a05fdf13e3e6dfbc8caec3847442667894" - integrity sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw== +ts-jest@^26.2.0: + version "26.4.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.4.1.tgz#08ec0d3fc2c3a39e4a46eae5610b69fafa6babd0" + integrity sha512-F4aFq01aS6mnAAa0DljNmKr/Kk9y4HVZ1m6/rtJ0ED56cuxINGq3Q9eVAh+z5vcYKe5qnTMvv90vE8vUMFxomg== dependencies: + "@types/jest" "26.x" bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" - jest-util "26.x" + jest-util "^26.1.0" json5 "2.x" lodash.memoize "4.x" make-error "1.x" mkdirp "1.x" semver "7.x" - yargs-parser "18.x" + yargs-parser "20.x" ts-node@^8.0.2: - version "8.10.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3" - integrity sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -ts-node@^8.1.0: version "8.10.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== @@ -10933,36 +10012,15 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== -tslint@^5.20.1: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" +tslib@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== tsutils@^3.17.1: version "3.17.1" @@ -11039,32 +10097,20 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.3.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== - -typescript@^3.8.3: +typescript@^3.3.3, typescript@~3.9.7: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== -typescript@~3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== - -typescript@~3.9.6: - version "3.9.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" - integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== +typescript@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5" + integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg== uglify-js@^3.1.4: - version "3.9.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.4.tgz#867402377e043c1fc7b102253a22b64e5862401b" - integrity sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA== - dependencies: - commander "~2.20.3" + version "3.11.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.1.tgz#32d274fea8aac333293044afd7f81409d5040d38" + integrity sha512-OApPSuJcxcnewwjSGGfWOjx3oix5XpmrK9Z2j0fTRlHGoZ49IU6kExfZTM0++fCArOOCet+vIfWwFHbvWqwp6g== uid-number@0.0.6: version "0.0.6" @@ -11115,12 +10161,10 @@ universal-user-agent@^4.0.0: dependencies: os-name "^3.1.0" -universal-user-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" - integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== - dependencies: - os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "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.0: version "0.1.2" @@ -11151,9 +10195,9 @@ upath@^1.2.0: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -11197,25 +10241,20 @@ uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - -uuid@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" - integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== +uuid@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== -v8-to-istanbul@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" - integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== +v8-to-istanbul@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz#0608f5b49a481458625edb058488607f25498ba5" + integrity sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -11245,22 +10284,13 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: +w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: browser-process-hrtime "^1.0.0" -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - w3c-xmlserializer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" @@ -11292,19 +10322,19 @@ webidl-conversions@^5.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== -webidl-conversions@^6.0.0: +webidl-conversions@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: +whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: iconv-lite "0.4.24" -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: +whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== @@ -11319,13 +10349,13 @@ whatwg-url@^7.0.0: webidl-conversions "^4.0.2" whatwg-url@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" - integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== + version "8.3.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.3.0.tgz#d1e11e565334486cdb280d3101b9c3fd1c867582" + integrity sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q== dependencies: lodash.sortby "^4.7.0" tr46 "^2.0.2" - webidl-conversions "^5.0.0" + webidl-conversions "^6.1.0" which-boxed-primitive@^1.0.1: version "1.0.1" @@ -11387,9 +10417,9 @@ wide-align@^1.1.0: string-width "^1.0.2 || 2" windows-release@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0" - integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" @@ -11493,10 +10523,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.0.0, ws@^7.2.3: - version "7.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" - integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== xml-name-validator@^3.0.0: version "3.0.0" @@ -11526,7 +10556,7 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -xmlchars@^2.1.1, xmlchars@^2.2.0: +xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== @@ -11551,6 +10581,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.2.tgz#48218df5da2731b4403115c39a1af709c873f829" + integrity sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -11561,7 +10596,7 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0: +yaml@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== @@ -11571,13 +10606,10 @@ yapool@^1.0.0: resolved "https://registry.yarnpkg.com/yapool/-/yapool-1.0.0.tgz#f693f29a315b50d9a9da2646a7a6645c96985b6a" integrity sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o= -yargs-parser@18.x, yargs-parser@^18.1.1, yargs-parser@^18.1.2, yargs-parser@^18.1.3: - 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-parser@20.x, yargs-parser@^20.0.0: + version "20.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.1.tgz#28f3773c546cdd8a69ddae68116b48a5da328e77" + integrity sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA== yargs-parser@^13.0.0, yargs-parser@^13.1.2: version "13.1.2" @@ -11595,6 +10627,14 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^18.1.2, yargs-parser@^18.1.3: + 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@^13.2.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -11629,23 +10669,6 @@ yargs@^14.2.2: yargs-parser "^15.0.1" yargs@^15.0.2, yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== - 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.1" - -yargs@^15.4.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -11662,16 +10685,29 @@ yargs@^15.4.0: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.0.3.tgz#7a919b9e43c90f80d4a142a89795e85399a7e54c" + integrity sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA== + dependencies: + cliui "^7.0.0" + escalade "^3.0.2" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.1" + yargs-parser "^20.0.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -zip-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-3.0.1.tgz#cb8db9d324a76c09f9b76b31a12a48638b0b9708" - integrity sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ== +zip-stream@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.2.tgz#3a20f1bd7729c2b59fd4efa04df5eb7a5a217d2e" + integrity sha512-TGxB2g+1ur6MHkvM644DuZr8Uzyz0k0OYWtS3YlpfWBEmK4woaC2t3+pozEL3dBfIPmpgmClR5B2QRcMgGt22g== dependencies: archiver-utils "^2.1.0" - compress-commons "^3.0.0" + compress-commons "^4.0.0" readable-stream "^3.6.0"