From b5d4d8be458b43d073e81120ef461cc8abf85421 Mon Sep 17 00:00:00 2001 From: "alex.berger@nexiot.ch" Date: Mon, 18 Mar 2019 09:18:09 +0100 Subject: [PATCH 01/16] Add support for (optional) user provided repository name to DockerImageAsset. This change makes it easier to use (reference) Docker Images created and deployed by CDK from EKS (Kubernetes) YAML resource files. --- packages/@aws-cdk/assets-docker/lib/image-asset.ts | 12 +++++++++++- packages/@aws-cdk/cx-api/lib/metadata/assets.ts | 5 +++++ packages/aws-cdk/lib/api/toolkit-info.ts | 14 ++++++++++---- packages/aws-cdk/lib/docker.ts | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/assets-docker/lib/image-asset.ts b/packages/@aws-cdk/assets-docker/lib/image-asset.ts index b2de0ad22503d..2cb42bcde60ea 100644 --- a/packages/@aws-cdk/assets-docker/lib/image-asset.ts +++ b/packages/@aws-cdk/assets-docker/lib/image-asset.ts @@ -10,6 +10,15 @@ export interface DockerImageAssetProps { * The directory where the Dockerfile is stored */ directory: string; + + /** + * ECR repository name, if omitted a dynamic name is used instead. + * Specify this property if you need to statically address the + * image, e.g. from a Kubernetes Pod. + * Note, this is only the repository name, without the registry and + * the tag parts. + */ + repositoryName?: string; } /** @@ -55,7 +64,8 @@ export class DockerImageAsset extends cdk.Construct { packaging: 'container-image', path: this.directory, id: this.node.uniqueId, - imageNameParameter: imageNameParameter.logicalId + imageNameParameter: imageNameParameter.logicalId, + repositoryName: props.repositoryName, }; this.node.addMetadata(cxapi.ASSET_METADATA, asset); diff --git a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts index 01786d0c595da..4924e8896e503 100644 --- a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts +++ b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts @@ -73,6 +73,11 @@ export interface ContainerImageAssetMetadataEntry { * ECR Repository name and tag (separated by ":") where this asset is stored. */ imageNameParameter: string; + + /** + * ECR Repository name. + */ + repositoryName?: string; } export type AssetMetadataEntry = FileAssetMetadataEntry | ContainerImageAssetMetadataEntry; diff --git a/packages/aws-cdk/lib/api/toolkit-info.ts b/packages/aws-cdk/lib/api/toolkit-info.ts index 68a4aa7852e01..9ddb0994d8345 100644 --- a/packages/aws-cdk/lib/api/toolkit-info.ts +++ b/packages/aws-cdk/lib/api/toolkit-info.ts @@ -99,11 +99,17 @@ export class ToolkitInfo { /** * Prepare an ECR repository for uploading to using Docker */ - public async prepareEcrRepository(assetId: string): Promise { + public async prepareEcrRepository(asset: cxapi.ContainerImageAssetMetadataEntry): Promise { const ecr = await this.props.sdk.ecr(this.props.environment, Mode.ForWriting); - - // Repository name based on asset id - const repositoryName = 'cdk/' + assetId.replace(/[:/]/g, '-').toLowerCase(); + let repositoryName; + if ( asset.repositoryName ) { + // Repository name provided by user + repositoryName = asset.repositoryName; + } else { + // Repository name based on asset id + const assetId = asset.id; + repositoryName = 'cdk/' + assetId.replace(/[:/]/g, '-').toLowerCase(); + } let repository; try { diff --git a/packages/aws-cdk/lib/docker.ts b/packages/aws-cdk/lib/docker.ts index 2038276373638..524eee7df69d3 100644 --- a/packages/aws-cdk/lib/docker.ts +++ b/packages/aws-cdk/lib/docker.ts @@ -43,7 +43,7 @@ export async function prepareContainerAsset(asset: ContainerImageAssetMetadataEn const buildHold = new PleaseHold(` ⌛ Building Asset Docker image ${asset.id} from ${asset.path}; this may take a while.`); try { - const ecr = await toolkitInfo.prepareEcrRepository(asset.id); + const ecr = await toolkitInfo.prepareEcrRepository(asset); const latest = `${ecr.repositoryUri}:latest`; let loggedIn = false; From e86106b6f68d98dbb8fd40ae540cc0fda869826a Mon Sep 17 00:00:00 2001 From: "alex.berger@nexiot.ch" Date: Mon, 18 Mar 2019 13:11:01 +0100 Subject: [PATCH 02/16] Add @default annotation for repositoryName --- packages/@aws-cdk/assets-docker/lib/image-asset.ts | 2 ++ packages/@aws-cdk/cx-api/lib/metadata/assets.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/@aws-cdk/assets-docker/lib/image-asset.ts b/packages/@aws-cdk/assets-docker/lib/image-asset.ts index 2cb42bcde60ea..af32ad764a917 100644 --- a/packages/@aws-cdk/assets-docker/lib/image-asset.ts +++ b/packages/@aws-cdk/assets-docker/lib/image-asset.ts @@ -17,6 +17,8 @@ export interface DockerImageAssetProps { * image, e.g. from a Kubernetes Pod. * Note, this is only the repository name, without the registry and * the tag parts. + * + * @default */ repositoryName?: string; } diff --git a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts index 4924e8896e503..5bd413bcae19b 100644 --- a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts +++ b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts @@ -76,6 +76,8 @@ export interface ContainerImageAssetMetadataEntry { /** * ECR Repository name. + * + * @default */ repositoryName?: string; } From fd0687e3d751226c3cb48c6ac156525e29e7d62f Mon Sep 17 00:00:00 2001 From: "alex.berger@nexiot.ch" Date: Tue, 19 Mar 2019 08:02:25 +0100 Subject: [PATCH 03/16] Updated property documentation --- packages/@aws-cdk/assets-docker/lib/image-asset.ts | 8 ++++---- packages/@aws-cdk/cx-api/lib/metadata/assets.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/assets-docker/lib/image-asset.ts b/packages/@aws-cdk/assets-docker/lib/image-asset.ts index af32ad764a917..a46300d0294e7 100644 --- a/packages/@aws-cdk/assets-docker/lib/image-asset.ts +++ b/packages/@aws-cdk/assets-docker/lib/image-asset.ts @@ -12,13 +12,13 @@ export interface DockerImageAssetProps { directory: string; /** - * ECR repository name, if omitted a dynamic name is used instead. - * Specify this property if you need to statically address the - * image, e.g. from a Kubernetes Pod. + * ECR repository name, if omitted a default name based on the asset's + * ID is used instead. Specify this property if you need to statically + * address the image, e.g. from a Kubernetes Pod. * Note, this is only the repository name, without the registry and * the tag parts. * - * @default + * @default automatically derived from the asset's ID. */ repositoryName?: string; } diff --git a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts index 5bd413bcae19b..3bcb79b6f0723 100644 --- a/packages/@aws-cdk/cx-api/lib/metadata/assets.ts +++ b/packages/@aws-cdk/cx-api/lib/metadata/assets.ts @@ -75,9 +75,13 @@ export interface ContainerImageAssetMetadataEntry { imageNameParameter: string; /** - * ECR Repository name. + * ECR repository name, if omitted a default name based on the asset's + * ID is used instead. Specify this property if you need to statically + * address the image, e.g. from a Kubernetes Pod. + * Note, this is only the repository name, without the registry and + * the tag parts. * - * @default + * * @default automatically derived from the asset's ID. */ repositoryName?: string; } From c0c5d89833a04d9fed00828556d35a1b329899e5 Mon Sep 17 00:00:00 2001 From: Adam Ruka Date: Fri, 15 Mar 2019 09:34:02 -0700 Subject: [PATCH 04/16] feat(cloudformation): allow specifying additional inputs for deploy Actions (#2020) Additional input Artifacts are needed when using the `parameterOverrides` property of the Action (any Artifact used in that map needs to be added to the input Artifacts of the Action, otherwise the Pipeline will fail at runtime). Also did some cleanup in the Action superclass while I was in the area. Fixes #1247 --- .../lib/pipeline-actions.ts | 27 +++++++-- .../aws-codepipeline-api/lib/action.ts | 18 ++++++ .../test/integ.pipeline-cfn.expected.json | 7 ++- .../test/integ.pipeline-cfn.ts | 7 ++- .../aws-codepipeline/test/test.action.ts | 59 ++++++++++++++++++- 5 files changed, 110 insertions(+), 8 deletions(-) diff --git a/packages/@aws-cdk/aws-cloudformation/lib/pipeline-actions.ts b/packages/@aws-cdk/aws-cloudformation/lib/pipeline-actions.ts index b886276a4339c..77ee1bd25b4b7 100644 --- a/packages/@aws-cdk/aws-cloudformation/lib/pipeline-actions.ts +++ b/packages/@aws-cdk/aws-cloudformation/lib/pipeline-actions.ts @@ -200,6 +200,23 @@ export interface PipelineCloudFormationDeployActionProps extends PipelineCloudFo * @default No overrides */ parameterOverrides?: { [name: string]: any }; + + /** + * The list of additional input Artifacts for this Action. + * This is especially useful when used in conjunction with the `parameterOverrides` property. + * For example, if you have: + * + * parameterOverrides: { + * 'Param1': action1.outputArtifact.bucketName, + * 'Param2': action2.outputArtifact.objectKey, + * } + * + * , if the output Artifacts of `action1` and `action2` were not used to + * set either the `templateConfiguration` or the `templatePath` properties, + * you need to make sure to include them in the `additionalInputArtifacts` - + * otherwise, you'll get an "unrecognized Artifact" error during your Pipeline's execution. + */ + additionalInputArtifacts?: codepipeline.Artifact[]; } // tslint:enable:max-line-length @@ -223,6 +240,10 @@ export abstract class PipelineCloudFormationDeployAction extends PipelineCloudFo }); this.props = props; + + for (const inputArtifact of props.additionalInputArtifacts || []) { + this.addInputArtifact(inputArtifact); + } } /** @@ -293,8 +314,7 @@ export class PipelineCreateReplaceChangeSetAction extends PipelineCloudFormation }); this.addInputArtifact(props.templatePath.artifact); - if (props.templateConfiguration && - props.templateConfiguration.artifact.artifactName !== props.templatePath.artifact.artifactName) { + if (props.templateConfiguration) { this.addInputArtifact(props.templateConfiguration.artifact); } @@ -357,8 +377,7 @@ export class PipelineCreateUpdateStackAction extends PipelineCloudFormationDeplo }); this.addInputArtifact(props.templatePath.artifact); - if (props.templateConfiguration && - props.templateConfiguration.artifact.artifactName !== props.templatePath.artifact.artifactName) { + if (props.templateConfiguration) { this.addInputArtifact(props.templateConfiguration.artifact); } diff --git a/packages/@aws-cdk/aws-codepipeline-api/lib/action.ts b/packages/@aws-cdk/aws-codepipeline-api/lib/action.ts index 5553cf105a57a..d98bbc52dd2c6 100644 --- a/packages/@aws-cdk/aws-codepipeline-api/lib/action.ts +++ b/packages/@aws-cdk/aws-codepipeline-api/lib/action.ts @@ -252,12 +252,30 @@ export abstract class Action { } protected addOutputArtifact(name: string): Artifact { + // adding the same name multiple times doesn't do anything - + // addOutputArtifact is idempotent + const ret = this._outputArtifacts.find(output => output.artifactName === name); + if (ret) { + return ret; + } + const artifact = new Artifact(name); this._actionOutputArtifacts.push(artifact); return artifact; } protected addInputArtifact(artifact: Artifact): Action { + // adding the same artifact multiple times doesn't do anything - + // addInputArtifact is idempotent + if (this._actionInputArtifacts.indexOf(artifact) !== -1) { + return this; + } + + // however, a _different_ input with the same name is an error + if (this._actionInputArtifacts.find(input => input.artifactName === artifact.artifactName)) { + throw new Error(`Action ${this.actionName} already has an input with the name '${artifact.artifactName}'`); + } + this._actionInputArtifacts.push(artifact); return this; } diff --git a/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.expected.json b/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.expected.json index d61ea21cfde6e..50739be109c18 100644 --- a/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.expected.json +++ b/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.expected.json @@ -211,9 +211,12 @@ "Arn" ] }, - "ParameterOverrides": "{\"BucketName\":{\"Fn::GetArtifactAtt\":[\"SourceArtifact\",\"BucketName\"]},\"ObjectKey\":{\"Fn::GetArtifactAtt\":[\"SourceArtifact\",\"ObjectKey\"]},\"Url\":{\"Fn::GetArtifactAtt\":[\"SourceArtifact\",\"URL\"]},\"OtherParam\":{\"Fn::GetParam\":[\"SourceArtifact\",\"params.json\",\"OtherParam\"]}}" + "ParameterOverrides": "{\"BucketName\":{\"Fn::GetArtifactAtt\":[\"SourceArtifact\",\"BucketName\"]},\"ObjectKey\":{\"Fn::GetArtifactAtt\":[\"SourceArtifact\",\"ObjectKey\"]},\"Url\":{\"Fn::GetArtifactAtt\":[\"AdditionalArtifact\",\"URL\"]},\"OtherParam\":{\"Fn::GetParam\":[\"SourceArtifact\",\"params.json\",\"OtherParam\"]}}" }, "InputArtifacts": [ + { + "Name": "AdditionalArtifact" + }, { "Name": "SourceArtifact" } @@ -274,4 +277,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.ts b/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.ts index b047a5efe333c..44589acaff0bf 100644 --- a/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.ts +++ b/packages/@aws-cdk/aws-codepipeline/test/integ.pipeline-cfn.ts @@ -1,4 +1,5 @@ import cfn = require('@aws-cdk/aws-cloudformation'); +import cpapi = require('@aws-cdk/aws-codepipeline-api'); import { Role } from '@aws-cdk/aws-iam'; import { ServicePrincipal } from '@aws-cdk/aws-iam'; import s3 = require('@aws-cdk/aws-s3'); @@ -33,6 +34,9 @@ const role = new Role(stack, 'CfnChangeSetRole', { assumedBy: new ServicePrincipal('cloudformation.amazonaws.com'), }); +// fake Artifact, just for testing +const additionalArtifact = new cpapi.Artifact('AdditionalArtifact'); + pipeline.addStage(sourceStage); pipeline.addStage({ name: 'CFN', @@ -47,9 +51,10 @@ pipeline.addStage({ parameterOverrides: { BucketName: source.outputArtifact.bucketName, ObjectKey: source.outputArtifact.objectKey, - Url: source.outputArtifact.url, + Url: additionalArtifact.url, OtherParam: source.outputArtifact.getParam('params.json', 'OtherParam'), }, + additionalInputArtifacts: [additionalArtifact], }), ], }); diff --git a/packages/@aws-cdk/aws-codepipeline/test/test.action.ts b/packages/@aws-cdk/aws-codepipeline/test/test.action.ts index adc8a8f62c03f..b12452eea55c3 100644 --- a/packages/@aws-cdk/aws-codepipeline/test/test.action.ts +++ b/packages/@aws-cdk/aws-codepipeline/test/test.action.ts @@ -1,4 +1,3 @@ -// import { validateArtifactBounds, validateSourceAction } from '../lib/validation'; import { expect, haveResourceLike } from '@aws-cdk/assert'; import codebuild = require('@aws-cdk/aws-codebuild'); import codecommit = require('@aws-cdk/aws-codecommit'); @@ -150,6 +149,64 @@ export = { test.done(); }, + + 'input Artifacts': { + 'can be added multiple times to an Action safely'(test: Test) { + const artifact = new actions.Artifact('SomeArtifact'); + + const stack = new cdk.Stack(); + const project = new codebuild.PipelineProject(stack, 'Project'); + const action = project.toCodePipelineBuildAction({ + actionName: 'CodeBuild', + inputArtifact: artifact, + additionalInputArtifacts: [artifact], + }); + + test.equal(action._inputArtifacts.length, 1); + + test.done(); + }, + + 'cannot have duplicate names'(test: Test) { + const artifact1 = new actions.Artifact('SomeArtifact'); + const artifact2 = new actions.Artifact('SomeArtifact'); + + const stack = new cdk.Stack(); + const project = new codebuild.PipelineProject(stack, 'Project'); + + test.throws(() => + project.toCodePipelineBuildAction({ + actionName: 'CodeBuild', + inputArtifact: artifact1, + additionalInputArtifacts: [artifact2], + }) + , /SomeArtifact/); + + test.done(); + }, + }, + + 'output Artifact names': { + 'accept the same name multiple times safely'(test: Test) { + const artifact = new actions.Artifact('SomeArtifact'); + + const stack = new cdk.Stack(); + const project = new codebuild.PipelineProject(stack, 'Project'); + const action = project.toCodePipelineBuildAction({ + actionName: 'CodeBuild', + inputArtifact: artifact, + outputArtifactName: 'Artifact1', + additionalOutputArtifactNames: [ + 'Artifact1', + 'Artifact1', + ], + }); + + test.equal(action._outputArtifacts.length, 1); + + test.done(); + }, + }, }; function boundsValidationResult(numberOfArtifacts: number, min: number, max: number): string[] { From 26bb450175f5b2d0ce1b4af75f3e9856dd414ef4 Mon Sep 17 00:00:00 2001 From: Simon-Pierre Gingras Date: Sat, 16 Mar 2019 05:48:44 -0700 Subject: [PATCH 05/16] chore(acm): update docs (#2028) Update class name in docs, remove outdated paragraph. --- packages/@aws-cdk/aws-certificatemanager/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/@aws-cdk/aws-certificatemanager/README.md b/packages/@aws-cdk/aws-certificatemanager/README.md index 69889eb494533..0122b59e2b76b 100644 --- a/packages/@aws-cdk/aws-certificatemanager/README.md +++ b/packages/@aws-cdk/aws-certificatemanager/README.md @@ -5,7 +5,7 @@ can be used in CloudFront and ELB. ### DNS-validated certificates -The `DNSValidatedCertificateRequest` class provides a Custom Resource by which +The `DnsValidatedCertificateRequest` class provides a Custom Resource by which you can request a TLS certificate from AWS Certificate Manager that is automatically validated using a cryptographically secure DNS record. For this to work, there must be a Route 53 public zone that is responsible for serving @@ -44,9 +44,6 @@ in the email. The email addresses use will be: * postmaster@domain.com * webmaster@domain.com -DNS validation is possible in ACM, but is not currently available in CloudFormation. -A Custom Resource will be developed for this, but is not currently available. - Because of these blocks, it's probably better to provision your certificates either in a separate stack from your main service, or provision them manually. In both cases, you'll import the certificate into your stack afterwards. From 7464e31ff442bbf45fdfc051396f41ad96b8de91 Mon Sep 17 00:00:00 2001 From: Jonathan Goldwasser Date: Sat, 16 Mar 2019 13:50:24 +0100 Subject: [PATCH 06/16] feat(ses): add constructs for email receiving (#1971) Add constructs for email receiving. --- packages/@aws-cdk/aws-ses/README.md | 88 ++++ packages/@aws-cdk/aws-ses/lib/index.ts | 5 + .../@aws-cdk/aws-ses/lib/receipt-filter.ts | 91 ++++ .../aws-ses/lib/receipt-rule-action.ts | 458 ++++++++++++++++++ .../@aws-cdk/aws-ses/lib/receipt-rule-set.ts | 157 ++++++ packages/@aws-cdk/aws-ses/lib/receipt-rule.ts | 243 ++++++++++ packages/@aws-cdk/aws-ses/package.json | 13 +- .../aws-ses/test/example.receiving.lit.ts | 38 ++ .../aws-ses/test/integ.receipt.expected.json | 439 +++++++++++++++++ .../@aws-cdk/aws-ses/test/integ.receipt.ts | 76 +++ .../aws-ses/test/test.receipt-filter.ts | 94 ++++ .../aws-ses/test/test.receipt-rule-action.ts | 451 +++++++++++++++++ .../aws-ses/test/test.receipt-rule-set.ts | 119 +++++ .../aws-ses/test/test.receipt-rule.ts | 153 ++++++ packages/@aws-cdk/aws-ses/test/test.ses.ts | 8 - 15 files changed, 2424 insertions(+), 9 deletions(-) create mode 100644 packages/@aws-cdk/aws-ses/lib/receipt-filter.ts create mode 100644 packages/@aws-cdk/aws-ses/lib/receipt-rule-action.ts create mode 100644 packages/@aws-cdk/aws-ses/lib/receipt-rule-set.ts create mode 100644 packages/@aws-cdk/aws-ses/lib/receipt-rule.ts create mode 100644 packages/@aws-cdk/aws-ses/test/example.receiving.lit.ts create mode 100644 packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json create mode 100644 packages/@aws-cdk/aws-ses/test/integ.receipt.ts create mode 100644 packages/@aws-cdk/aws-ses/test/test.receipt-filter.ts create mode 100644 packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts create mode 100644 packages/@aws-cdk/aws-ses/test/test.receipt-rule-set.ts create mode 100644 packages/@aws-cdk/aws-ses/test/test.receipt-rule.ts delete mode 100644 packages/@aws-cdk/aws-ses/test/test.ses.ts diff --git a/packages/@aws-cdk/aws-ses/README.md b/packages/@aws-cdk/aws-ses/README.md index 77cf9101c97ba..7dc46f9b29c8c 100644 --- a/packages/@aws-cdk/aws-ses/README.md +++ b/packages/@aws-cdk/aws-ses/README.md @@ -1,2 +1,90 @@ ## The CDK Construct Library for AWS Simple Email Service This module is part of the [AWS Cloud Development Kit](https://github.com/awslabs/aws-cdk) project. + +### Email receiving +Create a receipt rule set with rules and actions: +[example of setting up a receipt rule set](test/example.receiving.lit.ts) + +Alternatively, rules can be added to a rule set: +```ts +const ruleSet = new ses.ReceiptRuleSet(this, 'RuleSet'): + +const awsRule = ruleSet.addRule('Aws', { + recipients: ['aws.com'] +}); +``` + +And actions to rules: +```ts +awsRule.addAction( + new ses.ReceiptRuleSnsAction({ + topic + }); +); +``` +When using `addRule`, the new rule is added after the last added rule unless `after` is specified. + +[More actions](test/integ.receipt.ts) + +#### Drop spams +A rule to drop spam can be added by setting `dropSpam` to `true`: + +```ts +new ses.ReceiptRuleSet(this, 'RuleSet', { + dropSpam: true +}); +``` + +This will add a rule at the top of the rule set with a Lambda action that stops processing messages that have at least one spam indicator. See [Lambda Function Examples](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-action-lambda-example-functions.html). + +### Import and export receipt rule set and receipt rules +Receipt rule sets and receipt rules can be exported: + +```ts +const ruleSet = new ReceiptRuleSet(this, 'RuleSet'); +const rule = ruleSet.addRule(this, 'Rule', { + recipients: ['hello@mydomain.com'] +}); + +const ruleSetRef = ruleSet.export(); +const ruleRef = rule.export(); +``` + +And imported: +```ts +const importedRuleSet = ses.ReceiptRuleSet.import(this, 'ImportedRuleSet', ruleSetRef); + +const importedRule = ses.ReceiptRule.import(this, 'ImportedRule', ruleRef); + +const otherRule = ses.ReceiptRule.import(this, 'OtherRule', { + name: 'other-rule' +}); + +importedRuleSet.addRule('New', { // This rule is added after the imported rule + after: importedRule, + recipients: ['mydomain.com'] +}); + +importedRuleSet.addRule('Extra', { // Added after the 'New' rule + recipients: ['extra.com'] +}); +``` + +### Receipt filter +Create a receipt filter: +```ts +new ses.ReceiptFilter(this, 'Filter', { + ip: '1.2.3.4/16' // Will be blocked +}) +``` + +A white list filter is also available: +```ts +new ses.WhiteListReceiptFilter(this, 'WhiteList', { + ips: [ + '10.0.0.0/16', + '1.2.3.4/16', + ] +}); +``` +This will first create a block all filter and then create allow filters for the listed ip addresses. diff --git a/packages/@aws-cdk/aws-ses/lib/index.ts b/packages/@aws-cdk/aws-ses/lib/index.ts index 725bd4c040640..078887862180c 100644 --- a/packages/@aws-cdk/aws-ses/lib/index.ts +++ b/packages/@aws-cdk/aws-ses/lib/index.ts @@ -1,2 +1,7 @@ +export * from './receipt-rule-set'; +export * from './receipt-rule'; +export * from './receipt-rule-action'; +export * from './receipt-filter'; + // AWS::SES CloudFormation Resources: export * from './ses.generated'; diff --git a/packages/@aws-cdk/aws-ses/lib/receipt-filter.ts b/packages/@aws-cdk/aws-ses/lib/receipt-filter.ts new file mode 100644 index 0000000000000..f715454906ae1 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/lib/receipt-filter.ts @@ -0,0 +1,91 @@ +import cdk = require('@aws-cdk/cdk'); +import { CfnReceiptFilter } from './ses.generated'; + +/** + * The policy for the receipt filter. + */ +export enum ReceiptFilterPolicy { + /** + * Allow the ip address or range. + */ + Allow = 'Allow', + + /** + * Block the ip address or range. + */ + Block = 'Block' +} + +/** + * Construction properties for a ReceiptFilter. + */ +export interface ReceiptFilterProps { + /** + * The name for the receipt filter. + * + * @default a CloudFormation generated name + */ + name?: string; + + /** + * The ip address or range to filter. + * + * @default 0.0.0.0/0 + */ + ip?: string; + + /** + * The policy for the filter. + * + * @default Block + */ + policy?: ReceiptFilterPolicy; +} + +/** + * A receipt filter. When instantiated without props, it creates a + * block all receipt filter. + */ +export class ReceiptFilter extends cdk.Construct { + constructor(scope: cdk.Construct, id: string, props?: ReceiptFilterProps) { + super(scope, id); + + new CfnReceiptFilter(this, 'Resource', { + filter: { + ipFilter: { + cidr: (props && props.ip) || '0.0.0.0/0', + policy: (props && props.policy) || ReceiptFilterPolicy.Block + }, + name: props ? props.name : undefined + } + }); + } +} + +/** + * Construction properties for a WhiteListReceiptFilter. + */ +export interface WhiteListReceiptFilterProps { + /** + * A list of ip addresses or ranges to white list. + */ + ips: string[]; +} + +/** + * A white list receipt filter. + */ +export class WhiteListReceiptFilter extends cdk.Construct { + constructor(scope: cdk.Construct, id: string, props: WhiteListReceiptFilterProps) { + super(scope, id); + + new ReceiptFilter(this, 'BlockAll'); + + props.ips.forEach(ip => { + new ReceiptFilter(this, `Allow${ip.replace(/[^\d]/g, '')}`, { + ip, + policy: ReceiptFilterPolicy.Allow + }); + }); + } +} diff --git a/packages/@aws-cdk/aws-ses/lib/receipt-rule-action.ts b/packages/@aws-cdk/aws-ses/lib/receipt-rule-action.ts new file mode 100644 index 0000000000000..36c8a7892e105 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/lib/receipt-rule-action.ts @@ -0,0 +1,458 @@ +import iam = require('@aws-cdk/aws-iam'); +import kms = require('@aws-cdk/aws-kms'); +import lambda = require('@aws-cdk/aws-lambda'); +import s3 = require('@aws-cdk/aws-s3'); +import sns = require('@aws-cdk/aws-sns'); +import cdk = require('@aws-cdk/cdk'); +import { CfnReceiptRule } from './ses.generated'; + +/** + * Properties for a receipt rule action. + */ +export interface ReceiptRuleActionProps { + /** + * Adds a header to the received email. + */ + addHeaderAction?: CfnReceiptRule.AddHeaderActionProperty + + /** + * Rejects the received email by returning a bounce response to the sender and, + * optionally, publishes a notification to Amazon SNS. + */ + bounceAction?: CfnReceiptRule.BounceActionProperty; + + /** + * Calls an AWS Lambda function, and optionally, publishes a notification to + * Amazon SNS. + */ + lambdaAction?: CfnReceiptRule.LambdaActionProperty; + + /** + * Saves the received message to an Amazon S3 bucket and, optionally, publishes + * a notification to Amazon SNS. + */ + s3Action?: CfnReceiptRule.S3ActionProperty; + + /** + * Publishes the email content within a notification to Amazon SNS. + */ + snsAction?: CfnReceiptRule.SNSActionProperty; + + /** + * Terminates the evaluation of the receipt rule set and optionally publishes a + * notification to Amazon SNS. + */ + stopAction?: CfnReceiptRule.StopActionProperty; + + /** + * Calls Amazon WorkMail and, optionally, publishes a notification to Amazon SNS. + */ + workmailAction?: CfnReceiptRule.WorkmailActionProperty; +} + +/** + * An abstract action for a receipt rule. + */ +export interface IReceiptRuleAction { + /** + * Renders the action specification + */ + render(): ReceiptRuleActionProps; +} + +/** + * Construction properties for a ReceiptRuleAddHeaderAction. + */ +export interface ReceiptRuleAddHeaderActionProps { + /** + * The name of the header to add. Must be between 1 and 50 characters, + * inclusive, and consist of alphanumeric (a-z, A-Z, 0-9) characters + * and dashes only. + */ + name: string; + + /** + * The value of the header to add. Must be less than 2048 characters, + * and must not contain newline characters ("\r" or "\n"). + */ + value: string; +} + +/** + * Adds a header to the received email + */ +export class ReceiptRuleAddHeaderAction implements IReceiptRuleAction { + private readonly name: string; + private readonly value: string; + + constructor(props: ReceiptRuleAddHeaderActionProps) { + if (!/^[a-zA-Z0-9-]{1,50}$/.test(props.name)) { + // tslint:disable:max-line-length + throw new Error('Header `name` must be between 1 and 50 characters, inclusive, and consist of alphanumeric (a-z, A-Z, 0-9) characters and dashes only.'); + // tslint:enable:max-line-length + } + + if (!/^[^\n\r]{0,2047}$/.test(props.value)) { + throw new Error('Header `value` must be less than 2048 characters, and must not contain newline characters ("\r" or "\n").'); + } + + this.name = props.name; + this.value = props.value; + } + + public render(): ReceiptRuleActionProps { + return { + addHeaderAction: { + headerName: this.name, + headerValue: this.value + } + }; + } +} + +/** + * Construction properties for a ReceiptRuleBounceActionTemplate. + */ +export interface ReceiptRuleBounceActionTemplateProps { + /** + * Human-readable text to include in the bounce message. + */ + message: string; + + /** + * The SMTP reply code, as defined by RFC 5321. + * + * @see https://tools.ietf.org/html/rfc5321 + */ + smtpReplyCode: string; + + /** + * The SMTP enhanced status code, as defined by RFC 3463. + * + * @see https://tools.ietf.org/html/rfc3463 + */ + statusCode?: string; +} + +/** + * A bounce action template. + */ +export class ReceiptRuleBounceActionTemplate { + public static readonly MailboxDoesNotExist = new ReceiptRuleBounceActionTemplate({ + message: 'Mailbox does not exist', + smtpReplyCode: '550', + statusCode: '5.1.1' + }); + + public static readonly MessageTooLarge = new ReceiptRuleBounceActionTemplate({ + message: 'Message too large', + smtpReplyCode: '552', + statusCode: '5.3.4' + }); + + public static readonly MailboxFull = new ReceiptRuleBounceActionTemplate({ + message: 'Mailbox full', + smtpReplyCode: '552', + statusCode: '5.2.2' + }); + + public static readonly MessageContentRejected = new ReceiptRuleBounceActionTemplate({ + message: 'Message content rejected', + smtpReplyCode: '500', + statusCode: '5.6.1' + }); + + public static readonly TemporaryFailure = new ReceiptRuleBounceActionTemplate({ + message: 'Temporary failure', + smtpReplyCode: '450', + statusCode: '4.0.0' + }); + + public readonly message: string; + public readonly smtpReplyCode: string; + public readonly statusCode?: string; + + constructor(props: ReceiptRuleBounceActionTemplateProps) { + this.message = props.message; + this.smtpReplyCode = props.smtpReplyCode; + this.statusCode = props.statusCode; + } +} + +/** + * Construction properties for a ReceiptRuleBounceAction. + */ +export interface ReceiptRuleBounceActionProps { + /** + * The template containing the message, reply code and status code. + */ + template: ReceiptRuleBounceActionTemplate; + + /** + * The email address of the sender of the bounced email. This is the address + * from which the bounce message will be sent. + */ + sender: string; + + /** + * The SNS topic to notify when the bounce action is taken. + * + * @default no notification + */ + topic?: sns.ITopic; +} + +/** + * Rejects the received email by returning a bounce response to the sender and, + * optionally, publishes a notification to Amazon SNS. + */ +export class ReceiptRuleBounceAction implements IReceiptRuleAction { + constructor(private readonly props: ReceiptRuleBounceActionProps) { + } + + public render(): ReceiptRuleActionProps { + return { + bounceAction: { + sender: this.props.sender, + smtpReplyCode: this.props.template.smtpReplyCode, + message: this.props.template.message, + topicArn: this.props.topic ? this.props.topic.topicArn : undefined, + statusCode: this.props.template.statusCode + } + }; + } +} + +/** + * The type of invocation to use for a Lambda Action. + */ +export enum LambdaInvocationType { + /** + * The function will be invoked asynchronously. + */ + Event = 'Event', + + /** + * The function will be invoked sychronously. Use RequestResponse only when + * you want to make a mail flow decision, such as whether to stop the receipt + * rule or the receipt rule set. + */ + RequestResponse = 'RequestResponse', +} + +/** + * Construction properties for a ReceiptRuleLambdaAction. + */ +export interface ReceiptRuleLambdaActionProps { + /** + * The Lambda function to invoke. + */ + function: lambda.IFunction + + /** + * The invocation type of the Lambda function. + * + * @default Event + */ + invocationType?: LambdaInvocationType; + + /** + * The SNS topic to notify when the Lambda action is taken. + * + * @default no notification + */ + topic?: sns.ITopic; +} + +/** + * Calls an AWS Lambda function, and optionally, publishes a notification to + * Amazon SNS. + */ +export class ReceiptRuleLambdaAction implements IReceiptRuleAction { + constructor(private readonly props: ReceiptRuleLambdaActionProps) { + } + + public render(): ReceiptRuleActionProps { + // Allow SES to invoke Lambda function + // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-permissions.html#receiving-email-permissions-lambda + const permissionId = 'AllowSes'; + if (!this.props.function.node.tryFindChild(permissionId)) { + this.props.function.addPermission(permissionId, { + action: 'lambda:InvokeFunction', + principal: new iam.ServicePrincipal('ses.amazonaws.com'), + sourceAccount: new cdk.ScopedAws().accountId + }); + } + + return { + lambdaAction: { + functionArn: this.props.function.functionArn, + invocationType: this.props.invocationType, + topicArn: this.props.topic ? this.props.topic.topicArn : undefined + } + }; + } +} + +/** + * Construction properties for a ReceiptRuleS3Action. + */ +export interface ReceiptRuleS3ActionProps { + /** + * The S3 bucket that incoming email will be saved to. + */ + bucket: s3.IBucket; + + /** + * The master key that SES should use to encrypt your emails before saving + * them to the S3 bucket. + * + * @default no encryption + */ + kmsKey?: kms.IEncryptionKey; + + /** + * The key prefix of the S3 bucket. + * + * @default no prefix + */ + objectKeyPrefix?: string; + + /** + * The SNS topic to notify when the S3 action is taken. + * + * @default no notification + */ + topic?: sns.ITopic; +} + +/** + * Saves the received message to an Amazon S3 bucket and, optionally, publishes + * a notification to Amazon SNS. + */ +export class ReceiptRuleS3Action implements IReceiptRuleAction { + constructor(private readonly props: ReceiptRuleS3ActionProps) { + } + + public render(): ReceiptRuleActionProps { + // Allow SES to write to S3 bucket + // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-permissions.html#receiving-email-permissions-s3 + const keyPattern = this.props.objectKeyPrefix || ''; + + const s3Statement = new iam.PolicyStatement() + .addAction('s3:PutObject') + .addServicePrincipal('ses.amazonaws.com') + .addResource(this.props.bucket.arnForObjects(`${keyPattern}*`)) + .addCondition('StringEquals', { + 'aws:Referer': new cdk.ScopedAws().accountId + }); + + this.props.bucket.addToResourcePolicy(s3Statement); + + // Allow SES to use KMS master key + // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-permissions.html#receiving-email-permissions-kms + if (this.props.kmsKey && !/alias\/aws\/ses$/.test(this.props.kmsKey.keyArn)) { + const kmsStatement = new iam.PolicyStatement() + .addActions('km:Encrypt', 'kms:GenerateDataKey') + .addServicePrincipal('ses.amazonaws.com') + .addAllResources() + .addConditions({ + Null: { + 'kms:EncryptionContext:aws:ses:rule-name': 'false', + 'kms:EncryptionContext:aws:ses:message-id': 'false' + }, + StringEquals: { + 'kms:EncryptionContext:aws:ses:source-account': new cdk.ScopedAws().accountId + } + }); + + this.props.kmsKey.addToResourcePolicy(kmsStatement); + } + + return { + s3Action: { + bucketName: this.props.bucket.bucketName, + kmsKeyArn: this.props.kmsKey ? this.props.kmsKey.keyArn : undefined, + objectKeyPrefix: this.props.objectKeyPrefix, + topicArn: this.props.topic ? this.props.topic.topicArn : undefined + } + }; + } +} + +/** + * The type of email encoding to use for a SNS action. + */ +export enum EmailEncoding { + /** + * Base 64 + */ + Base64 = 'Base64', + + /** + * UTF-8 + */ + UTF8 = 'UTF-8', +} + +/** + * Construction properties for a ReceiptRuleSnsAction. + */ +export interface ReceiptRuleSnsActionProps { + /** + * The encoding to use for the email within the Amazon SNS notification. + * + * @default UTF-8 + */ + encoding?: EmailEncoding; + + /** + * The SNS topic to notify. + */ + topic: sns.ITopic; +} + +/** + * Publishes the email content within a notification to Amazon SNS. + */ +export class ReceiptRuleSnsAction implements IReceiptRuleAction { + constructor(private readonly props: ReceiptRuleSnsActionProps) { + } + + public render(): ReceiptRuleActionProps { + return { + snsAction: { + encoding: this.props.encoding, + topicArn: this.props.topic.topicArn + } + }; + } +} + +/** + * Construction properties for a ReceiptRuleStopAction. + */ +export interface ReceiptRuleStopActionProps { + /** + * The SNS topic to notify when the stop action is taken. + */ + topic?: sns.ITopic; +} + +/** + * Terminates the evaluation of the receipt rule set and optionally publishes a + * notification to Amazon SNS. + */ +export class ReceiptRuleStopAction implements IReceiptRuleAction { + constructor(private readonly props?: ReceiptRuleStopActionProps) { + } + + public render(): ReceiptRuleActionProps { + return { + stopAction: { + scope: 'RuleSet', + topicArn: this.props && this.props.topic ? this.props.topic.topicArn : undefined + } + }; + } +} diff --git a/packages/@aws-cdk/aws-ses/lib/receipt-rule-set.ts b/packages/@aws-cdk/aws-ses/lib/receipt-rule-set.ts new file mode 100644 index 0000000000000..54122a7a2ed62 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/lib/receipt-rule-set.ts @@ -0,0 +1,157 @@ +import cdk = require('@aws-cdk/cdk'); +import { DropSpamReceiptRule, ReceiptRule, ReceiptRuleOptions } from './receipt-rule'; +import { CfnReceiptRuleSet } from './ses.generated'; + +/** + * A receipt rule set. + */ +export interface IReceiptRuleSet extends cdk.IConstruct { + /** + * The receipt rule set name. + */ + readonly name: string; + + /** + * Adds a new receipt rule in this rule set. The new rule is added after + * the last added rule unless `after` is specified. + */ + addRule(id: string, options?: ReceiptRuleOptions): ReceiptRule; + + /** + * Exports this receipt rule set from the stack. + */ + export(): ReceiptRuleSetImportProps; +} + +/** + * Construction properties for a ReceiptRuleSet. + */ +export interface ReceiptRuleSetProps { + /** + * The name for the receipt rule set. + * + * @default a CloudFormation generated name + */ + name?: string; + + /** + * The list of rules to add to this rule set. Rules are added in the same + * order as they appear in the list. + */ + rules?: ReceiptRuleOptions[] + + /** + * Whether to add a first rule to stop processing messages + * that have at least one spam indicator. + * + * @default false + */ + dropSpam?: boolean; +} + +/** + * A new or imported receipt rule set. + */ +export abstract class ReceiptRuleSetBase extends cdk.Construct implements IReceiptRuleSet { + public abstract readonly name: string; + + private lastAddedRule?: ReceiptRule; + + /** + * Adds a new receipt rule in this rule set. The new rule is added after + * the last added rule unless `after` is specified. + */ + public addRule(id: string, options?: ReceiptRuleOptions): ReceiptRule { + this.lastAddedRule = new ReceiptRule(this, id, { + after: this.lastAddedRule ? this.lastAddedRule : undefined, + ruleSet: this, + ...options + }); + + return this.lastAddedRule; + } + + public abstract export(): ReceiptRuleSetImportProps; + + /** + * Adds a drop spam rule + */ + protected addDropSpamRule(): void { + const dropSpam = new DropSpamReceiptRule(this, 'DropSpam', { + ruleSet: this + }); + this.lastAddedRule = dropSpam.rule; + } +} + +/** + * A new receipt rule set. + */ +export class ReceiptRuleSet extends ReceiptRuleSetBase implements IReceiptRuleSet { + /** + * Import an exported receipt rule set. + */ + public static import(scope: cdk.Construct, id: string, props: ReceiptRuleSetImportProps): IReceiptRuleSet { + return new ImportedReceiptRuleSet(scope, id, props); + } + + public readonly name: string; + + constructor(scope: cdk.Construct, id: string, props?: ReceiptRuleSetProps) { + super(scope, id); + + const resource = new CfnReceiptRuleSet(this, 'Resource', { + ruleSetName: props ? props.name : undefined + }); + + this.name = resource.receiptRuleSetName; + + if (props) { + const rules = props.rules || []; + rules.forEach((ruleOption, idx) => this.addRule(`Rule${idx}`, ruleOption)); + + if (props.dropSpam) { + this.addDropSpamRule(); + } + } + } + + /** + * Exports this receipt rule set from the stack. + */ + public export(): ReceiptRuleSetImportProps { + return { + name: new cdk.CfnOutput(this, 'ReceiptRuleSetName', { value: this.name }).makeImportValue().toString() + }; + } +} + +/** + * Construction properties for an ImportedReceiptRuleSet. + */ +export interface ReceiptRuleSetImportProps { + /** + * The receipt rule set name. + */ + name: string; +} + +/** + * An imported receipt rule set. + */ +class ImportedReceiptRuleSet extends ReceiptRuleSetBase implements IReceiptRuleSet { + public readonly name: string; + + constructor(scope: cdk.Construct, id: string, private readonly props: ReceiptRuleSetImportProps) { + super(scope, id); + + this.name = props.name; + } + + /** + * Exports this receipt rule set from the stack. + */ + public export() { + return this.props; + } +} diff --git a/packages/@aws-cdk/aws-ses/lib/receipt-rule.ts b/packages/@aws-cdk/aws-ses/lib/receipt-rule.ts new file mode 100644 index 0000000000000..05956125bcc56 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/lib/receipt-rule.ts @@ -0,0 +1,243 @@ +import lambda = require('@aws-cdk/aws-lambda'); +import cdk = require('@aws-cdk/cdk'); +import { IReceiptRuleAction, LambdaInvocationType, ReceiptRuleActionProps, ReceiptRuleLambdaAction } from './receipt-rule-action'; +import { IReceiptRuleSet } from './receipt-rule-set'; +import { CfnReceiptRule } from './ses.generated'; + +/** + * A receipt rule. + */ +export interface IReceiptRule extends cdk.IConstruct { + /** + * The name of the receipt rule. + */ + readonly name: string; + + /** + * Exports this receipt rule from the stack. + */ + export(): ReceiptRuleImportProps; +} + +/** + * The type of TLS policy for a receipt rule. + */ +export enum TlsPolicy { + /** + * Do not check for TLS. + */ + Optional = 'Optional', + + /** + * Bounce emails that are not received over TLS. + */ + Require = 'Require' +} + +/** + * Options to add a receipt rule to a receipt rule set. + */ +export interface ReceiptRuleOptions { + /** + * An ordered list of actions to perform on messages that match at least + * one of the recipient email addresses or domains specified in the + * receipt rule. + */ + actions?: IReceiptRuleAction[]; + + /** + * An existing rule after which the new rule will be placed. + * + * @default the new rule is inserted at the beginning of the rule list + */ + after?: IReceiptRule; + + /** + * Whether the rule is active. + * + * @default true + */ + enabled?: boolean; + + /** + * The name for the rule + * + * @default a CloudFormation generated name + */ + name?: string; + + /** + * The recipient domains and email addresses that the receipt rule applies to. + * + * @default match all recipients under all verified domains. + */ + recipients?: string[]; + + /** + * Wheter to scan for spam and viruses. + * + * @default false + */ + scanEnabled?: boolean; + + /** + * The TLS policy + * + * @default Optional + */ + tlsPolicy?: TlsPolicy; +} + +/** + * Construction properties for a ReceiptRule. + */ +export interface ReceiptRuleProps extends ReceiptRuleOptions { + /** + * The name of the rule set that the receipt rule will be added to. + */ + ruleSet: IReceiptRuleSet; +} + +/** + * A new receipt rule. + */ +export class ReceiptRule extends cdk.Construct implements IReceiptRule { + /** + * Import an exported receipt rule. + */ + public static import(scope: cdk.Construct, id: string, props: ReceiptRuleImportProps): IReceiptRule { + return new ImportedReceiptRule(scope, id, props); + } + + public readonly name: string; + private readonly renderedActions = new Array(); + + constructor(scope: cdk.Construct, id: string, props: ReceiptRuleProps) { + super(scope, id); + + const resource = new CfnReceiptRule(this, 'Resource', { + after: props.after ? props.after.name : undefined, + rule: { + actions: new cdk.Token(() => this.getRenderedActions()), + enabled: props.enabled === undefined ? true : props.enabled, + name: props.name, + recipients: props.recipients, + scanEnabled: props.scanEnabled, + tlsPolicy: props.tlsPolicy + }, + ruleSetName: props.ruleSet.name + }); + + this.name = resource.receiptRuleName; + + if (props.actions) { + props.actions.forEach(action => this.addAction(action)); + } + } + + /** + * Adds an action to this receipt rule. + */ + public addAction(action: IReceiptRuleAction) { + const renderedAction = action.render(); + + this.renderedActions.push(renderedAction); + } + + /** + * Exports this receipt rule from the stack. + */ + public export(): ReceiptRuleImportProps { + return { + name: new cdk.CfnOutput(this, 'ReceiptRuleName', { value: this.name }).makeImportValue().toString() + }; + } + + private getRenderedActions() { + if (this.renderedActions.length === 0) { + return undefined; + } + + return this.renderedActions; + } +} + +export interface ReceiptRuleImportProps { + /** + * The name of the receipt rule. + */ + name: string; +} + +/** + * An imported receipt rule. + */ +class ImportedReceiptRule extends cdk.Construct implements IReceiptRule { + public readonly name: string; + + constructor(scope: cdk.Construct, id: string, private readonly props: ReceiptRuleImportProps) { + super(scope, id); + + this.name = props.name; + } + + /** + * Exports this receipt rule from the stack. + */ + public export() { + return this.props; + } +} + +/** + * A rule added at the top of the rule set to drop spam/virus. + * + * @see https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-action-lambda-example-functions.html + */ +export class DropSpamReceiptRule extends cdk.Construct { + public readonly rule: ReceiptRule; + + constructor(scope: cdk.Construct, id: string, props: ReceiptRuleProps) { + super(scope, id); + + const fn = new lambda.SingletonFunction(this, 'Function', { + runtime: lambda.Runtime.NodeJS810, + handler: 'index.handler', + code: lambda.Code.inline(`exports.handler = ${dropSpamCode}`), + uuid: '224e77f9-a32e-4b4d-ac32-983477abba16' + }); + + this.rule = new ReceiptRule(this, 'Rule', { + actions: [ + new ReceiptRuleLambdaAction({ + function: fn, + invocationType: LambdaInvocationType.RequestResponse + }) + ], + scanEnabled: true, + ruleSet: props.ruleSet + }); + } +} + +// Adapted from https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-action-lambda-example-functions.html +// tslint:disable:no-console +function dropSpamCode(event: any, _: any, callback: any) { + console.log('Spam filter'); + + const sesNotification = event.Records[0].ses; + console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2)); + + // Check if any spam check failed + if (sesNotification.receipt.spfVerdict.status === 'FAIL' + || sesNotification.receipt.dkimVerdict.status === 'FAIL' + || sesNotification.receipt.spamVerdict.status === 'FAIL' + || sesNotification.receipt.virusVerdict.status === 'FAIL') { + console.log('Dropping spam'); + + // Stop processing rule set, dropping message + callback(null, { disposition : 'STOP_RULE_SET' }); + } else { + callback(null, null); + } +} diff --git a/packages/@aws-cdk/aws-ses/package.json b/packages/@aws-cdk/aws-ses/package.json index 5648c95c06063..0f1675168eabb 100644 --- a/packages/@aws-cdk/aws-ses/package.json +++ b/packages/@aws-cdk/aws-ses/package.json @@ -56,17 +56,28 @@ "devDependencies": { "@aws-cdk/assert": "^0.25.3", "cdk-build-tools": "^0.25.3", + "cdk-integ-tools": "^0.25.3", "cfn2ts": "^0.25.3", "pkglint": "^0.25.3" }, "dependencies": { + "@aws-cdk/aws-iam": "^0.25.3", + "@aws-cdk/aws-kms": "^0.25.3", + "@aws-cdk/aws-lambda": "^0.25.3", + "@aws-cdk/aws-s3": "^0.25.3", + "@aws-cdk/aws-sns": "^0.25.3", "@aws-cdk/cdk": "^0.25.3" }, "homepage": "https://github.com/awslabs/aws-cdk", "peerDependencies": { + "@aws-cdk/aws-iam": "^0.25.3", + "@aws-cdk/aws-kms": "^0.25.3", + "@aws-cdk/aws-lambda": "^0.25.3", + "@aws-cdk/aws-s3": "^0.25.3", + "@aws-cdk/aws-sns": "^0.25.3", "@aws-cdk/cdk": "^0.25.3" }, "engines": { "node": ">= 8.10.0" } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-ses/test/example.receiving.lit.ts b/packages/@aws-cdk/aws-ses/test/example.receiving.lit.ts new file mode 100644 index 0000000000000..f14cfa46d10b6 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/example.receiving.lit.ts @@ -0,0 +1,38 @@ +import s3 = require('@aws-cdk/aws-s3'); +import sns = require('@aws-cdk/aws-sns'); +import cdk = require('@aws-cdk/cdk'); +import ses = require('../lib'); + +const stack = new cdk.Stack(); + +/// !show +const bucket = new s3.Bucket(stack, 'Bucket'); +const topic = new sns.Topic(stack, 'Topic'); + +new ses.ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + recipients: ['hello@aws.com'], + actions: [ + new ses.ReceiptRuleAddHeaderAction({ + name: 'X-Special-Header', + value: 'aws' + }), + new ses.ReceiptRuleS3Action({ + bucket, + objectKeyPrefix: 'emails/', + topic + }) + ], + }, + { + recipients: ['aws.com'], + actions: [ + new ses.ReceiptRuleSnsAction({ + topic + }) + ] + } + ] +}); +/// !hide diff --git a/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json b/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json new file mode 100644 index 0000000000000..e74ddbee8d0b3 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json @@ -0,0 +1,439 @@ +{ + "Resources": { + "TopicBFC7AF6E": { + "Type": "AWS::SNS::Topic" + }, + "FunctionServiceRole675BB04A": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": { + "Fn::Join": [ + "", + [ + "lambda.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "Function76856677": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "ZipFile": "exports.handler = async (event) => event;" + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "FunctionServiceRole675BB04A", + "Arn" + ] + }, + "Runtime": "nodejs8.10" + }, + "DependsOn": [ + "FunctionServiceRole675BB04A" + ] + }, + "FunctionAllowSes1829904A": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Ref": "Function76856677" + }, + "Principal": "ses.amazonaws.com", + "SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "Bucket83908E77": { + "Type": "AWS::S3::Bucket", + "DeletionPolicy": "Retain" + }, + "BucketPolicyE9A3008A": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "Bucket83908E77" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:PutObject", + "Condition": { + "StringEquals": { + "aws:Referer": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": { + "Fn::Join": [ + "", + [ + "ses.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + }, + "Resource": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "Bucket83908E77", + "Arn" + ] + }, + "/emails/*" + ] + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "Key961B73FD": { + "Type": "AWS::KMS::Key", + "Properties": { + "KeyPolicy": { + "Statement": [ + { + "Action": [ + "kms:Create*", + "kms:Describe*", + "kms:Enable*", + "kms:List*", + "kms:Put*", + "kms:Update*", + "kms:Revoke*", + "kms:Disable*", + "kms:Get*", + "kms:Delete*", + "kms:ScheduleKeyDeletion", + "kms:CancelKeyDeletion" + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::", + { + "Ref": "AWS::AccountId" + }, + ":root" + ] + ] + } + }, + "Resource": "*" + }, + { + "Action": [ + "km:Encrypt", + "kms:GenerateDataKey" + ], + "Condition": { + "Null": { + "kms:EncryptionContext:aws:ses:rule-name": "false", + "kms:EncryptionContext:aws:ses:message-id": "false" + }, + "StringEquals": { + "kms:EncryptionContext:aws:ses:source-account": { + "Ref": "AWS::AccountId" + } + } + }, + "Effect": "Allow", + "Principal": { + "Service": { + "Fn::Join": [ + "", + [ + "ses.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + }, + "Resource": "*" + } + ], + "Version": "2012-10-17" + } + }, + "DeletionPolicy": "Retain" + }, + "RuleSetE30C6C48": { + "Type": "AWS::SES::ReceiptRuleSet" + }, + "RuleSetDropSpamRule5809F51B": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Actions": [ + { + "LambdaAction": { + "FunctionArn": { + "Fn::GetAtt": [ + "SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15", + "Arn" + ] + }, + "InvocationType": "RequestResponse" + } + } + ], + "Enabled": true, + "ScanEnabled": true + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + } + } + }, + "RuleSetFirstRule0A27C8CC": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Actions": [ + { + "AddHeaderAction": { + "HeaderName": "X-My-Header", + "HeaderValue": "value" + } + }, + { + "LambdaAction": { + "FunctionArn": { + "Fn::GetAtt": [ + "Function76856677", + "Arn" + ] + }, + "InvocationType": "RequestResponse", + "TopicArn": { + "Ref": "TopicBFC7AF6E" + } + } + }, + { + "S3Action": { + "BucketName": { + "Ref": "Bucket83908E77" + }, + "KmsKeyArn": { + "Fn::GetAtt": [ + "Key961B73FD", + "Arn" + ] + }, + "ObjectKeyPrefix": "emails/", + "TopicArn": { + "Ref": "TopicBFC7AF6E" + } + } + }, + { + "SNSAction": { + "Encoding": "Base64", + "TopicArn": { + "Ref": "TopicBFC7AF6E" + } + } + }, + { + "BounceAction": { + "Message": "Message content rejected", + "Sender": "cdk-ses-receipt-test@yopmail.com", + "SmtpReplyCode": "500", + "StatusCode": "5.6.1", + "TopicArn": { + "Ref": "TopicBFC7AF6E" + } + } + } + ], + "Enabled": true, + "Name": "FirstRule", + "Recipients": [ + "cdk-ses-receipt-test@yopmail.com" + ], + "ScanEnabled": true, + "TlsPolicy": "Require" + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + }, + "After": { + "Ref": "RuleSetDropSpamRule5809F51B" + } + } + }, + "RuleSetSecondRule03178AD4": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Actions": [ + { + "StopAction": { + "Scope": "RuleSet", + "TopicArn": { + "Ref": "TopicBFC7AF6E" + } + } + } + ], + "Enabled": true + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + }, + "After": { + "Ref": "RuleSetFirstRule0A27C8CC" + } + } + }, + "SingletonLambda224e77f9a32e4b4dac32983477abba16ServiceRole3037F5B4": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": { + "Fn::Join": [ + "", + [ + "lambda.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "ZipFile": "exports.handler = function dropSpamCode(event, _, callback) {\n console.log('Spam filter');\n const sesNotification = event.Records[0].ses;\n console.log(\"SES Notification:\\n\", JSON.stringify(sesNotification, null, 2));\n // Check if any spam check failed\n if (sesNotification.receipt.spfVerdict.status === 'FAIL'\n || sesNotification.receipt.dkimVerdict.status === 'FAIL'\n || sesNotification.receipt.spamVerdict.status === 'FAIL'\n || sesNotification.receipt.virusVerdict.status === 'FAIL') {\n console.log('Dropping spam');\n // Stop processing rule set, dropping message\n callback(null, { disposition: 'STOP_RULE_SET' });\n }\n else {\n callback(null, null);\n }\n}" + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "SingletonLambda224e77f9a32e4b4dac32983477abba16ServiceRole3037F5B4", + "Arn" + ] + }, + "Runtime": "nodejs8.10" + }, + "DependsOn": [ + "SingletonLambda224e77f9a32e4b4dac32983477abba16ServiceRole3037F5B4" + ] + }, + "SingletonLambda224e77f9a32e4b4dac32983477abba16AllowSesB42DF904": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Ref": "SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15" + }, + "Principal": "ses.amazonaws.com", + "SourceAccount": { + "Ref": "AWS::AccountId" + } + } + }, + "WhiteListBlockAllAE2CDDFF": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "0.0.0.0/0", + "Policy": "Block" + } + } + } + }, + "WhiteListAllow1000016F396A7F2": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "10.0.0.0/16", + "Policy": "Allow" + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-ses/test/integ.receipt.ts b/packages/@aws-cdk/aws-ses/test/integ.receipt.ts new file mode 100644 index 0000000000000..2994acd4e2f60 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/integ.receipt.ts @@ -0,0 +1,76 @@ +import kms = require('@aws-cdk/aws-kms'); +import lambda = require('@aws-cdk/aws-lambda'); +import s3 = require('@aws-cdk/aws-s3'); +import sns = require('@aws-cdk/aws-sns'); +import cdk = require('@aws-cdk/cdk'); +import ses = require('../lib'); + +const app = new cdk.App(); + +const stack = new cdk.Stack(app, 'aws-cdk-ses-receipt'); + +const topic = new sns.Topic(stack, 'Topic'); + +const fn = new lambda.Function(stack, 'Function', { + code: lambda.Code.inline('exports.handler = async (event) => event;'), + handler: 'index.handler', + runtime: lambda.Runtime.NodeJS810 +}); + +const bucket = new s3.Bucket(stack, 'Bucket'); + +const kmsKey = new kms.EncryptionKey(stack, 'Key'); + +const ruleSet = new ses.ReceiptRuleSet(stack, 'RuleSet', { + dropSpam: true +}); + +const firstRule = ruleSet.addRule('FirstRule', { + actions: [ + new ses.ReceiptRuleAddHeaderAction({ + name: 'X-My-Header', + value: 'value' + }), + new ses.ReceiptRuleLambdaAction({ + function: fn, + invocationType: ses.LambdaInvocationType.RequestResponse, + topic + }), + new ses.ReceiptRuleS3Action({ + bucket, + kmsKey, + objectKeyPrefix: 'emails/', + topic + }), + new ses.ReceiptRuleSnsAction({ + encoding: ses.EmailEncoding.Base64, + topic + }) + ], + name: 'FirstRule', + recipients: ['cdk-ses-receipt-test@yopmail.com'], + scanEnabled: true, + tlsPolicy: ses.TlsPolicy.Require, +}); + +firstRule.addAction( + new ses.ReceiptRuleBounceAction({ + sender: 'cdk-ses-receipt-test@yopmail.com', + template: ses.ReceiptRuleBounceActionTemplate.MessageContentRejected, + topic + }) +); + +const secondRule = ruleSet.addRule('SecondRule'); + +secondRule.addAction(new ses.ReceiptRuleStopAction({ + topic +})); + +new ses.WhiteListReceiptFilter(stack, 'WhiteList', { + ips: [ + '10.0.0.0/16' + ] +}); + +app.run(); diff --git a/packages/@aws-cdk/aws-ses/test/test.receipt-filter.ts b/packages/@aws-cdk/aws-ses/test/test.receipt-filter.ts new file mode 100644 index 0000000000000..b0d40052a3534 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/test.receipt-filter.ts @@ -0,0 +1,94 @@ +import { expect } from '@aws-cdk/assert'; +import { Stack } from '@aws-cdk/cdk'; +import { Test } from 'nodeunit'; +import { ReceiptFilter, ReceiptFilterPolicy, WhiteListReceiptFilter } from '../lib'; + +// tslint:disable:object-literal-key-quotes + +export = { + 'can create a receipt filter'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + new ReceiptFilter(stack, 'Filter', { + ip: '1.2.3.4/16', + name: 'MyFilter', + policy: ReceiptFilterPolicy.Block + }); + + // THEN + expect(stack).toMatch({ + "Resources": { + "FilterC907D6DA": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "1.2.3.4/16", + "Policy": "Block" + }, + "Name": "MyFilter" + } + } + } + } + }); + + test.done(); + }, + + 'can create a white list filter'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + new WhiteListReceiptFilter(stack, 'WhiteList', { + ips: [ + '10.0.0.0/16', + '1.2.3.4' + ] + }); + + // THEN + expect(stack).toMatch({ + "Resources": { + "WhiteListBlockAllAE2CDDFF": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "0.0.0.0/0", + "Policy": "Block" + } + } + } + }, + "WhiteListAllow1000016F396A7F2": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "10.0.0.0/16", + "Policy": "Allow" + } + } + } + }, + "WhiteListAllow1234A4DDAD4E": { + "Type": "AWS::SES::ReceiptFilter", + "Properties": { + "Filter": { + "IpFilter": { + "Cidr": "1.2.3.4", + "Policy": "Allow" + } + } + } + } + } + }); + + test.done(); + } +}; diff --git a/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts new file mode 100644 index 0000000000000..4ac0e349169cb --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts @@ -0,0 +1,451 @@ +import { expect, haveResource, haveResourceLike } from '@aws-cdk/assert'; +import kms = require('@aws-cdk/aws-kms'); +import lambda = require('@aws-cdk/aws-lambda'); +import s3 = require('@aws-cdk/aws-s3'); +import sns = require('@aws-cdk/aws-sns'); +import { Stack } from '@aws-cdk/cdk'; +import { Test } from 'nodeunit'; +// tslint:disable:max-line-length +import { EmailEncoding, LambdaInvocationType, ReceiptRuleAddHeaderAction, ReceiptRuleBounceAction, ReceiptRuleBounceActionTemplate, ReceiptRuleLambdaAction, ReceiptRuleS3Action, ReceiptRuleSet, ReceiptRuleSnsAction, ReceiptRuleStopAction } from '../lib'; +// tslint:enable:max-line-length + +export = { + 'can add an add header action'(test: Test) { + // GIVEN + const stack = new Stack(); + + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleAddHeaderAction({ + name: 'X-My-Header', + value: 'value' + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + AddHeaderAction: { + HeaderName: 'X-My-Header', + HeaderValue: 'value' + } + } + ], + Enabled: true + } + })); + + test.done(); + }, + + 'fails when header name is invalid'(test: Test) { + const stack = new Stack(); + + test.throws(() => new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleAddHeaderAction({ + name: 'He@der', + value: 'value' + }) + ] + } + ] + }), /`name`/); + + test.done(); + }, + + 'fails when header value is invalid'(test: Test) { + const stack = new Stack(); + + const ruleSet = new ReceiptRuleSet(stack, 'RuleSet'); + + test.throws(() => ruleSet.addRule('Rule', { + actions: [ + new ReceiptRuleAddHeaderAction({ + name: 'Header', + value: `va + lu` + }) + ] + }), /`value`/); + + test.done(); + }, + + 'can add a bounce action'(test: Test) { + // GIVEN + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'Topic'); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleBounceAction({ + sender: 'noreply@aws.com', + template: ReceiptRuleBounceActionTemplate.MessageContentRejected, + topic + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + BounceAction: { + Message: 'Message content rejected', + Sender: 'noreply@aws.com', + SmtpReplyCode: '500', + TopicArn: { + Ref: 'TopicBFC7AF6E' + }, + StatusCode: '5.6.1', + } + } + ], + Enabled: true + } + })); + + test.done(); + }, + + 'can add a lambda action'(test: Test) { + // GIVEN + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'Topic'); + + const fn = new lambda.Function(stack, 'Function', { + code: lambda.Code.inline(''), + handler: 'index.handler', + runtime: lambda.Runtime.NodeJS810 + }); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleLambdaAction({ + function: fn, + invocationType: LambdaInvocationType.RequestResponse, + topic + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + LambdaAction: { + FunctionArn: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn' + ] + }, + InvocationType: 'RequestResponse', + TopicArn: { + Ref: 'TopicBFC7AF6E' + } + } + }, + ], + Enabled: true + } + })); + + expect(stack).to(haveResource('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + Ref: 'Function76856677' + }, + Principal: 'ses.amazonaws.com', + SourceAccount: { + Ref: 'AWS::AccountId' + } + })); + + test.done(); + }, + + 'can add a s3 action'(test: Test) { + // GIVEN + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'Topic'); + + const bucket = new s3.Bucket(stack, 'Bucket'); + + const kmsKey = new kms.EncryptionKey(stack, 'Key'); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleS3Action({ + bucket, + kmsKey, + objectKeyPrefix: 'emails/', + topic + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + S3Action: { + BucketName: { + Ref: 'Bucket83908E77' + }, + KmsKeyArn: { + 'Fn::GetAtt': [ + 'Key961B73FD', + 'Arn' + ] + }, + TopicArn: { + Ref: 'TopicBFC7AF6E' + }, + ObjectKeyPrefix: 'emails/' + } + } + ], + Enabled: true + } + })); + + expect(stack).to(haveResource('AWS::S3::BucketPolicy', { + Bucket: { + Ref: 'Bucket83908E77' + }, + PolicyDocument: { + Statement: [ + { + Action: 's3:PutObject', + Condition: { + StringEquals: { + 'aws:Referer': { + Ref: 'AWS::AccountId' + } + } + }, + Effect: 'Allow', + Principal: { + Service: { + 'Fn::Join': [ + '', + [ + 'ses.', + { + Ref: 'AWS::URLSuffix' + } + ] + ] + } + }, + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'Bucket83908E77', + 'Arn' + ] + }, + '/emails/*' + ] + ] + } + } + ], + Version: '2012-10-17' + } + })); + + expect(stack).to(haveResourceLike('AWS::KMS::Key', { + KeyPolicy: { + Statement: [ + { + Action: [ + 'kms:Create*', + 'kms:Describe*', + 'kms:Enable*', + 'kms:List*', + 'kms:Put*', + 'kms:Update*', + 'kms:Revoke*', + 'kms:Disable*', + 'kms:Get*', + 'kms:Delete*', + 'kms:ScheduleKeyDeletion', + 'kms:CancelKeyDeletion' + ], + Effect: 'Allow', + Principal: { + AWS: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition' + }, + ':iam::', + { + Ref: 'AWS::AccountId' + }, + ':root' + ] + ] + } + }, + Resource: '*' + }, + { + Action: [ + 'km:Encrypt', + 'kms:GenerateDataKey' + ], + Condition: { + Null: { + 'kms:EncryptionContext:aws:ses:rule-name': 'false', + 'kms:EncryptionContext:aws:ses:message-id': 'false' + }, + StringEquals: { + 'kms:EncryptionContext:aws:ses:source-account': { + Ref: 'AWS::AccountId' + } + } + }, + Effect: 'Allow', + Principal: { + Service: { + 'Fn::Join': [ + '', + [ + 'ses.', + { + Ref: 'AWS::URLSuffix' + } + ] + ] + } + }, + Resource: '*' + } + ], + Version: '2012-10-17' + } + })); + + test.done(); + }, + + 'can add a sns action'(test: Test) { + // GIVEN + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'Topic'); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleSnsAction({ + encoding: EmailEncoding.Base64, + topic + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + SNSAction: { + Encoding: 'Base64', + TopicArn: { + Ref: 'TopicBFC7AF6E' + } + } + } + ], + Enabled: true + } + })); + + test.done(); + }, + + 'can add a stop action'(test: Test) { + // GIVEN + const stack = new Stack(); + + const topic = new sns.Topic(stack, 'Topic'); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + actions: [ + new ReceiptRuleStopAction({ + topic + }) + ] + } + ] + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + StopAction: { + Scope: 'RuleSet', + TopicArn: { + Ref: 'TopicBFC7AF6E' + } + } + } + ], + Enabled: true + } + })); + + test.done(); + } +}; diff --git a/packages/@aws-cdk/aws-ses/test/test.receipt-rule-set.ts b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-set.ts new file mode 100644 index 0000000000000..6ccca2d1b0be6 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-set.ts @@ -0,0 +1,119 @@ +import { expect, haveResource } from '@aws-cdk/assert'; +import { Stack } from '@aws-cdk/cdk'; +import { Test } from 'nodeunit'; +import { ReceiptRuleSet } from '../lib'; + +// tslint:disable:object-literal-key-quotes + +export = { + 'can create a receipt rule set'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + name: 'MyRuleSet' + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRuleSet', { + RuleSetName: 'MyRuleSet' + })); + + test.done(); + }, + + 'can create a receipt rule set with drop spam'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + dropSpam: true + }); + + // THEN + expect(stack).to(haveResource('AWS::SES::ReceiptRule', { + Rule: { + Actions: [ + { + LambdaAction: { + FunctionArn: { + 'Fn::GetAtt': [ + 'SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15', + 'Arn' + ] + }, + InvocationType: 'RequestResponse' + } + } + ], + Enabled: true, + ScanEnabled: true + } + })); + + expect(stack).to(haveResource('AWS::Lambda::Function')); + + test.done(); + }, + + 'export receipt rule set'(test: Test) { + // GIVEN + const stack = new Stack(); + const receiptRuleSet = new ReceiptRuleSet(stack, 'RuleSet'); + + // WHEN + receiptRuleSet.export(); + + // THEN + expect(stack).toMatch({ + "Resources": { + "RuleSetE30C6C48": { + "Type": "AWS::SES::ReceiptRuleSet" + } + }, + "Outputs": { + "RuleSetReceiptRuleSetNameBA4266DD": { + "Value": { + "Ref": "RuleSetE30C6C48" + }, + "Export": { + "Name": "RuleSetReceiptRuleSetNameBA4266DD" + } + } + } + }); + + test.done(); + }, + + 'import receipt rule set'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + const receiptRuleSet = ReceiptRuleSet.import(stack, 'ImportedRuleSet', { + name: 'MyRuleSet' + }); + + receiptRuleSet.addRule('MyRule'); + + // THEN + expect(stack).toMatch({ + "Resources": { + "ImportedRuleSetMyRule53EE2F7F": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Enabled": true + }, + "RuleSetName": "MyRuleSet" + } + } + }, + }); + + test.done(); + } +}; diff --git a/packages/@aws-cdk/aws-ses/test/test.receipt-rule.ts b/packages/@aws-cdk/aws-ses/test/test.receipt-rule.ts new file mode 100644 index 0000000000000..dbd369a16be08 --- /dev/null +++ b/packages/@aws-cdk/aws-ses/test/test.receipt-rule.ts @@ -0,0 +1,153 @@ +import { expect } from '@aws-cdk/assert'; +import { Stack } from '@aws-cdk/cdk'; +import { Test } from 'nodeunit'; +import { ReceiptRule, ReceiptRuleSet, TlsPolicy } from '../lib'; + +// tslint:disable:object-literal-key-quotes + +export = { + 'can create receipt rules with second after first'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + new ReceiptRuleSet(stack, 'RuleSet', { + rules: [ + { + name: 'FirstRule', + }, + { + enabled: false, + name: 'SecondRule', + recipients: ['hello@aws.com'], + scanEnabled: true, + tlsPolicy: TlsPolicy.Require + } + ] + }); + + // THEN + expect(stack).toMatch({ + "Resources": { + "RuleSetE30C6C48": { + "Type": "AWS::SES::ReceiptRuleSet" + }, + "RuleSetRule023C3B8E1": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Name": "FirstRule", + "Enabled": true + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + } + } + }, + "RuleSetRule117041B57": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Enabled": false, + "Name": "SecondRule", + "Recipients": [ + "hello@aws.com" + ], + "ScanEnabled": true, + "TlsPolicy": "Require" + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + }, + "After": { + "Ref": "RuleSetRule023C3B8E1" + } + } + } + } + }); + + test.done(); + }, + + 'export receipt rule'(test: Test) { + // GIVEN + const stack = new Stack(); + const receiptRuleSet = new ReceiptRuleSet(stack, 'RuleSet'); + const receiptRule = receiptRuleSet.addRule('Rule'); + + // WHEN + receiptRule.export(); + + // THEN + expect(stack).toMatch({ + "Resources": { + "RuleSetE30C6C48": { + "Type": "AWS::SES::ReceiptRuleSet" + }, + "RuleSetRule0B1D6BCA": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Enabled": true + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + } + } + } + }, + "Outputs": { + "RuleSetRuleReceiptRuleName5620D98F": { + "Value": { + "Ref": "RuleSetRule0B1D6BCA" + }, + "Export": { + "Name": "RuleSetRuleReceiptRuleName5620D98F" + } + } + } + }); + + test.done(); + }, + + 'import receipt rule'(test: Test) { + // GIVEN + const stack = new Stack(); + + // WHEN + const receiptRule = ReceiptRule.import(stack, 'ImportedRule', { + name: 'MyRule' + }); + + const receiptRuleSet = new ReceiptRuleSet(stack, 'RuleSet'); + + receiptRuleSet.addRule('MyRule', { + after: receiptRule + }); + + // THEN + expect(stack).toMatch({ + "Resources": { + "RuleSetE30C6C48": { + "Type": "AWS::SES::ReceiptRuleSet" + }, + "RuleSetMyRule60B1D107": { + "Type": "AWS::SES::ReceiptRule", + "Properties": { + "Rule": { + "Enabled": true + }, + "RuleSetName": { + "Ref": "RuleSetE30C6C48" + }, + "After": "MyRule" + } + } + }, + }); + + test.done(); + } +}; diff --git a/packages/@aws-cdk/aws-ses/test/test.ses.ts b/packages/@aws-cdk/aws-ses/test/test.ses.ts deleted file mode 100644 index 820f6b467f38f..0000000000000 --- a/packages/@aws-cdk/aws-ses/test/test.ses.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Test, testCase } from 'nodeunit'; - -export = testCase({ - notTested(test: Test) { - test.ok(true, 'No tests are specified for this package.'); - test.done(); - } -}); From 21962c97236397800151b087ed1f143b97d0e376 Mon Sep 17 00:00:00 2001 From: Simon-Pierre Gingras Date: Mon, 18 Mar 2019 01:25:34 -0700 Subject: [PATCH 07/16] fix(stepfunctions): Actually perform rendering of NotCondition Without this fix, the `Not` condition would render as (notice that `variable`, `comparisonOperator` and `value` are not capitalized): ``` { Not: VariableComparison { variable: '$.a', comparisonOperator: 0, value: 'b' } } ``` --- .../@aws-cdk/aws-stepfunctions/lib/condition.ts | 4 ++-- .../aws-stepfunctions/test/test.condition.ts | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-stepfunctions/lib/condition.ts b/packages/@aws-cdk/aws-stepfunctions/lib/condition.ts index d7b1d80dad20a..5125960302cce 100644 --- a/packages/@aws-cdk/aws-stepfunctions/lib/condition.ts +++ b/packages/@aws-cdk/aws-stepfunctions/lib/condition.ts @@ -221,7 +221,7 @@ class NotCondition extends Condition { public renderCondition(): any { return { - Not: this.comparisonOperation + Not: this.comparisonOperation.renderCondition() }; } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-stepfunctions/test/test.condition.ts b/packages/@aws-cdk/aws-stepfunctions/test/test.condition.ts index f0577272715b8..118504b910f74 100644 --- a/packages/@aws-cdk/aws-stepfunctions/test/test.condition.ts +++ b/packages/@aws-cdk/aws-stepfunctions/test/test.condition.ts @@ -8,5 +8,17 @@ export = { }); test.done(); - } + }, + 'NotConditon must render properly'(test: Test) { + // GIVEN + const condition = stepfunctions.Condition.not(stepfunctions.Condition.stringEquals('$.a', 'b')); + + // WHEN + const render = condition.renderCondition(); + + // THEN + test.deepEqual(render, {Not: {Variable: '$.a', StringEquals: 'b'}}); + + test.done(); + }, }; From 1ac842ad4d48a636e9f0c7a520306d5388e1e170 Mon Sep 17 00:00:00 2001 From: Elad Ben-Israel Date: Mon, 18 Mar 2019 13:53:12 +0200 Subject: [PATCH 08/16] chore(build): allow generating a subset of language packages (#1730) Update the build tools to take an argument to pack only a subset of language targets. --- pack.sh | 5 +- package-lock.json | 3206 +++++++---------- .../@aws-cdk/app-delivery/package-lock.json | 2 +- packages/@aws-cdk/applet-js/package-lock.json | 2 +- packages/@aws-cdk/assert/package-lock.json | 2 +- .../@aws-cdk/assets-docker/package-lock.json | 2 +- .../package-lock.json | 2 +- .../aws-autoscaling-common/package-lock.json | 2 +- .../package-lock.json | 2 +- .../aws-cloudformation/package-lock.json | 2 +- .../@aws-cdk/aws-cloudfront/package-lock.json | 2 +- .../@aws-cdk/aws-cloudtrail/package-lock.json | 2 +- .../@aws-cdk/aws-codebuild/package-lock.json | 2 +- .../@aws-cdk/aws-codecommit/package-lock.json | 2 +- packages/@aws-cdk/aws-docdb/.npmignore | 4 + packages/@aws-cdk/aws-ecs/package-lock.json | 2 +- packages/@aws-cdk/aws-opsworkscm/.npmignore | 4 + .../@aws-cdk/aws-route53/package-lock.json | 2 +- packages/@aws-cdk/aws-sqs/package-lock.json | 2 +- packages/@aws-cdk/cdk/package-lock.json | 2 +- packages/@aws-cdk/cfnspec/package-lock.json | 2 +- .../cloudformation-diff/package-lock.json | 2 +- .../@aws-cdk/region-info/package-lock.json | 2 +- packages/aws-cdk/package-lock.json | 2 +- packages/decdk/package-lock.json | 2 +- .../simple-resource-bundler/package-lock.json | 2 +- tools/awslint/package-lock.json | 2 +- tools/cdk-build-tools/bin/cdk-package.ts | 24 +- tools/cdk-build-tools/package-lock.json | 532 +-- tools/cdk-integ-tools/package-lock.json | 2 +- tools/cfn2ts/package-lock.json | 2 +- tools/pkglint/package-lock.json | 2 +- tools/pkgtools/package-lock.json | 2 +- tools/y-npm/package-lock.json | 2 +- 34 files changed, 1580 insertions(+), 2251 deletions(-) diff --git a/pack.sh b/pack.sh index a5684f6351d83..65965b4fd32ac 100755 --- a/pack.sh +++ b/pack.sh @@ -14,8 +14,9 @@ mkdir -p ${distdir} scopes=$(lerna ls 2>/dev/null | grep -v "(private)" | cut -d" " -f1 | xargs -n1 -I{} echo "--scope {}" | tr "\n" " ") # Run the "cdk-package" script in all modules. For jsii modules, this invokes jsii-pacmak which generates and builds multi-language -# outputs. For non-jsii module, it will just run "npm pack" and place the output in dist/npm (which is similar to how pacmak outputs it). -lerna run ${scopes} --sort --stream package +# outputs. For non-jsii module, it will just run "npm pack" and place the output in dist/npm +# (which is similar to how pacmak outputs it). +lerna run ${scopes} --sort --stream package -- -- "$@" # Collect dist/ from all modules into the root dist/ for dir in $(find packages -name dist | grep -v node_modules); do diff --git a/package-lock.json b/package-lock.json index 4a6fc282b8a84..dddf9ac3b0ab3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -234,103 +234,78 @@ "@types/node": "*", "chalk": "^2.0.1", "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "@jest/core": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.4.0.tgz", - "integrity": "sha512-S48krBwigVm3DwLSEtMiiWnWz+G3uGii192LIZYbWULYSOCwQeG7hWb6a3yWBLYuZnATh3W6QMxs7whS0/hQMQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.5.0.tgz", + "integrity": "sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ==", "dev": true, "requires": { "@jest/console": "^24.3.0", - "@jest/reporters": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/reporters": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.3.0", - "jest-config": "^24.4.0", - "jest-haste-map": "^24.4.0", - "jest-message-util": "^24.3.0", + "jest-changed-files": "^24.5.0", + "jest-config": "^24.5.0", + "jest-haste-map": "^24.5.0", + "jest-message-util": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.4.0", - "jest-runner": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", - "jest-watcher": "^24.3.0", + "jest-resolve-dependencies": "^24.5.0", + "jest-runner": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", + "jest-watcher": "^24.5.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", - "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "@jest/environment": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.4.0.tgz", - "integrity": "sha512-YuPsWWwTS4wkMsvCNXvBZPZQGOVtsVyle9OzHIAdWvV+B9qjs0vA85Il1+FSG0b765VqznPvpfIe1wKoIFOleQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.5.0.tgz", + "integrity": "sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA==", "dev": true, "requires": { - "@jest/fake-timers": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/fake-timers": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", - "jest-mock": "^24.3.0" + "jest-mock": "^24.5.0" } }, "@jest/fake-timers": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.3.0.tgz", - "integrity": "sha512-rHwVI17dGMHxHzfAhnZ04+wFznjFfZ246QugeBnbiYr7/bDosPD2P1qeNjWnJUUcfl0HpS6kkr+OB/mqSJxQFg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.5.0.tgz", + "integrity": "sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "@types/node": "*", - "jest-message-util": "^24.3.0", - "jest-mock": "^24.3.0" + "jest-message-util": "^24.5.0", + "jest-mock": "^24.5.0" } }, "@jest/reporters": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.4.0.tgz", - "integrity": "sha512-teO0to16UaYJTLWXCWCa1kBPx/PY4dw2/8I2LPIzk5mNN5km8jyx5jz8D1Yy0nqascVtbpG4+VnSt7E16cnrcw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.5.0.tgz", + "integrity": "sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q==", "dev": true, "requires": { - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -338,23 +313,15 @@ "istanbul-lib-coverage": "^2.0.2", "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-source-maps": "^3.0.1", - "jest-haste-map": "^24.4.0", - "jest-resolve": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-util": "^24.3.0", + "jest-haste-map": "^24.5.0", + "jest-resolve": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "node-notifier": "^5.2.1", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "@jest/source-map": { @@ -366,73 +333,46 @@ "callsites": "^3.0.0", "graceful-fs": "^4.1.15", "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true - } } }, "@jest/test-result": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.3.0.tgz", - "integrity": "sha512-j7UZ49T8C4CVipEY99nLttnczVTtLyVzFfN20OiBVn7awOs0U3endXSTq7ouPrLR5y4YjI5GDcbcvDUjgeamzg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.5.0.tgz", + "integrity": "sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A==", "dev": true, "requires": { "@jest/console": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "@types/istanbul-lib-coverage": "^1.1.0" } }, "@jest/transform": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.4.0.tgz", - "integrity": "sha512-Y928pU6bqWqMlGugRiaWOresox/CIrRuBVdPnYiSoIcRtwNKZujCOkzIzRalcTTxm77wuLjNihcq8OWfdm+Dxg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.5.0.tgz", + "integrity": "sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.4.0", + "jest-haste-map": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "micromatch": "^3.1.10", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", "write-file-atomic": "2.4.1" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } } }, "@jest/types": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.3.0.tgz", - "integrity": "sha512-VoO1F5tU2n/93QN/zaZ7Q8SeV/Rj+9JJOgbvKbBwy4lenvmdj1iDaQEPXGTKrO6OSvDeb2drTFipZJYxgo6kIQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.5.0.tgz", + "integrity": "sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^1.1.0", @@ -573,6 +513,14 @@ "minimatch": "^3.0.4", "npmlog": "^4.1.2", "slash": "^1.0.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "@lerna/command": { @@ -591,6 +539,23 @@ "is-ci": "^1.0.10", "lodash": "^4.17.5", "npmlog": "^4.1.2" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + } } }, "@lerna/conventional-commits": { @@ -638,10 +603,27 @@ }, "dependencies": { "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } } } }, @@ -820,6 +802,14 @@ "@lerna/symlink-dependencies": "3.13.0", "p-map": "^1.2.0", "slash": "^1.0.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "@lerna/list": { @@ -1012,6 +1002,12 @@ "requires": { "is-obj": "^1.0.0" } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true } } }, @@ -1204,6 +1200,14 @@ "semver": "^5.5.0", "slash": "^1.0.0", "temp-write": "^3.4.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "@lerna/write-log-file": { @@ -1233,9 +1237,9 @@ "dev": true }, "@octokit/endpoint": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.3.tgz", - "integrity": "sha512-vAWzeoj9Lzpl3V3YkWKhGzmDUoMfKpyxJhpq74/ohMvmLXDoEuAGnApy/7TRi3OmnjyX2Lr+e9UGGAD0919ohA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.2.3.tgz", + "integrity": "sha512-yUPCt4vMIOclox13CUxzuKiPJIFo46b/6GhUnUTw5QySczN1L0DtSxgmIZrZV4SAb9EyAqrceoyrWoYVnfF2AA==", "dev": true, "requires": { "deepmerge": "3.2.0", @@ -1245,36 +1249,40 @@ } }, "@octokit/plugin-enterprise-rest": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.1.2.tgz", - "integrity": "sha512-EWKrEqhSgzqWXI9DuEsEI691PNJppm/a4zW62//te27I8pYI5zSNVR3wtNUk0NWPlvs7054YzGZochwbUbhI8A==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.2.1.tgz", + "integrity": "sha512-Ssrh5D5uOqeS/Kjs6bbzn4ZaaaZQ2h6X/DgoDVv0Goa2ncpHwBN644hfYOL5ycigkpYbHKTjyb6cM49kPwQRPA==", "dev": true }, "@octokit/request": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.3.0.tgz", - "integrity": "sha512-5YRqYNZOAaL7+nt7w3Scp6Sz4P2g7wKFP9npx1xdExMomk8/M/ICXVLYVam2wzxeY0cIc6wcKpjC5KI4jiNbGw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.4.2.tgz", + "integrity": "sha512-lxVlYYvwGbKSHXfbPk5vxEA8w4zHOH1wobado4a9EfsyD3Cbhuhus1w0Ye9Ro0eMubGO8kNy5d+xNFisM3Tvaw==", "dev": true, "requires": { - "@octokit/endpoint": "^3.1.1", + "@octokit/endpoint": "^3.2.0", + "deprecation": "^1.0.1", "is-plain-object": "^2.0.4", "node-fetch": "^2.3.0", + "once": "^1.4.0", "universal-user-agent": "^2.0.1" } }, "@octokit/rest": { - "version": "16.16.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.16.2.tgz", - "integrity": "sha512-sNOIcYEzEQD9ovDyOnDmFyZZvU+3ytgrBG/BtCSxJ0e9/j9BKIGH/zyG6py/5DzImcj/U/PA77OqcBrPH3vaQg==", + "version": "16.19.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.19.0.tgz", + "integrity": "sha512-mUk/GU2LtV95OAM3FnvK7KFFNzUUzEGFldOhWliJnuhwBqxEag1gW85o//L6YphC9wLoTaZQOhCHmQcsCnt2ag==", "dev": true, "requires": { - "@octokit/request": "2.3.0", - "before-after-hook": "^1.2.0", + "@octokit/request": "2.4.2", + "before-after-hook": "^1.4.0", "btoa-lite": "^1.0.0", + "deprecation": "^1.0.1", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "lodash.uniq": "^4.5.0", "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", "universal-user-agent": "^2.0.0", "url-template": "^2.0.8" } @@ -1442,9 +1450,9 @@ } }, "ajv": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", - "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1460,9 +1468,9 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -1509,6 +1517,12 @@ "readable-stream": "^2.0.6" } }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1670,6 +1684,12 @@ "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -1695,6 +1715,15 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -1704,26 +1733,18 @@ } }, "babel-jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.4.0.tgz", - "integrity": "sha512-wh23nKbWZf9SeO0GNOQc2QDqaMXOmbaI2Hvbcl6FGqg9zqHwr9Jy0e0ZqsXiJ2Cv8YKqD+eOE2wAGVhq4nzWDQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.5.0.tgz", + "integrity": "sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g==", "dev": true, "requires": { - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", "babel-preset-jest": "^24.3.0", "chalk": "^2.4.2", "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "babel-plugin-istanbul": { @@ -1872,9 +1893,15 @@ } }, "before-after-hook": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.2.tgz", - "integrity": "sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", + "integrity": "sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg==", + "dev": true + }, + "bind-obj-methods": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", + "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", "dev": true }, "block-stream": { @@ -2060,6 +2087,14 @@ "dev": true, "requires": { "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } } }, "caller-path": { @@ -2072,9 +2107,9 @@ } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", "dev": true }, "camelcase": { @@ -2095,14 +2130,20 @@ } }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "rsvp": "^4.8.4" } }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2133,9 +2174,9 @@ "dev": true }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "class-utils": { @@ -2161,6 +2202,12 @@ } } }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2193,22 +2240,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -2273,6 +2304,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "columnify": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", @@ -2281,6 +2318,23 @@ "requires": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "combined-stream": { @@ -2293,9 +2347,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "compare-func": { @@ -2593,6 +2647,28 @@ "parse-json": "^4.0.0" } }, + "coveralls": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", + "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", + "dev": true, + "requires": { + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.86.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -2663,6 +2739,19 @@ "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } } }, "dateformat": { @@ -2814,6 +2903,12 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, + "deprecation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-1.0.1.tgz", + "integrity": "sha512-ccVHpE72+tcIKaGMql33x5MAjKQIZrk+3x2GbJ7TeraUCZWHoT+KSZpoC+JQFsUBlSTXUrBaGiF0j6zVTepPLg==", + "dev": true + }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", @@ -2837,9 +2932,9 @@ } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", "dev": true }, "diff-sequences": { @@ -2858,6 +2953,12 @@ "path-type": "^3.0.0" } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2904,6 +3005,12 @@ "safer-buffer": "^2.1.0" } }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -3004,6 +3111,12 @@ } } }, + "esm": { + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.18.tgz", + "integrity": "sha512-1UENjnnI37UDp7KuOqKYjfqdaMim06eBWnDv37smaxTIzDl0ZWnlgoXwsVwD9+Lidw+q/f1gUf2diVMDCycoVw==", + "dev": true + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -3022,6 +3135,12 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, "exec-sh": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", @@ -3085,16 +3204,16 @@ } }, "expect": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.4.0.tgz", - "integrity": "sha512-p3QGkNhxN4WXih12lOx4vuhJpl/ZFD1AWu9lWh8IXNZD10ySSOzDN4Io8zuEOWvzylFkDpU9oQ/KRTZ/Bs9/ag==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.5.0.tgz", + "integrity": "sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "ansi-styles": "^3.2.0", "jest-get-type": "^24.3.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", "jest-regex-util": "^24.3.0" } }, @@ -3332,42 +3451,86 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, + "fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -3424,6 +3587,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function-loop": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", + "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -3438,6 +3607,43 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "genfun": { @@ -3789,6 +3995,14 @@ "ignore": "^3.3.5", "pify": "^3.0.0", "slash": "^1.0.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "graceful-fs": { @@ -3797,6 +4011,12 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -3847,6 +4067,14 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-flag": { @@ -4026,23 +4254,15 @@ "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } } }, "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "^2.0.0", + "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, @@ -4115,58 +4335,6 @@ "string-width": "^2.1.0", "strip-ansi": "^5.0.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "requires": { - "ansi-regex": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "dev": true - } - } - } } }, "invariant": { @@ -4229,12 +4397,12 @@ "dev": true }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { @@ -4310,13 +4478,10 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-generator-fn": { "version": "2.0.0", @@ -4589,160 +4754,83 @@ } }, "jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.4.0.tgz", - "integrity": "sha512-gAGfjvu8hHN0N6/aDyCBpncWWBcpY6wq69Msq/I6Xd763q/ZYBEMh0SKUomrViFoJ/dyistA6b4aJh8e+5QMyw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.5.0.tgz", + "integrity": "sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.4.0" + "jest-cli": "^24.5.0" }, "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "jest-cli": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.4.0.tgz", - "integrity": "sha512-QQOgpRpXoDqpxhEux/AGyI9XJzVOJ5ppz4Kb9MlA5PvzsyYD3DRk/uiyJgmvBhCCXvcA1CKEl/g/LH0kbKg10Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.5.0.tgz", + "integrity": "sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g==", "dev": true, "requires": { - "@jest/core": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/core": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-config": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", "yargs": "^12.0.2" } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } } } }, "jest-changed-files": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.3.0.tgz", - "integrity": "sha512-fTq0YAUR6644fgsqLC7Zi2gXA/bAplMRvfXQdutmkwgrCKK6upkj+sgXqsUfUZRm15CVr3YSojr/GRNn71IMvg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.5.0.tgz", + "integrity": "sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.4.0.tgz", - "integrity": "sha512-H2R6qkfUPck+OlIWsjeShecbqYiEDUvzZfsfgQkx6LVakAORy7wZFptONVF+Qz7iO9Bl6x35cBA2A1o1W+ctDg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.5.0.tgz", + "integrity": "sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.3.0", - "babel-jest": "^24.4.0", + "@jest/types": "^24.5.0", + "babel-jest": "^24.5.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.4.0", - "jest-environment-node": "^24.4.0", + "jest-environment-jsdom": "^24.5.0", + "jest-environment-node": "^24.5.0", "jest-get-type": "^24.3.0", - "jest-jasmine2": "^24.4.0", + "jest-jasmine2": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-resolve": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "micromatch": "^3.1.10", - "pretty-format": "^24.4.0", + "pretty-format": "^24.5.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.4.0.tgz", - "integrity": "sha512-2GdKN8GOledWkMGXcRCSr3KVTrjZU6vxbfZzwzRlM7gSG8HNIx+eoFXauQNQ5j7q73fZCoPnyS5/uOcXQ3wkWg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.5.0.tgz", + "integrity": "sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw==", "dev": true, "requires": { "chalk": "^2.0.1", "diff-sequences": "^24.3.0", "jest-get-type": "^24.3.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-docblock": { @@ -4755,43 +4843,43 @@ } }, "jest-each": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.4.0.tgz", - "integrity": "sha512-W98N4Ep6BBdCanynA9jdJDUaPvZ9OAnIHNA8mK6kbH7JYdnNQKGvp5ivl/PjCTqiI2wnHKYRI06EjsfOqT8ZFQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.5.0.tgz", + "integrity": "sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "jest-get-type": "^24.3.0", - "jest-util": "^24.3.0", - "pretty-format": "^24.4.0" + "jest-util": "^24.5.0", + "pretty-format": "^24.5.0" } }, "jest-environment-jsdom": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.4.0.tgz", - "integrity": "sha512-7irZXPZLQF79r97uH9dG9mm76H+27CMSH8TEcF70x6pY4xFJipjjluiXRw1C2lh0o6FrbSQKpkSXncdOw+hY0A==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz", + "integrity": "sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ==", "dev": true, "requires": { - "@jest/environment": "^24.4.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.3.0", - "jest-util": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/fake-timers": "^24.5.0", + "@jest/types": "^24.5.0", + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.4.0.tgz", - "integrity": "sha512-ed1TjncsHO+Ird4BDrWwqsMQQM+bg9AFHj0AcCumgzfc+Us6ywWUQUg+5UbKLKnu1EWp5mK7mmbLxLqdz2kc9w==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.5.0.tgz", + "integrity": "sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw==", "dev": true, "requires": { - "@jest/environment": "^24.4.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.3.0", - "jest-util": "^24.3.0" + "@jest/environment": "^24.5.0", + "@jest/fake-timers": "^24.5.0", + "@jest/types": "^24.5.0", + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0" } }, "jest-get-type": { @@ -4801,98 +4889,90 @@ "dev": true }, "jest-haste-map": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.4.0.tgz", - "integrity": "sha512-X20xhhPBjbz4UVTN9BMBjlFUM/gmi1TmYWWxZUgLg4fZXMIve4RUdA/nS/QgC76ouGgvwb9z52KwZ85bmNx55A==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.5.0.tgz", + "integrity": "sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "fb-watchman": "^2.0.0", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", "jest-serializer": "^24.4.0", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "micromatch": "^3.1.10", "sane": "^4.0.3" } }, "jest-jasmine2": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.4.0.tgz", - "integrity": "sha512-J9A0SKWuUNDmXKU+a3Yj69NmUXK7R3btHHu1ZMpjHKlMoHggVjdzsolpNHELCENBOTXvcLXqEH0Xm+pYRoNfMw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz", + "integrity": "sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.4.0", + "expect": "^24.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.4.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-runtime": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "pretty-format": "^24.4.0", + "jest-each": "^24.5.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "pretty-format": "^24.5.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.4.0.tgz", - "integrity": "sha512-PAo0y19ZkWZWYmdoPAQKpYTDt7IGwrTFhIwGmHO1xkRjzAWW8zcCoiMLrFwNSi9rir2ZH7el8gXZ0d2mmU7O9Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz", + "integrity": "sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ==", "dev": true, "requires": { - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-matcher-utils": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.4.0.tgz", - "integrity": "sha512-JDWrJ1G+GfxtEQlX7DlCV/0sk0uYbnra0jVl3DiDbS0FUX0HeGA1CxRW/U87LB3XNHQydhBKbXgf+pDCiUCn4w==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz", + "integrity": "sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.4.0", + "jest-diff": "^24.5.0", "jest-get-type": "^24.3.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-message-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.3.0.tgz", - "integrity": "sha512-lXM0YgKYGqN5/eH1NGw4Ix+Pk2I9Y77beyRas7xM24n+XTTK3TbT0VkT3L/qiyS7WkW0YwyxoXnnAaGw4hsEDA==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.5.0.tgz", + "integrity": "sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", "slash": "^2.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "jest-mock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.3.0.tgz", - "integrity": "sha512-AhAo0qjbVWWGvcbW5nChFjR0ObQImvGtU6DodprNziDOt+pP0CBdht/sYcNIOXeim8083QUi9bC8QdKB8PTK4Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.5.0.tgz", + "integrity": "sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw==", "dev": true, "requires": { - "@jest/types": "^24.3.0" + "@jest/types": "^24.5.0" } }, "jest-pnp-resolver": { @@ -4908,12 +4988,12 @@ "dev": true }, "jest-resolve": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.4.0.tgz", - "integrity": "sha512-XvMIuDH6wQi76YJfNG40iolXP2l+fA+LLORGgNSZ5VgowCeyV/XVygTN4L3No3GP1cthUdl/ULzWBd2CfYmTkw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.5.0.tgz", + "integrity": "sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -4921,80 +5001,72 @@ } }, "jest-resolve-dependencies": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.4.0.tgz", - "integrity": "sha512-3ssDSve3iSsIKm5daivq1mrCaBVFAa+TMG4qardNPoi7IJfupDUETIBCXYF9GRtIfNuD/dJOSag4u6oMHRxTGg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz", + "integrity": "sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.4.0" + "jest-snapshot": "^24.5.0" } }, "jest-runner": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.4.0.tgz", - "integrity": "sha512-eCuEMDbJknyKEUBWBDebW3GQ6Ty8wwB3YqDjFb4p3UQozA2HarPq0n9N83viq18vvZ/BDrQvW6RLdZaiLipM4Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.5.0.tgz", + "integrity": "sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA==", "dev": true, "requires": { "@jest/console": "^24.3.0", - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.4.0", + "jest-config": "^24.5.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.4.0", - "jest-jasmine2": "^24.4.0", - "jest-leak-detector": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-util": "^24.3.0", + "jest-haste-map": "^24.5.0", + "jest-jasmine2": "^24.5.0", + "jest-leak-detector": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-resolve": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.4.0.tgz", - "integrity": "sha512-wmopIA6EqgfSvYmqFvfZViJy5LCyIATUSRRt16HQDNN4ypWUQAaFwZ9fpbPo7e2UnKHTe2CK0dCRB1o/a6JUfQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.5.0.tgz", + "integrity": "sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw==", "dev": true, "requires": { "@jest/console": "^24.3.0", - "@jest/environment": "^24.4.0", + "@jest/environment": "^24.5.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/yargs": "^12.0.2", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.4.0", - "jest-haste-map": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-mock": "^24.3.0", + "jest-config": "^24.5.0", + "jest-haste-map": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-mock": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-resolve": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", "yargs": "^12.0.2" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "jest-serializer": { @@ -5004,36 +5076,36 @@ "dev": true }, "jest-snapshot": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.4.0.tgz", - "integrity": "sha512-h+xO+ZQC+XEcf5wsy6+yducTKw6ku+oS5E2eJZI4YI65AT/lvbMjKgulgQWUOxga4HP0qHnz9uwa67/Zo7jVrw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.5.0.tgz", + "integrity": "sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", - "expect": "^24.4.0", - "jest-diff": "^24.4.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-resolve": "^24.4.0", + "expect": "^24.5.0", + "jest-diff": "^24.5.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-resolve": "^24.5.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.4.0", + "pretty-format": "^24.5.0", "semver": "^5.5.0" } }, "jest-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.3.0.tgz", - "integrity": "sha512-eKIAC+MTKWZthUUVOwZ3Tc5a0cKMnxalQHr6qZ4kPzKn6k09sKvsmjCygqZ1SxVVfUKoa8Sfn6XDv9uTJ1iXTg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.5.0.tgz", + "integrity": "sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q==", "dev": true, "requires": { "@jest/console": "^24.3.0", - "@jest/fake-timers": "^24.3.0", + "@jest/fake-timers": "^24.5.0", "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", "callsites": "^3.0.0", "chalk": "^2.0.1", @@ -5042,49 +5114,20 @@ "mkdirp": "^0.5.1", "slash": "^2.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "jest-validate": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.4.0.tgz", - "integrity": "sha512-XESrpRYneLmiN9ayFm9RhBV5dwmhRZ+LbebScuuQ5GsY6ILpX9UeUMUdQ5Iz++YxFsmn5Lyi/Wkw6EV4v7nNTg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.5.0.tgz", + "integrity": "sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "camelcase": "^5.0.0", "chalk": "^2.0.1", "jest-get-type": "^24.3.0", "leven": "^2.1.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" }, "dependencies": { "camelcase": { @@ -5096,18 +5139,18 @@ } }, "jest-watcher": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.3.0.tgz", - "integrity": "sha512-EpJS/aUG8D3DMuy9XNA4fnkKWy3DQdoWhY92ZUdlETIeEn1xya4Np/96MBSh4II5YvxwKe6JKwbu3Bnzfwa7vA==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.5.0.tgz", + "integrity": "sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA==", "dev": true, "requires": { - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", "@types/yargs": "^12.0.9", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "string-length": "^2.0.0" } }, @@ -5187,19 +5230,6 @@ "whatwg-url": "^6.4.1", "ws": "^5.2.0", "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } } }, "jsesc": { @@ -5297,6 +5327,12 @@ "invert-kv": "^2.0.0" } }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -5326,6 +5362,27 @@ "@lerna/version": "3.13.1", "import-local": "^1.0.0", "npmlog": "^4.1.2" + }, + "dependencies": { + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } } }, "leven": { @@ -5472,6 +5529,12 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5598,13 +5661,13 @@ } }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, @@ -5685,9 +5748,9 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==", "dev": true }, "minimatch": { @@ -5756,1244 +5819,195 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "nodeunit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", - "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", - "dev": true, - "requires": { - "ejs": "^2.5.2", - "tap": "^12.0.1" - }, - "dependencies": { - "ajv": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", - "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bind-obj-methods": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", - "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", - "dev": true, - "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.85.0" - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esm": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.1.tgz", - "integrity": "sha512-+gxDed1gELD6mCn0P4TRPpknVJe7JvLtg3lJ9sRlLSpfw6J47QMGa5pi+10DN20VQ5z6OtbxjFoD9Z6PM+zb6Q==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-loop": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", - "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "~1.37.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", - "dev": true - }, - "own-or-env": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", - "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", - "dev": true, - "requires": { - "own-or": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "tap": { - "version": "12.5.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.5.1.tgz", - "integrity": "sha512-FiZtRwt169oq0pmaZwC4Bw/leqdzmG7paqKA0PYk7+yGq2m3q35U9yh9Hh8x/Z+iue8V2/cFwS8x9mSZnM51cQ==", - "dev": true, - "requires": { - "bind-obj-methods": "^2.0.0", - "browser-process-hrtime": "^1.0.0", - "capture-stack-trace": "^1.0.0", - "clean-yaml-object": "^0.1.0", - "color-support": "^1.1.0", - "coveralls": "^3.0.2", - "domain-browser": "^1.2.0", - "esm": "^3.1.4", - "foreground-child": "^1.3.3", - "fs-exists-cached": "^1.0.0", - "function-loop": "^1.0.1", - "glob": "^7.1.3", - "isexe": "^2.0.0", - "js-yaml": "^3.12.1", - "minipass": "^2.3.5", - "mkdirp": "^0.5.1", - "nyc": "^13.1.0", - "opener": "^1.5.1", - "os-homedir": "^1.0.2", - "own-or": "^1.0.0", - "own-or-env": "^1.0.1", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.0", - "source-map-support": "^0.5.10", - "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^3.0.7", - "tap-parser": "^7.0.0", - "tmatch": "^4.0.0", - "trivial-deferred": "^1.0.1", - "ts-node": "^8.0.1", - "tsame": "^2.0.1", - "typescript": "^3.2.4", - "write-file-atomic": "^2.3.0", - "yapool": "^1.0.0" - } - }, - "tap-mocha-reporter": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz", - "integrity": "sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA==", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", - "glob": "^7.0.5", - "js-yaml": "^3.3.1", - "readable-stream": "^2.1.5", - "tap-parser": "^5.1.0", - "unicode-length": "^1.0.0" - }, - "dependencies": { - "tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" - } - } - } - }, - "tap-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", - "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "minipass": "^2.2.0" - } - }, - "tmatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", - "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", - "dev": true - }, - "ts-node": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", - "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - } - } - }, - "tsame": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", - "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "unicode-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, - "requires": { - "punycode": "^1.3.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-plain-object": "^2.0.4" } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true - }, - "yn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", - "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true } } }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "nodeunit": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", + "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", + "dev": true, + "requires": { + "ejs": "^2.5.2", + "tap": "^12.0.1" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -7050,6 +6064,14 @@ "uid-number": "0.0.6", "umask": "^1.1.0", "which": "^1.3.1" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } } }, "npm-package-arg": { @@ -8283,8 +7305,22 @@ "dev": true, "requires": { "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } } }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -8360,6 +7396,21 @@ "os-tmpdir": "^1.0.0" } }, + "own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "requires": { + "own-or": "^1.0.0" + } + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -8636,12 +7687,57 @@ } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } } }, "pn": { @@ -8663,23 +7759,15 @@ "dev": true }, "pretty-format": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.4.0.tgz", - "integrity": "sha512-SEXFzT01NwO4vaymwhz1/CM+wKCLOT92uqrzxIjmdRQMt7JAEuZ2eInCMvDS+4ZidEB+Rdq+fMs/Vwse8VAh1A==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.5.0.tgz", + "integrity": "sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ==", "dev": true, "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } } }, "process-nextick-args": { @@ -8848,6 +7936,14 @@ "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", "slash": "^1.0.0" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } } }, "read-package-tree": { @@ -8995,6 +8091,22 @@ "uuid": "^3.3.2" }, "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -9051,20 +8163,12 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } } }, "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "resolve-url": { @@ -9105,9 +8209,9 @@ } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", "dev": true }, "run-async": { @@ -9159,14 +8263,14 @@ "dev": true }, "sane": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.0.3.tgz", - "integrity": "sha512-hSLkC+cPHiBQs7LSyXkotC3UUtyn8C4FMn50TNaacRyvBlI+3ebcxMpqckmTdtXVtel87YS7GXN3UIOj7NiGVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", + "capture-exit": "^2.0.0", "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", @@ -9258,9 +8362,9 @@ "dev": true }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, "slide": { @@ -9389,9 +8493,9 @@ } }, "socks": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.3.tgz", - "integrity": "sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", "dev": true, "requires": { "ip": "^1.1.5", @@ -9399,13 +8503,13 @@ } }, "socks-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "~4.2.1", + "socks": "~2.3.2" } }, "sort-keys": { @@ -9437,9 +8541,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -9620,14 +8724,30 @@ } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string_decoder": { @@ -9640,12 +8760,12 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", + "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^4.1.0" } }, "strip-bom": { @@ -9700,6 +8820,108 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, + "tap": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.6.0.tgz", + "integrity": "sha512-HsU8Djx7WhkP8SZbtdtb1P/g74QdMYgLtge9/MiNZ2uKXa1KV36nHgWIFI0BlrhnzcS9n3WfqmLY2tIBTjl+ew==", + "dev": true, + "requires": { + "bind-obj-methods": "^2.0.0", + "browser-process-hrtime": "^1.0.0", + "capture-stack-trace": "^1.0.0", + "clean-yaml-object": "^0.1.0", + "color-support": "^1.1.0", + "coveralls": "^3.0.2", + "domain-browser": "^1.2.0", + "esm": "^3.2.5", + "foreground-child": "^1.3.3", + "fs-exists-cached": "^1.0.0", + "function-loop": "^1.0.1", + "glob": "^7.1.3", + "isexe": "^2.0.0", + "js-yaml": "^3.12.1", + "minipass": "^2.3.5", + "mkdirp": "^0.5.1", + "nyc": "^13.3.0", + "opener": "^1.5.1", + "os-homedir": "^1.0.2", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.10", + "stack-utils": "^1.0.2", + "tap-mocha-reporter": "^3.0.9", + "tap-parser": "^7.0.0", + "tmatch": "^4.0.0", + "trivial-deferred": "^1.0.1", + "ts-node": "^8.0.2", + "tsame": "^2.0.1", + "typescript": "^3.3.3", + "write-file-atomic": "^2.4.2", + "yapool": "^1.0.0" + }, + "dependencies": { + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "tap-mocha-reporter": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", + "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", + "dev": true, + "requires": { + "color-support": "^1.1.0", + "debug": "^2.1.3", + "diff": "^1.3.2", + "escape-string-regexp": "^1.0.3", + "glob": "^7.0.5", + "js-yaml": "^3.3.1", + "readable-stream": "^2.1.5", + "tap-parser": "^5.1.0", + "unicode-length": "^1.0.0" + }, + "dependencies": { + "tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + } + } + } + }, + "tap-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", + "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "minipass": "^2.2.0" + } + }, "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", @@ -9844,6 +9066,12 @@ "xtend": "~4.0.1" } }, + "tmatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", + "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9908,21 +9136,13 @@ } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { @@ -9952,6 +9172,12 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, "ts-jest": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.0.tgz", @@ -9980,6 +9206,33 @@ } } }, + "ts-node": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz", + "integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } + } + }, + "tsame": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", + "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", + "dev": true + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", @@ -9987,9 +9240,9 @@ "dev": true }, "tslint": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.13.1.tgz", - "integrity": "sha512-fplQqb2miLbcPhyHoMV4FU9PtNRbgmm/zI5d3SZwwmJQM6V0eodju+hplpyfhLWpmwrDNfNYU57uYRb8s0zZoQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", + "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -10004,7 +9257,15 @@ "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } } }, "tsutils": { @@ -10053,13 +9314,13 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.19.0", "source-map": "~0.6.1" } }, @@ -10075,6 +9336,39 @@ "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, + "unicode-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "requires": { + "punycode": "^1.3.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -10311,9 +9605,9 @@ "dev": true }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -10391,6 +9685,43 @@ "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { @@ -10400,9 +9731,9 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -10467,6 +9798,12 @@ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, + "yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -10487,12 +9824,6 @@ "yargs-parser": "^11.1.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -10502,12 +9833,6 @@ "locate-path": "^3.0.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -10519,9 +9844,9 @@ } }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -10541,25 +9866,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } } } }, @@ -10574,12 +9880,18 @@ }, "dependencies": { "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", "dev": true } } + }, + "yn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", + "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", + "dev": true } } } diff --git a/packages/@aws-cdk/app-delivery/package-lock.json b/packages/@aws-cdk/app-delivery/package-lock.json index 629aa63d8139c..09a0bb9abe6e0 100644 --- a/packages/@aws-cdk/app-delivery/package-lock.json +++ b/packages/@aws-cdk/app-delivery/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/app-delivery", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/applet-js/package-lock.json b/packages/@aws-cdk/applet-js/package-lock.json index d683e3a8eab58..1e25d4a689835 100644 --- a/packages/@aws-cdk/applet-js/package-lock.json +++ b/packages/@aws-cdk/applet-js/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/applet-js", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/assert/package-lock.json b/packages/@aws-cdk/assert/package-lock.json index 7c4cd0ccbc8c0..9de1c314a3aad 100644 --- a/packages/@aws-cdk/assert/package-lock.json +++ b/packages/@aws-cdk/assert/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/assert", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/assets-docker/package-lock.json b/packages/@aws-cdk/assets-docker/package-lock.json index 2c11d6e283106..90f3cd63db2fd 100644 --- a/packages/@aws-cdk/assets-docker/package-lock.json +++ b/packages/@aws-cdk/assets-docker/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/assets-docker", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-applicationautoscaling/package-lock.json b/packages/@aws-cdk/aws-applicationautoscaling/package-lock.json index 52e3dbc07ec3d..04b8cb6035dbd 100644 --- a/packages/@aws-cdk/aws-applicationautoscaling/package-lock.json +++ b/packages/@aws-cdk/aws-applicationautoscaling/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-applicationautoscaling", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-autoscaling-common/package-lock.json b/packages/@aws-cdk/aws-autoscaling-common/package-lock.json index 1f6856b9393a4..ddf7d8ac18165 100644 --- a/packages/@aws-cdk/aws-autoscaling-common/package-lock.json +++ b/packages/@aws-cdk/aws-autoscaling-common/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-autoscaling-common", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package-lock.json b/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package-lock.json index e3fb799be9e3a..659ed05dfc00a 100644 --- a/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package-lock.json +++ b/packages/@aws-cdk/aws-certificatemanager/lambda-packages/dns_validated_certificate_handler/package-lock.json @@ -1,6 +1,6 @@ { "name": "dns_validated_certificate_handler", - "version": "0.25.2", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-cloudformation/package-lock.json b/packages/@aws-cdk/aws-cloudformation/package-lock.json index 780970d9a5ee0..8c97d92d18e51 100644 --- a/packages/@aws-cdk/aws-cloudformation/package-lock.json +++ b/packages/@aws-cdk/aws-cloudformation/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-cloudformation", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-cloudfront/package-lock.json b/packages/@aws-cdk/aws-cloudfront/package-lock.json index 974a72ad9c7de..dea362a95d46c 100644 --- a/packages/@aws-cdk/aws-cloudfront/package-lock.json +++ b/packages/@aws-cdk/aws-cloudfront/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-cloudfront", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-cloudtrail/package-lock.json b/packages/@aws-cdk/aws-cloudtrail/package-lock.json index e9d676a68e7ae..9c2f0ace6cc3c 100644 --- a/packages/@aws-cdk/aws-cloudtrail/package-lock.json +++ b/packages/@aws-cdk/aws-cloudtrail/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-cloudtrail", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-codebuild/package-lock.json b/packages/@aws-cdk/aws-codebuild/package-lock.json index d5090317c104f..29cad125e8a0e 100644 --- a/packages/@aws-cdk/aws-codebuild/package-lock.json +++ b/packages/@aws-cdk/aws-codebuild/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-codebuild", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-codecommit/package-lock.json b/packages/@aws-cdk/aws-codecommit/package-lock.json index 3a52959920a04..986c01651f110 100644 --- a/packages/@aws-cdk/aws-codecommit/package-lock.json +++ b/packages/@aws-cdk/aws-codecommit/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-codecommit", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-docdb/.npmignore b/packages/@aws-cdk/aws-docdb/.npmignore index 0ed32f4a4a755..2895a406c8e61 100644 --- a/packages/@aws-cdk/aws-docdb/.npmignore +++ b/packages/@aws-cdk/aws-docdb/.npmignore @@ -15,3 +15,7 @@ dist .LAST_BUILD .LAST_PACKAGE .jsii + + +# Include .jsii +!.jsii diff --git a/packages/@aws-cdk/aws-ecs/package-lock.json b/packages/@aws-cdk/aws-ecs/package-lock.json index de7c9be5929de..42b0aab1e99ba 100644 --- a/packages/@aws-cdk/aws-ecs/package-lock.json +++ b/packages/@aws-cdk/aws-ecs/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-ecs", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-opsworkscm/.npmignore b/packages/@aws-cdk/aws-opsworkscm/.npmignore index 0ed32f4a4a755..2895a406c8e61 100644 --- a/packages/@aws-cdk/aws-opsworkscm/.npmignore +++ b/packages/@aws-cdk/aws-opsworkscm/.npmignore @@ -15,3 +15,7 @@ dist .LAST_BUILD .LAST_PACKAGE .jsii + + +# Include .jsii +!.jsii diff --git a/packages/@aws-cdk/aws-route53/package-lock.json b/packages/@aws-cdk/aws-route53/package-lock.json index de3c1643652bb..91e62829c871b 100644 --- a/packages/@aws-cdk/aws-route53/package-lock.json +++ b/packages/@aws-cdk/aws-route53/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-route53", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/aws-sqs/package-lock.json b/packages/@aws-cdk/aws-sqs/package-lock.json index 37948f25919b7..d706a9e70d18e 100644 --- a/packages/@aws-cdk/aws-sqs/package-lock.json +++ b/packages/@aws-cdk/aws-sqs/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/aws-sqs", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/cdk/package-lock.json b/packages/@aws-cdk/cdk/package-lock.json index 0c5c361faa7ba..e6f9c7b90b2c6 100644 --- a/packages/@aws-cdk/cdk/package-lock.json +++ b/packages/@aws-cdk/cdk/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/cdk", - "version": "0.25.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/cfnspec/package-lock.json b/packages/@aws-cdk/cfnspec/package-lock.json index ce2e707868671..55f1be9fac84a 100644 --- a/packages/@aws-cdk/cfnspec/package-lock.json +++ b/packages/@aws-cdk/cfnspec/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/cfnspec", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/cloudformation-diff/package-lock.json b/packages/@aws-cdk/cloudformation-diff/package-lock.json index c8d4d43d26b6e..862d0c5f19609 100644 --- a/packages/@aws-cdk/cloudformation-diff/package-lock.json +++ b/packages/@aws-cdk/cloudformation-diff/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/cloudformation-diff", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/@aws-cdk/region-info/package-lock.json b/packages/@aws-cdk/region-info/package-lock.json index 3a21f56178c2b..b6dfc9aa49e07 100644 --- a/packages/@aws-cdk/region-info/package-lock.json +++ b/packages/@aws-cdk/region-info/package-lock.json @@ -1,6 +1,6 @@ { "name": "@aws-cdk/region-info", - "version": "0.25.2", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/aws-cdk/package-lock.json b/packages/aws-cdk/package-lock.json index f5c751b33620e..bff15d42a0e8c 100644 --- a/packages/aws-cdk/package-lock.json +++ b/packages/aws-cdk/package-lock.json @@ -1,6 +1,6 @@ { "name": "aws-cdk", - "version": "0.25.0", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/decdk/package-lock.json b/packages/decdk/package-lock.json index df2ad3fc4aa9a..683752c1ff76b 100644 --- a/packages/decdk/package-lock.json +++ b/packages/decdk/package-lock.json @@ -1,6 +1,6 @@ { "name": "decdk", - "version": "0.25.2", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/simple-resource-bundler/package-lock.json b/packages/simple-resource-bundler/package-lock.json index 53e01c56b9b35..7167892a01c0d 100644 --- a/packages/simple-resource-bundler/package-lock.json +++ b/packages/simple-resource-bundler/package-lock.json @@ -1,6 +1,6 @@ { "name": "simple-resource-bundler", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/awslint/package-lock.json b/tools/awslint/package-lock.json index 856a165ef14f9..642379f50f68a 100644 --- a/tools/awslint/package-lock.json +++ b/tools/awslint/package-lock.json @@ -1,6 +1,6 @@ { "name": "awslint", - "version": "0.25.2", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/cdk-build-tools/bin/cdk-package.ts b/tools/cdk-build-tools/bin/cdk-package.ts index dee69e2f35ff0..a7ce99fa4671b 100644 --- a/tools/cdk-build-tools/bin/cdk-package.ts +++ b/tools/cdk-build-tools/bin/cdk-package.ts @@ -7,23 +7,19 @@ import { Timers } from '../lib/timer'; const timers = new Timers(); const buildTimer = timers.start('Total time'); -interface Arguments extends yargs.Arguments { - verbose: boolean; - jsiiPacmak: string; -} - async function main() { - const args: Arguments = yargs + const args = yargs .env('CDK_PACKAGE') .usage('Usage: cdk-package') .option('verbose', { type: 'boolean', default: false, alias: 'v', desc: 'verbose output' }) + .option('targets', { type: 'array', default: new Array(), desc: 'Targets to pass to jsii-pacmak' }) .option('jsii-pacmak', { type: 'string', desc: 'Specify a different jsii-pacmak executable', default: require.resolve('jsii-pacmak/bin/jsii-pacmak'), defaultDescription: 'jsii-pacmak provided by node dependencies' }) - .argv as any; + .argv; // if this is a jsii package, use jsii-packmak const outdir = 'dist'; @@ -36,7 +32,11 @@ async function main() { } if (pkg.jsii) { - await shell([ args.jsiiPacmak, args.verbose ? '-vvv' : '-v', '-o', outdir ], timers); + const command = [args['jsii-pacmak'], + args.verbose ? '-vvv' : '-v', + ...args.targets ? flatMap(args.targets, (target: string) => ['-t', target]) : [], + '-o', outdir ]; + await shell(command, timers); } else { // just "npm pack" and deploy to "outdir" const tarball = (await shell([ 'npm', 'pack' ], timers)).trim(); @@ -56,3 +56,11 @@ main().then(() => { process.stderr.write(`Package failed. ${timers.display()}\n`); process.exit(1); }); + +function flatMap(xs: T[], f: (x: T) => U[]): U[] { + const ret = new Array(); + for (const x of xs) { + ret.push(...f(x)); + } + return ret; +} \ No newline at end of file diff --git a/tools/cdk-build-tools/package-lock.json b/tools/cdk-build-tools/package-lock.json index 18f5a70782ff0..389e899f292bf 100644 --- a/tools/cdk-build-tools/package-lock.json +++ b/tools/cdk-build-tools/package-lock.json @@ -208,31 +208,31 @@ } }, "@jest/core": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.4.0.tgz", - "integrity": "sha512-S48krBwigVm3DwLSEtMiiWnWz+G3uGii192LIZYbWULYSOCwQeG7hWb6a3yWBLYuZnATh3W6QMxs7whS0/hQMQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.5.0.tgz", + "integrity": "sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ==", "requires": { "@jest/console": "^24.3.0", - "@jest/reporters": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/reporters": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.3.0", - "jest-config": "^24.4.0", - "jest-haste-map": "^24.4.0", - "jest-message-util": "^24.3.0", + "jest-changed-files": "^24.5.0", + "jest-config": "^24.5.0", + "jest-haste-map": "^24.5.0", + "jest-message-util": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.4.0", - "jest-runner": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", - "jest-watcher": "^24.3.0", + "jest-resolve-dependencies": "^24.5.0", + "jest-runner": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", + "jest-watcher": "^24.5.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", "pirates": "^4.0.1", @@ -242,37 +242,37 @@ } }, "@jest/environment": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.4.0.tgz", - "integrity": "sha512-YuPsWWwTS4wkMsvCNXvBZPZQGOVtsVyle9OzHIAdWvV+B9qjs0vA85Il1+FSG0b765VqznPvpfIe1wKoIFOleQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.5.0.tgz", + "integrity": "sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA==", "requires": { - "@jest/fake-timers": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/fake-timers": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", - "jest-mock": "^24.3.0" + "jest-mock": "^24.5.0" } }, "@jest/fake-timers": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.3.0.tgz", - "integrity": "sha512-rHwVI17dGMHxHzfAhnZ04+wFznjFfZ246QugeBnbiYr7/bDosPD2P1qeNjWnJUUcfl0HpS6kkr+OB/mqSJxQFg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.5.0.tgz", + "integrity": "sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "@types/node": "*", - "jest-message-util": "^24.3.0", - "jest-mock": "^24.3.0" + "jest-message-util": "^24.5.0", + "jest-mock": "^24.5.0" } }, "@jest/reporters": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.4.0.tgz", - "integrity": "sha512-teO0to16UaYJTLWXCWCa1kBPx/PY4dw2/8I2LPIzk5mNN5km8jyx5jz8D1Yy0nqascVtbpG4+VnSt7E16cnrcw==", - "requires": { - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.5.0.tgz", + "integrity": "sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q==", + "requires": { + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -280,10 +280,10 @@ "istanbul-lib-coverage": "^2.0.2", "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-source-maps": "^3.0.1", - "jest-haste-map": "^24.4.0", - "jest-resolve": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-util": "^24.3.0", + "jest-haste-map": "^24.5.0", + "jest-resolve": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "node-notifier": "^5.2.1", "slash": "^2.0.0", @@ -302,30 +302,30 @@ } }, "@jest/test-result": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.3.0.tgz", - "integrity": "sha512-j7UZ49T8C4CVipEY99nLttnczVTtLyVzFfN20OiBVn7awOs0U3endXSTq7ouPrLR5y4YjI5GDcbcvDUjgeamzg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.5.0.tgz", + "integrity": "sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A==", "requires": { "@jest/console": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "@types/istanbul-lib-coverage": "^1.1.0" } }, "@jest/transform": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.4.0.tgz", - "integrity": "sha512-Y928pU6bqWqMlGugRiaWOresox/CIrRuBVdPnYiSoIcRtwNKZujCOkzIzRalcTTxm77wuLjNihcq8OWfdm+Dxg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.5.0.tgz", + "integrity": "sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.4.0", + "jest-haste-map": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "micromatch": "^3.1.10", "realpath-native": "^1.1.0", "slash": "^2.0.0", @@ -334,9 +334,9 @@ } }, "@jest/types": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.3.0.tgz", - "integrity": "sha512-VoO1F5tU2n/93QN/zaZ7Q8SeV/Rj+9JJOgbvKbBwy4lenvmdj1iDaQEPXGTKrO6OSvDeb2drTFipZJYxgo6kIQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.5.0.tgz", + "integrity": "sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA==", "requires": { "@types/istanbul-lib-coverage": "^1.1.0", "@types/yargs": "^12.0.9" @@ -409,9 +409,9 @@ "dev": true }, "@types/node": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.1.tgz", - "integrity": "sha512-2azXFP9n4aA2QNLkKm/F9pzKxgYj1SMawZ5Eh9iC21RH3XNcFsivLVU2NhpMgQm7YobSByvIol4c42ZFusXFHQ==" + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", + "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==" }, "@types/stack-utils": { "version": "1.0.1", @@ -652,12 +652,12 @@ } }, "babel-jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.4.0.tgz", - "integrity": "sha512-wh23nKbWZf9SeO0GNOQc2QDqaMXOmbaI2Hvbcl6FGqg9zqHwr9Jy0e0ZqsXiJ2Cv8YKqD+eOE2wAGVhq4nzWDQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.5.0.tgz", + "integrity": "sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g==", "requires": { - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", "babel-preset-jest": "^24.3.0", @@ -869,11 +869,11 @@ "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==" }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "requires": { - "rsvp": "^3.3.3" + "rsvp": "^4.8.4" } }, "capture-stack-trace": { @@ -1033,9 +1033,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" }, "compare-versions": { "version": "3.4.0", @@ -1345,9 +1345,9 @@ } }, "esm": { - "version": "3.2.15", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.15.tgz", - "integrity": "sha512-GcKZRSlQ/QevC/t94FXYKbUobSTArdLfRBAV6t6HIguoUBfuFGomxSZbsRHySaTppixC9jtmzAX+0GF4tbJaJA==" + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.18.tgz", + "integrity": "sha512-1UENjnnI37UDp7KuOqKYjfqdaMim06eBWnDv37smaxTIzDl0ZWnlgoXwsVwD9+Lidw+q/f1gUf2diVMDCycoVw==" }, "esprima": { "version": "4.0.1", @@ -1426,15 +1426,15 @@ } }, "expect": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.4.0.tgz", - "integrity": "sha512-p3QGkNhxN4WXih12lOx4vuhJpl/ZFD1AWu9lWh8IXNZD10ySSOzDN4Io8zuEOWvzylFkDpU9oQ/KRTZ/Bs9/ag==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.5.0.tgz", + "integrity": "sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "ansi-styles": "^3.2.0", "jest-get-type": "^24.3.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", "jest-regex-util": "^24.3.0" } }, @@ -2169,29 +2169,29 @@ } }, "jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.4.0.tgz", - "integrity": "sha512-gAGfjvu8hHN0N6/aDyCBpncWWBcpY6wq69Msq/I6Xd763q/ZYBEMh0SKUomrViFoJ/dyistA6b4aJh8e+5QMyw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.5.0.tgz", + "integrity": "sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ==", "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.4.0" + "jest-cli": "^24.5.0" }, "dependencies": { "jest-cli": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.4.0.tgz", - "integrity": "sha512-QQOgpRpXoDqpxhEux/AGyI9XJzVOJ5ppz4Kb9MlA5PvzsyYD3DRk/uiyJgmvBhCCXvcA1CKEl/g/LH0kbKg10Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.5.0.tgz", + "integrity": "sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g==", "requires": { - "@jest/core": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/core": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-config": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", "yargs": "^12.0.2" @@ -2219,47 +2219,47 @@ } }, "jest-changed-files": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.3.0.tgz", - "integrity": "sha512-fTq0YAUR6644fgsqLC7Zi2gXA/bAplMRvfXQdutmkwgrCKK6upkj+sgXqsUfUZRm15CVr3YSojr/GRNn71IMvg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.5.0.tgz", + "integrity": "sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.4.0.tgz", - "integrity": "sha512-H2R6qkfUPck+OlIWsjeShecbqYiEDUvzZfsfgQkx6LVakAORy7wZFptONVF+Qz7iO9Bl6x35cBA2A1o1W+ctDg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.5.0.tgz", + "integrity": "sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.3.0", - "babel-jest": "^24.4.0", + "@jest/types": "^24.5.0", + "babel-jest": "^24.5.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.4.0", - "jest-environment-node": "^24.4.0", + "jest-environment-jsdom": "^24.5.0", + "jest-environment-node": "^24.5.0", "jest-get-type": "^24.3.0", - "jest-jasmine2": "^24.4.0", + "jest-jasmine2": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-resolve": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "micromatch": "^3.1.10", - "pretty-format": "^24.4.0", + "pretty-format": "^24.5.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.4.0.tgz", - "integrity": "sha512-2GdKN8GOledWkMGXcRCSr3KVTrjZU6vxbfZzwzRlM7gSG8HNIx+eoFXauQNQ5j7q73fZCoPnyS5/uOcXQ3wkWg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.5.0.tgz", + "integrity": "sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw==", "requires": { "chalk": "^2.0.1", "diff-sequences": "^24.3.0", "jest-get-type": "^24.3.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-docblock": { @@ -2271,40 +2271,40 @@ } }, "jest-each": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.4.0.tgz", - "integrity": "sha512-W98N4Ep6BBdCanynA9jdJDUaPvZ9OAnIHNA8mK6kbH7JYdnNQKGvp5ivl/PjCTqiI2wnHKYRI06EjsfOqT8ZFQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.5.0.tgz", + "integrity": "sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "jest-get-type": "^24.3.0", - "jest-util": "^24.3.0", - "pretty-format": "^24.4.0" + "jest-util": "^24.5.0", + "pretty-format": "^24.5.0" } }, "jest-environment-jsdom": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.4.0.tgz", - "integrity": "sha512-7irZXPZLQF79r97uH9dG9mm76H+27CMSH8TEcF70x6pY4xFJipjjluiXRw1C2lh0o6FrbSQKpkSXncdOw+hY0A==", - "requires": { - "@jest/environment": "^24.4.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.3.0", - "jest-util": "^24.3.0", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz", + "integrity": "sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ==", + "requires": { + "@jest/environment": "^24.5.0", + "@jest/fake-timers": "^24.5.0", + "@jest/types": "^24.5.0", + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.4.0.tgz", - "integrity": "sha512-ed1TjncsHO+Ird4BDrWwqsMQQM+bg9AFHj0AcCumgzfc+Us6ywWUQUg+5UbKLKnu1EWp5mK7mmbLxLqdz2kc9w==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.5.0.tgz", + "integrity": "sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw==", "requires": { - "@jest/environment": "^24.4.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.3.0", - "jest-util": "^24.3.0" + "@jest/environment": "^24.5.0", + "@jest/fake-timers": "^24.5.0", + "@jest/types": "^24.5.0", + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0" } }, "jest-get-type": { @@ -2313,71 +2313,71 @@ "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==" }, "jest-haste-map": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.4.0.tgz", - "integrity": "sha512-X20xhhPBjbz4UVTN9BMBjlFUM/gmi1TmYWWxZUgLg4fZXMIve4RUdA/nS/QgC76ouGgvwb9z52KwZ85bmNx55A==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.5.0.tgz", + "integrity": "sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "fb-watchman": "^2.0.0", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", "jest-serializer": "^24.4.0", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "micromatch": "^3.1.10", "sane": "^4.0.3" } }, "jest-jasmine2": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.4.0.tgz", - "integrity": "sha512-J9A0SKWuUNDmXKU+a3Yj69NmUXK7R3btHHu1ZMpjHKlMoHggVjdzsolpNHELCENBOTXvcLXqEH0Xm+pYRoNfMw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz", + "integrity": "sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw==", "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.4.0", + "expect": "^24.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.4.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-runtime": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "pretty-format": "^24.4.0", + "jest-each": "^24.5.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "pretty-format": "^24.5.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.4.0.tgz", - "integrity": "sha512-PAo0y19ZkWZWYmdoPAQKpYTDt7IGwrTFhIwGmHO1xkRjzAWW8zcCoiMLrFwNSi9rir2ZH7el8gXZ0d2mmU7O9Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz", + "integrity": "sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ==", "requires": { - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-matcher-utils": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.4.0.tgz", - "integrity": "sha512-JDWrJ1G+GfxtEQlX7DlCV/0sk0uYbnra0jVl3DiDbS0FUX0HeGA1CxRW/U87LB3XNHQydhBKbXgf+pDCiUCn4w==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz", + "integrity": "sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q==", "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.4.0", + "jest-diff": "^24.5.0", "jest-get-type": "^24.3.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-message-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.3.0.tgz", - "integrity": "sha512-lXM0YgKYGqN5/eH1NGw4Ix+Pk2I9Y77beyRas7xM24n+XTTK3TbT0VkT3L/qiyS7WkW0YwyxoXnnAaGw4hsEDA==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.5.0.tgz", + "integrity": "sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ==", "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -2386,11 +2386,11 @@ } }, "jest-mock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.3.0.tgz", - "integrity": "sha512-AhAo0qjbVWWGvcbW5nChFjR0ObQImvGtU6DodprNziDOt+pP0CBdht/sYcNIOXeim8083QUi9bC8QdKB8PTK4Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.5.0.tgz", + "integrity": "sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw==", "requires": { - "@jest/types": "^24.3.0" + "@jest/types": "^24.5.0" } }, "jest-pnp-resolver": { @@ -2404,11 +2404,11 @@ "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==" }, "jest-resolve": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.4.0.tgz", - "integrity": "sha512-XvMIuDH6wQi76YJfNG40iolXP2l+fA+LLORGgNSZ5VgowCeyV/XVygTN4L3No3GP1cthUdl/ULzWBd2CfYmTkw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.5.0.tgz", + "integrity": "sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -2416,65 +2416,65 @@ } }, "jest-resolve-dependencies": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.4.0.tgz", - "integrity": "sha512-3ssDSve3iSsIKm5daivq1mrCaBVFAa+TMG4qardNPoi7IJfupDUETIBCXYF9GRtIfNuD/dJOSag4u6oMHRxTGg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz", + "integrity": "sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.4.0" + "jest-snapshot": "^24.5.0" } }, "jest-runner": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.4.0.tgz", - "integrity": "sha512-eCuEMDbJknyKEUBWBDebW3GQ6Ty8wwB3YqDjFb4p3UQozA2HarPq0n9N83viq18vvZ/BDrQvW6RLdZaiLipM4Q==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.5.0.tgz", + "integrity": "sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA==", "requires": { "@jest/console": "^24.3.0", - "@jest/environment": "^24.4.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/environment": "^24.5.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.4.0", + "jest-config": "^24.5.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.4.0", - "jest-jasmine2": "^24.4.0", - "jest-leak-detector": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-runtime": "^24.4.0", - "jest-util": "^24.3.0", + "jest-haste-map": "^24.5.0", + "jest-jasmine2": "^24.5.0", + "jest-leak-detector": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-resolve": "^24.5.0", + "jest-runtime": "^24.5.0", + "jest-util": "^24.5.0", "jest-worker": "^24.4.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.4.0.tgz", - "integrity": "sha512-wmopIA6EqgfSvYmqFvfZViJy5LCyIATUSRRt16HQDNN4ypWUQAaFwZ9fpbPo7e2UnKHTe2CK0dCRB1o/a6JUfQ==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.5.0.tgz", + "integrity": "sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw==", "requires": { "@jest/console": "^24.3.0", - "@jest/environment": "^24.4.0", + "@jest/environment": "^24.5.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.4.0", - "@jest/types": "^24.3.0", + "@jest/transform": "^24.5.0", + "@jest/types": "^24.5.0", "@types/yargs": "^12.0.2", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.4.0", - "jest-haste-map": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-mock": "^24.3.0", + "jest-config": "^24.5.0", + "jest-haste-map": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-mock": "^24.5.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.4.0", - "jest-snapshot": "^24.4.0", - "jest-util": "^24.3.0", - "jest-validate": "^24.4.0", + "jest-resolve": "^24.5.0", + "jest-snapshot": "^24.5.0", + "jest-util": "^24.5.0", + "jest-validate": "^24.5.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", @@ -2508,34 +2508,34 @@ "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==" }, "jest-snapshot": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.4.0.tgz", - "integrity": "sha512-h+xO+ZQC+XEcf5wsy6+yducTKw6ku+oS5E2eJZI4YI65AT/lvbMjKgulgQWUOxga4HP0qHnz9uwa67/Zo7jVrw==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.5.0.tgz", + "integrity": "sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA==", "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "chalk": "^2.0.1", - "expect": "^24.4.0", - "jest-diff": "^24.4.0", - "jest-matcher-utils": "^24.4.0", - "jest-message-util": "^24.3.0", - "jest-resolve": "^24.4.0", + "expect": "^24.5.0", + "jest-diff": "^24.5.0", + "jest-matcher-utils": "^24.5.0", + "jest-message-util": "^24.5.0", + "jest-resolve": "^24.5.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.4.0", + "pretty-format": "^24.5.0", "semver": "^5.5.0" } }, "jest-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.3.0.tgz", - "integrity": "sha512-eKIAC+MTKWZthUUVOwZ3Tc5a0cKMnxalQHr6qZ4kPzKn6k09sKvsmjCygqZ1SxVVfUKoa8Sfn6XDv9uTJ1iXTg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.5.0.tgz", + "integrity": "sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q==", "requires": { "@jest/console": "^24.3.0", - "@jest/fake-timers": "^24.3.0", + "@jest/fake-timers": "^24.5.0", "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", "callsites": "^3.0.0", "chalk": "^2.0.1", @@ -2547,30 +2547,30 @@ } }, "jest-validate": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.4.0.tgz", - "integrity": "sha512-XESrpRYneLmiN9ayFm9RhBV5dwmhRZ+LbebScuuQ5GsY6ILpX9UeUMUdQ5Iz++YxFsmn5Lyi/Wkw6EV4v7nNTg==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.5.0.tgz", + "integrity": "sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "camelcase": "^5.0.0", "chalk": "^2.0.1", "jest-get-type": "^24.3.0", "leven": "^2.1.0", - "pretty-format": "^24.4.0" + "pretty-format": "^24.5.0" } }, "jest-watcher": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.3.0.tgz", - "integrity": "sha512-EpJS/aUG8D3DMuy9XNA4fnkKWy3DQdoWhY92ZUdlETIeEn1xya4Np/96MBSh4II5YvxwKe6JKwbu3Bnzfwa7vA==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.5.0.tgz", + "integrity": "sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA==", "requires": { - "@jest/test-result": "^24.3.0", - "@jest/types": "^24.3.0", + "@jest/test-result": "^24.5.0", + "@jest/types": "^24.5.0", "@types/node": "*", "@types/yargs": "^12.0.9", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.3.0", + "jest-util": "^24.5.0", "string-length": "^2.0.0" } }, @@ -2928,12 +2928,12 @@ } }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, @@ -2979,9 +2979,9 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==" }, "minimatch": { "version": "3.0.4", @@ -4321,11 +4321,11 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "pretty-format": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.4.0.tgz", - "integrity": "sha512-SEXFzT01NwO4vaymwhz1/CM+wKCLOT92uqrzxIjmdRQMt7JAEuZ2eInCMvDS+4ZidEB+Rdq+fMs/Vwse8VAh1A==", + "version": "24.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.5.0.tgz", + "integrity": "sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ==", "requires": { - "@jest/types": "^24.3.0", + "@jest/types": "^24.5.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -4560,9 +4560,9 @@ } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" }, "safe-buffer": { "version": "5.1.2", @@ -4583,13 +4583,13 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.0.3.tgz", - "integrity": "sha512-hSLkC+cPHiBQs7LSyXkotC3UUtyn8C4FMn50TNaacRyvBlI+3ebcxMpqckmTdtXVtel87YS7GXN3UIOj7NiGVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", + "capture-exit": "^2.0.0", "exec-sh": "^0.3.2", "execa": "^1.0.0", "fb-watchman": "^2.0.0", @@ -4797,9 +4797,9 @@ } }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5268,9 +5268,9 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.13.1.tgz", - "integrity": "sha512-fplQqb2miLbcPhyHoMV4FU9PtNRbgmm/zI5d3SZwwmJQM6V0eodju+hplpyfhLWpmwrDNfNYU57uYRb8s0zZoQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", + "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", "requires": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", @@ -5284,7 +5284,7 @@ "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tsutils": "^2.29.0" }, "dependencies": { "diff": { @@ -5329,12 +5329,12 @@ "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==" }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "optional": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.19.0", "source-map": "~0.6.1" } }, diff --git a/tools/cdk-integ-tools/package-lock.json b/tools/cdk-integ-tools/package-lock.json index 5f00a3bf0d6b4..0e9a7c871cd7a 100644 --- a/tools/cdk-integ-tools/package-lock.json +++ b/tools/cdk-integ-tools/package-lock.json @@ -1,6 +1,6 @@ { "name": "cdk-integ-tools", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/cfn2ts/package-lock.json b/tools/cfn2ts/package-lock.json index 0cbfda7aabde3..c7850342cd8fd 100644 --- a/tools/cfn2ts/package-lock.json +++ b/tools/cfn2ts/package-lock.json @@ -1,6 +1,6 @@ { "name": "cfn2ts", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/pkglint/package-lock.json b/tools/pkglint/package-lock.json index e36dbb6cab643..fd6259711e79b 100644 --- a/tools/pkglint/package-lock.json +++ b/tools/pkglint/package-lock.json @@ -1,6 +1,6 @@ { "name": "pkglint", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/pkgtools/package-lock.json b/tools/pkgtools/package-lock.json index a28331e3e68ba..02974d4715eac 100644 --- a/tools/pkgtools/package-lock.json +++ b/tools/pkgtools/package-lock.json @@ -1,6 +1,6 @@ { "name": "pkgtools", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tools/y-npm/package-lock.json b/tools/y-npm/package-lock.json index dcc11c034eb1d..fe5ab164a17fc 100644 --- a/tools/y-npm/package-lock.json +++ b/tools/y-npm/package-lock.json @@ -1,6 +1,6 @@ { "name": "y-npm", - "version": "0.24.1", + "version": "0.25.3", "lockfileVersion": 1, "requires": true, "dependencies": { From b5d1838d2ff8d0e90617f27e37e7e401c48b81e3 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Mon, 18 Mar 2019 12:54:10 +0100 Subject: [PATCH 09/16] fix(toolkit): 'cdk deploy' support updates to Outputs (#2029) If only stack Outputs are changed, CloudFormation generates a ChangeSet that is executable but has 0 changes. Before, we looked at the amount of changes to say there was nothing to do, but now we look at the actual change set status to determine whether it's an empty change set or not. The effect is that we can now deploy updates even if only Outputs changed. This becomes very important when the only thing changed to a stack is an Output got added because a cross-stack reference was taken by a downstream stack. Fixes #778. --- packages/aws-cdk/lib/api/deploy-stack.ts | 9 +- .../aws-cdk/lib/api/util/cloudformation.ts | 35 +++- packages/aws-cdk/package-lock.json | 188 +++++++++++++++--- packages/aws-cdk/package.json | 2 + .../aws-cdk/test/api/test.deploy-stack.ts | 55 +++++ packages/aws-cdk/test/util/mock-sdk.ts | 100 ++++++++++ 6 files changed, 354 insertions(+), 35 deletions(-) create mode 100644 packages/aws-cdk/test/api/test.deploy-stack.ts create mode 100644 packages/aws-cdk/test/util/mock-sdk.ts diff --git a/packages/aws-cdk/lib/api/deploy-stack.ts b/packages/aws-cdk/lib/api/deploy-stack.ts index d678505444d77..d7c8f96da323a 100644 --- a/packages/aws-cdk/lib/api/deploy-stack.ts +++ b/packages/aws-cdk/lib/api/deploy-stack.ts @@ -7,7 +7,7 @@ import { debug, error, print } from '../logging'; import { toYAML } from '../serialize'; import { Mode } from './aws-auth/credentials'; import { ToolkitInfo } from './toolkit-info'; -import { describeStack, stackExists, stackFailedCreating, waitForChangeSet, waitForStack } from './util/cloudformation'; +import { changeSetHasNoChanges, describeStack, stackExists, stackFailedCreating, waitForChangeSet, waitForStack } from './util/cloudformation'; import { StackActivityMonitor } from './util/cloudformation/stack-activity-monitor'; import { StackStatus } from './util/cloudformation/stack-status'; import { SDK } from './util/sdk'; @@ -77,8 +77,9 @@ export async function deployStack(options: DeployStackOptions): Promise(valueProvider: () => Promise, ti /** * Waits for a ChangeSet to be available for triggering a StackUpdate. * + * Will return a changeset that is either ready to be executed or has no changes. + * Will throw in other cases. + * * @param cfn a CloudFormation client * @param stackName the name of the Stack that the ChangeSet belongs to * @param changeSetName the name of the ChangeSet @@ -93,25 +96,43 @@ async function waitFor(valueProvider: () => Promise, ti * @returns the CloudFormation description of the ChangeSet */ // tslint:disable-next-line:max-line-length -export async function waitForChangeSet(cfn: CloudFormation, stackName: string, changeSetName: string): Promise { +export async function waitForChangeSet(cfn: CloudFormation, stackName: string, changeSetName: string): Promise { debug('Waiting for changeset %s on stack %s to finish creating...', changeSetName, stackName); - return waitFor(async () => { + const ret = await waitFor(async () => { const description = await describeChangeSet(cfn, stackName, changeSetName); // The following doesn't use a switch because tsc will not allow fall-through, UNLESS it is allows // EVERYWHERE that uses this library directly or indirectly, which is undesirable. if (description.Status === 'CREATE_PENDING' || description.Status === 'CREATE_IN_PROGRESS') { debug('Changeset %s on stack %s is still creating', changeSetName, stackName); return undefined; - } else if (description.Status === 'CREATE_COMPLETE') { + } + + if (description.Status === 'CREATE_COMPLETE' || changeSetHasNoChanges(description)) { return description; - } else if (description.Status === 'FAILED') { - if (description.StatusReason && description.StatusReason.startsWith('The submitted information didn\'t contain changes.')) { - return description; - } } + // tslint:disable-next-line:max-line-length throw new Error(`Failed to create ChangeSet ${changeSetName} on ${stackName}: ${description.Status || 'NO_STATUS'}, ${description.StatusReason || 'no reason provided'}`); }); + + if (!ret) { + throw new Error('Change set took too long to be created; aborting'); + } + + return ret; +} + +/** + * Return true if the given change set has no changes + * + * This must be determined from the status, not the 'Changes' array on the + * object; the latter can be empty because no resources were changed, but if + * there are changes to Outputs, the change set can still be executed. + */ +export function changeSetHasNoChanges(description: CloudFormation.DescribeChangeSetOutput) { + return description.Status === 'FAILED' + && description.StatusReason + && description.StatusReason.startsWith('The submitted information didn\'t contain changes.'); } /** diff --git a/packages/aws-cdk/package-lock.json b/packages/aws-cdk/package-lock.json index bff15d42a0e8c..5afca94ce20d0 100644 --- a/packages/aws-cdk/package-lock.json +++ b/packages/aws-cdk/package-lock.json @@ -4,6 +4,42 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sinonjs/commons": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", + "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", + "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.0.tgz", + "integrity": "sha512-beHeJM/RRAaLLsMJhsCvHK31rIqZuobfPLa/80yGH5hnD8PV1hyh9xJBJNFfNmO7yWqm+zomijHsXpI6iTQJfQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "array-from": "^2.1.1", + "lodash": "^4.17.11" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "@types/archiver": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-2.1.2.tgz", @@ -62,7 +98,7 @@ }, "@types/mockery": { "version": "1.4.29", - "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", + "resolved": "http://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", "integrity": "sha1-m6It838H43gP/4Ux0aOOYz+UV6U=", "dev": true }, @@ -89,6 +125,12 @@ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, + "@types/sinon": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.10.tgz", + "integrity": "sha512-4w7SvsiUOtd4mUfund9QROPSJ5At/GQskDpqd87pJIRI6ULWSJqHI3GIZE337wQuN3aznroJGr94+o8fwvL37Q==", + "dev": true + }, "@types/table": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/table/-/table-4.0.5.tgz", @@ -182,6 +224,12 @@ "readable-stream": "^2.0.0" } }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -281,7 +329,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -357,7 +405,7 @@ }, "cli-color": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.1.7.tgz", + "resolved": "http://registry.npmjs.org/cli-color/-/cli-color-0.1.7.tgz", "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", "requires": { "es5-ext": "0.8.x" @@ -388,7 +436,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -398,7 +446,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -547,6 +595,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "difflib": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", @@ -600,7 +654,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { "es6-promise": "^4.0.3" @@ -635,7 +689,7 @@ }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "execa": { @@ -741,7 +795,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -752,7 +806,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "xregexp": { @@ -769,7 +823,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-uri": { @@ -845,6 +899,12 @@ "har-schema": "^2.0.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "heap": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", @@ -857,7 +917,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -953,7 +1013,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -1001,7 +1061,7 @@ }, "json-diff": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.3.1.tgz", + "resolved": "http://registry.npmjs.org/json-diff/-/json-diff-0.3.1.tgz", "integrity": "sha1-bbw64tJeB1p/1xvNmHRFhmb7aBs=", "requires": { "cli-color": "~0.1.6", @@ -1043,6 +1103,12 @@ "verror": "1.10.0" } }, + "just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -1070,7 +1136,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { "graceful-fs": "^4.1.2", @@ -1093,6 +1159,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lolex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.1.0.tgz", + "integrity": "sha512-zFo5MgCJ0rZ7gQg69S4pqBsLURbFw11X68C18OcJjJQbqaXm2NoTrGl1IMM3TIz0/BnN1tIs2tzmmqvCsOMMjw==", + "dev": true + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -1157,6 +1229,27 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" }, + "nise": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", + "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + } + } + }, "normalize-package-data": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.2.tgz", @@ -1293,7 +1386,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { @@ -1301,6 +1394,23 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -1316,7 +1426,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "prelude-ls": { @@ -1422,7 +1532,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1488,7 +1598,7 @@ }, "sax": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "semver": { @@ -1524,6 +1634,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "sinon": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.7.tgz", + "integrity": "sha512-rlrre9F80pIQr3M36gOdoCEWzFAMDgHYD8+tocqOw+Zw9OZ8F84a80Ds69eZfcjnzDqqG88ulFld0oin/6rG/g==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.1", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.2.0", + "diff": "^3.5.0", + "lolex": "^3.1.0", + "nise": "^1.4.10", + "supports-color": "^5.5.0" + } + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -1631,7 +1756,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -1652,9 +1777,18 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "table": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", @@ -1727,6 +1861,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -1810,7 +1950,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -1832,7 +1972,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -1842,7 +1982,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -1866,7 +2006,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xregexp": { diff --git a/packages/aws-cdk/package.json b/packages/aws-cdk/package.json index 23aa0a719a6c2..7a9d76df37604 100644 --- a/packages/aws-cdk/package.json +++ b/packages/aws-cdk/package.json @@ -42,8 +42,10 @@ "@types/uuid": "^3.4.3", "@types/yaml": "^1.0.0", "@types/yargs": "^8.0.3", + "@types/sinon": "^7.0.10", "cdk-build-tools": "^0.25.3", "mockery": "^2.1.0", + "sinon": "^7.2.7", "pkglint": "^0.25.3" }, "dependencies": { diff --git a/packages/aws-cdk/test/api/test.deploy-stack.ts b/packages/aws-cdk/test/api/test.deploy-stack.ts new file mode 100644 index 0000000000000..ef5e4ed614e7a --- /dev/null +++ b/packages/aws-cdk/test/api/test.deploy-stack.ts @@ -0,0 +1,55 @@ +import { Test } from 'nodeunit'; +import { deployStack } from '../../lib'; +import { MockSDK } from '../util/mock-sdk'; + +const FAKE_STACK = { + name: 'withouterrors', + template: { resource: 'noerrorresource' }, + environment: { name: 'dev', account: '12345', region: 'here' }, + metadata: {}, +}; + +export = { + async 'do deploy executable change set with 0 changes'(test: Test) { + // GIVEN + const sdk = new MockSDK(); + + let executed = false; + + sdk.stubCloudFormation({ + describeStacks() { + return { + Stacks: [] + }; + }, + + createChangeSet() { + return {}; + }, + + describeChangeSet() { + return { + Status: 'CREATE_COMPLETE', + Changes: [], + }; + }, + + executeChangeSet() { + executed = true; + return {}; + } + }); + + // WHEN + const ret = await deployStack({ + stack: FAKE_STACK, + sdk, + }); + + // THEN + test.equals(ret.noOp, false); + test.equals(executed, true); + + test.done(); + }, +}; diff --git a/packages/aws-cdk/test/util/mock-sdk.ts b/packages/aws-cdk/test/util/mock-sdk.ts new file mode 100644 index 0000000000000..008e44904f5df --- /dev/null +++ b/packages/aws-cdk/test/util/mock-sdk.ts @@ -0,0 +1,100 @@ +import AWS = require('aws-sdk'); +import sinon = require('sinon'); +import { SDK } from "../../lib/api/util/sdk"; + +/** + * An SDK that allows replacing (some of) the clients + * + * Its the responsibility of the consumer to replace all calls that + * actually will be called. + */ +export class MockSDK extends SDK { + private readonly sandbox: sinon.SinonSandbox; + constructor() { + super(); + this.sandbox = sinon.createSandbox(); + } + + /** + * Replace the CloudFormation client with the given object + */ + public stubCloudFormation(stubs: SyncHandlerSubsetOf) { + this.sandbox.stub(this, 'cloudFormation').returns(Promise.resolve(partialAwsService(stubs))); + } +} + +/** + * Wrap synchronous fake handlers so that they sort-of function like a real AWS client + * + * For example, turns an object like this: + * + * ```ts + * { + * someCall(opts: AWS.Service.SomeCallInput): AWS.Service.SomeCallOutput { + * return {...whatever...}; + * } + * } + * ``` + * + * Into an object that in the type system pretends to be an 'AWS.Service' + * class (even though it really isn't) and can be called like this: + * + * ```ts + * const service = await sdk.someService(...); + * const response = await service.someCall(...).promise(); + * ``` + * + * We only implement the narrow subset of the AWS SDK API that the CDK actually + * uses, and we cheat on the types to make TypeScript happy on the rest of the API. + * + * Most important feature of this class is that it will derive the input and output + * types of the handlers on the input object from the ACTUAL AWS Service class, + * so that you don't have to declare them. + */ +function partialAwsService(fns: SyncHandlerSubsetOf): S { + // Super unsafe in here because I don't know how to make TypeScript happy, + // but at least the outer types make sure everything that happens in here works out. + const ret: any = {}; + + for (const [key, handler] of Object.entries(fns)) { + ret[key] = (args: any) => new FakeAWSResponse((handler as any)(args)); + } + + return ret; +} + +// Because of the overloads an AWS handler type looks like this: +// +// { +// (params: INPUTSTRUCT, callback?: ((err: AWSError, data: {}) => void) | undefined): Request; +// (callback?: ((err: AWS.AWSError, data: {}) => void) | undefined): AWS.Request<...>; +// } +// +// Get the first overload and extract the input and output struct types +type AwsCallInputOutput = + T extends { + (args: infer INPUT, callback?: ((err: AWS.AWSError, data: any) => void) | undefined): AWS.Request; + (callback?: ((err: AWS.AWSError, data: {}) => void) | undefined): AWS.Request; + } ? [INPUT, OUTPUT] : never; + +// Determine the type of the mock handler from the type of the Input/Output type pair. +// Don't need to worry about the 'never', TypeScript will propagate it upwards making it +// impossible to specify the field that has 'never' anywhere in its type. +type MockHandlerType = (input: AI[0]) => AI[1]; + +// Any subset of the full type that synchronously returns the output structure is okay +type SyncHandlerSubsetOf = {[K in keyof S]?: MockHandlerType>}; + +/** + * Fake AWS response. + * + * We only ever 'await response.promise()' so that's the only thing we implement here. + */ +class FakeAWSResponse { + constructor(private readonly x: T) { + } + + public promise(): Promise { + return Promise.resolve(this.x); + } +} From fa99fb2224ec9618092ac5b684cd3c713f9cdb32 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Mon, 18 Mar 2019 13:58:59 +0100 Subject: [PATCH 10/16] fix(cfn2ts): properly de-Tokenize L1 string-arrays (#2033) Because of accepted Tokenized values, cfn2ts previously translated a string and string array into: interface Props { someString: string; stringArray: Array | Token; } The latter was not intended. We now emit: interface Props { someString: string; stringArray: string[]; } Since the Token will be typed as `Object` in Java, this change now makes it impossible to mistakenly pass any old java Object. A typical case would be pass a `Subnet` where a `string subnetId` was expected, failing in a nonobvious way. Fixes #2030. --- .../aws-autoscaling/lib/auto-scaling-group.ts | 6 ++-- packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts | 6 ++-- .../lib/server/deployment-group.ts | 2 +- .../@aws-cdk/aws-ecs/lib/base/base-service.ts | 2 +- packages/@aws-cdk/aws-iam/lib/group.ts | 2 +- packages/@aws-cdk/aws-iam/lib/util.ts | 4 +-- packages/@aws-cdk/aws-lambda/lib/function.ts | 2 +- tools/cfn2ts/lib/codegen.ts | 30 +++++++++++-------- 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts b/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts index 0134c6b2a0360..3b5962c1dcb9a 100644 --- a/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts +++ b/packages/@aws-cdk/aws-autoscaling/lib/auto-scaling-group.ts @@ -249,7 +249,7 @@ export class AutoScalingGroup extends cdk.Construct implements IAutoScalingGroup imageId: machineImage.imageId, keyName: props.keyName, instanceType: props.instanceType.toString(), - securityGroups: securityGroupsToken, + securityGroups: securityGroupsToken.toList(), iamInstanceProfile: iamProfile.ref, userData: userDataToken, associatePublicIpAddress: props.associatePublicIpAddress, @@ -274,8 +274,8 @@ export class AutoScalingGroup extends cdk.Construct implements IAutoScalingGroup maxSize: maxCapacity.toString(), desiredCapacity: desiredCapacity.toString(), launchConfigurationName: launchConfig.ref, - loadBalancerNames: new cdk.Token(() => this.loadBalancerNames.length > 0 ? this.loadBalancerNames : undefined), - targetGroupArns: new cdk.Token(() => this.targetGroupArns.length > 0 ? this.targetGroupArns : undefined), + loadBalancerNames: new cdk.Token(() => this.loadBalancerNames.length > 0 ? this.loadBalancerNames : undefined).toList(), + targetGroupArns: new cdk.Token(() => this.targetGroupArns.length > 0 ? this.targetGroupArns : undefined).toList(), }; if (props.notificationsTopic) { diff --git a/packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts b/packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts index 706f05d3cf368..009834d0682b8 100644 --- a/packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts +++ b/packages/@aws-cdk/aws-cloudwatch/lib/alarm.ts @@ -107,9 +107,9 @@ export class Alarm extends Construct { // Actions actionsEnabled: props.actionsEnabled, - alarmActions: new Token(() => this.alarmActionArns), - insufficientDataActions: new Token(() => this.insufficientDataActionArns), - okActions: new Token(() => this.okActionArns), + alarmActions: new Token(() => this.alarmActionArns).toList(), + insufficientDataActions: new Token(() => this.insufficientDataActionArns).toList(), + okActions: new Token(() => this.okActionArns).toList(), // Metric ...metricJson(props.metric) diff --git a/packages/@aws-cdk/aws-codedeploy/lib/server/deployment-group.ts b/packages/@aws-cdk/aws-codedeploy/lib/server/deployment-group.ts index 11ffdb9972482..f7cf5469c84cc 100644 --- a/packages/@aws-cdk/aws-codedeploy/lib/server/deployment-group.ts +++ b/packages/@aws-cdk/aws-codedeploy/lib/server/deployment-group.ts @@ -300,7 +300,7 @@ export class ServerDeploymentGroup extends ServerDeploymentGroupBase { autoScalingGroups: new cdk.Token(() => this._autoScalingGroups.length === 0 ? undefined - : this._autoScalingGroups.map(asg => asg.autoScalingGroupName)), + : this._autoScalingGroups.map(asg => asg.autoScalingGroupName)).toList(), loadBalancerInfo: this.loadBalancerInfo(props.loadBalancer), deploymentStyle: props.loadBalancer === undefined ? undefined diff --git a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts index fa8365cc1d266..f6811d72eec3f 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts @@ -191,7 +191,7 @@ export abstract class BaseService extends cdk.Construct awsvpcConfiguration: { assignPublicIp: assignPublicIp ? 'ENABLED' : 'DISABLED', subnets: subnets.map(x => x.subnetId), - securityGroups: new cdk.Token(() => [securityGroup!.securityGroupId]), + securityGroups: new cdk.Token(() => [securityGroup!.securityGroupId]).toList(), } }; } diff --git a/packages/@aws-cdk/aws-iam/lib/group.ts b/packages/@aws-cdk/aws-iam/lib/group.ts index 7e68246eb7b1c..a8b82d68fab3f 100644 --- a/packages/@aws-cdk/aws-iam/lib/group.ts +++ b/packages/@aws-cdk/aws-iam/lib/group.ts @@ -50,7 +50,7 @@ export class Group extends Construct implements IPrincipal { */ public readonly principal: PolicyPrincipal; - private readonly managedPolicies: any[]; + private readonly managedPolicies: string[]; private readonly attachedPolicies = new AttachedPolicies(); private defaultPolicy?: Policy; diff --git a/packages/@aws-cdk/aws-iam/lib/util.ts b/packages/@aws-cdk/aws-iam/lib/util.ts index aeb0f2c39652f..e3d2bae372627 100644 --- a/packages/@aws-cdk/aws-iam/lib/util.ts +++ b/packages/@aws-cdk/aws-iam/lib/util.ts @@ -3,11 +3,11 @@ import { Policy } from './policy'; const MAX_POLICY_NAME_LEN = 128; -export function undefinedIfEmpty(f: () => T[]): Token { +export function undefinedIfEmpty(f: () => string[]): string[] { return new Token(() => { const array = f(); return (array && array.length > 0) ? array : undefined; - }); + }).toList(); } /** diff --git a/packages/@aws-cdk/aws-lambda/lib/function.ts b/packages/@aws-cdk/aws-lambda/lib/function.ts index 9d603e43dc860..657219c575cfc 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function.ts @@ -365,7 +365,7 @@ export class Function extends FunctionBase { functionName: props.functionName, description: props.description, code: new cdk.Token(() => props.code._toJSON(resource)), - layers: new cdk.Token(() => this.layers.length > 0 ? this.layers.map(layer => layer.layerVersionArn) : undefined), + layers: new cdk.Token(() => this.layers.length > 0 ? this.layers.map(layer => layer.layerVersionArn) : undefined).toList(), handler: props.handler, timeout: props.timeout, runtime: props.runtime.name, diff --git a/tools/cfn2ts/lib/codegen.ts b/tools/cfn2ts/lib/codegen.ts index e6a73ddc4a815..9ac2e9f0e74eb 100644 --- a/tools/cfn2ts/lib/codegen.ts +++ b/tools/cfn2ts/lib/codegen.ts @@ -579,8 +579,11 @@ export default class CodeGenerator { // render the union of all item types const itemTypes = genspec.specTypesToCodeTypes(resourceContext, itemTypeNames(propSpec)); - if (propName !== 'Tags') { - // Always accept a token in place of any list element + // 'tokenizableType' operates at the level of rendered type names in TypeScript, so stringify + // the objects. + const renderedTypes = itemTypes.map(t => this.renderCodeName(resourceContext, t)); + if (!tokenizableType(renderedTypes) && propName !== 'Tags') { + // Always accept a token in place of any list element (unless the list elements are tokenizable) itemTypes.push(genspec.TOKEN_NAME); } @@ -619,17 +622,20 @@ export default class CodeGenerator { return alternatives.join(' | '); } + /** + * Render a CodeName to a string representation of it in TypeScript + */ + private renderCodeName(context: genspec.CodeName, type: genspec.CodeName): string { + const rel = type.relativeTo(context); + const specType = rel.specName && this.spec.PropertyTypes[rel.specName.fqn]; + if (!specType || schema.isPropertyBag(specType)) { + return rel.fqn; + } + return this.findNativeType(context, specType); + } + private renderTypeUnion(context: genspec.CodeName, types: genspec.CodeName[]) { - return types - .map(type => type.relativeTo(context)) - .map(type => { - const specType = type.specName && this.spec.PropertyTypes[type.specName.fqn]; - if (!specType || schema.isPropertyBag(specType)) { - return type.fqn; - } - return this.findNativeType(context, specType); - }) - .join(' | '); + return types.map(t => this.renderCodeName(context, t)).join(' | '); } private docLink(link: string | undefined, ...before: string[]) { From 13f99f389ebf70b8dfa5a733ebfeafdee1526c02 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Mon, 18 Mar 2019 13:59:21 +0100 Subject: [PATCH 11/16] fix(ecs): make TaskDefinition accept IRoles (#2034) The role input parameters are currently Roles but should be IRoles. Required adding the grant methods to the `IRole` definition, which weren't there before. Fixes #1925. --- .../aws-ecs/lib/base/task-definition.ts | 6 ++--- packages/@aws-cdk/aws-iam/lib/lazy-role.ts | 18 ++++++++++++-- packages/@aws-cdk/aws-iam/lib/role.ts | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts index d1063e1c23ee9..541799f0a1b8e 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/task-definition.ts @@ -23,14 +23,14 @@ export interface CommonTaskDefinitionProps { * * @default An execution role will be automatically created if you use ECR images in your task definition */ - executionRole?: iam.Role; + executionRole?: iam.IRole; /** * The IAM role assumable by your application code running inside the container * * @default A task role is automatically created for you */ - taskRole?: iam.Role; + taskRole?: iam.IRole; /** * See: https://docs.aws.amazon.com/AmazonECS/latest/developerguide//task_definition_parameters.html#volumes @@ -112,7 +112,7 @@ export class TaskDefinition extends cdk.Construct { /** * Task role used by this task definition */ - public readonly taskRole: iam.Role; + public readonly taskRole: iam.IRole; /** * Network mode used by this task definition diff --git a/packages/@aws-cdk/aws-iam/lib/lazy-role.ts b/packages/@aws-cdk/aws-iam/lib/lazy-role.ts index ec48896d22553..846732dd985e5 100644 --- a/packages/@aws-cdk/aws-iam/lib/lazy-role.ts +++ b/packages/@aws-cdk/aws-iam/lib/lazy-role.ts @@ -1,5 +1,5 @@ import cdk = require('@aws-cdk/cdk'); -import { Policy } from './policy'; +import { IPrincipal, Policy } from './policy'; import { PolicyPrincipal, PolicyStatement } from './policy-document'; import { IRole, Role, RoleImportProps, RoleProps } from './role'; @@ -85,6 +85,20 @@ export class LazyRole extends cdk.Construct implements IRole { return this.instantiate().principal; } + /** + * Grant the actions defined in actions to the identity Principal on this resource. + */ + public grant(identity?: IPrincipal, ...actions: string[]): void { + return this.instantiate().grant(identity, ...actions); + } + + /** + * Grant permissions to the given principal to pass this role. + */ + public grantPassRole(identity?: IPrincipal): void { + return this.instantiate().grantPassRole(identity); + } + private instantiate(): Role { if (!this.role) { const role = new Role(this, 'Default', this.props); @@ -95,4 +109,4 @@ export class LazyRole extends cdk.Construct implements IRole { } return this.role; } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-iam/lib/role.ts b/packages/@aws-cdk/aws-iam/lib/role.ts index 065fa6e49e916..4b7479abbc15b 100644 --- a/packages/@aws-cdk/aws-iam/lib/role.ts +++ b/packages/@aws-cdk/aws-iam/lib/role.ts @@ -245,6 +245,16 @@ export interface IRole extends IConstruct, IPrincipal { * Export this role to another stack. */ export(): RoleImportProps; + + /** + * Grant the actions defined in actions to the identity Principal on this resource. + */ + grant(identity?: IPrincipal, ...actions: string[]): void; + + /** + * Grant permissions to the given principal to pass this role. + */ + grantPassRole(identity?: IPrincipal): void; } function createAssumeRolePolicy(principal: PolicyPrincipal, externalId?: string) { @@ -331,4 +341,18 @@ class ImportedRole extends Construct implements IRole { public attachManagedPolicy(_arn: string): void { // FIXME: Add warning that we're ignoring this } + + /** + * Grant the actions defined in actions to the identity Principal on this resource. + */ + public grant(_identity?: IPrincipal, ..._actions: string[]): void { + // FIXME: Add warning that we're ignoring this + } + + /** + * Grant permissions to the given principal to pass this role. + */ + public grantPassRole(_identity?: IPrincipal): void { + // FIXME: Add warning that we're ignoring this + } } From a0cbd24901bfa8285125635db2a29e0d8ca4e020 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Mon, 18 Mar 2019 15:45:05 +0100 Subject: [PATCH 12/16] feat(cfnspec): update to version 2.28.0 (#2035) Also in this commit: - Bugfix to the update script to compile, so create-new-libraries is actually run on the new spec. - Add 'npm run set-refkind' to make it easier to set refkinds for new resources. --- packages/@aws-cdk/aws-greengrass/.gitignore | 14 + packages/@aws-cdk/aws-greengrass/.npmignore | 17 + packages/@aws-cdk/aws-greengrass/LICENSE | 201 ++ packages/@aws-cdk/aws-greengrass/NOTICE | 2 + packages/@aws-cdk/aws-greengrass/README.md | 7 + packages/@aws-cdk/aws-greengrass/lib/index.ts | 2 + packages/@aws-cdk/aws-greengrass/package.json | 73 + .../aws-greengrass/test/test.greengrass.ts | 9 + packages/@aws-cdk/cdk/package.json | 2 +- packages/@aws-cdk/cfnspec/CHANGELOG.md | 43 + .../cfnspec/build-tools/set-refkind.ts | 44 + .../@aws-cdk/cfnspec/build-tools/update.sh | 2 + packages/@aws-cdk/cfnspec/package.json | 1 + ...0_CloudFormationResourceSpecification.json | 2616 +++++++++++++---- .../spec-source/600_RefKinds_patch.json | 180 ++ packages/decdk/package.json | 3 +- tools/cfn2ts/lib/codegen.ts | 2 +- 17 files changed, 2592 insertions(+), 626 deletions(-) create mode 100644 packages/@aws-cdk/aws-greengrass/.gitignore create mode 100644 packages/@aws-cdk/aws-greengrass/.npmignore create mode 100644 packages/@aws-cdk/aws-greengrass/LICENSE create mode 100644 packages/@aws-cdk/aws-greengrass/NOTICE create mode 100644 packages/@aws-cdk/aws-greengrass/README.md create mode 100644 packages/@aws-cdk/aws-greengrass/lib/index.ts create mode 100644 packages/@aws-cdk/aws-greengrass/package.json create mode 100644 packages/@aws-cdk/aws-greengrass/test/test.greengrass.ts create mode 100644 packages/@aws-cdk/cfnspec/build-tools/set-refkind.ts diff --git a/packages/@aws-cdk/aws-greengrass/.gitignore b/packages/@aws-cdk/aws-greengrass/.gitignore new file mode 100644 index 0000000000000..7b20ed5f53385 --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/.gitignore @@ -0,0 +1,14 @@ +*.d.ts +*.generated.ts +*.js +*.js.map +*.snk +.jsii +.LAST_BUILD +.LAST_PACKAGE +.nycrc +.nyc_output +coverage +dist +tsconfig.json +tslint.json diff --git a/packages/@aws-cdk/aws-greengrass/.npmignore b/packages/@aws-cdk/aws-greengrass/.npmignore new file mode 100644 index 0000000000000..0ed32f4a4a755 --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/.npmignore @@ -0,0 +1,17 @@ +# The basics +*.ts +*.tgz +*.snk +!*.d.ts +!*.js + +# Coverage +coverage +.nyc_output +.nycrc + +# Build gear +dist +.LAST_BUILD +.LAST_PACKAGE +.jsii diff --git a/packages/@aws-cdk/aws-greengrass/LICENSE b/packages/@aws-cdk/aws-greengrass/LICENSE new file mode 100644 index 0000000000000..46c185646b439 --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/@aws-cdk/aws-greengrass/NOTICE b/packages/@aws-cdk/aws-greengrass/NOTICE new file mode 100644 index 0000000000000..8585168af8b7d --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/NOTICE @@ -0,0 +1,2 @@ +AWS Cloud Development Kit (AWS CDK) +Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/packages/@aws-cdk/aws-greengrass/README.md b/packages/@aws-cdk/aws-greengrass/README.md new file mode 100644 index 0000000000000..ae9619dc49a55 --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/README.md @@ -0,0 +1,7 @@ +## AWS::Greengrass Construct Library + +This module is part of the [AWS Cloud Development Kit](https://github.com/awslabs/aws-cdk) project. + +```ts +import greengrass = require('@aws-cdk/aws-greengrass'); +``` diff --git a/packages/@aws-cdk/aws-greengrass/lib/index.ts b/packages/@aws-cdk/aws-greengrass/lib/index.ts new file mode 100644 index 0000000000000..7a534d94a5f1a --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/lib/index.ts @@ -0,0 +1,2 @@ +// AWS::Greengrass CloudFormation Resources: +export * from './greengrass.generated'; diff --git a/packages/@aws-cdk/aws-greengrass/package.json b/packages/@aws-cdk/aws-greengrass/package.json new file mode 100644 index 0000000000000..fa84fb2a3b19c --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/package.json @@ -0,0 +1,73 @@ +{ + "name": "@aws-cdk/aws-greengrass", + "version": "0.25.3", + "description": "The CDK Construct Library for AWS::Greengrass", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "jsii": { + "outdir": "dist", + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Greengrass", + "packageId": "Amazon.CDK.AWS.Greengrass", + "signAssembly": true, + "assemblyOriginatorKeyFile": "../../key.snk" + }, + "java": { + "package": "software.amazon.awscdk.services.greengrass", + "maven": { + "groupId": "software.amazon.awscdk", + "artifactId": "greengrass" + } + }, + "sphinx": {} + } + }, + "repository": { + "type": "git", + "url": "https://github.com/awslabs/aws-cdk.git" + }, + "homepage": "https://github.com/awslabs/aws-cdk", + "scripts": { + "build": "cdk-build", + "integ": "cdk-integ", + "lint": "cdk-lint", + "package": "cdk-package", + "awslint": "cdk-awslint", + "pkglint": "pkglint -f", + "test": "cdk-test", + "watch": "cdk-watch", + "cfn2ts": "cfn2ts" + }, + "cdk-build": { + "cloudformation": "AWS::Greengrass" + }, + "keywords": [ + "aws", + "cdk", + "constructs", + "AWS::Greengrass", + "aws-greengrass" + ], + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com", + "organization": true + }, + "license": "Apache-2.0", + "devDependencies": { + "@aws-cdk/assert": "^0.25.3", + "cdk-build-tools": "^0.25.3", + "cfn2ts": "^0.25.3", + "pkglint": "^0.25.3" + }, + "dependencies": { + "@aws-cdk/cdk": "^0.25.3" + }, + "peerDependencies": { + "@aws-cdk/cdk": "^0.25.3" + }, + "engines": { + "node": ">= 8.10.0" + } +} diff --git a/packages/@aws-cdk/aws-greengrass/test/test.greengrass.ts b/packages/@aws-cdk/aws-greengrass/test/test.greengrass.ts new file mode 100644 index 0000000000000..51db772aeb78f --- /dev/null +++ b/packages/@aws-cdk/aws-greengrass/test/test.greengrass.ts @@ -0,0 +1,9 @@ +import { Test, testCase } from 'nodeunit'; +import {} from '../lib'; + +export = testCase({ + notTested(test: Test) { + test.ok(true, 'No tests are specified for this package.'); + test.done(); + } +}); diff --git a/packages/@aws-cdk/cdk/package.json b/packages/@aws-cdk/cdk/package.json index 6656332c23fc8..f5f2dd39bea95 100644 --- a/packages/@aws-cdk/cdk/package.json +++ b/packages/@aws-cdk/cdk/package.json @@ -78,4 +78,4 @@ "engines": { "node": ">= 8.10.0" } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/cfnspec/CHANGELOG.md b/packages/@aws-cdk/cfnspec/CHANGELOG.md index 8ad4f68fbf51a..99b2bce2586d6 100644 --- a/packages/@aws-cdk/cfnspec/CHANGELOG.md +++ b/packages/@aws-cdk/cfnspec/CHANGELOG.md @@ -1,3 +1,46 @@ + + + + + + + +# CloudFormation Resource Specification v2.28.0 + +## New Resource Types + +* AWS::Greengrass::ConnectorDefinition +* AWS::Greengrass::ConnectorDefinitionVersion +* AWS::Greengrass::CoreDefinition +* AWS::Greengrass::CoreDefinitionVersion +* AWS::Greengrass::DeviceDefinition +* AWS::Greengrass::DeviceDefinitionVersion +* AWS::Greengrass::FunctionDefinition +* AWS::Greengrass::FunctionDefinitionVersion +* AWS::Greengrass::Group +* AWS::Greengrass::GroupVersion +* AWS::Greengrass::LoggerDefinition +* AWS::Greengrass::LoggerDefinitionVersion +* AWS::Greengrass::ResourceDefinitionVersion +* AWS::Greengrass::SubscriptionDefinition +* AWS::Greengrass::SubscriptionDefinitionVersion + +## Attribute Changes + + +## Property Changes + +* AWS::AppStream::Fleet Tags (__added__) +* AWS::AppStream::ImageBuilder Tags (__added__) +* AWS::AppStream::Stack Tags (__added__) +* AWS::SageMaker::NotebookInstance RootAccess (__added__) + +## Property Type Changes + +* AWS::CodeBuild::Project.GitSubmodulesConfig (__added__) +* AWS::CodeBuild::Project.S3LogsConfig EncryptionDisabled (__added__) +* AWS::CodeBuild::Project.Source GitSubmodulesConfig (__added__) + # Serverless Application Model (SAM) Resource Specification v2016-10-31 ## New Resource Types diff --git a/packages/@aws-cdk/cfnspec/build-tools/set-refkind.ts b/packages/@aws-cdk/cfnspec/build-tools/set-refkind.ts new file mode 100644 index 0000000000000..184e272a2510b --- /dev/null +++ b/packages/@aws-cdk/cfnspec/build-tools/set-refkind.ts @@ -0,0 +1,44 @@ +import fs = require('fs'); +import path = require('path'); +import util = require('util'); + +const readFile = util.promisify(fs.readFile); +const writeFile = util.promisify(fs.writeFile); + +async function main() { + const args = process.argv.slice(2); + + if (args.length < 2) { + process.stderr.write(`Usage: set-refspec RESOURCE [RESOURCE] [...] KIND`); + process.exit(1); + } + + const kind = args[args.length - 1]; + const resources = args.slice(0, args.length - 1); + + const patchFile = path.join(__dirname, '..', 'spec-source', '600_RefKinds_patch.json'); + const patches = JSON.parse(await readFile(patchFile, { encoding: 'utf-8' })); + + for (const resource of resources) { + patches.ResourceTypes[resource] = { + patch: { + operations: [ + { + op: "add", + path: "/RefKind", + value: kind, + } + ], + description: `Set RefKind of ${resource} to ${kind}` + } + }; + } + + await writeFile(patchFile, JSON.stringify(patches, undefined, 2), { encoding: 'utf-8' }); +} + +main().catch(e => { + // tslint:disable-next-line:no-console + console.error(e); + process.exit(1); +}); \ No newline at end of file diff --git a/packages/@aws-cdk/cfnspec/build-tools/update.sh b/packages/@aws-cdk/cfnspec/build-tools/update.sh index c500ff0f3da4f..e2e2a34477433 100755 --- a/packages/@aws-cdk/cfnspec/build-tools/update.sh +++ b/packages/@aws-cdk/cfnspec/build-tools/update.sh @@ -52,6 +52,8 @@ update-spec \ spec-source/000_sam.spec.json \ false +npm run build + echo >&2 "Creating missing AWS construct libraries for new resource types..." node ${scriptdir}/create-missing-libraries.js diff --git a/packages/@aws-cdk/cfnspec/package.json b/packages/@aws-cdk/cfnspec/package.json index 34b780c0a85fa..9b78d2861c04c 100644 --- a/packages/@aws-cdk/cfnspec/package.json +++ b/packages/@aws-cdk/cfnspec/package.json @@ -5,6 +5,7 @@ "scripts": { "update": "cdk-build && /bin/bash build-tools/update.sh", "build": "cdk-build && node build-tools/build", + "set-refkind": "cdk-build && node build-tools/set-refkind", "watch": "cdk-watch", "pkglint": "pkglint -f", "test": "cdk-test", diff --git a/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json b/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json index cc008c003b787..811f7c7d0dd7b 100644 --- a/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json +++ b/packages/@aws-cdk/cfnspec/spec-source/000_CloudFormationResourceSpecification.json @@ -3884,6 +3884,17 @@ "Type": "List", "UpdateType": "Mutable" }, + "AWS::CodeBuild::Project.GitSubmodulesConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-gitsubmodulesconfig.html", + "Properties": { + "FetchSubmodules": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-gitsubmodulesconfig.html#cfn-codebuild-project-gitsubmodulesconfig-fetchsubmodules", + "PrimitiveType": "Boolean", + "Required": true, + "UpdateType": "Mutable" + } + } + }, "AWS::CodeBuild::Project.LogsConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html", "Properties": { @@ -3963,6 +3974,12 @@ "AWS::CodeBuild::Project.S3LogsConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html", "Properties": { + "EncryptionDisabled": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html#cfn-codebuild-project-s3logsconfig-encryptiondisabled", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, "Location": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html#cfn-codebuild-project-s3logsconfig-location", "PrimitiveType": "String", @@ -3998,6 +4015,12 @@ "Required": false, "UpdateType": "Mutable" }, + "GitSubmodulesConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-gitsubmodulesconfig", + "Required": false, + "Type": "GitSubmodulesConfig", + "UpdateType": "Mutable" + }, "InsecureSsl": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-insecuressl", "PrimitiveType": "Boolean", @@ -12214,216 +12237,1122 @@ } } }, - "AWS::GuardDuty::Filter.Condition": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html", + "AWS::Greengrass::ConnectorDefinition.Connector": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html", "Properties": { - "Eq": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-eq", - "PrimitiveItemType": "String", - "Required": false, - "Type": "List", - "UpdateType": "Mutable" - }, - "Gte": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-gte", - "PrimitiveType": "Integer", - "Required": false, - "UpdateType": "Mutable" - }, - "Lt": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lt", - "PrimitiveType": "Integer", - "Required": false, - "UpdateType": "Mutable" + "ConnectorArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-connectorarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" }, - "Lte": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lte", - "PrimitiveType": "Integer", - "Required": false, - "UpdateType": "Mutable" + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" }, - "Neq": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-neq", - "PrimitiveItemType": "String", + "Parameters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-parameters", + "PrimitiveType": "Json", "Required": false, - "Type": "List", - "UpdateType": "Mutable" + "UpdateType": "Immutable" } } }, - "AWS::GuardDuty::Filter.FindingCriteria": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html", + "AWS::Greengrass::ConnectorDefinition.ConnectorDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connectordefinitionversion.html", "Properties": { - "Criterion": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-criterion", - "PrimitiveType": "Json", - "Required": false, - "UpdateType": "Mutable" - }, - "ItemType": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-itemtype", - "Required": false, - "Type": "Condition", - "UpdateType": "Mutable" + "Connectors": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connectordefinitionversion.html#cfn-greengrass-connectordefinition-connectordefinitionversion-connectors", + "ItemType": "Connector", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" } } }, - "AWS::IAM::Group.Policy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "AWS::Greengrass::ConnectorDefinitionVersion.Connector": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html", "Properties": { - "PolicyDocument": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", - "PrimitiveType": "Json", + "ConnectorArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-connectorarn", + "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "PolicyName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-id", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + }, + "Parameters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-parameters", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" } } }, - "AWS::IAM::Role.Policy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "AWS::Greengrass::CoreDefinition.Core": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html", "Properties": { - "PolicyDocument": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", - "PrimitiveType": "Json", + "CertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-certificatearn", + "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "PolicyName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-id", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + }, + "SyncShadow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-syncshadow", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Immutable" + }, + "ThingArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-thingarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" } } }, - "AWS::IAM::User.LoginProfile": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html", + "AWS::Greengrass::CoreDefinition.CoreDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-coredefinitionversion.html", "Properties": { - "Password": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-password", + "Cores": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-coredefinitionversion.html#cfn-greengrass-coredefinition-coredefinitionversion-cores", + "ItemType": "Core", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::CoreDefinitionVersion.Core": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html", + "Properties": { + "CertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-certificatearn", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "PasswordResetRequired": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-passwordresetrequired", + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "SyncShadow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-syncshadow", "PrimitiveType": "Boolean", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + }, + "ThingArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-thingarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" } } }, - "AWS::IAM::User.Policy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "AWS::Greengrass::DeviceDefinition.Device": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html", "Properties": { - "PolicyDocument": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", - "PrimitiveType": "Json", + "CertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-certificatearn", + "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "PolicyName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-id", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + }, + "SyncShadow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-syncshadow", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Immutable" + }, + "ThingArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-thingarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" } } }, - "AWS::IoT1Click::Project.DeviceTemplate": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html", + "AWS::Greengrass::DeviceDefinition.DeviceDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-devicedefinitionversion.html", "Properties": { - "CallbackOverrides": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-callbackoverrides", - "PrimitiveType": "Json", - "Required": false, - "UpdateType": "Mutable" - }, - "DeviceType": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-devicetype", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" + "Devices": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-devicedefinitionversion.html#cfn-greengrass-devicedefinition-devicedefinitionversion-devices", + "ItemType": "Device", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" } } }, - "AWS::IoT1Click::Project.PlacementTemplate": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html", + "AWS::Greengrass::DeviceDefinitionVersion.Device": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html", "Properties": { - "DefaultAttributes": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-defaultattributes", - "PrimitiveType": "Json", - "Required": false, - "UpdateType": "Mutable" + "CertificateArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-certificatearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" }, - "DeviceTemplates": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-devicetemplates", - "PrimitiveType": "Json", + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "SyncShadow": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-syncshadow", + "PrimitiveType": "Boolean", "Required": false, "UpdateType": "Immutable" + }, + "ThingArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-thingarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" } } }, - "AWS::IoT::Thing.AttributePayload": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html", + "AWS::Greengrass::FunctionDefinition.DefaultConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-defaultconfig.html", "Properties": { - "Attributes": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html#cfn-iot-thing-attributepayload-attributes", - "DuplicatesAllowed": false, - "PrimitiveItemType": "String", - "Required": false, - "Type": "Map", + "Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-defaultconfig.html#cfn-greengrass-functiondefinition-defaultconfig-execution", + "Required": true, + "Type": "Execution", "UpdateType": "Mutable" } } }, - "AWS::IoT::TopicRule.Action": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html", + "AWS::Greengrass::FunctionDefinition.Environment": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html", "Properties": { - "CloudwatchAlarm": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchalarm", - "Required": false, - "Type": "CloudwatchAlarmAction", - "UpdateType": "Mutable" - }, - "CloudwatchMetric": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchmetric", + "AccessSysfs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-accesssysfs", + "PrimitiveType": "Boolean", "Required": false, - "Type": "CloudwatchMetricAction", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "DynamoDB": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodb", + "Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-execution", "Required": false, - "Type": "DynamoDBAction", - "UpdateType": "Mutable" + "Type": "Execution", + "UpdateType": "Immutable" }, - "DynamoDBv2": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodbv2", + "ResourceAccessPolicies": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-resourceaccesspolicies", + "ItemType": "ResourceAccessPolicy", "Required": false, - "Type": "DynamoDBv2Action", - "UpdateType": "Mutable" + "Type": "List", + "UpdateType": "Immutable" }, - "Elasticsearch": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-elasticsearch", + "Variables": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-variables", + "PrimitiveType": "Json", "Required": false, - "Type": "ElasticsearchAction", - "UpdateType": "Mutable" - }, - "Firehose": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-firehose", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html", + "Properties": { + "IsolationMode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html#cfn-greengrass-functiondefinition-execution-isolationmode", + "PrimitiveType": "String", "Required": false, - "Type": "FirehoseAction", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "IotAnalytics": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-iotanalytics", + "RunAs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html#cfn-greengrass-functiondefinition-execution-runas", + "Required": false, + "Type": "RunAs", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.Function": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html", + "Properties": { + "FunctionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-functionarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "FunctionConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-functionconfiguration", + "Required": true, + "Type": "FunctionConfiguration", + "UpdateType": "Immutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.FunctionConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html", + "Properties": { + "EncodingType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-encodingtype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Environment": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-environment", + "Required": false, + "Type": "Environment", + "UpdateType": "Immutable" + }, + "ExecArgs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-execargs", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Executable": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-executable", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "MemorySize": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-memorysize", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Immutable" + }, + "Pinned": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-pinned", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "Timeout": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-timeout", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.FunctionDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html", + "Properties": { + "DefaultConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html#cfn-greengrass-functiondefinition-functiondefinitionversion-defaultconfig", + "Required": false, + "Type": "DefaultConfig", + "UpdateType": "Immutable" + }, + "Functions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html#cfn-greengrass-functiondefinition-functiondefinitionversion-functions", + "ItemType": "Function", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.ResourceAccessPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html", + "Properties": { + "Permission": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html#cfn-greengrass-functiondefinition-resourceaccesspolicy-permission", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "ResourceId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html#cfn-greengrass-functiondefinition-resourceaccesspolicy-resourceid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinition.RunAs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html", + "Properties": { + "Gid": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html#cfn-greengrass-functiondefinition-runas-gid", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + }, + "Uid": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html#cfn-greengrass-functiondefinition-runas-uid", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.DefaultConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html", + "Properties": { + "Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html#cfn-greengrass-functiondefinitionversion-defaultconfig-execution", + "Required": true, + "Type": "Execution", + "UpdateType": "Mutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.Environment": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html", + "Properties": { + "AccessSysfs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-accesssysfs", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Immutable" + }, + "Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-execution", + "Required": false, + "Type": "Execution", + "UpdateType": "Immutable" + }, + "ResourceAccessPolicies": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-resourceaccesspolicies", + "ItemType": "ResourceAccessPolicy", + "Required": false, + "Type": "List", + "UpdateType": "Immutable" + }, + "Variables": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-variables", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.Execution": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html", + "Properties": { + "IsolationMode": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html#cfn-greengrass-functiondefinitionversion-execution-isolationmode", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "RunAs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html#cfn-greengrass-functiondefinitionversion-execution-runas", + "Required": false, + "Type": "RunAs", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.Function": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html", + "Properties": { + "FunctionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-functionarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "FunctionConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-functionconfiguration", + "Required": true, + "Type": "FunctionConfiguration", + "UpdateType": "Immutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.FunctionConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html", + "Properties": { + "EncodingType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-encodingtype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Environment": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-environment", + "Required": false, + "Type": "Environment", + "UpdateType": "Immutable" + }, + "ExecArgs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-execargs", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Executable": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-executable", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "MemorySize": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-memorysize", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Immutable" + }, + "Pinned": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-pinned", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "Timeout": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-timeout", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.ResourceAccessPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html", + "Properties": { + "Permission": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html#cfn-greengrass-functiondefinitionversion-resourceaccesspolicy-permission", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "ResourceId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html#cfn-greengrass-functiondefinitionversion-resourceaccesspolicy-resourceid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion.RunAs": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html", + "Properties": { + "Gid": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html#cfn-greengrass-functiondefinitionversion-runas-gid", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + }, + "Uid": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html#cfn-greengrass-functiondefinitionversion-runas-uid", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::Group.GroupVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html", + "Properties": { + "ConnectorDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-connectordefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "CoreDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-coredefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "DeviceDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-devicedefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "FunctionDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-functiondefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "LoggerDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-loggerdefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "ResourceDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-resourcedefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "SubscriptionDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-subscriptiondefinitionversionarn", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::LoggerDefinition.Logger": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html", + "Properties": { + "Component": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-component", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Level": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-level", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Space": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-space", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + }, + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-type", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::LoggerDefinition.LoggerDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-loggerdefinitionversion.html", + "Properties": { + "Loggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-loggerdefinitionversion.html#cfn-greengrass-loggerdefinition-loggerdefinitionversion-loggers", + "ItemType": "Logger", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::LoggerDefinitionVersion.Logger": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html", + "Properties": { + "Component": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-component", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Level": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-level", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Space": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-space", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + }, + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-type", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.GroupOwnerSetting": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html", + "Properties": { + "AutoAddGroupOwner": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html#cfn-greengrass-resourcedefinitionversion-groupownersetting-autoaddgroupowner", + "PrimitiveType": "Boolean", + "Required": true, + "UpdateType": "Immutable" + }, + "GroupOwner": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html#cfn-greengrass-resourcedefinitionversion-groupownersetting-groupowner", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.LocalDeviceResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html", + "Properties": { + "GroupOwnerSetting": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html#cfn-greengrass-resourcedefinitionversion-localdeviceresourcedata-groupownersetting", + "Required": false, + "Type": "GroupOwnerSetting", + "UpdateType": "Immutable" + }, + "SourcePath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html#cfn-greengrass-resourcedefinitionversion-localdeviceresourcedata-sourcepath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.LocalVolumeResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html", + "Properties": { + "DestinationPath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-destinationpath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "GroupOwnerSetting": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-groupownersetting", + "Required": false, + "Type": "GroupOwnerSetting", + "UpdateType": "Immutable" + }, + "SourcePath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-sourcepath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.ResourceDataContainer": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html", + "Properties": { + "LocalDeviceResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-localdeviceresourcedata", + "Required": false, + "Type": "LocalDeviceResourceData", + "UpdateType": "Immutable" + }, + "LocalVolumeResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-localvolumeresourcedata", + "Required": false, + "Type": "LocalVolumeResourceData", + "UpdateType": "Immutable" + }, + "S3MachineLearningModelResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-s3machinelearningmodelresourcedata", + "Required": false, + "Type": "S3MachineLearningModelResourceData", + "UpdateType": "Immutable" + }, + "SageMakerMachineLearningModelResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-sagemakermachinelearningmodelresourcedata", + "Required": false, + "Type": "SageMakerMachineLearningModelResourceData", + "UpdateType": "Immutable" + }, + "SecretsManagerSecretResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-secretsmanagersecretresourcedata", + "Required": false, + "Type": "SecretsManagerSecretResourceData", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.ResourceInstance": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html", + "Properties": { + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "ResourceDataContainer": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-resourcedatacontainer", + "Required": true, + "Type": "ResourceDataContainer", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.S3MachineLearningModelResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html", + "Properties": { + "DestinationPath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata-destinationpath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "S3Uri": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata-s3uri", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.SageMakerMachineLearningModelResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html", + "Properties": { + "DestinationPath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata-destinationpath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "SageMakerJobArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata-sagemakerjobarn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::ResourceDefinitionVersion.SecretsManagerSecretResourceData": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html", + "Properties": { + "ARN": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata-arn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "AdditionalStagingLabelsToDownload": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata-additionalstaginglabelstodownload", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::SubscriptionDefinition.Subscription": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html", + "Properties": { + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Source": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-source", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Subject": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-subject", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Target": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-target", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::SubscriptionDefinition.SubscriptionDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscriptiondefinitionversion.html", + "Properties": { + "Subscriptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinition-subscriptiondefinitionversion-subscriptions", + "ItemType": "Subscription", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::SubscriptionDefinitionVersion.Subscription": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html", + "Properties": { + "Id": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-id", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Source": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-source", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Subject": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-subject", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "Target": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-target", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::GuardDuty::Filter.Condition": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html", + "Properties": { + "Eq": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-eq", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Gte": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-gte", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Lt": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lt", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Lte": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lte", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Neq": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-neq", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + } + } + }, + "AWS::GuardDuty::Filter.FindingCriteria": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html", + "Properties": { + "Criterion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-criterion", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, + "ItemType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-itemtype", + "Required": false, + "Type": "Condition", + "UpdateType": "Mutable" + } + } + }, + "AWS::IAM::Group.Policy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "Properties": { + "PolicyDocument": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", + "PrimitiveType": "Json", + "Required": true, + "UpdateType": "Mutable" + }, + "PolicyName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IAM::Role.Policy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "Properties": { + "PolicyDocument": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", + "PrimitiveType": "Json", + "Required": true, + "UpdateType": "Mutable" + }, + "PolicyName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IAM::User.LoginProfile": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html", + "Properties": { + "Password": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-password", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "PasswordResetRequired": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-passwordresetrequired", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IAM::User.Policy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html", + "Properties": { + "PolicyDocument": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument", + "PrimitiveType": "Json", + "Required": true, + "UpdateType": "Mutable" + }, + "PolicyName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoT1Click::Project.DeviceTemplate": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html", + "Properties": { + "CallbackOverrides": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-callbackoverrides", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, + "DeviceType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-devicetype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::IoT1Click::Project.PlacementTemplate": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html", + "Properties": { + "DefaultAttributes": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-defaultattributes", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, + "DeviceTemplates": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-devicetemplates", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::IoT::Thing.AttributePayload": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html", + "Properties": { + "Attributes": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html#cfn-iot-thing-attributepayload-attributes", + "DuplicatesAllowed": false, + "PrimitiveItemType": "String", + "Required": false, + "Type": "Map", + "UpdateType": "Mutable" + } + } + }, + "AWS::IoT::TopicRule.Action": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html", + "Properties": { + "CloudwatchAlarm": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchalarm", + "Required": false, + "Type": "CloudwatchAlarmAction", + "UpdateType": "Mutable" + }, + "CloudwatchMetric": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchmetric", + "Required": false, + "Type": "CloudwatchMetricAction", + "UpdateType": "Mutable" + }, + "DynamoDB": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodb", + "Required": false, + "Type": "DynamoDBAction", + "UpdateType": "Mutable" + }, + "DynamoDBv2": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodbv2", + "Required": false, + "Type": "DynamoDBv2Action", + "UpdateType": "Mutable" + }, + "Elasticsearch": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-elasticsearch", + "Required": false, + "Type": "ElasticsearchAction", + "UpdateType": "Mutable" + }, + "Firehose": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-firehose", + "Required": false, + "Type": "FirehoseAction", + "UpdateType": "Mutable" + }, + "IotAnalytics": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-iotanalytics", "Required": false, "Type": "IotAnalyticsAction", "UpdateType": "Mutable" @@ -19181,7 +20110,7 @@ } } }, - "ResourceSpecificationVersion": "2.26.0", + "ResourceSpecificationVersion": "2.28.0", "ResourceTypes": { "AWS::AmazonMQ::Broker": { "Attributes": { @@ -20720,6 +21649,13 @@ "Required": false, "UpdateType": "Immutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "VpcConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-vpcconfig", "Required": false, @@ -20790,6 +21726,13 @@ "Required": false, "UpdateType": "Mutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "VpcConfig": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-vpcconfig", "Required": false, @@ -20857,6 +21800,13 @@ "Type": "List", "UpdateType": "Mutable" }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-tags", + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, "UserSettings": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-usersettings", "ItemType": "UserSetting", @@ -28060,832 +29010,1246 @@ "Type": "List", "UpdateType": "Mutable" }, - "Tags": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-tags", - "DuplicatesAllowed": true, - "ItemType": "Tag", - "Required": false, - "Type": "List", + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-tags", + "DuplicatesAllowed": true, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-type", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::ElasticLoadBalancingV2::TargetGroup": { + "Attributes": { + "LoadBalancerArns": { + "PrimitiveItemType": "String", + "Type": "List" + }, + "TargetGroupFullName": { + "PrimitiveType": "String" + }, + "TargetGroupName": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html", + "Properties": { + "HealthCheckEnabled": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckenabled", + "PrimitiveType": "Boolean", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthCheckIntervalSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckintervalseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthCheckPath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckpath", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthCheckPort": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckport", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthCheckProtocol": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckprotocol", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthCheckTimeoutSeconds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthchecktimeoutseconds", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "HealthyThresholdCount": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthythresholdcount", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Matcher": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-matcher", + "Required": false, + "Type": "Matcher", + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-name", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Port": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-port", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Immutable" + }, + "Protocol": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-protocol", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-tags", + "DuplicatesAllowed": true, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "TargetGroupAttributes": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targetgroupattributes", + "DuplicatesAllowed": false, + "ItemType": "TargetGroupAttribute", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "TargetType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targettype", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "Targets": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targets", + "DuplicatesAllowed": false, + "ItemType": "TargetDescription", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "UnhealthyThresholdCount": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-unhealthythresholdcount", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "VpcId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-vpcid", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + } + } + }, + "AWS::Elasticsearch::Domain": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "DomainArn": { + "PrimitiveType": "String" + }, + "DomainEndpoint": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html", + "Properties": { + "AccessPolicies": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-accesspolicies", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, + "AdvancedOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedoptions", + "DuplicatesAllowed": false, + "PrimitiveItemType": "String", + "Required": false, + "Type": "Map", + "UpdateType": "Mutable" + }, + "DomainName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainname", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "EBSOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-ebsoptions", + "Required": false, + "Type": "EBSOptions", + "UpdateType": "Mutable" + }, + "ElasticsearchClusterConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchclusterconfig", + "Required": false, + "Type": "ElasticsearchClusterConfig", + "UpdateType": "Mutable" + }, + "ElasticsearchVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchversion", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, + "EncryptionAtRestOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-encryptionatrestoptions", + "Required": false, + "Type": "EncryptionAtRestOptions", + "UpdateType": "Immutable" + }, + "NodeToNodeEncryptionOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions", + "Required": false, + "Type": "NodeToNodeEncryptionOptions", + "UpdateType": "Immutable" + }, + "SnapshotOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-snapshotoptions", + "Required": false, + "Type": "SnapshotOptions", + "UpdateType": "Mutable" + }, + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-tags", + "DuplicatesAllowed": true, + "ItemType": "Tag", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "VPCOptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-vpcoptions", + "Required": false, + "Type": "VPCOptions", + "UpdateType": "Mutable" + } + } + }, + "AWS::Events::EventBusPolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html", + "Properties": { + "Action": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-action", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Condition": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-condition", + "Required": false, + "Type": "Condition", + "UpdateType": "Mutable" + }, + "Principal": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-principal", + "PrimitiveType": "String", + "Required": true, "UpdateType": "Mutable" }, - "Type": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-type", + "StatementId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-statementid", "PrimitiveType": "String", - "Required": false, + "Required": true, "UpdateType": "Immutable" } } }, - "AWS::ElasticLoadBalancingV2::TargetGroup": { + "AWS::Events::Rule": { "Attributes": { - "LoadBalancerArns": { - "PrimitiveItemType": "String", - "Type": "List" - }, - "TargetGroupFullName": { - "PrimitiveType": "String" - }, - "TargetGroupName": { + "Arn": { "PrimitiveType": "String" } }, - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html", "Properties": { - "HealthCheckEnabled": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckenabled", - "PrimitiveType": "Boolean", + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-description", + "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "HealthCheckIntervalSeconds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckintervalseconds", - "PrimitiveType": "Integer", + "EventPattern": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-eventpattern", + "PrimitiveType": "Json", "Required": false, "UpdateType": "Mutable" }, - "HealthCheckPath": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckpath", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-name", "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "HealthCheckPort": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckport", + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-rolearn", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "HealthCheckProtocol": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckprotocol", + "ScheduleExpression": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-scheduleexpression", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "HealthCheckTimeoutSeconds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthchecktimeoutseconds", - "PrimitiveType": "Integer", - "Required": false, - "UpdateType": "Mutable" - }, - "HealthyThresholdCount": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthythresholdcount", - "PrimitiveType": "Integer", + "State": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-state", + "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "Matcher": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-matcher", + "Targets": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-targets", + "DuplicatesAllowed": false, + "ItemType": "Target", "Required": false, - "Type": "Matcher", + "Type": "List", "UpdateType": "Mutable" - }, - "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-name", + } + } + }, + "AWS::FSx::FileSystem": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html", + "Properties": { + "BackupId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-backupid", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, - "Port": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-port", - "PrimitiveType": "Integer", + "FileSystemType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-filesystemtype", + "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, - "Protocol": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-protocol", + "KmsKeyId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-kmskeyid", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, - "Tags": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-tags", - "DuplicatesAllowed": true, - "ItemType": "Tag", + "LustreConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-lustreconfiguration", "Required": false, - "Type": "List", + "Type": "LustreConfiguration", "UpdateType": "Mutable" }, - "TargetGroupAttributes": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targetgroupattributes", - "DuplicatesAllowed": false, - "ItemType": "TargetGroupAttribute", + "SecurityGroupIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-securitygroupids", + "PrimitiveItemType": "String", "Required": false, "Type": "List", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "TargetType": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targettype", - "PrimitiveType": "String", + "StorageCapacity": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-storagecapacity", + "PrimitiveType": "Integer", "Required": false, "UpdateType": "Immutable" }, - "Targets": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targets", - "DuplicatesAllowed": false, - "ItemType": "TargetDescription", + "SubnetIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-subnetids", + "PrimitiveItemType": "String", "Required": false, "Type": "List", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "UnhealthyThresholdCount": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-unhealthythresholdcount", - "PrimitiveType": "Integer", + "Tags": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-tags", + "ItemType": "TagEntry", "Required": false, + "Type": "List", "UpdateType": "Mutable" }, - "VpcId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-vpcid", - "PrimitiveType": "String", + "WindowsConfiguration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-windowsconfiguration", "Required": false, - "UpdateType": "Immutable" + "Type": "WindowsConfiguration", + "UpdateType": "Mutable" } } }, - "AWS::Elasticsearch::Domain": { - "Attributes": { - "Arn": { - "PrimitiveType": "String" + "AWS::GameLift::Alias": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html", + "Properties": { + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-description", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" }, - "DomainArn": { - "PrimitiveType": "String" + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" }, - "DomainEndpoint": { - "PrimitiveType": "String" + "RoutingStrategy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-routingstrategy", + "Required": true, + "Type": "RoutingStrategy", + "UpdateType": "Mutable" } - }, - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html", + } + }, + "AWS::GameLift::Build": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html", "Properties": { - "AccessPolicies": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-accesspolicies", - "PrimitiveType": "Json", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-name", + "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "AdvancedOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedoptions", - "DuplicatesAllowed": false, - "PrimitiveItemType": "String", + "StorageLocation": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-storagelocation", "Required": false, - "Type": "Map", - "UpdateType": "Mutable" + "Type": "S3Location", + "UpdateType": "Immutable" }, - "DomainName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainname", + "Version": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-version", "PrimitiveType": "String", "Required": false, + "UpdateType": "Mutable" + } + } + }, + "AWS::GameLift::Fleet": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html", + "Properties": { + "BuildId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-buildid", + "PrimitiveType": "String", + "Required": true, "UpdateType": "Immutable" }, - "EBSOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-ebsoptions", + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-description", + "PrimitiveType": "String", "Required": false, - "Type": "EBSOptions", "UpdateType": "Mutable" }, - "ElasticsearchClusterConfig": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchclusterconfig", + "DesiredEC2Instances": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-desiredec2instances", + "PrimitiveType": "Integer", + "Required": true, + "UpdateType": "Mutable" + }, + "EC2InboundPermissions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2inboundpermissions", + "DuplicatesAllowed": false, + "ItemType": "IpPermission", "Required": false, - "Type": "ElasticsearchClusterConfig", + "Type": "List", "UpdateType": "Mutable" }, - "ElasticsearchVersion": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchversion", + "EC2InstanceType": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2instancetype", "PrimitiveType": "String", - "Required": false, + "Required": true, "UpdateType": "Immutable" }, - "EncryptionAtRestOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-encryptionatrestoptions", + "LogPaths": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-logpaths", + "DuplicatesAllowed": false, + "PrimitiveItemType": "String", "Required": false, - "Type": "EncryptionAtRestOptions", + "Type": "List", "UpdateType": "Immutable" }, - "NodeToNodeEncryptionOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions", + "MaxSize": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-maxsize", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "MinSize": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-minsize", + "PrimitiveType": "Integer", + "Required": false, + "UpdateType": "Mutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-name", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "ServerLaunchParameters": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-serverlaunchparameters", + "PrimitiveType": "String", "Required": false, - "Type": "NodeToNodeEncryptionOptions", "UpdateType": "Immutable" }, - "SnapshotOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-snapshotoptions", + "ServerLaunchPath": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-serverlaunchpath", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + } + } + }, + "AWS::Glue::Classifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html", + "Properties": { + "GrokClassifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-grokclassifier", "Required": false, - "Type": "SnapshotOptions", + "Type": "GrokClassifier", "UpdateType": "Mutable" }, - "Tags": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-tags", - "DuplicatesAllowed": true, - "ItemType": "Tag", + "JsonClassifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-jsonclassifier", "Required": false, - "Type": "List", + "Type": "JsonClassifier", "UpdateType": "Mutable" }, - "VPCOptions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-vpcoptions", + "XMLClassifier": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-xmlclassifier", "Required": false, - "Type": "VPCOptions", + "Type": "XMLClassifier", "UpdateType": "Mutable" } } }, - "AWS::Events::EventBusPolicy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html", + "AWS::Glue::Connection": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html", "Properties": { - "Action": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-action", + "CatalogId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-catalogid", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" - }, - "Condition": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-condition", - "Required": false, - "Type": "Condition", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "Principal": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-principal", - "PrimitiveType": "String", + "ConnectionInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-connectioninput", "Required": true, + "Type": "ConnectionInput", "UpdateType": "Mutable" - }, - "StatementId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-statementid", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Immutable" } } }, - "AWS::Events::Rule": { - "Attributes": { - "Arn": { - "PrimitiveType": "String" - } - }, - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html", + "AWS::Glue::Crawler": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html", "Properties": { - "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-description", + "Classifiers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-classifiers", + "PrimitiveItemType": "String", + "Required": false, + "Type": "List", + "UpdateType": "Mutable" + }, + "Configuration": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-configuration", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "EventPattern": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-eventpattern", - "PrimitiveType": "Json", + "DatabaseName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-databasename", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-description", + "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-name", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-name", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, - "RoleArn": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-rolearn", + "Role": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-role", "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "Schedule": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schedule", "Required": false, + "Type": "Schedule", "UpdateType": "Mutable" }, - "ScheduleExpression": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-scheduleexpression", - "PrimitiveType": "String", + "SchemaChangePolicy": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schemachangepolicy", "Required": false, + "Type": "SchemaChangePolicy", "UpdateType": "Mutable" }, - "State": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-state", + "TablePrefix": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-tableprefix", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, "Targets": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-targets", - "DuplicatesAllowed": false, - "ItemType": "Target", - "Required": false, - "Type": "List", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-targets", + "Required": true, + "Type": "Targets", "UpdateType": "Mutable" } } }, - "AWS::FSx::FileSystem": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html", + "AWS::Glue::Database": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html", "Properties": { - "BackupId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-backupid", + "CatalogId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-catalogid", "PrimitiveType": "String", - "Required": false, + "Required": true, "UpdateType": "Immutable" }, - "FileSystemType": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-filesystemtype", + "DatabaseInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-databaseinput", + "Required": true, + "Type": "DatabaseInput", + "UpdateType": "Mutable" + } + } + }, + "AWS::Glue::DevEndpoint": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html", + "Properties": { + "EndpointName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-endpointname", "PrimitiveType": "String", "Required": false, "UpdateType": "Immutable" }, - "KmsKeyId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-kmskeyid", + "ExtraJarsS3Path": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrajarss3path", "PrimitiveType": "String", "Required": false, - "UpdateType": "Immutable" - }, - "LustreConfiguration": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-lustreconfiguration", - "Required": false, - "Type": "LustreConfiguration", "UpdateType": "Mutable" }, - "SecurityGroupIds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-securitygroupids", - "PrimitiveItemType": "String", + "ExtraPythonLibsS3Path": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrapythonlibss3path", + "PrimitiveType": "String", "Required": false, - "Type": "List", - "UpdateType": "Immutable" + "UpdateType": "Mutable" }, - "StorageCapacity": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-storagecapacity", + "NumberOfNodes": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-numberofnodes", "PrimitiveType": "Integer", "Required": false, - "UpdateType": "Immutable" + "UpdateType": "Mutable" }, - "SubnetIds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-subnetids", - "PrimitiveItemType": "String", - "Required": false, - "Type": "List", - "UpdateType": "Immutable" + "PublicKey": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-publickey", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" }, - "Tags": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-tags", - "ItemType": "TagEntry", + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-rolearn", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Mutable" + }, + "SecurityGroupIds": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-securitygroupids", + "PrimitiveItemType": "String", "Required": false, "Type": "List", "UpdateType": "Mutable" }, - "WindowsConfiguration": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-windowsconfiguration", + "SubnetId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-subnetid", + "PrimitiveType": "String", "Required": false, - "Type": "WindowsConfiguration", "UpdateType": "Mutable" } } }, - "AWS::GameLift::Alias": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html", + "AWS::Glue::Job": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html", "Properties": { + "AllocatedCapacity": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-allocatedcapacity", + "PrimitiveType": "Double", + "Required": false, + "UpdateType": "Mutable" + }, + "Command": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-command", + "Required": true, + "Type": "JobCommand", + "UpdateType": "Mutable" + }, + "Connections": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-connections", + "Required": false, + "Type": "ConnectionsList", + "UpdateType": "Mutable" + }, + "DefaultArguments": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-defaultarguments", + "PrimitiveType": "Json", + "Required": false, + "UpdateType": "Mutable" + }, "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-description", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-description", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Mutable" + }, + "ExecutionProperty": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-executionproperty", + "Required": false, + "Type": "ExecutionProperty", + "UpdateType": "Mutable" + }, + "LogUri": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-loguri", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, + "MaxRetries": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-maxretries", + "PrimitiveType": "Double", + "Required": false, + "UpdateType": "Mutable" + }, "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-name", + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-name", "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" + "Required": false, + "UpdateType": "Immutable" }, - "RoutingStrategy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-routingstrategy", + "Role": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-role", + "PrimitiveType": "String", "Required": true, - "Type": "RoutingStrategy", "UpdateType": "Mutable" } } }, - "AWS::GameLift::Build": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html", + "AWS::Glue::Partition": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html", "Properties": { - "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-name", + "CatalogId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-catalogid", "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" - }, - "StorageLocation": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-storagelocation", - "Required": false, - "Type": "S3Location", + "Required": true, "UpdateType": "Immutable" }, - "Version": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-version", + "DatabaseName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-databasename", "PrimitiveType": "String", - "Required": false, + "Required": true, + "UpdateType": "Immutable" + }, + "PartitionInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-partitioninput", + "Required": true, + "Type": "PartitionInput", "UpdateType": "Mutable" + }, + "TableName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-tablename", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" } } }, - "AWS::GameLift::Fleet": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html", + "AWS::Glue::Table": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html", "Properties": { - "BuildId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-buildid", + "CatalogId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-catalogid", "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" }, - "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-description", + "DatabaseName": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-databasename", "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" + "Required": true, + "UpdateType": "Immutable" }, - "DesiredEC2Instances": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-desiredec2instances", - "PrimitiveType": "Integer", + "TableInput": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-tableinput", "Required": true, + "Type": "TableInput", "UpdateType": "Mutable" - }, - "EC2InboundPermissions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2inboundpermissions", - "DuplicatesAllowed": false, - "ItemType": "IpPermission", - "Required": false, + } + } + }, + "AWS::Glue::Trigger": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html", + "Properties": { + "Actions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-actions", + "ItemType": "Action", + "Required": true, "Type": "List", "UpdateType": "Mutable" }, - "EC2InstanceType": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2instancetype", + "Description": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-description", "PrimitiveType": "String", - "Required": true, - "UpdateType": "Immutable" + "Required": false, + "UpdateType": "Mutable" }, - "LogPaths": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-logpaths", - "DuplicatesAllowed": false, - "PrimitiveItemType": "String", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-name", + "PrimitiveType": "String", "Required": false, - "Type": "List", "UpdateType": "Immutable" }, - "MaxSize": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-maxsize", - "PrimitiveType": "Integer", + "Predicate": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-predicate", "Required": false, + "Type": "Predicate", "UpdateType": "Mutable" }, - "MinSize": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-minsize", - "PrimitiveType": "Integer", + "Schedule": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-schedule", + "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" }, - "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-name", + "Type": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-type", "PrimitiveType": "String", "Required": true, "UpdateType": "Mutable" - }, - "ServerLaunchParameters": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-serverlaunchparameters", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Immutable" - }, - "ServerLaunchPath": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-serverlaunchpath", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Immutable" } } }, - "AWS::Glue::Classifier": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html", - "Properties": { - "GrokClassifier": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-grokclassifier", - "Required": false, - "Type": "GrokClassifier", - "UpdateType": "Mutable" + "AWS::Greengrass::ConnectorDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" }, - "JsonClassifier": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-jsonclassifier", - "Required": false, - "Type": "JsonClassifier", - "UpdateType": "Mutable" + "Id": { + "PrimitiveType": "String" }, - "XMLClassifier": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-xmlclassifier", + "LatestVersionArn": { + "PrimitiveType": "String" + }, + "Name": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html#cfn-greengrass-connectordefinition-initialversion", "Required": false, - "Type": "XMLClassifier", + "Type": "ConnectorDefinitionVersion", + "UpdateType": "Immutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html#cfn-greengrass-connectordefinition-name", + "PrimitiveType": "String", + "Required": true, "UpdateType": "Mutable" } } }, - "AWS::Glue::Connection": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html", + "AWS::Greengrass::ConnectorDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html", "Properties": { - "CatalogId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-catalogid", + "ConnectorDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html#cfn-greengrass-connectordefinitionversion-connectordefinitionid", "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" }, - "ConnectionInput": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-connectioninput", + "Connectors": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html#cfn-greengrass-connectordefinitionversion-connectors", + "ItemType": "Connector", "Required": true, - "Type": "ConnectionInput", - "UpdateType": "Mutable" + "Type": "List", + "UpdateType": "Immutable" } } }, - "AWS::Glue::Crawler": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html", - "Properties": { - "Classifiers": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-classifiers", - "PrimitiveItemType": "String", - "Required": false, - "Type": "List", - "UpdateType": "Mutable" - }, - "Configuration": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-configuration", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" + "AWS::Greengrass::CoreDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" }, - "DatabaseName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-databasename", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Mutable" + "Id": { + "PrimitiveType": "String" }, - "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-description", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" + "LatestVersionArn": { + "PrimitiveType": "String" }, "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-name", - "PrimitiveType": "String", + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html#cfn-greengrass-coredefinition-initialversion", "Required": false, + "Type": "CoreDefinitionVersion", "UpdateType": "Immutable" }, - "Role": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-role", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html#cfn-greengrass-coredefinition-name", "PrimitiveType": "String", "Required": true, "UpdateType": "Mutable" + } + } + }, + "AWS::Greengrass::CoreDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html", + "Properties": { + "CoreDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html#cfn-greengrass-coredefinitionversion-coredefinitionid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" }, - "Schedule": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schedule", - "Required": false, - "Type": "Schedule", - "UpdateType": "Mutable" + "Cores": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html#cfn-greengrass-coredefinitionversion-cores", + "ItemType": "Core", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::DeviceDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" }, - "SchemaChangePolicy": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schemachangepolicy", - "Required": false, - "Type": "SchemaChangePolicy", - "UpdateType": "Mutable" + "Id": { + "PrimitiveType": "String" }, - "TablePrefix": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-tableprefix", - "PrimitiveType": "String", + "LatestVersionArn": { + "PrimitiveType": "String" + }, + "Name": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html#cfn-greengrass-devicedefinition-initialversion", "Required": false, - "UpdateType": "Mutable" + "Type": "DeviceDefinitionVersion", + "UpdateType": "Immutable" }, - "Targets": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-targets", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html#cfn-greengrass-devicedefinition-name", + "PrimitiveType": "String", "Required": true, - "Type": "Targets", "UpdateType": "Mutable" } } }, - "AWS::Glue::Database": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html", + "AWS::Greengrass::DeviceDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html", "Properties": { - "CatalogId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-catalogid", + "DeviceDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html#cfn-greengrass-devicedefinitionversion-devicedefinitionid", "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" }, - "DatabaseInput": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-databaseinput", + "Devices": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html#cfn-greengrass-devicedefinitionversion-devices", + "ItemType": "Device", "Required": true, - "Type": "DatabaseInput", - "UpdateType": "Mutable" + "Type": "List", + "UpdateType": "Immutable" } } }, - "AWS::Glue::DevEndpoint": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html", + "AWS::Greengrass::FunctionDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "Id": { + "PrimitiveType": "String" + }, + "LatestVersionArn": { + "PrimitiveType": "String" + }, + "Name": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html", "Properties": { - "EndpointName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-endpointname", - "PrimitiveType": "String", + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html#cfn-greengrass-functiondefinition-initialversion", "Required": false, + "Type": "FunctionDefinitionVersion", "UpdateType": "Immutable" }, - "ExtraJarsS3Path": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrajarss3path", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" - }, - "ExtraPythonLibsS3Path": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrapythonlibss3path", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html#cfn-greengrass-functiondefinition-name", "PrimitiveType": "String", - "Required": false, + "Required": true, "UpdateType": "Mutable" - }, - "NumberOfNodes": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-numberofnodes", - "PrimitiveType": "Integer", + } + } + }, + "AWS::Greengrass::FunctionDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html", + "Properties": { + "DefaultConfig": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-defaultconfig", "Required": false, - "UpdateType": "Mutable" + "Type": "DefaultConfig", + "UpdateType": "Immutable" }, - "PublicKey": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-publickey", + "FunctionDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-functiondefinitionid", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "RoleArn": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-rolearn", - "PrimitiveType": "String", + "Functions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-functions", + "ItemType": "Function", "Required": true, - "UpdateType": "Mutable" + "Type": "List", + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::Group": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" }, - "SecurityGroupIds": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-securitygroupids", - "PrimitiveItemType": "String", + "Id": { + "PrimitiveType": "String" + }, + "LatestVersionArn": { + "PrimitiveType": "String" + }, + "Name": { + "PrimitiveType": "String" + }, + "RoleArn": { + "PrimitiveType": "String" + }, + "RoleAttachedAt": { + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-initialversion", "Required": false, - "Type": "List", + "Type": "GroupVersion", + "UpdateType": "Immutable" + }, + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-name", + "PrimitiveType": "String", + "Required": true, "UpdateType": "Mutable" }, - "SubnetId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-subnetid", + "RoleArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-rolearn", "PrimitiveType": "String", "Required": false, "UpdateType": "Mutable" } } }, - "AWS::Glue::Job": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html", + "AWS::Greengrass::GroupVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html", "Properties": { - "AllocatedCapacity": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-allocatedcapacity", - "PrimitiveType": "Double", + "ConnectorDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-connectordefinitionversionarn", + "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" - }, - "Command": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-command", - "Required": true, - "Type": "JobCommand", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "Connections": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-connections", + "CoreDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-coredefinitionversionarn", + "PrimitiveType": "String", "Required": false, - "Type": "ConnectionsList", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "DefaultArguments": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-defaultarguments", - "PrimitiveType": "Json", + "DeviceDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-devicedefinitionversionarn", + "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-description", + "FunctionDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-functiondefinitionversionarn", "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "ExecutionProperty": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-executionproperty", + "GroupId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-groupid", + "PrimitiveType": "String", + "Required": true, + "UpdateType": "Immutable" + }, + "LoggerDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-loggerdefinitionversionarn", + "PrimitiveType": "String", "Required": false, - "Type": "ExecutionProperty", - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "LogUri": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-loguri", + "ResourceDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-resourcedefinitionversionarn", "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" }, - "MaxRetries": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-maxretries", - "PrimitiveType": "Double", + "SubscriptionDefinitionVersionArn": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-subscriptiondefinitionversionarn", + "PrimitiveType": "String", "Required": false, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + } + } + }, + "AWS::Greengrass::LoggerDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" + }, + "Id": { + "PrimitiveType": "String" + }, + "LatestVersionArn": { + "PrimitiveType": "String" }, "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-name", - "PrimitiveType": "String", + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html#cfn-greengrass-loggerdefinition-initialversion", "Required": false, + "Type": "LoggerDefinitionVersion", "UpdateType": "Immutable" }, - "Role": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-role", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html#cfn-greengrass-loggerdefinition-name", "PrimitiveType": "String", "Required": true, "UpdateType": "Mutable" } } }, - "AWS::Glue::Partition": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html", + "AWS::Greengrass::LoggerDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html", "Properties": { - "CatalogId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-catalogid", - "PrimitiveType": "String", - "Required": true, - "UpdateType": "Immutable" - }, - "DatabaseName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-databasename", + "LoggerDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html#cfn-greengrass-loggerdefinitionversion-loggerdefinitionid", "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" }, - "PartitionInput": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-partitioninput", - "Required": true, - "Type": "PartitionInput", - "UpdateType": "Mutable" - }, - "TableName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-tablename", - "PrimitiveType": "String", + "Loggers": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html#cfn-greengrass-loggerdefinitionversion-loggers", + "ItemType": "Logger", "Required": true, + "Type": "List", "UpdateType": "Immutable" } } }, - "AWS::Glue::Table": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html", + "AWS::Greengrass::ResourceDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html", "Properties": { - "CatalogId": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-catalogid", + "ResourceDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html#cfn-greengrass-resourcedefinitionversion-resourcedefinitionid", "PrimitiveType": "String", "Required": true, "UpdateType": "Immutable" }, - "DatabaseName": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-databasename", - "PrimitiveType": "String", + "Resources": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html#cfn-greengrass-resourcedefinitionversion-resources", + "ItemType": "ResourceInstance", "Required": true, + "Type": "List", "UpdateType": "Immutable" - }, - "TableInput": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-tableinput", - "Required": true, - "Type": "TableInput", - "UpdateType": "Mutable" } } }, - "AWS::Glue::Trigger": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html", - "Properties": { - "Actions": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-actions", - "ItemType": "Action", - "Required": true, - "Type": "List", - "UpdateType": "Mutable" + "AWS::Greengrass::SubscriptionDefinition": { + "Attributes": { + "Arn": { + "PrimitiveType": "String" }, - "Description": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-description", - "PrimitiveType": "String", - "Required": false, - "UpdateType": "Mutable" + "Id": { + "PrimitiveType": "String" + }, + "LatestVersionArn": { + "PrimitiveType": "String" }, "Name": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-name", - "PrimitiveType": "String", + "PrimitiveType": "String" + } + }, + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html", + "Properties": { + "InitialVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html#cfn-greengrass-subscriptiondefinition-initialversion", "Required": false, + "Type": "SubscriptionDefinitionVersion", "UpdateType": "Immutable" }, - "Predicate": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-predicate", - "Required": false, - "Type": "Predicate", - "UpdateType": "Mutable" - }, - "Schedule": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-schedule", + "Name": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html#cfn-greengrass-subscriptiondefinition-name", "PrimitiveType": "String", - "Required": false, + "Required": true, "UpdateType": "Mutable" - }, - "Type": { - "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-type", + } + } + }, + "AWS::Greengrass::SubscriptionDefinitionVersion": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html", + "Properties": { + "SubscriptionDefinitionId": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinitionversion-subscriptiondefinitionid", "PrimitiveType": "String", "Required": true, - "UpdateType": "Mutable" + "UpdateType": "Immutable" + }, + "Subscriptions": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinitionversion-subscriptions", + "ItemType": "Subscription", + "Required": true, + "Type": "List", + "UpdateType": "Immutable" } } }, @@ -34287,6 +35651,12 @@ "Required": true, "UpdateType": "Mutable" }, + "RootAccess": { + "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-rootaccess", + "PrimitiveType": "String", + "Required": false, + "UpdateType": "Immutable" + }, "SecurityGroupIds": { "Documentation": "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-securitygroupids", "PrimitiveItemType": "String", diff --git a/packages/@aws-cdk/cfnspec/spec-source/600_RefKinds_patch.json b/packages/@aws-cdk/cfnspec/spec-source/600_RefKinds_patch.json index 40cd117e6e8c2..fc81dcdd6c852 100644 --- a/packages/@aws-cdk/cfnspec/spec-source/600_RefKinds_patch.json +++ b/packages/@aws-cdk/cfnspec/spec-source/600_RefKinds_patch.json @@ -4427,6 +4427,186 @@ ], "description": "Set RefKind of AWS::RoboMaker::SimulationApplicationVersion to Arn" } + }, + "AWS::Greengrass::ConnectorDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::ConnectorDefinition to Id" + } + }, + "AWS::Greengrass::ConnectorDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::ConnectorDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::CoreDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::CoreDefinition to Id" + } + }, + "AWS::Greengrass::CoreDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::CoreDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::DeviceDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::DeviceDefinition to Id" + } + }, + "AWS::Greengrass::DeviceDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::DeviceDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::FunctionDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::FunctionDefinition to Id" + } + }, + "AWS::Greengrass::FunctionDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::FunctionDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::Group": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::Group to Id" + } + }, + "AWS::Greengrass::GroupVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::GroupVersion to Arn" + } + }, + "AWS::Greengrass::LoggerDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::LoggerDefinition to Id" + } + }, + "AWS::Greengrass::LoggerDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::LoggerDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::ResourceDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::ResourceDefinitionVersion to Arn" + } + }, + "AWS::Greengrass::SubscriptionDefinition": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Id" + } + ], + "description": "Set RefKind of AWS::Greengrass::SubscriptionDefinition to Id" + } + }, + "AWS::Greengrass::SubscriptionDefinitionVersion": { + "patch": { + "operations": [ + { + "op": "add", + "path": "/RefKind", + "value": "Arn" + } + ], + "description": "Set RefKind of AWS::Greengrass::SubscriptionDefinitionVersion to Arn" + } } } } diff --git a/packages/decdk/package.json b/packages/decdk/package.json index 1a233025c090f..61393925d0bda 100644 --- a/packages/decdk/package.json +++ b/packages/decdk/package.json @@ -77,6 +77,7 @@ "@aws-cdk/aws-fsx": "^0.25.3", "@aws-cdk/aws-gamelift": "^0.25.3", "@aws-cdk/aws-glue": "^0.25.3", + "@aws-cdk/aws-greengrass": "^0.25.3", "@aws-cdk/aws-guardduty": "^0.25.3", "@aws-cdk/aws-iam": "^0.25.3", "@aws-cdk/aws-inspector": "^0.25.3", @@ -144,4 +145,4 @@ "engines": { "node": ">= 8.10.0" } -} \ No newline at end of file +} diff --git a/tools/cfn2ts/lib/codegen.ts b/tools/cfn2ts/lib/codegen.ts index 9ac2e9f0e74eb..289e09c2a7bc3 100644 --- a/tools/cfn2ts/lib/codegen.ts +++ b/tools/cfn2ts/lib/codegen.ts @@ -651,7 +651,7 @@ export default class CodeGenerator { private validateRefKindPresence(name: string, resourceType: schema.ResourceType): any { if (!resourceType.RefKind) { // Both empty string and undefined - throw new Error(`Resource ${name} does not have a RefKind; please annotate this new resources in @aws-cdk/cfnspec`); + throw new Error(`Resource ${name} does not have a RefKind; please run in @aws-cdk/cfnspec: npm run set-refkind ${name} Arn|Id|None|...`); } } } From 5aa4fc7d47e8c1cc38ed27264d1367222a121125 Mon Sep 17 00:00:00 2001 From: Elad Ben-Israel Date: Tue, 19 Mar 2019 13:58:21 +0200 Subject: [PATCH 13/16] refactor: name "toCloudFormation" internal (renamed to "_toCloudFormation") (#2047) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The method `toCloudFormation` is not supposed to be directly called by users. Mark it as `@internal` and rename to `_toCloudFormation`. Fixes #2044 Related #2016 BREAKING CHANGE: “toCloudFormation” is now internal and should not be called directly. Instead use “app.synthesizeStack” --- packages/@aws-cdk/assert/lib/expect.ts | 4 +- .../assets-docker/test/test.image-asset.ts | 2 +- packages/@aws-cdk/assets/test/test.asset.ts | 4 +- .../aws-apigateway/test/test.deployment.ts | 2 +- .../aws-apigateway/test/test.restapi.ts | 2 +- .../test/test.step-scaling-policy.ts | 2 +- .../aws-cloudtrail/test/test.cloudtrail.ts | 12 ++--- .../test/server/test.deployment-group.ts | 2 +- .../aws-codepipeline/test/test.pipeline.ts | 2 +- packages/@aws-cdk/aws-iam/test/test.role.ts | 4 +- packages/@aws-cdk/aws-s3/test/test.bucket.ts | 4 +- .../aws-s3/test/test.notifications.ts | 2 +- packages/@aws-cdk/aws-sqs/test/test.sqs.ts | 8 ++-- packages/@aws-cdk/cdk/lib/cfn-condition.ts | 2 +- packages/@aws-cdk/cdk/lib/cfn-element.ts | 8 ++-- packages/@aws-cdk/cdk/lib/cfn-mapping.ts | 2 +- packages/@aws-cdk/cdk/lib/cfn-output.ts | 2 +- packages/@aws-cdk/cdk/lib/cfn-parameter.ts | 2 +- packages/@aws-cdk/cdk/lib/cfn-resource.ts | 2 +- packages/@aws-cdk/cdk/lib/cfn-rule.ts | 2 +- packages/@aws-cdk/cdk/lib/include.ts | 2 +- packages/@aws-cdk/cdk/lib/stack.ts | 10 ++-- packages/@aws-cdk/cdk/test/test.arn.ts | 2 +- packages/@aws-cdk/cdk/test/test.condition.ts | 4 +- packages/@aws-cdk/cdk/test/test.include.ts | 6 +-- packages/@aws-cdk/cdk/test/test.logical-id.ts | 12 ++--- packages/@aws-cdk/cdk/test/test.mappings.ts | 2 +- packages/@aws-cdk/cdk/test/test.output.ts | 6 +-- packages/@aws-cdk/cdk/test/test.parameter.ts | 2 +- packages/@aws-cdk/cdk/test/test.resource.ts | 48 +++++++++---------- packages/@aws-cdk/cdk/test/test.rule.ts | 2 +- packages/@aws-cdk/cdk/test/test.secret.ts | 2 +- packages/@aws-cdk/cdk/test/test.stack.ts | 32 ++++++------- .../@aws-cdk/runtime-values/test/test.rtv.ts | 2 +- packages/aws-cdk/package-lock.json | 48 +++++++++---------- packages/decdk/package.json | 2 +- 36 files changed, 128 insertions(+), 124 deletions(-) diff --git a/packages/@aws-cdk/assert/lib/expect.ts b/packages/@aws-cdk/assert/lib/expect.ts index fa50a36088f47..f1c444a425caa 100644 --- a/packages/@aws-cdk/assert/lib/expect.ts +++ b/packages/@aws-cdk/assert/lib/expect.ts @@ -20,7 +20,7 @@ export function expect(stack: api.SynthesizedStack | cdk.Stack, skipValidation = sstack = { name: stack.name, - template: stack.toCloudFormation(), + template: stack._toCloudFormation(), metadata: collectStackMetadata(stack.node), environment: { name: 'test', @@ -36,7 +36,7 @@ export function expect(stack: api.SynthesizedStack | cdk.Stack, skipValidation = } function isStackClassInstance(x: api.SynthesizedStack | cdk.Stack): x is cdk.Stack { - return 'toCloudFormation' in x; + return '_toCloudFormation' in x; } function collectStackMetadata(root: cdk.ConstructNode): api.StackMetadata { diff --git a/packages/@aws-cdk/assets-docker/test/test.image-asset.ts b/packages/@aws-cdk/assets-docker/test/test.image-asset.ts index 24d249c1151c1..42aacd7a565fc 100644 --- a/packages/@aws-cdk/assets-docker/test/test.image-asset.ts +++ b/packages/@aws-cdk/assets-docker/test/test.image-asset.ts @@ -18,7 +18,7 @@ export = { }); // THEN - const template = stack.toCloudFormation(); + const template = stack._toCloudFormation(); test.deepEqual(template.Parameters.ImageImageName5E684353, { Type: 'String', diff --git a/packages/@aws-cdk/assets/test/test.asset.ts b/packages/@aws-cdk/assets/test/test.asset.ts index f27b07e38d26c..1c28ec9ef4d04 100644 --- a/packages/@aws-cdk/assets/test/test.asset.ts +++ b/packages/@aws-cdk/assets/test/test.asset.ts @@ -30,7 +30,7 @@ export = { }); // verify that now the template contains parameters for this asset - const template = stack.toCloudFormation(); + const template = stack._toCloudFormation(); test.equal(template.Parameters.MyAssetS3Bucket68C9B344.Type, 'String'); test.equal(template.Parameters.MyAssetS3VersionKey68E1A45D.Type, 'String'); @@ -74,7 +74,7 @@ export = { }); // verify that now the template contains parameters for this asset - const template = stack.toCloudFormation(); + const template = stack._toCloudFormation(); test.equal(template.Parameters.MyAssetS3Bucket68C9B344.Type, 'String'); test.equal(template.Parameters.MyAssetS3VersionKey68E1A45D.Type, 'String'); diff --git a/packages/@aws-cdk/aws-apigateway/test/test.deployment.ts b/packages/@aws-cdk/aws-apigateway/test/test.deployment.ts index 2017eb2e70a38..ac8db66cd4d25 100644 --- a/packages/@aws-cdk/aws-apigateway/test/test.deployment.ts +++ b/packages/@aws-cdk/aws-apigateway/test/test.deployment.ts @@ -153,7 +153,7 @@ export = { function synthesize() { stack.node.prepareTree(); - return stack.toCloudFormation(); + return stack._toCloudFormation(); } }, diff --git a/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts b/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts index d3fe96d286b97..740481dc534f8 100644 --- a/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts +++ b/packages/@aws-cdk/aws-apigateway/test/test.restapi.ts @@ -344,7 +344,7 @@ export = { // THEN stack.node.prepareTree(); - test.deepEqual(stack.toCloudFormation().Outputs.MyRestApiRestApiIdB93C5C2D, { + test.deepEqual(stack._toCloudFormation().Outputs.MyRestApiRestApiIdB93C5C2D, { Value: { Ref: 'MyRestApi2D1F47A9' }, Export: { Name: 'MyRestApiRestApiIdB93C5C2D' } }); diff --git a/packages/@aws-cdk/aws-applicationautoscaling/test/test.step-scaling-policy.ts b/packages/@aws-cdk/aws-applicationautoscaling/test/test.step-scaling-policy.ts index a3a8d48f4bae7..71772bcf7e639 100644 --- a/packages/@aws-cdk/aws-applicationautoscaling/test/test.step-scaling-policy.ts +++ b/packages/@aws-cdk/aws-applicationautoscaling/test/test.step-scaling-policy.ts @@ -129,7 +129,7 @@ function setupStepScaling(intervals: appscaling.ScalingInterval[]) { scalingSteps: intervals }); - return new ScalingStackTemplate(stack.toCloudFormation()); + return new ScalingStackTemplate(stack._toCloudFormation()); } class ScalingStackTemplate { diff --git a/packages/@aws-cdk/aws-cloudtrail/test/test.cloudtrail.ts b/packages/@aws-cdk/aws-cloudtrail/test/test.cloudtrail.ts index 1cf7d571ae139..1197811a5f2bf 100644 --- a/packages/@aws-cdk/aws-cloudtrail/test/test.cloudtrail.ts +++ b/packages/@aws-cdk/aws-cloudtrail/test/test.cloudtrail.ts @@ -66,7 +66,7 @@ export = { expect(stack).to(haveResource("AWS::S3::Bucket")); expect(stack).to(haveResource("AWS::S3::BucketPolicy", ExpectedBucketPolicyProperties)); expect(stack).to(not(haveResource("AWS::Logs::LogGroup"))); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.deepEqual(trail.DependsOn, ['MyAmazingCloudTrailS3Policy39C120B0']); test.done(); }, @@ -97,7 +97,7 @@ export = { PolicyName: logsRolePolicyName, Roles: [{ Ref: 'MyAmazingCloudTrailLogsRoleF2CCF977' }], })); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.deepEqual(trail.DependsOn, [logsRolePolicyName, logsRoleName, 'MyAmazingCloudTrailS3Policy39C120B0']); test.done(); }, @@ -116,7 +116,7 @@ export = { expect(stack).to(haveResource("AWS::Logs::LogGroup", { RetentionInDays: 7 })); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.deepEqual(trail.DependsOn, [logsRolePolicyName, logsRoleName, 'MyAmazingCloudTrailS3Policy39C120B0']); test.done(); }, @@ -134,7 +134,7 @@ export = { expect(stack).to(not(haveResource("AWS::Logs::LogGroup"))); expect(stack).to(not(haveResource("AWS::IAM::Role"))); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.equals(trail.Properties.EventSelectors.length, 1); const selector = trail.Properties.EventSelectors[0]; test.equals(selector.ReadWriteType, null, "Expected selector read write type to be undefined"); @@ -160,7 +160,7 @@ export = { expect(stack).to(not(haveResource("AWS::Logs::LogGroup"))); expect(stack).to(not(haveResource("AWS::IAM::Role"))); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.equals(trail.Properties.EventSelectors.length, 1); const selector = trail.Properties.EventSelectors[0]; test.equals(selector.ReadWriteType, "ReadOnly", "Expected selector read write type to be Read"); @@ -179,7 +179,7 @@ export = { new CloudTrail(stack, 'MyAmazingCloudTrail', { managementEvents: ReadWriteType.WriteOnly }); - const trail: any = stack.toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; + const trail: any = stack._toCloudFormation().Resources.MyAmazingCloudTrail54516E8D; test.equals(trail.Properties.EventSelectors.length, 1); const selector = trail.Properties.EventSelectors[0]; test.equals(selector.ReadWriteType, "WriteOnly", "Expected selector read write type to be All"); diff --git a/packages/@aws-cdk/aws-codedeploy/test/server/test.deployment-group.ts b/packages/@aws-cdk/aws-codedeploy/test/server/test.deployment-group.ts index a9631773b57b8..ac79e4efc9f6d 100644 --- a/packages/@aws-cdk/aws-codedeploy/test/server/test.deployment-group.ts +++ b/packages/@aws-cdk/aws-codedeploy/test/server/test.deployment-group.ts @@ -355,7 +355,7 @@ export = { }); test.throws(() => { - stack.toCloudFormation(); + stack._toCloudFormation(); }, /deploymentInAlarm/); test.done(); diff --git a/packages/@aws-cdk/aws-codepipeline/test/test.pipeline.ts b/packages/@aws-cdk/aws-codepipeline/test/test.pipeline.ts index 5dec7efcdddd7..e2a69af8e5f06 100644 --- a/packages/@aws-cdk/aws-codepipeline/test/test.pipeline.ts +++ b/packages/@aws-cdk/aws-codepipeline/test/test.pipeline.ts @@ -45,7 +45,7 @@ export = { ], }); - test.notDeepEqual(stack.toCloudFormation(), {}); + test.notDeepEqual(stack._toCloudFormation(), {}); test.deepEqual([], pipeline.node.validateTree()); test.done(); }, diff --git a/packages/@aws-cdk/aws-iam/test/test.role.ts b/packages/@aws-cdk/aws-iam/test/test.role.ts index 2b8520adc6c52..155d1b1154b79 100644 --- a/packages/@aws-cdk/aws-iam/test/test.role.ts +++ b/packages/@aws-cdk/aws-iam/test/test.role.ts @@ -87,10 +87,10 @@ export = { assumedBy: new ServicePrincipal('sns.amazonaws.com') }); - test.ok(!('MyRoleDefaultPolicyA36BE1DD' in stack.toCloudFormation().Resources), 'initially created without a policy'); + test.ok(!('MyRoleDefaultPolicyA36BE1DD' in stack._toCloudFormation().Resources), 'initially created without a policy'); role.addToPolicy(new PolicyStatement().addResource('myresource').addAction('myaction')); - test.ok(stack.toCloudFormation().Resources.MyRoleDefaultPolicyA36BE1DD, 'policy resource created'); + test.ok(stack._toCloudFormation().Resources.MyRoleDefaultPolicyA36BE1DD, 'policy resource created'); expect(stack).toMatch({ Resources: { MyRoleF48FFE04: diff --git a/packages/@aws-cdk/aws-s3/test/test.bucket.ts b/packages/@aws-cdk/aws-s3/test/test.bucket.ts index df9eb379964cf..cf7ef92a7c8b1 100644 --- a/packages/@aws-cdk/aws-s3/test/test.bucket.ts +++ b/packages/@aws-cdk/aws-s3/test/test.bucket.ts @@ -444,7 +444,7 @@ export = { test.deepEqual(bucket.bucketArn, bucketArn); test.deepEqual(bucket.node.resolve(bucket.bucketName), 'my-bucket'); - test.deepEqual(stack.toCloudFormation(), {}, 'the ref is not a real resource'); + test.deepEqual(stack._toCloudFormation(), {}, 'the ref is not a real resource'); test.done(); }, @@ -925,7 +925,7 @@ export = { bucket.grantWrite(writer); bucket.grantDelete(deleter); - const resources = stack.toCloudFormation().Resources; + const resources = stack._toCloudFormation().Resources; const actions = (id: string) => resources[id].Properties.PolicyDocument.Statement[0].Action; test.deepEqual(actions('WriterDefaultPolicyDC585BCE'), [ 's3:DeleteObject*', 's3:PutObject*', 's3:Abort*' ]); diff --git a/packages/@aws-cdk/aws-s3/test/test.notifications.ts b/packages/@aws-cdk/aws-s3/test/test.notifications.ts index a82c1359fe0d5..8009213fbf00e 100644 --- a/packages/@aws-cdk/aws-s3/test/test.notifications.ts +++ b/packages/@aws-cdk/aws-s3/test/test.notifications.ts @@ -307,7 +307,7 @@ export = { bucket.onObjectCreated(dest); stack.node.prepareTree(); - test.deepEqual(stack.toCloudFormation().Resources.BucketNotifications8F2E257D, { + test.deepEqual(stack._toCloudFormation().Resources.BucketNotifications8F2E257D, { Type: 'Custom::S3BucketNotifications', Properties: { ServiceToken: { 'Fn::GetAtt': [ 'BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691', 'Arn' ] }, diff --git a/packages/@aws-cdk/aws-sqs/test/test.sqs.ts b/packages/@aws-cdk/aws-sqs/test/test.sqs.ts index 048d0c92177b1..44d327797da37 100644 --- a/packages/@aws-cdk/aws-sqs/test/test.sqs.ts +++ b/packages/@aws-cdk/aws-sqs/test/test.sqs.ts @@ -107,7 +107,7 @@ export = { test.deepEqual(stack.node.resolve(imports.queueUrl), { 'Fn::ImportValue': 'QueueQueueUrlC30FF916' }); // the exporting stack has Outputs for QueueARN and QueueURL - const outputs = stack.toCloudFormation().Outputs; + const outputs = stack._toCloudFormation().Outputs; test.deepEqual(outputs.QueueQueueArn8CF496D5, { Value: { 'Fn::GetAtt': [ 'Queue4A7E3555', 'Arn' ] }, Export: { Name: 'QueueQueueArn8CF496D5' } }); test.deepEqual(outputs.QueueQueueUrlC30FF916, { Value: { Ref: 'Queue4A7E3555' }, Export: { Name: 'QueueQueueUrlC30FF916' } }); @@ -252,7 +252,7 @@ export = { keyArn: { 'Fn::ImportValue': 'QueueWithCustomKeyKeyArn537F6E42' } }); - test.deepEqual(stack.toCloudFormation().Outputs, { + test.deepEqual(stack._toCloudFormation().Outputs, { "QueueWithCustomKeyQueueArnD326BB9B": { "Value": { "Fn::GetAtt": [ @@ -300,7 +300,7 @@ export = { keyArn: { 'Fn::ImportValue': 'QueueWithManagedKeyKeyArn9C42A85D' } }); - test.deepEqual(stack.toCloudFormation().Outputs, { + test.deepEqual(stack._toCloudFormation().Outputs, { "QueueWithManagedKeyQueueArn8798A14E": { "Value": { "Fn::GetAtt": [ @@ -406,7 +406,7 @@ export = { // make sure the queue policy is added as a dependency to the bucket // notifications resource so it will be created first. - test.deepEqual(stack.toCloudFormation().Resources.BucketNotifications8F2E257D.DependsOn, [ 'QueuePolicy25439813' ]); + test.deepEqual(stack._toCloudFormation().Resources.BucketNotifications8F2E257D.DependsOn, [ 'QueuePolicy25439813' ]); test.done(); }, diff --git a/packages/@aws-cdk/cdk/lib/cfn-condition.ts b/packages/@aws-cdk/cdk/lib/cfn-condition.ts index 4cd6549f7295c..1f28cc15047df 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-condition.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-condition.ts @@ -25,7 +25,7 @@ export class CfnCondition extends CfnRefElement implements ICfnConditionExpressi this.expression = props && props.expression; } - public toCloudFormation(): object { + public _toCloudFormation(): object { if (!this.expression) { return { }; } diff --git a/packages/@aws-cdk/cdk/lib/cfn-element.ts b/packages/@aws-cdk/cdk/lib/cfn-element.ts index 89aba929fbe2a..ffd546b0f98cb 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-element.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-element.ts @@ -17,7 +17,7 @@ export abstract class CfnElement extends Construct { * @returns The construct as a stack element or undefined if it is not a stack element. */ public static isCfnElement(construct: IConstruct): construct is CfnElement { - return ('logicalId' in construct && 'toCloudFormation' in construct); + return ('logicalId' in construct && '_toCloudFormation' in construct); } /** @@ -100,8 +100,10 @@ export abstract class CfnElement extends Construct { * } * } * } + * + * @internal */ - public abstract toCloudFormation(): object; + public abstract _toCloudFormation(): object; /** * Automatically detect references in this CfnElement @@ -117,7 +119,7 @@ export abstract class CfnElement extends Construct { // This does make the assumption that the error will not be rectified, // but the error will be thrown later on anyway. If the error doesn't // get thrown down the line, we may miss references. - this.node.recordReference(...findTokens(this, () => this.toCloudFormation())); + this.node.recordReference(...findTokens(this, () => this._toCloudFormation())); } catch (e) { if (e.type !== 'CfnSynthesisError') { throw e; } } diff --git a/packages/@aws-cdk/cdk/lib/cfn-mapping.ts b/packages/@aws-cdk/cdk/lib/cfn-mapping.ts index 3897f255582d3..2444dff11ba5d 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-mapping.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-mapping.ts @@ -43,7 +43,7 @@ export class CfnMapping extends CfnRefElement { return Fn.findInMap(this.logicalId, key1, key2); } - public toCloudFormation(): object { + public _toCloudFormation(): object { return { Mappings: { [this.logicalId]: this.mapping diff --git a/packages/@aws-cdk/cdk/lib/cfn-output.ts b/packages/@aws-cdk/cdk/lib/cfn-output.ts index 4432ca7874b92..519c03980b297 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-output.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-output.ts @@ -111,7 +111,7 @@ export class CfnOutput extends CfnElement { return fn().importValue(this.obtainExportName()); } - public toCloudFormation(): object { + public _toCloudFormation(): object { return { Outputs: { [this.logicalId]: { diff --git a/packages/@aws-cdk/cdk/lib/cfn-parameter.ts b/packages/@aws-cdk/cdk/lib/cfn-parameter.ts index f04bca2300039..c5006a6a8d35f 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-parameter.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-parameter.ts @@ -104,7 +104,7 @@ export class CfnParameter extends CfnRefElement { this.stringListValue = this.value.toList(); } - public toCloudFormation(): object { + public _toCloudFormation(): object { return { Parameters: { [this.logicalId]: { diff --git a/packages/@aws-cdk/cdk/lib/cfn-resource.ts b/packages/@aws-cdk/cdk/lib/cfn-resource.ts index 68777d8de806d..74bc60dce7159 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-resource.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-resource.ts @@ -206,7 +206,7 @@ export class CfnResource extends CfnRefElement { /** * Emits CloudFormation for this resource. */ - public toCloudFormation(): object { + public _toCloudFormation(): object { try { // merge property overrides onto properties and then render (and validate). const tags = CfnResource.isTaggable(this) ? this.tags.renderTags() : undefined; diff --git a/packages/@aws-cdk/cdk/lib/cfn-rule.ts b/packages/@aws-cdk/cdk/lib/cfn-rule.ts index c51a40f6617fa..207e43a5b5a1f 100644 --- a/packages/@aws-cdk/cdk/lib/cfn-rule.ts +++ b/packages/@aws-cdk/cdk/lib/cfn-rule.ts @@ -92,7 +92,7 @@ export class CfnRule extends CfnRefElement { }); } - public toCloudFormation(): object { + public _toCloudFormation(): object { return { Rules: { [this.logicalId]: { diff --git a/packages/@aws-cdk/cdk/lib/include.ts b/packages/@aws-cdk/cdk/lib/include.ts index 1ae1fbe030c0f..a6d9831568be6 100644 --- a/packages/@aws-cdk/cdk/lib/include.ts +++ b/packages/@aws-cdk/cdk/lib/include.ts @@ -31,7 +31,7 @@ export class Include extends CfnElement { this.template = props.template; } - public toCloudFormation() { + public _toCloudFormation() { return this.template; } } diff --git a/packages/@aws-cdk/cdk/lib/stack.ts b/packages/@aws-cdk/cdk/lib/stack.ts index 25452e6e1d991..0b9d4e1509c62 100644 --- a/packages/@aws-cdk/cdk/lib/stack.ts +++ b/packages/@aws-cdk/cdk/lib/stack.ts @@ -143,9 +143,11 @@ export class Stack extends Construct { /** * Returns the CloudFormation template for this stack by traversing - * the tree and invoking toCloudFormation() on all Entity objects. + * the tree and invoking _toCloudFormation() on all Entity objects. + * + * @internal */ - public toCloudFormation() { + public _toCloudFormation() { // before we begin synthesis, we shall lock this stack, so children cannot be added this.node.lock(); @@ -158,7 +160,7 @@ export class Stack extends Construct { }; const elements = cfnElements(this); - const fragments = elements.map(e => this.node.resolve(e.toCloudFormation())); + const fragments = elements.map(e => this.node.resolve(e._toCloudFormation())); // merge in all CloudFormation fragments collected from the tree for (const fragment of fragments) { @@ -446,7 +448,7 @@ export class Stack extends Construct { const template = `${this.node.id}.template.json`; // write the CloudFormation template as a JSON file - session.store.writeJson(template, this.toCloudFormation()); + session.store.writeJson(template, this._toCloudFormation()); const artifact: cxapi.Artifact = { type: cxapi.ArtifactType.AwsCloudFormationStack, diff --git a/packages/@aws-cdk/cdk/test/test.arn.ts b/packages/@aws-cdk/cdk/test/test.arn.ts index 8d4d02ef12c22..ef1041a2b0997 100644 --- a/packages/@aws-cdk/cdk/test/test.arn.ts +++ b/packages/@aws-cdk/cdk/test/test.arn.ts @@ -219,7 +219,7 @@ export = { new CfnOutput(stack2, 'SomeValue', { value: arn }); // THEN - test.deepEqual(stack2.node.resolve(stack2.toCloudFormation()), { + test.deepEqual(stack2.node.resolve(stack2._toCloudFormation()), { Outputs: { SomeValue: { Value: { diff --git a/packages/@aws-cdk/cdk/test/test.condition.ts b/packages/@aws-cdk/cdk/test/test.condition.ts index 546d2d80d93a0..86a6517d8e73b 100644 --- a/packages/@aws-cdk/cdk/test/test.condition.ts +++ b/packages/@aws-cdk/cdk/test/test.condition.ts @@ -16,7 +16,7 @@ export = { }); // THEN - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Parameters: { Param1: { Type: 'String' } }, Conditions: { Condition1: { 'Fn::Equals': [ 'a', 'b' ] }, @@ -45,7 +45,7 @@ export = { // THEN test.ok(cdk.unresolved(propValue)); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Foo::Bar', diff --git a/packages/@aws-cdk/cdk/test/test.include.ts b/packages/@aws-cdk/cdk/test/test.include.ts index 6e80bc19abb97..d8761503c4f22 100644 --- a/packages/@aws-cdk/cdk/test/test.include.ts +++ b/packages/@aws-cdk/cdk/test/test.include.ts @@ -7,7 +7,7 @@ export = { new Include(stack, 'T1', { template: clone(template) }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Parameters: { MyParam: { Type: 'String', Default: 'Hello' } }, Resources: { MyResource1: { Type: 'ResourceType1', Properties: { P1: 1, P2: 2 } }, @@ -24,7 +24,7 @@ export = { new CfnOutput(stack, 'MyOutput', { description: 'Out!', disableExport: true }); new CfnParameter(stack, 'MyParam2', { type: 'Integer' }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Parameters: { MyParam: { Type: 'String', Default: 'Hello' }, MyParam2: { Type: 'Integer' } }, @@ -46,7 +46,7 @@ export = { new CfnOutput(stack, 'MyOutput', { description: 'Out!' }); new CfnParameter(stack, 'MyParam', { type: 'Integer' }); // duplicate! - test.throws(() => stack.toCloudFormation()); + test.throws(() => stack._toCloudFormation()); test.done(); }, }; diff --git a/packages/@aws-cdk/cdk/test/test.logical-id.ts b/packages/@aws-cdk/cdk/test/test.logical-id.ts index c237670430dba..a2037722587e3 100644 --- a/packages/@aws-cdk/cdk/test/test.logical-id.ts +++ b/packages/@aws-cdk/cdk/test/test.logical-id.ts @@ -44,7 +44,7 @@ const uniqueTests = { new CfnResource(parent, 'ThingResource', { type: 'AWS::TAAS::Thing' }); // THEN - const template = stack.toCloudFormation(); + const template = stack._toCloudFormation(); test.ok('Renamed' in template.Resources); test.done(); @@ -60,7 +60,7 @@ const uniqueTests = { // THEN test.throws(() => { - stack.toCloudFormation(); + stack._toCloudFormation(); }); test.done(); @@ -95,7 +95,7 @@ const uniqueTests = { new CfnResource(child2, 'HeyThere', { type: 'AWS::TAAS::Thing' }); // THEN - const template = stack.toCloudFormation(); + const template = stack._toCloudFormation(); test.deepEqual(template, { Resources: { ParentChildHeyThere35220347: { @@ -112,7 +112,7 @@ const uniqueTests = { const stack1 = new Stack(); const parent1 = new Construct(stack1, 'Parent'); new CfnResource(parent1, 'HeyThere', { type: 'AWS::TAAS::Thing' }); - const template1 = stack1.toCloudFormation(); + const template1 = stack1._toCloudFormation(); // AND const theId1 = Object.keys(template1.Resources)[0]; @@ -123,7 +123,7 @@ const uniqueTests = { const parent2 = new Construct(stack2, 'Parent'); const invisibleWrapper = new Construct(parent2, 'Default'); new CfnResource(invisibleWrapper, 'HeyThere', { type: 'AWS::TAAS::Thing' }); - const template2 = stack1.toCloudFormation(); + const template2 = stack1._toCloudFormation(); const theId2 = Object.keys(template2.Resources)[0]; test.equal('AWS::TAAS::Thing', template2.Resources[theId2].Type); @@ -211,7 +211,7 @@ const allSchemesTests: {[name: string]: (scheme: IAddressingScheme, test: Test) // THEN stack.node.prepareTree(); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { NewName: { Type: 'R1' }, diff --git a/packages/@aws-cdk/cdk/test/test.mappings.ts b/packages/@aws-cdk/cdk/test/test.mappings.ts index 9c619b03240d2..82cae2a2ab406 100644 --- a/packages/@aws-cdk/cdk/test/test.mappings.ts +++ b/packages/@aws-cdk/cdk/test/test.mappings.ts @@ -28,7 +28,7 @@ export = { mapping.setValue('TopLevelKey2', 'SecondLevelKey2', 'Hi'); mapping.setValue('TopLevelKey1', 'SecondLevelKey1', [ 1, 2, 3, 4 ]); - test.deepEqual(stack.toCloudFormation(), { Mappings: + test.deepEqual(stack._toCloudFormation(), { Mappings: { MyMapping: { TopLevelKey1: { SecondLevelKey1: [ 1, 2, 3, 4 ], diff --git a/packages/@aws-cdk/cdk/test/test.output.ts b/packages/@aws-cdk/cdk/test/test.output.ts index b0b0549777e65..278f544a30865 100644 --- a/packages/@aws-cdk/cdk/test/test.output.ts +++ b/packages/@aws-cdk/cdk/test/test.output.ts @@ -12,7 +12,7 @@ export = { value: ref, description: 'CfnOutput properties' }); - test.deepEqual(stack.toCloudFormation(), { Resources: { MyResource: { Type: 'R' } }, + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'R' } }, Outputs: { MyOutput: { Description: 'CfnOutput properties', @@ -55,7 +55,7 @@ export = { const output = new CfnOutput(stack, 'MyOutput'); test.deepEqual(stack.node.resolve(output.makeImportValue()), { 'Fn::ImportValue': 'MyStack:MyOutput' }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Outputs: { MyOutput: { Export: { Name: 'MyStack:MyOutput' } @@ -73,7 +73,7 @@ export = { new CfnOutput(stack, 'SomeOutput', { value: 'x' }); // THEN - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Outputs: { SomeOutput: { Value: 'x' diff --git a/packages/@aws-cdk/cdk/test/test.parameter.ts b/packages/@aws-cdk/cdk/test/test.parameter.ts index a9773291f2862..c8e783a59e8dd 100644 --- a/packages/@aws-cdk/cdk/test/test.parameter.ts +++ b/packages/@aws-cdk/cdk/test/test.parameter.ts @@ -14,7 +14,7 @@ export = { new CfnResource(stack, 'Resource', { type: 'Type', properties: { ReferenceToParam: param.ref } }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Parameters: { ChildMyParam3161BF5D: { Default: 10, diff --git a/packages/@aws-cdk/cdk/test/test.resource.ts b/packages/@aws-cdk/cdk/test/test.resource.ts index 5ee4f6f92872f..0e78f0296d97c 100644 --- a/packages/@aws-cdk/cdk/test/test.resource.ts +++ b/packages/@aws-cdk/cdk/test/test.resource.ts @@ -15,7 +15,7 @@ export = { } }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: "MyResourceType", @@ -56,7 +56,7 @@ export = { res.increment(); res.increment(2); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'My::Counter', Properties: { Count: 13 } } } @@ -78,7 +78,7 @@ export = { } }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'My::Counter', Properties: { Count: 10 } }, YourResource: { @@ -105,7 +105,7 @@ export = { } }); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: "My::Counter", Properties: { Count: 1 } }, MyResource2: { @@ -131,7 +131,7 @@ export = { r2.node.addDependency(r3); stack.node.prepareTree(); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Counter1: { Type: "My::Counter", @@ -166,7 +166,7 @@ export = { dependent.addDependsOn(r1); // THEN - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Counter1: { Type: "My::Counter", @@ -191,7 +191,7 @@ export = { const cond = new CfnCondition(stack, 'MyCondition', { expression: Fn.conditionNot(Fn.conditionEquals('a', 'b')) }); r1.options.condition = cond; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Resource: { Type: 'Type', Condition: 'MyCondition' } }, Conditions: { MyCondition: { 'Fn::Not': [ { 'Fn::Equals': [ 'a', 'b' ] } ] } } }); @@ -217,7 +217,7 @@ export = { r1.options.deletionPolicy = DeletionPolicy.Retain; r1.options.updateReplacePolicy = DeletionPolicy.Snapshot; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Resource: { Type: 'Type', @@ -246,7 +246,7 @@ export = { r1.options.updatePolicy = { useOnlineResharding: true }; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Resource: { Type: 'Type', @@ -269,7 +269,7 @@ export = { MyValue: 99 }; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Resources: { Resource: { Type: "Type", @@ -301,7 +301,7 @@ export = { applyRemovalPolicy(forbid, RemovalPolicy.Forbid); applyRemovalPolicy(destroy, RemovalPolicy.Destroy); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { Orphan: { Type: 'T1', DeletionPolicy: 'Retain' }, Forbid: { Type: 'T2', DeletionPolicy: 'Retain' }, Destroy: { Type: 'T3' } } }); @@ -352,7 +352,7 @@ export = { dependingResource.node.addDependency(c3); stack.node.prepareTree(); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyC1R1FB2A562F: { Type: 'T1' }, MyC1R2AE2B5066: { Type: 'T2' }, MyC2R3809EEAD6: { Type: 'T3' }, @@ -387,7 +387,7 @@ export = { r.addOverride('Use.Dot.Notation', 'To create subtrees'); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'YouCanEvenOverrideTheType', Use: { Dot: { Notation: 'To create subtrees' } }, @@ -416,7 +416,7 @@ export = { r.addOverride('Properties.Hello.World.Value2', null); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: { Hello: { World: { Value1: 'Hello', Value2: null } } } } } }); @@ -444,7 +444,7 @@ export = { r.addOverride('Properties.Hello.World.Value2', undefined); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: { Hello: { World: { Value1: 'Hello' } } } } } }); @@ -463,7 +463,7 @@ export = { r.addPropertyOverride('Tree.Does.Not.Exist', undefined); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: { Tree: { Exists: 42 } } } } }); @@ -493,7 +493,7 @@ export = { r.addPropertyDeletionOverride('Hello.World.Value3'); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: { Hello: { World: { Value1: 'Hello' } } } } } }); @@ -519,7 +519,7 @@ export = { r.addOverride('Properties.Hello.World.Foo.Bar', 42); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: @@ -542,7 +542,7 @@ export = { r.addPropertyOverride('Hello.World', { Hey: 'Jude' }); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'AWS::Resource::Type', Properties: { Hello: { World: { Hey: 'Jude' } } } } } }); @@ -560,7 +560,7 @@ export = { r.setProperty('prop2', 'bar'); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'MyResourceType', Properties: { PROP1: 'foo', PROP2: 'bar' } } } }); @@ -574,7 +574,7 @@ export = { r.setProperty('prop3', 'zoo'); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'MyResourceType', Properties: { PROP3: 'zoo' } } } }); @@ -589,7 +589,7 @@ export = { r.setProperty('prop3', 'zoo'); r.setProperty('prop2', 'hey'); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'MyResourceType', Properties: { PROP2: 'hey', PROP3: 'zoo' } } } }); @@ -608,7 +608,7 @@ export = { type: 'MyResourceType', }); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { ParentMyResource4B1FDBCC: { Type: 'MyResourceType', Metadata: { [cxapi.PATH_METADATA_KEY]: 'Parent/MyResource' } } } }); @@ -629,7 +629,7 @@ export = { // THEN app.node.prepareTree(); - test.deepEqual(stackB.toCloudFormation(), { + test.deepEqual(stackB._toCloudFormation(), { Resources: { Resource: { Type: 'R' diff --git a/packages/@aws-cdk/cdk/test/test.rule.ts b/packages/@aws-cdk/cdk/test/test.rule.ts index 93fd6dc0b06ac..f400cad1b9bd0 100644 --- a/packages/@aws-cdk/cdk/test/test.rule.ts +++ b/packages/@aws-cdk/cdk/test/test.rule.ts @@ -9,7 +9,7 @@ export = { rule.addAssertion(Fn.conditionEquals('lhs', 'rhs'), 'lhs equals rhs'); rule.addAssertion(Fn.conditionNot(Fn.conditionAnd(Fn.conditionContains([ 'hello', 'world' ], "world"))), 'some assertion'); - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Rules: { MyRule: { Assertions: [ diff --git a/packages/@aws-cdk/cdk/test/test.secret.ts b/packages/@aws-cdk/cdk/test/test.secret.ts index 6a4eb23ae3fff..f240df0413c60 100644 --- a/packages/@aws-cdk/cdk/test/test.secret.ts +++ b/packages/@aws-cdk/cdk/test/test.secret.ts @@ -27,7 +27,7 @@ export = { allowedValues: [ 'allowed', 'values' ], }); - test.deepEqual(stack.toCloudFormation(), { Parameters: + test.deepEqual(stack._toCloudFormation(), { Parameters: { MySecretParameterBB81DE58: { Type: 'AWS::SSM::Parameter::Value', Default: '/my/secret/param', diff --git a/packages/@aws-cdk/cdk/test/test.stack.ts b/packages/@aws-cdk/cdk/test/test.stack.ts index ee507750abb7c..74683f1f87ba3 100644 --- a/packages/@aws-cdk/cdk/test/test.stack.ts +++ b/packages/@aws-cdk/cdk/test/test.stack.ts @@ -5,7 +5,7 @@ import { App, CfnCondition, CfnOutput, CfnParameter, CfnResource, Construct, Inc export = { 'a stack can be serialized into a CloudFormation template, initially it\'s empty'(test: Test) { const stack = new Stack(); - test.deepEqual(stack.toCloudFormation(), { }); + test.deepEqual(stack._toCloudFormation(), { }); test.done(); }, @@ -14,7 +14,7 @@ export = { stack.templateOptions.templateFormatVersion = 'MyTemplateVersion'; stack.templateOptions.description = 'This is my description'; stack.templateOptions.transform = 'SAMy'; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Description: 'This is my description', AWSTemplateFormatVersion: 'MyTemplateVersion', Transform: 'SAMy' @@ -34,7 +34,7 @@ export = { const stack = new Stack(undefined, 'MyStack'); new CfnResource(stack, 'MyResource', { type: 'MyResourceType' }); - test.deepEqual(stack.toCloudFormation(), { Resources: { MyResource: { Type: 'MyResourceType' } } }); + test.deepEqual(stack._toCloudFormation(), { Resources: { MyResource: { Type: 'MyResourceType' } } }); test.done(); }, @@ -48,7 +48,7 @@ export = { MetadataKey: 'MetadataValue' }; - test.deepEqual(stack.toCloudFormation(), { + test.deepEqual(stack._toCloudFormation(), { Description: 'StackDescription', Transform: 'Transform', AWSTemplateFormatVersion: 'TemplateVersion', @@ -62,7 +62,7 @@ export = { // workaround for people running into issues caused by SDK-3003. // We should come up with a proper solution that involved jsii callbacks (when they exist) // so this can be implemented by jsii languages as well. - 'Overriding `Stack.toCloudFormation` allows arbitrary post-processing of the generated template during synthesis'(test: Test) { + 'Overriding `Stack._toCloudFormation` allows arbitrary post-processing of the generated template during synthesis'(test: Test) { const stack = new StackWithPostProcessor(); @@ -77,7 +77,7 @@ export = { } }); - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { myResource: { Type: 'AWS::MyResource', Properties: @@ -146,7 +146,7 @@ export = { new Include(stack, 'Include', { template }); - const output = stack.toCloudFormation(); + const output = stack._toCloudFormation(); test.equal(typeof output.Description, 'string'); test.done(); @@ -167,7 +167,7 @@ export = { // this happens as part of app.run(). app.node.prepareTree(); - test.deepEqual(stack1.toCloudFormation(), { + test.deepEqual(stack1._toCloudFormation(), { Outputs: { ExportsOutputRefAWSAccountIdAD568057: { Value: { Ref: 'AWS::AccountId' }, @@ -176,7 +176,7 @@ export = { } }); - test.deepEqual(stack2.toCloudFormation(), { + test.deepEqual(stack2._toCloudFormation(), { Parameters: { SomeParameter: { Type: 'String', @@ -201,7 +201,7 @@ export = { app.node.prepareTree(); // THEN - test.deepEqual(stack1.toCloudFormation(), { + test.deepEqual(stack1._toCloudFormation(), { Outputs: { ExportsOutputRefAWSAccountIdAD568057: { Value: { Ref: 'AWS::AccountId' }, @@ -210,7 +210,7 @@ export = { } }); - test.deepEqual(stack2.toCloudFormation(), { + test.deepEqual(stack2._toCloudFormation(), { Parameters: { SomeParameter: { Type: 'String', @@ -236,7 +236,7 @@ export = { // this happens as part of app.run(). app.node.prepareTree(); - test.deepEqual(stack2.toCloudFormation(), { + test.deepEqual(stack2._toCloudFormation(), { Outputs: { DemOutput: { Value: { Ref: 'AWS::Region' }, @@ -260,7 +260,7 @@ export = { app.node.prepareTree(); // THEN - test.deepEqual(stack2.toCloudFormation(), { + test.deepEqual(stack2._toCloudFormation(), { Parameters: { SomeParameter: { Type: 'String', @@ -364,7 +364,7 @@ export = { bonjour.overrideLogicalId('BOOM'); // THEN - test.deepEqual(stack.toCloudFormation(), { Resources: + test.deepEqual(stack._toCloudFormation(), { Resources: { BOOM: { Type: 'Resource::Type' }, RefToBonjour: { Type: 'Other::Resource', @@ -379,8 +379,8 @@ class StackWithPostProcessor extends Stack { // ... - public toCloudFormation() { - const template = super.toCloudFormation(); + public _toCloudFormation() { + const template = super._toCloudFormation(); // manipulate template (e.g. rename "Key" to "key") template.Resources.myResource.Properties.Environment.key = diff --git a/packages/@aws-cdk/runtime-values/test/test.rtv.ts b/packages/@aws-cdk/runtime-values/test/test.rtv.ts index e05f9feea1dca..ce965f9bf7436 100644 --- a/packages/@aws-cdk/runtime-values/test/test.rtv.ts +++ b/packages/@aws-cdk/runtime-values/test/test.rtv.ts @@ -13,7 +13,7 @@ export = { new RuntimeValueTest(stack, 'RuntimeValue'); - console.log(JSON.stringify(stack.toCloudFormation(), undefined, 2)); + console.log(JSON.stringify(stack._toCloudFormation(), undefined, 2)); test.done(); } }; diff --git a/packages/aws-cdk/package-lock.json b/packages/aws-cdk/package-lock.json index 5afca94ce20d0..e9500355caadb 100644 --- a/packages/aws-cdk/package-lock.json +++ b/packages/aws-cdk/package-lock.json @@ -98,7 +98,7 @@ }, "@types/mockery": { "version": "1.4.29", - "resolved": "http://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.29.tgz", "integrity": "sha1-m6It838H43gP/4Ux0aOOYz+UV6U=", "dev": true }, @@ -329,7 +329,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -405,7 +405,7 @@ }, "cli-color": { "version": "0.1.7", - "resolved": "http://registry.npmjs.org/cli-color/-/cli-color-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.1.7.tgz", "integrity": "sha1-rcMgD6RxzCEbDaf1ZrcemLnWc0c=", "requires": { "es5-ext": "0.8.x" @@ -436,7 +436,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -446,7 +446,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -654,7 +654,7 @@ }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { "es6-promise": "^4.0.3" @@ -689,7 +689,7 @@ }, "events": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "execa": { @@ -795,7 +795,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -806,7 +806,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "xregexp": { @@ -823,7 +823,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-uri": { @@ -917,7 +917,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -1013,7 +1013,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { "builtin-modules": "^1.0.0" @@ -1061,7 +1061,7 @@ }, "json-diff": { "version": "0.3.1", - "resolved": "http://registry.npmjs.org/json-diff/-/json-diff-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.3.1.tgz", "integrity": "sha1-bbw64tJeB1p/1xvNmHRFhmb7aBs=", "requires": { "cli-color": "~0.1.6", @@ -1136,7 +1136,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { "graceful-fs": "^4.1.2", @@ -1386,7 +1386,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { @@ -1426,7 +1426,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "prelude-ls": { @@ -1532,7 +1532,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1598,7 +1598,7 @@ }, "sax": { "version": "1.2.1", - "resolved": "http://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "semver": { @@ -1756,7 +1756,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -1777,7 +1777,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "supports-color": { @@ -1950,7 +1950,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -1972,7 +1972,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -1982,7 +1982,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -2006,7 +2006,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xregexp": { diff --git a/packages/decdk/package.json b/packages/decdk/package.json index 61393925d0bda..1da954cd7f51b 100644 --- a/packages/decdk/package.json +++ b/packages/decdk/package.json @@ -145,4 +145,4 @@ "engines": { "node": ">= 8.10.0" } -} +} \ No newline at end of file From c795ca26cdaf643534ca5a465c21f290b2cb3ab1 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Tue, 19 Mar 2019 14:16:36 +0100 Subject: [PATCH 14/16] chore: update `desiredCapacity` in README (#2051) Update `instanceCount` => `desiredCapacity` in ECS README. Fixes #1926. --- packages/@aws-cdk/aws-ecs/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/@aws-cdk/aws-ecs/README.md b/packages/@aws-cdk/aws-ecs/README.md index 81ada6f31abb1..6539c47812830 100644 --- a/packages/@aws-cdk/aws-ecs/README.md +++ b/packages/@aws-cdk/aws-ecs/README.md @@ -23,7 +23,7 @@ const cluster = new ecs.Cluster(this, 'Cluster', { // Add capacity to it cluster.addDefaultAutoScalingGroupCapacity('Capacity', { instanceType: new ec2.InstanceType("t2.xlarge"), - instanceCount: 3, + desiredCapacity: 3, }); // Instantiate Amazon ECS Service with an automatic load balancer @@ -91,7 +91,7 @@ const cluster = new ecs.Cluster(this, 'Cluster', { // Either add default capacity cluster.addDefaultAutoScalingGroupCapacity({ instanceType: new ec2.InstanceType("t2.xlarge"), - instanceCount: 3, + desiredCapacity: 3, }); // Or add customized capacity. Be sure to start the Amazon ECS-optimized AMI. @@ -266,7 +266,7 @@ const autoScalingGroup = cluster.addDefaultAutoScalingGroupCapacity({ instanceType: new ec2.InstanceType("t2.xlarge"), minCapacity: 3, maxCapacity: 30 - instanceCount: 3, + desiredCapacity: 3, // Give instances 5 minutes to drain running tasks when an instance is // terminated. This is the default, turn this off by specifying 0 or @@ -294,4 +294,3 @@ To start an Amazon ECS task on an Amazon EC2-backed Cluster, instantiate an ## Roadmap - [ ] Service Discovery Integration -- [ ] Private registry authentication From 7c2a20f1db004e211d2c6eef09a7157b6ff9c118 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Tue, 19 Mar 2019 14:50:08 +0100 Subject: [PATCH 15/16] Format doc comment --- packages/@aws-cdk/assets-docker/lib/image-asset.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/@aws-cdk/assets-docker/lib/image-asset.ts b/packages/@aws-cdk/assets-docker/lib/image-asset.ts index a46300d0294e7..2bc8cc1850876 100644 --- a/packages/@aws-cdk/assets-docker/lib/image-asset.ts +++ b/packages/@aws-cdk/assets-docker/lib/image-asset.ts @@ -12,11 +12,11 @@ export interface DockerImageAssetProps { directory: string; /** - * ECR repository name, if omitted a default name based on the asset's - * ID is used instead. Specify this property if you need to statically - * address the image, e.g. from a Kubernetes Pod. - * Note, this is only the repository name, without the registry and - * the tag parts. + * ECR repository name + * + * Specify this property if you need to statically address the image, e.g. + * from a Kubernetes Pod. Note, this is only the repository name, without the + * registry and the tag parts. * * @default automatically derived from the asset's ID. */ From b9cc7504c713b28842a8a3267ec3105026c1405e Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Tue, 19 Mar 2019 14:58:26 +0100 Subject: [PATCH 16/16] Add unit test --- packages/aws-cdk/test/test.docker.ts | 54 ++++++++++++++++++++++++++ packages/aws-cdk/test/util/mock-sdk.ts | 7 ++++ 2 files changed, 61 insertions(+) create mode 100644 packages/aws-cdk/test/test.docker.ts diff --git a/packages/aws-cdk/test/test.docker.ts b/packages/aws-cdk/test/test.docker.ts new file mode 100644 index 0000000000000..efda5f52d728e --- /dev/null +++ b/packages/aws-cdk/test/test.docker.ts @@ -0,0 +1,54 @@ +import cxapi = require('@aws-cdk/cx-api'); +import { Test } from 'nodeunit'; +import { ToolkitInfo } from '../lib'; +import { prepareContainerAsset } from '../lib/docker'; +import { MockSDK } from './util/mock-sdk'; + +export = { + async 'creates repository with given name'(test: Test) { + // GIVEN + + let createdName; + + const sdk = new MockSDK(); + sdk.stubEcr({ + describeRepositories() { + return { repositories: [] }; + }, + + createRepository(req) { + createdName = req.repositoryName; + + // Stop the test so that we don't actually docker build + throw new Error('STOPTEST'); + }, + }); + + const toolkit = new ToolkitInfo({ + sdk, + bucketName: 'BUCKET_NAME', + bucketEndpoint: 'BUCKET_ENDPOINT', + environment: { name: 'env', account: '1234', region: 'abc' } + }); + + // WHEN + const asset: cxapi.ContainerImageAssetMetadataEntry = { + id: 'assetId', + imageNameParameter: 'MyParameter', + packaging: 'container-image', + path: '/foo', + repositoryName: 'some-name', + }; + + try { + await prepareContainerAsset(asset, toolkit, false); + } catch (e) { + if (!/STOPTEST/.test(e.toString())) { throw e; } + } + + // THEN + test.deepEqual(createdName, 'some-name'); + + test.done(); + }, +}; \ No newline at end of file diff --git a/packages/aws-cdk/test/util/mock-sdk.ts b/packages/aws-cdk/test/util/mock-sdk.ts index 008e44904f5df..43c88c83508d9 100644 --- a/packages/aws-cdk/test/util/mock-sdk.ts +++ b/packages/aws-cdk/test/util/mock-sdk.ts @@ -21,6 +21,13 @@ export class MockSDK extends SDK { public stubCloudFormation(stubs: SyncHandlerSubsetOf) { this.sandbox.stub(this, 'cloudFormation').returns(Promise.resolve(partialAwsService(stubs))); } + + /** + * Replace the ECR client with the given object + */ + public stubEcr(stubs: SyncHandlerSubsetOf) { + this.sandbox.stub(this, 'ecr').returns(Promise.resolve(partialAwsService(stubs))); + } } /**