├── .eslintignore ├── .eslintrc ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── aws.jpg └── schema.png ├── cdktf.json ├── help ├── package-lock.json ├── package.json ├── scaffold.json ├── src ├── lib │ └── constructs │ │ ├── continuousDeployment │ │ ├── build.ts │ │ ├── index.ts │ │ └── pipeline.ts │ │ └── staticWebsite │ │ ├── bucket.ts │ │ ├── cdn.ts │ │ ├── environmentVariables.ts │ │ ├── index.ts │ │ └── ssl.ts ├── main.ts └── utils │ └── escapeTemplateForTerraform.ts ├── templates └── buildspec.yml ├── tsconfig.json └── types └── environment.d.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /out 3 | /.terraform 4 | /src/imports -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "oclif", 4 | "oclif-typescript" 5 | ], 6 | 7 | "rules": { 8 | "quotes": ["error", "double"], 9 | "valid-jsdoc": ["error", { 10 | "requireParamType": false, 11 | "requireReturnType": false 12 | }], 13 | "no-new": ["off"], 14 | "camelcase": ["error"], 15 | "unicorn/filename-case": ["warning", { 16 | "cases": { 17 | "camelCase": true, 18 | "pascalCase": true 19 | } 20 | }], 21 | "unicorn/no-abusive-eslint-disable": ["off"], 22 | "indent": ["error", 2, { 23 | "SwitchCase": 1 24 | }], 25 | "sort-imports": ["error", { 26 | "ignoreDeclarationSort": true 27 | }], 28 | "object-curly-spacing": ["error", "always"], 29 | "@typescript-eslint/interface-name-prefix": ["error", "always"], 30 | "@typescript-eslint/member-ordering": ["error", { 31 | "default": { 32 | "memberTypes": ["signature", "field", "constructor", "method"], 33 | "order": "alphabetically" 34 | } 35 | }] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | out 4 | terraform.tfstate* 5 | src/imports 6 | .terraform 7 | .DS_Store 8 | .env.local 9 | .env.*.local -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Scaffold 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | AWS 3 |

4 | 5 |

AWS Static Website

6 | 7 |

8 | Documentation | 9 | Website | 10 | Blog | 11 | Twitter | 12 | LinkedIn 13 |

14 | 15 |

+ $1.5 / month      ~ 4min / create

16 | 17 |

18 | Node version 19 | Yarn version 20 | AWS version 21 | Terraform version 22 | CDKTF version 23 | License 24 |

25 | 26 | ```console 27 | $ scaffold aws:static-website 28 | ``` 29 | 30 | This infrastructure uses the static website hosting capabilities of **[AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html)** to host your static website in a **serverless way**. 31 | 32 | Your **GitHub account** will be connected to **[CodePipeline](https://aws.amazon.com/codepipeline)** and **[CodeBuild](https://aws.amazon.com/codebuild)**, so you will be able to build, test and deploy your favorite SPA and SSG frameworks (React JS, Vue JS, Gatsby JS, Hugo...) using the usual `git push` command. 33 | 34 | Given that the S3 website endpoints do not support HTTPS, this infrastructure uses **[CloudFront](https://aws.amazon.com/cloudfront)** coupled with **[ACM](https://aws.amazon.com/acm)** to add a fully-managed SSL certificate to your website. 35 | 36 | To use an ACM certificate with Amazon CloudFront, the certificate [must be requested](https://docs.aws.amazon.com/acm/latest/userguide/acm-regions.html) in the US East (N. Virginia) region. 37 | 38 | This infrastructure also uses **[SSM Parameters Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)** to store your build environment variables. 39 | 40 | ![](/assets/schema.png) 41 | 42 | ### Requirements 43 | 44 | * You will need a **GitHub** account to create this infrastructure. **Support for GitLab and BitBucket is coming soon.** 45 | 46 | * If you plan to use an apex domain for your website (i.e. a root domain that does not contain a subdomain), make sure that your domain host support the ANAME, ALIAS or naked CNAME DNS record type. 47 | 48 | ## Components 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
NameSourcePrice
S3 (one bucket)
S3 will be used to store your website source code.
src/lib/constructs/staticWebsite/bucket.tsUsage
Cloudfront (one distribution)
CloudFront will be used to serve your website from your S3 bucket.
src/lib/constructs/staticWebsite/cdn.tsUsage
CodePipeline (one pipeline)
CodePipeline will be used to manage the deployments of your website.
src/lib/constructs/continuousDeployment/pipeline.ts$1 / month
CodeBuild (one build project)
CodeBuild will be used to run the builds of your website.
src/lib/constructs/continuousDeployment/build.ts+$0.5 / month
ACM (one certificate)
ACM will be used to manage the SSL certificate of your website.
src/lib/constructs/staticWebsite/ssl.tsFree
SSM (one parameter store)
SSM Parameter Store will be used to store the environment variables of your builds.
src/lib/constructs/computing/environmentVariables.tsUsage
91 | 92 | ## Environment variables 93 | 94 | These environment variables will be **automatically** configured each time you create an environment (or a sandbox) for your infrastructure. 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 |
NameDescription
BUILD_COMMANDThe command that needs to be run to build your website (e.g. npm i && npm run build) (optional).
BUILD_OUTPUT_DIRThe directory where the build command output your website (e.g. build/) (optional).
DOMAIN_NAMESThe domain name(s) that you want to use for your website.
ENABLE_HTTPSWe need to wait for the ACM certificate to be "issued" to enable HTTPS. See the "after install" section to learn more.
GITHUB_BRANCHThe branch from which you want to deploy.
GITHUB_OAUTH_TOKENThe GitHub OAuth token that will be used by CodePipeline to pull your source code from your repository.
GITHUB_REPOThe GitHub repository that contains your source code.
GITHUB_REPO_OWNERThe owner of your GitHub repository. Can be a regular user or an organization.
GITHUB_WEBHOOK_TOKENA random token that will be used by CodePipeline and GitHub to prevent impersonation.
187 | 188 | ### Inherited 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 |
NameDescription
SCAFFOLD_AWS_PROFILEThe AWS named profile used to create your infrastructure.
SCAFFOLD_AWS_REGIONThe AWS region where you want to create your infrastructure.
SCAFFOLD_AWS_S3_BACKEND_BUCKETThe AWS S3 bucket that will contain the Terraform state of your infrastructure.
SCAFFOLD_AWS_S3_BACKEND_DYNAMODB_TABLEThe AWS DynamoDB table that will be used to store the Terraform state locks.
SCAFFOLD_AWS_S3_BACKEND_KEYThe S3 bucket key under which your Terraform state will be saved.
SCAFFOLD_RESOURCE_NAMES_PREFIXAn unique custom prefix used to avoid name colision with existing resources.
257 | 258 | ## After install 259 | 260 | **CloudFront will display a placeholder index file until the end of the first deployment.** 261 | 262 | This infrastructure exports three Terraform outputs: `cloudfront_distribution_uri`, `pipeline_execution_details_url` and `ssl_validation_dns_records`. 263 | 264 | The `cloudfront_distribution_uri` output value contains the URI of your CloudFront distribution. You could use it to access your website while your DNS are propagating. 265 | 266 | The `pipeline_execution_details_url` output values contains the URL of your pipeline executions details. 267 | 268 | The `ssl_validation_dns_records` output value contains the DNS records that you need to set in order to validate your ACM certificate (see below). 269 | 270 | ### How do I set up my domain name? 271 | 272 | The way you will set up your domain name will vary according to the presence or absence of a subdomain. 273 | 274 | If your domain name doesn't have any subdomains, you will need to add two DNS records: 275 | 276 | - **Name:** or @ 277 | - **Type:** ALIASE, ANAME or CNAME 278 | - **Value:** `cloudfront_distribution_uri` 279 | 280 |

281 | 282 | - **Name:** www 283 | - **Type:** CNAME 284 | - **Value:** `cloudfront_distribution_uri` 285 | 286 | If your domain name has a subdomain, you will need to add one CNAME record: 287 | 288 | - **Name:** subdomain 289 | - **Type:** CNAME 290 | - **Value:** `cloudfront_distribution_uri` 291 | 292 | ### How do I set up HTTPS? 293 | 294 | The `ssl_validation_dns_records` output value contains the DNS records that you need to set in order to validate your ACM certificate. 295 | 296 | Once set, you will need to [wait for the status](https://console.aws.amazon.com/acm/home?region=us-east-1#/) of your certificate to switch from "pending" to "issued" to use it with your application load balancer. 297 | 298 | You could then set the `ENABLE_HTTPS` environment variable to "true" in your local env file and run the `scaffold apply` command to update your infrastructure. 299 | 300 | If you want to automate this process, you could use AWS Route 53 as your domain host then use the `aws_route53_record` and `aws_acm_certificate_validation` resources to wait for certificate validation. See the [Terraform documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate_validation) to learn more. 301 | 302 | ### How do I customize the build stage of my pipeline? 303 | 304 | [CodeBuild uses a YAML file](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html) to describe all the steps that a stage requires. This file is located in the templates directory at the root of your infrastructure: 305 | 306 | ```env 307 | # ./templates 308 | buildspec.yml 309 | ``` 310 | 311 | You could update this file directly to customize your pipeline build stage. 312 | 313 | ### How do I add environment variables to the build stage? 314 | 315 | To add an environment variable to the build stage all you have to do is to add an environment variable that starts with `BUILD_` to your infrastructure code. 316 | 317 | For example, let's say that you want to add a `TOKEN` variable to your build. You will first add it to your `.env` file: 318 | 319 | ```env 320 | # .env 321 | BUILD_TOKEN= 322 | ``` 323 | 324 | Then, given that this value is secret you choose to define it in your local env file: 325 | 326 | ```env 327 | # .env.{environment}.local 328 | BUILD_TOKEN=MY_SECRET_TOKEN 329 | ``` 330 | 331 | One done, you could access your environment variables in all your buildspec file: 332 | 333 | ```yaml 334 | # templates/buildspec.yml 335 | 336 | version: 0.2 337 | 338 | phases: 339 | pre_build: 340 | commands: 341 | - echo $TOKEN 342 | ``` 343 | 344 | Remember to run the `scaffold apply` command each time you update your infrastructure code. 345 | -------------------------------------------------------------------------------- /assets/aws.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scaffold-sh/aws-static-website/37d614ad12482712dc6ab27002d2a1ccc694b323/assets/aws.jpg -------------------------------------------------------------------------------- /assets/schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scaffold-sh/aws-static-website/37d614ad12482712dc6ab27002d2a1ccc694b323/assets/schema.png -------------------------------------------------------------------------------- /cdktf.json: -------------------------------------------------------------------------------- 1 | { 2 | "language": "typescript", 3 | "app": "npm run --silent compile && node ./dist/main.js", 4 | "terraformProviders": [ 5 | "aws@~> 3.0", 6 | "null@~> 2.0" 7 | ], 8 | "codeMakerOutput": "./src/imports", 9 | "output": "./out" 10 | } -------------------------------------------------------------------------------- /help: -------------------------------------------------------------------------------- 1 | ======================================================================================================== 2 | 3 | Your cdktf typescript project is ready! 4 | 5 | cat help Print this message 6 | 7 | Compile: 8 | npm run compile Compile typescript code to javascript (or "yarn watch") 9 | npm run watch Watch for changes and compile typescript in the background 10 | npm run build cdktf get and compile typescript 11 | 12 | Synthesize: 13 | cdktf synth Synthesize Terraform resources from stacks to cdktf.out/ (ready for 'terraform apply') 14 | 15 | Diff: 16 | cdktf diff Perform a diff (terraform plan) for the given stack 17 | 18 | Deploy: 19 | cdktf deploy Deploy the given stack 20 | 21 | Destroy: 22 | cdktf destroy Destroy the stack 23 | 24 | 25 | Upgrades: 26 | npm run get Import/update Terraform providers and modules (you should check-in this directory) 27 | npm run upgrade Upgrade cdktf modules to latest version 28 | npm run upgrade:next Upgrade cdktf modules to latest "@next" version (last commit) 29 | 30 | ======================================================================================================== 31 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-static-website", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "ansi-styles": { 34 | "version": "3.2.1", 35 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 36 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 37 | "dev": true, 38 | "requires": { 39 | "color-convert": "^1.9.0" 40 | } 41 | }, 42 | "chalk": { 43 | "version": "2.4.2", 44 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 45 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^3.2.1", 49 | "escape-string-regexp": "^1.0.5", 50 | "supports-color": "^5.3.0" 51 | } 52 | }, 53 | "color-convert": { 54 | "version": "1.9.3", 55 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 56 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 57 | "dev": true, 58 | "requires": { 59 | "color-name": "1.1.3" 60 | } 61 | }, 62 | "color-name": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 65 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 66 | "dev": true 67 | }, 68 | "escape-string-regexp": { 69 | "version": "1.0.5", 70 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 71 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 72 | "dev": true 73 | }, 74 | "has-flag": { 75 | "version": "3.0.0", 76 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 77 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 78 | "dev": true 79 | }, 80 | "supports-color": { 81 | "version": "5.5.0", 82 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 83 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 84 | "dev": true, 85 | "requires": { 86 | "has-flag": "^3.0.0" 87 | } 88 | } 89 | } 90 | }, 91 | "@jsii/spec": { 92 | "version": "1.10.0", 93 | "resolved": "https://registry.npmjs.org/@jsii/spec/-/spec-1.10.0.tgz", 94 | "integrity": "sha512-7Wg3oilwm3G0RphZzXbSwzCSsv/A3neF8uLZe4izcVkA3YR1LExjWKVFbQEEL+NXDNWKhOKku3vamq5ri9O1+w==", 95 | "dev": true, 96 | "requires": { 97 | "jsonschema": "^1.2.6" 98 | } 99 | }, 100 | "@types/color-name": { 101 | "version": "1.1.1", 102 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 103 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 104 | "dev": true 105 | }, 106 | "@types/dotenv-flow": { 107 | "version": "3.0.1", 108 | "resolved": "https://registry.npmjs.org/@types/dotenv-flow/-/dotenv-flow-3.0.1.tgz", 109 | "integrity": "sha512-+HD2z/1kVDPk9s85HdK8jmYvW+B2SqpUzfpz8nZdpy+NXY/+ixcxeD2dAUn2tVaj/8t04lMwPO+Zfh0tbQkCjQ==", 110 | "dev": true 111 | }, 112 | "@types/eslint-visitor-keys": { 113 | "version": "1.0.0", 114 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 115 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 116 | "dev": true 117 | }, 118 | "@types/json-schema": { 119 | "version": "7.0.6", 120 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", 121 | "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", 122 | "dev": true 123 | }, 124 | "@types/node": { 125 | "version": "14.0.27", 126 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", 127 | "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", 128 | "dev": true 129 | }, 130 | "@types/readline-sync": { 131 | "version": "1.4.3", 132 | "resolved": "https://registry.npmjs.org/@types/readline-sync/-/readline-sync-1.4.3.tgz", 133 | "integrity": "sha512-YP9NVli96E+qQLAF2db+VjnAUEeZcFVg4YnMgr8kpDUFwQBnj31rPLOVHmazbKQhaIkJ9cMHsZhpKdzUeL0KTg==", 134 | "dev": true 135 | }, 136 | "@types/yoga-layout": { 137 | "version": "1.9.2", 138 | "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", 139 | "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==", 140 | "dev": true 141 | }, 142 | "@typescript-eslint/eslint-plugin": { 143 | "version": "2.34.0", 144 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", 145 | "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", 146 | "dev": true, 147 | "requires": { 148 | "@typescript-eslint/experimental-utils": "2.34.0", 149 | "functional-red-black-tree": "^1.0.1", 150 | "regexpp": "^3.0.0", 151 | "tsutils": "^3.17.1" 152 | }, 153 | "dependencies": { 154 | "regexpp": { 155 | "version": "3.1.0", 156 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 157 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 158 | "dev": true 159 | } 160 | } 161 | }, 162 | "@typescript-eslint/experimental-utils": { 163 | "version": "2.34.0", 164 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", 165 | "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", 166 | "dev": true, 167 | "requires": { 168 | "@types/json-schema": "^7.0.3", 169 | "@typescript-eslint/typescript-estree": "2.34.0", 170 | "eslint-scope": "^5.0.0", 171 | "eslint-utils": "^2.0.0" 172 | }, 173 | "dependencies": { 174 | "eslint-scope": { 175 | "version": "5.1.1", 176 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 177 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 178 | "dev": true, 179 | "requires": { 180 | "esrecurse": "^4.3.0", 181 | "estraverse": "^4.1.1" 182 | } 183 | }, 184 | "eslint-utils": { 185 | "version": "2.1.0", 186 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 187 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 188 | "dev": true, 189 | "requires": { 190 | "eslint-visitor-keys": "^1.1.0" 191 | } 192 | } 193 | } 194 | }, 195 | "@typescript-eslint/parser": { 196 | "version": "2.34.0", 197 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", 198 | "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", 199 | "dev": true, 200 | "requires": { 201 | "@types/eslint-visitor-keys": "^1.0.0", 202 | "@typescript-eslint/experimental-utils": "2.34.0", 203 | "@typescript-eslint/typescript-estree": "2.34.0", 204 | "eslint-visitor-keys": "^1.1.0" 205 | } 206 | }, 207 | "@typescript-eslint/typescript-estree": { 208 | "version": "2.34.0", 209 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", 210 | "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", 211 | "dev": true, 212 | "requires": { 213 | "debug": "^4.1.1", 214 | "eslint-visitor-keys": "^1.1.0", 215 | "glob": "^7.1.6", 216 | "is-glob": "^4.0.1", 217 | "lodash": "^4.17.15", 218 | "semver": "^7.3.2", 219 | "tsutils": "^3.17.1" 220 | } 221 | }, 222 | "acorn": { 223 | "version": "6.4.2", 224 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 225 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 226 | "dev": true 227 | }, 228 | "acorn-jsx": { 229 | "version": "5.3.1", 230 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 231 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 232 | "dev": true 233 | }, 234 | "ajv": { 235 | "version": "6.12.5", 236 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", 237 | "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", 238 | "dev": true, 239 | "requires": { 240 | "fast-deep-equal": "^3.1.1", 241 | "fast-json-stable-stringify": "^2.0.0", 242 | "json-schema-traverse": "^0.4.1", 243 | "uri-js": "^4.2.2" 244 | } 245 | }, 246 | "ansi-escapes": { 247 | "version": "4.3.1", 248 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 249 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 250 | "dev": true, 251 | "requires": { 252 | "type-fest": "^0.11.0" 253 | } 254 | }, 255 | "ansi-regex": { 256 | "version": "5.0.0", 257 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 258 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 259 | "dev": true 260 | }, 261 | "ansi-styles": { 262 | "version": "4.2.1", 263 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 264 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 265 | "dev": true, 266 | "requires": { 267 | "@types/color-name": "^1.1.1", 268 | "color-convert": "^2.0.1" 269 | } 270 | }, 271 | "argparse": { 272 | "version": "1.0.10", 273 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 274 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 275 | "dev": true, 276 | "requires": { 277 | "sprintf-js": "~1.0.2" 278 | } 279 | }, 280 | "array-filter": { 281 | "version": "1.0.0", 282 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", 283 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", 284 | "dev": true 285 | }, 286 | "array-includes": { 287 | "version": "3.1.1", 288 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 289 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 290 | "dev": true, 291 | "requires": { 292 | "define-properties": "^1.1.3", 293 | "es-abstract": "^1.17.0", 294 | "is-string": "^1.0.5" 295 | } 296 | }, 297 | "array.prototype.flatmap": { 298 | "version": "1.2.3", 299 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", 300 | "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", 301 | "dev": true, 302 | "requires": { 303 | "define-properties": "^1.1.3", 304 | "es-abstract": "^1.17.0-next.1", 305 | "function-bind": "^1.1.1" 306 | } 307 | }, 308 | "arrify": { 309 | "version": "2.0.1", 310 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 311 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", 312 | "dev": true 313 | }, 314 | "astral-regex": { 315 | "version": "2.0.0", 316 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 317 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 318 | "dev": true 319 | }, 320 | "at-least-node": { 321 | "version": "1.0.0", 322 | "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 323 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 324 | "dev": true 325 | }, 326 | "auto-bind": { 327 | "version": "4.0.0", 328 | "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", 329 | "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", 330 | "dev": true 331 | }, 332 | "available-typed-arrays": { 333 | "version": "1.0.2", 334 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", 335 | "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", 336 | "dev": true, 337 | "requires": { 338 | "array-filter": "^1.0.0" 339 | } 340 | }, 341 | "balanced-match": { 342 | "version": "1.0.0", 343 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 344 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 345 | "dev": true 346 | }, 347 | "brace-expansion": { 348 | "version": "1.1.11", 349 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 350 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 351 | "dev": true, 352 | "requires": { 353 | "balanced-match": "^1.0.0", 354 | "concat-map": "0.0.1" 355 | } 356 | }, 357 | "callsites": { 358 | "version": "3.1.0", 359 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 360 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 361 | "dev": true 362 | }, 363 | "camelcase": { 364 | "version": "5.3.1", 365 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 366 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 367 | "dev": true 368 | }, 369 | "case": { 370 | "version": "1.6.3", 371 | "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", 372 | "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", 373 | "dev": true 374 | }, 375 | "cdktf": { 376 | "version": "0.0.14", 377 | "resolved": "https://registry.npmjs.org/cdktf/-/cdktf-0.0.14.tgz", 378 | "integrity": "sha512-EzX6GPhMnVp9fhgGAlBFxXO25AsMaxosiPWiIXuki546SlGHI0+449isduOAXiW1DqP+awL3Ap9roGM1cELxGg==", 379 | "requires": { 380 | "json-stable-stringify": "^1.0.1" 381 | }, 382 | "dependencies": { 383 | "json-stable-stringify": { 384 | "version": "1.0.1", 385 | "bundled": true, 386 | "requires": { 387 | "jsonify": "~0.0.0" 388 | } 389 | }, 390 | "jsonify": { 391 | "version": "0.0.0", 392 | "bundled": true 393 | } 394 | } 395 | }, 396 | "cdktf-cli": { 397 | "version": "0.0.14", 398 | "resolved": "https://registry.npmjs.org/cdktf-cli/-/cdktf-cli-0.0.14.tgz", 399 | "integrity": "sha512-yiwrf/1LV8zThkdYKvEhFGTFNyV035tiDJ8fBFq9ZgHBa0L0A0nFxx3zgImdv9NLDvD4eWLUsaf+ry6QzwYoow==", 400 | "dev": true, 401 | "requires": { 402 | "@types/node": "^14.0.26", 403 | "@types/readline-sync": "^1.4.3", 404 | "cdktf": "0.0.14", 405 | "chalk": "^4.1.0", 406 | "codemaker": "^0.22.0", 407 | "constructs": "^3.0.0", 408 | "eslint-plugin-react": "^7.20.0", 409 | "fs-extra": "^8.1.0", 410 | "ink": "^2.7.1", 411 | "ink-confirm-input": "^2.0.0", 412 | "ink-spinner": "^3.0.1", 413 | "jsii": "1.1.0", 414 | "jsii-pacmak": "1.1.0", 415 | "log4js": "^6.3.0", 416 | "open": "^7.0.4", 417 | "react": "^16.13.1", 418 | "readline-sync": "^1.4.10", 419 | "semver": "^7.3.2", 420 | "sscaff": "^1.2.0", 421 | "yargs": "^15.1.0" 422 | } 423 | }, 424 | "chalk": { 425 | "version": "4.1.0", 426 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 427 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 428 | "dev": true, 429 | "requires": { 430 | "ansi-styles": "^4.1.0", 431 | "supports-color": "^7.1.0" 432 | } 433 | }, 434 | "chardet": { 435 | "version": "0.7.0", 436 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 437 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 438 | "dev": true 439 | }, 440 | "ci-info": { 441 | "version": "2.0.0", 442 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 443 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", 444 | "dev": true 445 | }, 446 | "clean-regexp": { 447 | "version": "1.0.0", 448 | "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", 449 | "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", 450 | "dev": true, 451 | "requires": { 452 | "escape-string-regexp": "^1.0.5" 453 | }, 454 | "dependencies": { 455 | "escape-string-regexp": { 456 | "version": "1.0.5", 457 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 458 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 459 | "dev": true 460 | } 461 | } 462 | }, 463 | "cli-cursor": { 464 | "version": "3.1.0", 465 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 466 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 467 | "dev": true, 468 | "requires": { 469 | "restore-cursor": "^3.1.0" 470 | } 471 | }, 472 | "cli-spinners": { 473 | "version": "1.3.1", 474 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", 475 | "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", 476 | "dev": true 477 | }, 478 | "cli-truncate": { 479 | "version": "2.1.0", 480 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", 481 | "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", 482 | "dev": true, 483 | "requires": { 484 | "slice-ansi": "^3.0.0", 485 | "string-width": "^4.2.0" 486 | } 487 | }, 488 | "cli-width": { 489 | "version": "2.2.1", 490 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 491 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 492 | "dev": true 493 | }, 494 | "cliui": { 495 | "version": "6.0.0", 496 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 497 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 498 | "dev": true, 499 | "requires": { 500 | "string-width": "^4.2.0", 501 | "strip-ansi": "^6.0.0", 502 | "wrap-ansi": "^6.2.0" 503 | } 504 | }, 505 | "clone": { 506 | "version": "2.1.2", 507 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 508 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 509 | "dev": true 510 | }, 511 | "codemaker": { 512 | "version": "0.22.0", 513 | "resolved": "https://registry.npmjs.org/codemaker/-/codemaker-0.22.0.tgz", 514 | "integrity": "sha512-3WQV/Fpa77nvzjUlc+0u53uIroJyyMB2Qwl++aXpAiDIsrsiAQq4uCURwdRBRX+eLkOTIAmT0L4qna3T7+2pUg==", 515 | "dev": true, 516 | "requires": { 517 | "camelcase": "^5.3.1", 518 | "decamelize": "^1.2.0", 519 | "fs-extra": "^8.1.0" 520 | } 521 | }, 522 | "color-convert": { 523 | "version": "2.0.1", 524 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 525 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 526 | "dev": true, 527 | "requires": { 528 | "color-name": "~1.1.4" 529 | } 530 | }, 531 | "color-name": { 532 | "version": "1.1.4", 533 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 534 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 535 | "dev": true 536 | }, 537 | "colors": { 538 | "version": "1.4.0", 539 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 540 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 541 | "dev": true 542 | }, 543 | "commonmark": { 544 | "version": "0.29.1", 545 | "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.29.1.tgz", 546 | "integrity": "sha512-DafPdNYFXoEhsSiR4O+dJ45UJBfDL4cBTks4B+agKiaWt7qjG0bIhg5xuCE0RqU71ikJcBIf4/sRHh9vYQVF8Q==", 547 | "dev": true, 548 | "requires": { 549 | "entities": "~1.1.1", 550 | "mdurl": "~1.0.1", 551 | "minimist": "~1.2.0", 552 | "string.prototype.repeat": "^0.2.0" 553 | } 554 | }, 555 | "concat-map": { 556 | "version": "0.0.1", 557 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 558 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 559 | "dev": true 560 | }, 561 | "constructs": { 562 | "version": "3.0.4", 563 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.0.4.tgz", 564 | "integrity": "sha512-CDvg7gMjphE3DFX4pzkF6j73NREbR8npPFW8Mx/CLRnMR035+Y1o1HrXIsNSss/dq3ZUnNTU9jKyd3fL9EOlfw==" 565 | }, 566 | "cross-spawn": { 567 | "version": "6.0.5", 568 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 569 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 570 | "dev": true, 571 | "requires": { 572 | "nice-try": "^1.0.4", 573 | "path-key": "^2.0.1", 574 | "semver": "^5.5.0", 575 | "shebang-command": "^1.2.0", 576 | "which": "^1.2.9" 577 | }, 578 | "dependencies": { 579 | "semver": { 580 | "version": "5.7.1", 581 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 582 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 583 | "dev": true 584 | } 585 | } 586 | }, 587 | "date-format": { 588 | "version": "3.0.0", 589 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", 590 | "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", 591 | "dev": true 592 | }, 593 | "debug": { 594 | "version": "4.1.1", 595 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 596 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 597 | "dev": true, 598 | "requires": { 599 | "ms": "^2.1.1" 600 | } 601 | }, 602 | "decamelize": { 603 | "version": "1.2.0", 604 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 605 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 606 | "dev": true 607 | }, 608 | "deep-equal": { 609 | "version": "2.0.3", 610 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", 611 | "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", 612 | "dev": true, 613 | "requires": { 614 | "es-abstract": "^1.17.5", 615 | "es-get-iterator": "^1.1.0", 616 | "is-arguments": "^1.0.4", 617 | "is-date-object": "^1.0.2", 618 | "is-regex": "^1.0.5", 619 | "isarray": "^2.0.5", 620 | "object-is": "^1.1.2", 621 | "object-keys": "^1.1.1", 622 | "object.assign": "^4.1.0", 623 | "regexp.prototype.flags": "^1.3.0", 624 | "side-channel": "^1.0.2", 625 | "which-boxed-primitive": "^1.0.1", 626 | "which-collection": "^1.0.1", 627 | "which-typed-array": "^1.1.2" 628 | } 629 | }, 630 | "deep-is": { 631 | "version": "0.1.3", 632 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 633 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 634 | "dev": true 635 | }, 636 | "define-properties": { 637 | "version": "1.1.3", 638 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 639 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 640 | "dev": true, 641 | "requires": { 642 | "object-keys": "^1.0.12" 643 | } 644 | }, 645 | "detect-indent": { 646 | "version": "5.0.0", 647 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", 648 | "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", 649 | "dev": true 650 | }, 651 | "detect-newline": { 652 | "version": "2.1.0", 653 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", 654 | "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", 655 | "dev": true 656 | }, 657 | "doctrine": { 658 | "version": "2.1.0", 659 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 660 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 661 | "dev": true, 662 | "requires": { 663 | "esutils": "^2.0.2" 664 | } 665 | }, 666 | "dotenv": { 667 | "version": "8.2.0", 668 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 669 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 670 | }, 671 | "dotenv-flow": { 672 | "version": "3.2.0", 673 | "resolved": "https://registry.npmjs.org/dotenv-flow/-/dotenv-flow-3.2.0.tgz", 674 | "integrity": "sha512-GEB6RrR4AbqDJvNSFrYHqZ33IKKbzkvLYiD5eo4+9aFXr4Y4G+QaFrB/fNp0y6McWBmvaPn3ZNjIufnj8irCtg==", 675 | "requires": { 676 | "dotenv": "^8.0.0" 677 | } 678 | }, 679 | "emoji-regex": { 680 | "version": "8.0.0", 681 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 682 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 683 | "dev": true 684 | }, 685 | "entities": { 686 | "version": "1.1.2", 687 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 688 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", 689 | "dev": true 690 | }, 691 | "es-abstract": { 692 | "version": "1.17.6", 693 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 694 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 695 | "dev": true, 696 | "requires": { 697 | "es-to-primitive": "^1.2.1", 698 | "function-bind": "^1.1.1", 699 | "has": "^1.0.3", 700 | "has-symbols": "^1.0.1", 701 | "is-callable": "^1.2.0", 702 | "is-regex": "^1.1.0", 703 | "object-inspect": "^1.7.0", 704 | "object-keys": "^1.1.1", 705 | "object.assign": "^4.1.0", 706 | "string.prototype.trimend": "^1.0.1", 707 | "string.prototype.trimstart": "^1.0.1" 708 | } 709 | }, 710 | "es-get-iterator": { 711 | "version": "1.1.0", 712 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", 713 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", 714 | "dev": true, 715 | "requires": { 716 | "es-abstract": "^1.17.4", 717 | "has-symbols": "^1.0.1", 718 | "is-arguments": "^1.0.4", 719 | "is-map": "^2.0.1", 720 | "is-set": "^2.0.1", 721 | "is-string": "^1.0.5", 722 | "isarray": "^2.0.5" 723 | } 724 | }, 725 | "es-to-primitive": { 726 | "version": "1.2.1", 727 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 728 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 729 | "dev": true, 730 | "requires": { 731 | "is-callable": "^1.1.4", 732 | "is-date-object": "^1.0.1", 733 | "is-symbol": "^1.0.2" 734 | } 735 | }, 736 | "escape-string-regexp": { 737 | "version": "2.0.0", 738 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 739 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 740 | "dev": true 741 | }, 742 | "eslint": { 743 | "version": "5.16.0", 744 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 745 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 746 | "dev": true, 747 | "requires": { 748 | "@babel/code-frame": "^7.0.0", 749 | "ajv": "^6.9.1", 750 | "chalk": "^2.1.0", 751 | "cross-spawn": "^6.0.5", 752 | "debug": "^4.0.1", 753 | "doctrine": "^3.0.0", 754 | "eslint-scope": "^4.0.3", 755 | "eslint-utils": "^1.3.1", 756 | "eslint-visitor-keys": "^1.0.0", 757 | "espree": "^5.0.1", 758 | "esquery": "^1.0.1", 759 | "esutils": "^2.0.2", 760 | "file-entry-cache": "^5.0.1", 761 | "functional-red-black-tree": "^1.0.1", 762 | "glob": "^7.1.2", 763 | "globals": "^11.7.0", 764 | "ignore": "^4.0.6", 765 | "import-fresh": "^3.0.0", 766 | "imurmurhash": "^0.1.4", 767 | "inquirer": "^6.2.2", 768 | "js-yaml": "^3.13.0", 769 | "json-stable-stringify-without-jsonify": "^1.0.1", 770 | "levn": "^0.3.0", 771 | "lodash": "^4.17.11", 772 | "minimatch": "^3.0.4", 773 | "mkdirp": "^0.5.1", 774 | "natural-compare": "^1.4.0", 775 | "optionator": "^0.8.2", 776 | "path-is-inside": "^1.0.2", 777 | "progress": "^2.0.0", 778 | "regexpp": "^2.0.1", 779 | "semver": "^5.5.1", 780 | "strip-ansi": "^4.0.0", 781 | "strip-json-comments": "^2.0.1", 782 | "table": "^5.2.3", 783 | "text-table": "^0.2.0" 784 | }, 785 | "dependencies": { 786 | "ansi-regex": { 787 | "version": "3.0.0", 788 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 789 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 790 | "dev": true 791 | }, 792 | "ansi-styles": { 793 | "version": "3.2.1", 794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 795 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 796 | "dev": true, 797 | "requires": { 798 | "color-convert": "^1.9.0" 799 | } 800 | }, 801 | "chalk": { 802 | "version": "2.4.2", 803 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 804 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 805 | "dev": true, 806 | "requires": { 807 | "ansi-styles": "^3.2.1", 808 | "escape-string-regexp": "^1.0.5", 809 | "supports-color": "^5.3.0" 810 | } 811 | }, 812 | "color-convert": { 813 | "version": "1.9.3", 814 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 815 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 816 | "dev": true, 817 | "requires": { 818 | "color-name": "1.1.3" 819 | } 820 | }, 821 | "color-name": { 822 | "version": "1.1.3", 823 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 824 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 825 | "dev": true 826 | }, 827 | "doctrine": { 828 | "version": "3.0.0", 829 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 830 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 831 | "dev": true, 832 | "requires": { 833 | "esutils": "^2.0.2" 834 | } 835 | }, 836 | "escape-string-regexp": { 837 | "version": "1.0.5", 838 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 839 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 840 | "dev": true 841 | }, 842 | "has-flag": { 843 | "version": "3.0.0", 844 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 845 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 846 | "dev": true 847 | }, 848 | "semver": { 849 | "version": "5.7.1", 850 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 851 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 852 | "dev": true 853 | }, 854 | "strip-ansi": { 855 | "version": "4.0.0", 856 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 857 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 858 | "dev": true, 859 | "requires": { 860 | "ansi-regex": "^3.0.0" 861 | } 862 | }, 863 | "supports-color": { 864 | "version": "5.5.0", 865 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 866 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 867 | "dev": true, 868 | "requires": { 869 | "has-flag": "^3.0.0" 870 | } 871 | } 872 | } 873 | }, 874 | "eslint-ast-utils": { 875 | "version": "1.1.0", 876 | "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", 877 | "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", 878 | "dev": true, 879 | "requires": { 880 | "lodash.get": "^4.4.2", 881 | "lodash.zip": "^4.2.0" 882 | } 883 | }, 884 | "eslint-config-oclif": { 885 | "version": "3.1.0", 886 | "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-3.1.0.tgz", 887 | "integrity": "sha512-Tqgy43cNXsSdhTLWW4RuDYGFhV240sC4ISSv/ZiUEg/zFxExSEUpRE6J+AGnkKY9dYwIW4C9b2YSUVv8z/miMA==", 888 | "dev": true, 889 | "requires": { 890 | "eslint-config-xo-space": "^0.20.0", 891 | "eslint-plugin-mocha": "^5.2.0", 892 | "eslint-plugin-node": "^7.0.1", 893 | "eslint-plugin-unicorn": "^6.0.1" 894 | } 895 | }, 896 | "eslint-config-oclif-typescript": { 897 | "version": "0.1.0", 898 | "resolved": "https://registry.npmjs.org/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-0.1.0.tgz", 899 | "integrity": "sha512-BjXNJcH2F02MdaSFml9vJskviUFVkLHbTPGM5tinIt98H6klFNKP7/lQ+fB/Goc2wB45usEuuw6+l/fwAv9i7g==", 900 | "dev": true, 901 | "requires": { 902 | "@typescript-eslint/eslint-plugin": "^2.6.1", 903 | "@typescript-eslint/parser": "^2.6.1", 904 | "eslint-config-oclif": "^3.1.0", 905 | "eslint-config-xo-space": "^0.20.0", 906 | "eslint-plugin-mocha": "^5.2.0", 907 | "eslint-plugin-node": "^7.0.1", 908 | "eslint-plugin-unicorn": "^6.0.1" 909 | } 910 | }, 911 | "eslint-config-xo": { 912 | "version": "0.24.2", 913 | "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.24.2.tgz", 914 | "integrity": "sha512-ivQ7qISScW6gfBp+p31nQntz1rg34UCybd3uvlngcxt5Utsf4PMMi9QoAluLFcPUM5Tvqk4JGraR9qu3msKPKQ==", 915 | "dev": true 916 | }, 917 | "eslint-config-xo-space": { 918 | "version": "0.20.0", 919 | "resolved": "https://registry.npmjs.org/eslint-config-xo-space/-/eslint-config-xo-space-0.20.0.tgz", 920 | "integrity": "sha512-bOsoZA8M6v1HviDUIGVq1fLVnSu3mMZzn85m2tqKb73tSzu4GKD4Jd2Py4ZKjCgvCbRRByEB5HPC3fTMnnJ1uw==", 921 | "dev": true, 922 | "requires": { 923 | "eslint-config-xo": "^0.24.0" 924 | } 925 | }, 926 | "eslint-plugin-es": { 927 | "version": "1.4.1", 928 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", 929 | "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", 930 | "dev": true, 931 | "requires": { 932 | "eslint-utils": "^1.4.2", 933 | "regexpp": "^2.0.1" 934 | } 935 | }, 936 | "eslint-plugin-mocha": { 937 | "version": "5.3.0", 938 | "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.3.0.tgz", 939 | "integrity": "sha512-3uwlJVLijjEmBeNyH60nzqgA1gacUWLUmcKV8PIGNvj1kwP/CTgAWQHn2ayyJVwziX+KETkr9opNwT1qD/RZ5A==", 940 | "dev": true, 941 | "requires": { 942 | "ramda": "^0.26.1" 943 | } 944 | }, 945 | "eslint-plugin-node": { 946 | "version": "7.0.1", 947 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", 948 | "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", 949 | "dev": true, 950 | "requires": { 951 | "eslint-plugin-es": "^1.3.1", 952 | "eslint-utils": "^1.3.1", 953 | "ignore": "^4.0.2", 954 | "minimatch": "^3.0.4", 955 | "resolve": "^1.8.1", 956 | "semver": "^5.5.0" 957 | }, 958 | "dependencies": { 959 | "semver": { 960 | "version": "5.7.1", 961 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 962 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 963 | "dev": true 964 | } 965 | } 966 | }, 967 | "eslint-plugin-react": { 968 | "version": "7.20.5", 969 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz", 970 | "integrity": "sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw==", 971 | "dev": true, 972 | "requires": { 973 | "array-includes": "^3.1.1", 974 | "array.prototype.flatmap": "^1.2.3", 975 | "doctrine": "^2.1.0", 976 | "has": "^1.0.3", 977 | "jsx-ast-utils": "^2.4.1", 978 | "object.entries": "^1.1.2", 979 | "object.fromentries": "^2.0.2", 980 | "object.values": "^1.1.1", 981 | "prop-types": "^15.7.2", 982 | "resolve": "^1.17.0", 983 | "string.prototype.matchall": "^4.0.2" 984 | } 985 | }, 986 | "eslint-plugin-unicorn": { 987 | "version": "6.0.1", 988 | "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-6.0.1.tgz", 989 | "integrity": "sha512-hjy9LhTdtL7pz8WTrzS0CGXRkWK3VAPLDjihofj8JC+uxQLfXm0WwZPPPB7xKmcjRyoH+jruPHOCrHNEINpG/Q==", 990 | "dev": true, 991 | "requires": { 992 | "clean-regexp": "^1.0.0", 993 | "eslint-ast-utils": "^1.0.0", 994 | "import-modules": "^1.1.0", 995 | "lodash.camelcase": "^4.1.1", 996 | "lodash.kebabcase": "^4.0.1", 997 | "lodash.snakecase": "^4.0.1", 998 | "lodash.upperfirst": "^4.2.0", 999 | "safe-regex": "^1.1.0" 1000 | } 1001 | }, 1002 | "eslint-scope": { 1003 | "version": "4.0.3", 1004 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 1005 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 1006 | "dev": true, 1007 | "requires": { 1008 | "esrecurse": "^4.1.0", 1009 | "estraverse": "^4.1.1" 1010 | } 1011 | }, 1012 | "eslint-utils": { 1013 | "version": "1.4.3", 1014 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 1015 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 1016 | "dev": true, 1017 | "requires": { 1018 | "eslint-visitor-keys": "^1.1.0" 1019 | } 1020 | }, 1021 | "eslint-visitor-keys": { 1022 | "version": "1.3.0", 1023 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1024 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1025 | "dev": true 1026 | }, 1027 | "espree": { 1028 | "version": "5.0.1", 1029 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 1030 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 1031 | "dev": true, 1032 | "requires": { 1033 | "acorn": "^6.0.7", 1034 | "acorn-jsx": "^5.0.0", 1035 | "eslint-visitor-keys": "^1.0.0" 1036 | } 1037 | }, 1038 | "esprima": { 1039 | "version": "4.0.1", 1040 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1041 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1042 | "dev": true 1043 | }, 1044 | "esquery": { 1045 | "version": "1.3.1", 1046 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 1047 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 1048 | "dev": true, 1049 | "requires": { 1050 | "estraverse": "^5.1.0" 1051 | }, 1052 | "dependencies": { 1053 | "estraverse": { 1054 | "version": "5.2.0", 1055 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1056 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1057 | "dev": true 1058 | } 1059 | } 1060 | }, 1061 | "esrecurse": { 1062 | "version": "4.3.0", 1063 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1064 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1065 | "dev": true, 1066 | "requires": { 1067 | "estraverse": "^5.2.0" 1068 | }, 1069 | "dependencies": { 1070 | "estraverse": { 1071 | "version": "5.2.0", 1072 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1073 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1074 | "dev": true 1075 | } 1076 | } 1077 | }, 1078 | "estraverse": { 1079 | "version": "4.3.0", 1080 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1081 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1082 | "dev": true 1083 | }, 1084 | "esutils": { 1085 | "version": "2.0.3", 1086 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1087 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1088 | "dev": true 1089 | }, 1090 | "external-editor": { 1091 | "version": "3.1.0", 1092 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 1093 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 1094 | "dev": true, 1095 | "requires": { 1096 | "chardet": "^0.7.0", 1097 | "iconv-lite": "^0.4.24", 1098 | "tmp": "^0.0.33" 1099 | } 1100 | }, 1101 | "fast-deep-equal": { 1102 | "version": "3.1.3", 1103 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1104 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1105 | "dev": true 1106 | }, 1107 | "fast-json-stable-stringify": { 1108 | "version": "2.1.0", 1109 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1110 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1111 | "dev": true 1112 | }, 1113 | "fast-levenshtein": { 1114 | "version": "2.0.6", 1115 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1116 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1117 | "dev": true 1118 | }, 1119 | "figures": { 1120 | "version": "2.0.0", 1121 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1122 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 1123 | "dev": true, 1124 | "requires": { 1125 | "escape-string-regexp": "^1.0.5" 1126 | }, 1127 | "dependencies": { 1128 | "escape-string-regexp": { 1129 | "version": "1.0.5", 1130 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1131 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1132 | "dev": true 1133 | } 1134 | } 1135 | }, 1136 | "file-entry-cache": { 1137 | "version": "5.0.1", 1138 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 1139 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 1140 | "dev": true, 1141 | "requires": { 1142 | "flat-cache": "^2.0.1" 1143 | } 1144 | }, 1145 | "find-up": { 1146 | "version": "4.1.0", 1147 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1148 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1149 | "dev": true, 1150 | "requires": { 1151 | "locate-path": "^5.0.0", 1152 | "path-exists": "^4.0.0" 1153 | } 1154 | }, 1155 | "flat-cache": { 1156 | "version": "2.0.1", 1157 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 1158 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 1159 | "dev": true, 1160 | "requires": { 1161 | "flatted": "^2.0.0", 1162 | "rimraf": "2.6.3", 1163 | "write": "1.0.3" 1164 | } 1165 | }, 1166 | "flatted": { 1167 | "version": "2.0.2", 1168 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 1169 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 1170 | "dev": true 1171 | }, 1172 | "foreach": { 1173 | "version": "2.0.5", 1174 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 1175 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 1176 | "dev": true 1177 | }, 1178 | "fs-extra": { 1179 | "version": "8.1.0", 1180 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1181 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1182 | "dev": true, 1183 | "requires": { 1184 | "graceful-fs": "^4.2.0", 1185 | "jsonfile": "^4.0.0", 1186 | "universalify": "^0.1.0" 1187 | } 1188 | }, 1189 | "fs.realpath": { 1190 | "version": "1.0.0", 1191 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1192 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1193 | "dev": true 1194 | }, 1195 | "function-bind": { 1196 | "version": "1.1.1", 1197 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1198 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1199 | "dev": true 1200 | }, 1201 | "functional-red-black-tree": { 1202 | "version": "1.0.1", 1203 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1204 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1205 | "dev": true 1206 | }, 1207 | "get-caller-file": { 1208 | "version": "2.0.5", 1209 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1210 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1211 | "dev": true 1212 | }, 1213 | "glob": { 1214 | "version": "7.1.6", 1215 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1216 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1217 | "dev": true, 1218 | "requires": { 1219 | "fs.realpath": "^1.0.0", 1220 | "inflight": "^1.0.4", 1221 | "inherits": "2", 1222 | "minimatch": "^3.0.4", 1223 | "once": "^1.3.0", 1224 | "path-is-absolute": "^1.0.0" 1225 | } 1226 | }, 1227 | "globals": { 1228 | "version": "11.12.0", 1229 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1230 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1231 | "dev": true 1232 | }, 1233 | "graceful-fs": { 1234 | "version": "4.2.4", 1235 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 1236 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 1237 | "dev": true 1238 | }, 1239 | "has": { 1240 | "version": "1.0.3", 1241 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1242 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1243 | "dev": true, 1244 | "requires": { 1245 | "function-bind": "^1.1.1" 1246 | } 1247 | }, 1248 | "has-flag": { 1249 | "version": "4.0.0", 1250 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1251 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1252 | "dev": true 1253 | }, 1254 | "has-symbols": { 1255 | "version": "1.0.1", 1256 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1257 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1258 | "dev": true 1259 | }, 1260 | "iconv-lite": { 1261 | "version": "0.4.24", 1262 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1263 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1264 | "dev": true, 1265 | "requires": { 1266 | "safer-buffer": ">= 2.1.2 < 3" 1267 | } 1268 | }, 1269 | "ignore": { 1270 | "version": "4.0.6", 1271 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1272 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1273 | "dev": true 1274 | }, 1275 | "import-fresh": { 1276 | "version": "3.2.1", 1277 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 1278 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 1279 | "dev": true, 1280 | "requires": { 1281 | "parent-module": "^1.0.0", 1282 | "resolve-from": "^4.0.0" 1283 | } 1284 | }, 1285 | "import-modules": { 1286 | "version": "1.1.0", 1287 | "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-1.1.0.tgz", 1288 | "integrity": "sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw=", 1289 | "dev": true 1290 | }, 1291 | "imurmurhash": { 1292 | "version": "0.1.4", 1293 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1294 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1295 | "dev": true 1296 | }, 1297 | "inflight": { 1298 | "version": "1.0.6", 1299 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1300 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1301 | "dev": true, 1302 | "requires": { 1303 | "once": "^1.3.0", 1304 | "wrappy": "1" 1305 | } 1306 | }, 1307 | "inherits": { 1308 | "version": "2.0.4", 1309 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1310 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1311 | "dev": true 1312 | }, 1313 | "ink": { 1314 | "version": "2.7.1", 1315 | "resolved": "https://registry.npmjs.org/ink/-/ink-2.7.1.tgz", 1316 | "integrity": "sha512-s7lJuQDJEdjqtaIWhp3KYHl6WV3J04U9zoQ6wVc+Xoa06XM27SXUY57qC5DO46xkF0CfgXMKkKNcgvSu/SAEpA==", 1317 | "dev": true, 1318 | "requires": { 1319 | "ansi-escapes": "^4.2.1", 1320 | "arrify": "^2.0.1", 1321 | "auto-bind": "^4.0.0", 1322 | "chalk": "^3.0.0", 1323 | "cli-cursor": "^3.1.0", 1324 | "cli-truncate": "^2.1.0", 1325 | "is-ci": "^2.0.0", 1326 | "lodash.throttle": "^4.1.1", 1327 | "log-update": "^3.0.0", 1328 | "prop-types": "^15.6.2", 1329 | "react-reconciler": "^0.24.0", 1330 | "scheduler": "^0.18.0", 1331 | "signal-exit": "^3.0.2", 1332 | "slice-ansi": "^3.0.0", 1333 | "string-length": "^3.1.0", 1334 | "widest-line": "^3.1.0", 1335 | "wrap-ansi": "^6.2.0", 1336 | "yoga-layout-prebuilt": "^1.9.3" 1337 | }, 1338 | "dependencies": { 1339 | "chalk": { 1340 | "version": "3.0.0", 1341 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 1342 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 1343 | "dev": true, 1344 | "requires": { 1345 | "ansi-styles": "^4.1.0", 1346 | "supports-color": "^7.1.0" 1347 | } 1348 | } 1349 | } 1350 | }, 1351 | "ink-confirm-input": { 1352 | "version": "2.0.0", 1353 | "resolved": "https://registry.npmjs.org/ink-confirm-input/-/ink-confirm-input-2.0.0.tgz", 1354 | "integrity": "sha512-YCd7a9XW0DIIbOhF3XiLo3WF86mOart9qI1qN56wT5IDJxU+j8BanEZh5/QXoazyIPSv1iXlHPIlRB5cbZIMIA==", 1355 | "dev": true, 1356 | "requires": { 1357 | "ink-text-input": "^3.2.1", 1358 | "prop-types": "^15.5.10", 1359 | "yn": "^3.1.1" 1360 | } 1361 | }, 1362 | "ink-spinner": { 1363 | "version": "3.1.0", 1364 | "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.1.0.tgz", 1365 | "integrity": "sha512-sPqmE4qeJ43vJFk9DGLd0wIqhMBAr3129ZqHPt7b847fVl+YTZ3g96khI82Db+FYE7v/Fc5B3lp4ZNtJfqpRUg==", 1366 | "dev": true, 1367 | "requires": { 1368 | "cli-spinners": "^1.0.0", 1369 | "prop-types": "^15.5.10" 1370 | } 1371 | }, 1372 | "ink-text-input": { 1373 | "version": "3.3.0", 1374 | "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-3.3.0.tgz", 1375 | "integrity": "sha512-gO4wrOf2ie3YuEARTIwGlw37lMjFn3Gk6CKIDrMlHb46WFMagZU7DplohjM24zynlqfnXA5UDEIfC2NBcvD8kg==", 1376 | "dev": true, 1377 | "requires": { 1378 | "chalk": "^3.0.0", 1379 | "prop-types": "^15.5.10" 1380 | }, 1381 | "dependencies": { 1382 | "chalk": { 1383 | "version": "3.0.0", 1384 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 1385 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 1386 | "dev": true, 1387 | "requires": { 1388 | "ansi-styles": "^4.1.0", 1389 | "supports-color": "^7.1.0" 1390 | } 1391 | } 1392 | } 1393 | }, 1394 | "inquirer": { 1395 | "version": "6.5.2", 1396 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 1397 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 1398 | "dev": true, 1399 | "requires": { 1400 | "ansi-escapes": "^3.2.0", 1401 | "chalk": "^2.4.2", 1402 | "cli-cursor": "^2.1.0", 1403 | "cli-width": "^2.0.0", 1404 | "external-editor": "^3.0.3", 1405 | "figures": "^2.0.0", 1406 | "lodash": "^4.17.12", 1407 | "mute-stream": "0.0.7", 1408 | "run-async": "^2.2.0", 1409 | "rxjs": "^6.4.0", 1410 | "string-width": "^2.1.0", 1411 | "strip-ansi": "^5.1.0", 1412 | "through": "^2.3.6" 1413 | }, 1414 | "dependencies": { 1415 | "ansi-escapes": { 1416 | "version": "3.2.0", 1417 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 1418 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 1419 | "dev": true 1420 | }, 1421 | "ansi-regex": { 1422 | "version": "3.0.0", 1423 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1424 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1425 | "dev": true 1426 | }, 1427 | "ansi-styles": { 1428 | "version": "3.2.1", 1429 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1430 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1431 | "dev": true, 1432 | "requires": { 1433 | "color-convert": "^1.9.0" 1434 | } 1435 | }, 1436 | "chalk": { 1437 | "version": "2.4.2", 1438 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1439 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1440 | "dev": true, 1441 | "requires": { 1442 | "ansi-styles": "^3.2.1", 1443 | "escape-string-regexp": "^1.0.5", 1444 | "supports-color": "^5.3.0" 1445 | } 1446 | }, 1447 | "cli-cursor": { 1448 | "version": "2.1.0", 1449 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 1450 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 1451 | "dev": true, 1452 | "requires": { 1453 | "restore-cursor": "^2.0.0" 1454 | } 1455 | }, 1456 | "color-convert": { 1457 | "version": "1.9.3", 1458 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1459 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1460 | "dev": true, 1461 | "requires": { 1462 | "color-name": "1.1.3" 1463 | } 1464 | }, 1465 | "color-name": { 1466 | "version": "1.1.3", 1467 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1468 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1469 | "dev": true 1470 | }, 1471 | "escape-string-regexp": { 1472 | "version": "1.0.5", 1473 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1474 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1475 | "dev": true 1476 | }, 1477 | "has-flag": { 1478 | "version": "3.0.0", 1479 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1480 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1481 | "dev": true 1482 | }, 1483 | "is-fullwidth-code-point": { 1484 | "version": "2.0.0", 1485 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1486 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1487 | "dev": true 1488 | }, 1489 | "mimic-fn": { 1490 | "version": "1.2.0", 1491 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1492 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1493 | "dev": true 1494 | }, 1495 | "onetime": { 1496 | "version": "2.0.1", 1497 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1498 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1499 | "dev": true, 1500 | "requires": { 1501 | "mimic-fn": "^1.0.0" 1502 | } 1503 | }, 1504 | "restore-cursor": { 1505 | "version": "2.0.0", 1506 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1507 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1508 | "dev": true, 1509 | "requires": { 1510 | "onetime": "^2.0.0", 1511 | "signal-exit": "^3.0.2" 1512 | } 1513 | }, 1514 | "string-width": { 1515 | "version": "2.1.1", 1516 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1517 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1518 | "dev": true, 1519 | "requires": { 1520 | "is-fullwidth-code-point": "^2.0.0", 1521 | "strip-ansi": "^4.0.0" 1522 | }, 1523 | "dependencies": { 1524 | "strip-ansi": { 1525 | "version": "4.0.0", 1526 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1527 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1528 | "dev": true, 1529 | "requires": { 1530 | "ansi-regex": "^3.0.0" 1531 | } 1532 | } 1533 | } 1534 | }, 1535 | "strip-ansi": { 1536 | "version": "5.2.0", 1537 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1538 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1539 | "dev": true, 1540 | "requires": { 1541 | "ansi-regex": "^4.1.0" 1542 | }, 1543 | "dependencies": { 1544 | "ansi-regex": { 1545 | "version": "4.1.0", 1546 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1547 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1548 | "dev": true 1549 | } 1550 | } 1551 | }, 1552 | "supports-color": { 1553 | "version": "5.5.0", 1554 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1555 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1556 | "dev": true, 1557 | "requires": { 1558 | "has-flag": "^3.0.0" 1559 | } 1560 | } 1561 | } 1562 | }, 1563 | "internal-slot": { 1564 | "version": "1.0.2", 1565 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", 1566 | "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", 1567 | "dev": true, 1568 | "requires": { 1569 | "es-abstract": "^1.17.0-next.1", 1570 | "has": "^1.0.3", 1571 | "side-channel": "^1.0.2" 1572 | } 1573 | }, 1574 | "is-arguments": { 1575 | "version": "1.0.4", 1576 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 1577 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 1578 | "dev": true 1579 | }, 1580 | "is-bigint": { 1581 | "version": "1.0.0", 1582 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", 1583 | "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", 1584 | "dev": true 1585 | }, 1586 | "is-boolean-object": { 1587 | "version": "1.0.1", 1588 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", 1589 | "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", 1590 | "dev": true 1591 | }, 1592 | "is-callable": { 1593 | "version": "1.2.0", 1594 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 1595 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 1596 | "dev": true 1597 | }, 1598 | "is-ci": { 1599 | "version": "2.0.0", 1600 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 1601 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 1602 | "dev": true, 1603 | "requires": { 1604 | "ci-info": "^2.0.0" 1605 | } 1606 | }, 1607 | "is-date-object": { 1608 | "version": "1.0.2", 1609 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1610 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1611 | "dev": true 1612 | }, 1613 | "is-docker": { 1614 | "version": "2.1.1", 1615 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", 1616 | "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", 1617 | "dev": true 1618 | }, 1619 | "is-extglob": { 1620 | "version": "2.1.1", 1621 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1622 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1623 | "dev": true 1624 | }, 1625 | "is-fullwidth-code-point": { 1626 | "version": "3.0.0", 1627 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1628 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1629 | "dev": true 1630 | }, 1631 | "is-glob": { 1632 | "version": "4.0.1", 1633 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1634 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1635 | "dev": true, 1636 | "requires": { 1637 | "is-extglob": "^2.1.1" 1638 | } 1639 | }, 1640 | "is-map": { 1641 | "version": "2.0.1", 1642 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", 1643 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", 1644 | "dev": true 1645 | }, 1646 | "is-number-object": { 1647 | "version": "1.0.4", 1648 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", 1649 | "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", 1650 | "dev": true 1651 | }, 1652 | "is-regex": { 1653 | "version": "1.1.1", 1654 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1655 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1656 | "dev": true, 1657 | "requires": { 1658 | "has-symbols": "^1.0.1" 1659 | } 1660 | }, 1661 | "is-set": { 1662 | "version": "2.0.1", 1663 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", 1664 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", 1665 | "dev": true 1666 | }, 1667 | "is-string": { 1668 | "version": "1.0.5", 1669 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1670 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1671 | "dev": true 1672 | }, 1673 | "is-symbol": { 1674 | "version": "1.0.3", 1675 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1676 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1677 | "dev": true, 1678 | "requires": { 1679 | "has-symbols": "^1.0.1" 1680 | } 1681 | }, 1682 | "is-typed-array": { 1683 | "version": "1.1.3", 1684 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", 1685 | "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", 1686 | "dev": true, 1687 | "requires": { 1688 | "available-typed-arrays": "^1.0.0", 1689 | "es-abstract": "^1.17.4", 1690 | "foreach": "^2.0.5", 1691 | "has-symbols": "^1.0.1" 1692 | } 1693 | }, 1694 | "is-weakmap": { 1695 | "version": "2.0.1", 1696 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1697 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 1698 | "dev": true 1699 | }, 1700 | "is-weakset": { 1701 | "version": "2.0.1", 1702 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", 1703 | "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", 1704 | "dev": true 1705 | }, 1706 | "is-wsl": { 1707 | "version": "2.2.0", 1708 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1709 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1710 | "dev": true, 1711 | "requires": { 1712 | "is-docker": "^2.0.0" 1713 | } 1714 | }, 1715 | "isarray": { 1716 | "version": "2.0.5", 1717 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1718 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 1719 | "dev": true 1720 | }, 1721 | "isexe": { 1722 | "version": "2.0.0", 1723 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1724 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1725 | "dev": true 1726 | }, 1727 | "js-tokens": { 1728 | "version": "4.0.0", 1729 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1730 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1731 | "dev": true 1732 | }, 1733 | "js-yaml": { 1734 | "version": "3.14.0", 1735 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1736 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1737 | "dev": true, 1738 | "requires": { 1739 | "argparse": "^1.0.7", 1740 | "esprima": "^4.0.0" 1741 | } 1742 | }, 1743 | "jsii": { 1744 | "version": "1.1.0", 1745 | "resolved": "https://registry.npmjs.org/jsii/-/jsii-1.1.0.tgz", 1746 | "integrity": "sha512-QmtKu2ZEXwMop+An4AnDsOZJr5EObcXtGiuw8bVy8ldq1WHiri4mvSWwZQI3ekUcWyOGjwFY9CuDy+xYbsf+Pg==", 1747 | "dev": true, 1748 | "requires": { 1749 | "@jsii/spec": "^1.1.0", 1750 | "case": "^1.6.2", 1751 | "colors": "^1.4.0", 1752 | "deep-equal": "^2.0.1", 1753 | "fs-extra": "^8.1.0", 1754 | "log4js": "^6.1.2", 1755 | "semver": "^7.1.3", 1756 | "semver-intersect": "^1.4.0", 1757 | "sort-json": "^2.0.0", 1758 | "spdx-license-list": "^6.1.0", 1759 | "typescript": "~3.8.3", 1760 | "yargs": "^15.3.0" 1761 | }, 1762 | "dependencies": { 1763 | "typescript": { 1764 | "version": "3.8.3", 1765 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 1766 | "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 1767 | "dev": true 1768 | } 1769 | } 1770 | }, 1771 | "jsii-pacmak": { 1772 | "version": "1.1.0", 1773 | "resolved": "https://registry.npmjs.org/jsii-pacmak/-/jsii-pacmak-1.1.0.tgz", 1774 | "integrity": "sha512-TLJjLN53fwA5n7hQ2UKRxRYUhead7sRILo4KOJQxN8dVAI1+oocp198QaVGbDD6ZE3aIUKKVThOkBZkY8K3zbw==", 1775 | "dev": true, 1776 | "requires": { 1777 | "@jsii/spec": "^1.1.0", 1778 | "camelcase": "^5.1.3", 1779 | "clone": "^2.1.2", 1780 | "codemaker": "^1.1.0", 1781 | "commonmark": "^0.29.1", 1782 | "escape-string-regexp": "^2.0.0", 1783 | "fs-extra": "^8.1.0", 1784 | "jsii-reflect": "^1.1.0", 1785 | "jsii-rosetta": "^1.1.0", 1786 | "semver": "^7.1.3", 1787 | "spdx-license-list": "^6.1.0", 1788 | "xmlbuilder": "^15.0.0", 1789 | "yargs": "^15.3.0" 1790 | }, 1791 | "dependencies": { 1792 | "codemaker": { 1793 | "version": "1.10.0", 1794 | "resolved": "https://registry.npmjs.org/codemaker/-/codemaker-1.10.0.tgz", 1795 | "integrity": "sha512-z/yLanhLaEJgSXkS6GVz9iH0EM0GwcE+MNpoT2r2z5DD14wlmPyMZi9+Q2k7BV1byAbsu3yMllgClkQVZkq52A==", 1796 | "dev": true, 1797 | "requires": { 1798 | "camelcase": "^6.0.0", 1799 | "decamelize": "^4.0.0", 1800 | "fs-extra": "^9.0.1" 1801 | }, 1802 | "dependencies": { 1803 | "camelcase": { 1804 | "version": "6.0.0", 1805 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", 1806 | "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", 1807 | "dev": true 1808 | }, 1809 | "fs-extra": { 1810 | "version": "9.0.1", 1811 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", 1812 | "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", 1813 | "dev": true, 1814 | "requires": { 1815 | "at-least-node": "^1.0.0", 1816 | "graceful-fs": "^4.2.0", 1817 | "jsonfile": "^6.0.1", 1818 | "universalify": "^1.0.0" 1819 | } 1820 | } 1821 | } 1822 | }, 1823 | "decamelize": { 1824 | "version": "4.0.0", 1825 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1826 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1827 | "dev": true 1828 | }, 1829 | "jsonfile": { 1830 | "version": "6.0.1", 1831 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", 1832 | "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", 1833 | "dev": true, 1834 | "requires": { 1835 | "graceful-fs": "^4.1.6", 1836 | "universalify": "^1.0.0" 1837 | } 1838 | }, 1839 | "universalify": { 1840 | "version": "1.0.0", 1841 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", 1842 | "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", 1843 | "dev": true 1844 | } 1845 | } 1846 | }, 1847 | "jsii-reflect": { 1848 | "version": "1.10.0", 1849 | "resolved": "https://registry.npmjs.org/jsii-reflect/-/jsii-reflect-1.10.0.tgz", 1850 | "integrity": "sha512-j/ijEUlaVxs/Vdkug0eegSrhFvFsIV5ljCB69n0UEktBtIawADeh0vkpZ885vI80tNWagYLvHmCDMGOIyhk00w==", 1851 | "dev": true, 1852 | "requires": { 1853 | "@jsii/spec": "^1.10.0", 1854 | "colors": "^1.4.0", 1855 | "fs-extra": "^9.0.1", 1856 | "oo-ascii-tree": "^1.10.0", 1857 | "yargs": "^15.4.0" 1858 | }, 1859 | "dependencies": { 1860 | "fs-extra": { 1861 | "version": "9.0.1", 1862 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", 1863 | "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", 1864 | "dev": true, 1865 | "requires": { 1866 | "at-least-node": "^1.0.0", 1867 | "graceful-fs": "^4.2.0", 1868 | "jsonfile": "^6.0.1", 1869 | "universalify": "^1.0.0" 1870 | } 1871 | }, 1872 | "jsonfile": { 1873 | "version": "6.0.1", 1874 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", 1875 | "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", 1876 | "dev": true, 1877 | "requires": { 1878 | "graceful-fs": "^4.1.6", 1879 | "universalify": "^1.0.0" 1880 | } 1881 | }, 1882 | "universalify": { 1883 | "version": "1.0.0", 1884 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", 1885 | "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", 1886 | "dev": true 1887 | } 1888 | } 1889 | }, 1890 | "jsii-rosetta": { 1891 | "version": "1.10.0", 1892 | "resolved": "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-1.10.0.tgz", 1893 | "integrity": "sha512-xwjXlYk4ttTh1NpwzvyWsDHsSCCENtNyE49lV3VF3CKKeNi5ANhgkhjnW71aKMG690hh2V4RBQfF6vwBBrtV1Q==", 1894 | "dev": true, 1895 | "requires": { 1896 | "@jsii/spec": "^1.10.0", 1897 | "commonmark": "^0.29.1", 1898 | "fs-extra": "^9.0.1", 1899 | "typescript": "~3.9.6", 1900 | "xmldom": "^0.3.0", 1901 | "yargs": "^15.4.0" 1902 | }, 1903 | "dependencies": { 1904 | "fs-extra": { 1905 | "version": "9.0.1", 1906 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", 1907 | "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", 1908 | "dev": true, 1909 | "requires": { 1910 | "at-least-node": "^1.0.0", 1911 | "graceful-fs": "^4.2.0", 1912 | "jsonfile": "^6.0.1", 1913 | "universalify": "^1.0.0" 1914 | } 1915 | }, 1916 | "jsonfile": { 1917 | "version": "6.0.1", 1918 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", 1919 | "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", 1920 | "dev": true, 1921 | "requires": { 1922 | "graceful-fs": "^4.1.6", 1923 | "universalify": "^1.0.0" 1924 | } 1925 | }, 1926 | "universalify": { 1927 | "version": "1.0.0", 1928 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", 1929 | "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", 1930 | "dev": true 1931 | } 1932 | } 1933 | }, 1934 | "json-schema-traverse": { 1935 | "version": "0.4.1", 1936 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1937 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1938 | "dev": true 1939 | }, 1940 | "json-stable-stringify-without-jsonify": { 1941 | "version": "1.0.1", 1942 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1943 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1944 | "dev": true 1945 | }, 1946 | "jsonfile": { 1947 | "version": "4.0.0", 1948 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1949 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1950 | "dev": true, 1951 | "requires": { 1952 | "graceful-fs": "^4.1.6" 1953 | } 1954 | }, 1955 | "jsonschema": { 1956 | "version": "1.2.6", 1957 | "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz", 1958 | "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA==", 1959 | "dev": true 1960 | }, 1961 | "jsx-ast-utils": { 1962 | "version": "2.4.1", 1963 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", 1964 | "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", 1965 | "dev": true, 1966 | "requires": { 1967 | "array-includes": "^3.1.1", 1968 | "object.assign": "^4.1.0" 1969 | } 1970 | }, 1971 | "levn": { 1972 | "version": "0.3.0", 1973 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1974 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1975 | "dev": true, 1976 | "requires": { 1977 | "prelude-ls": "~1.1.2", 1978 | "type-check": "~0.3.2" 1979 | } 1980 | }, 1981 | "locate-path": { 1982 | "version": "5.0.0", 1983 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1984 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1985 | "dev": true, 1986 | "requires": { 1987 | "p-locate": "^4.1.0" 1988 | } 1989 | }, 1990 | "lodash": { 1991 | "version": "4.17.20", 1992 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1993 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 1994 | "dev": true 1995 | }, 1996 | "lodash.camelcase": { 1997 | "version": "4.3.0", 1998 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1999 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", 2000 | "dev": true 2001 | }, 2002 | "lodash.get": { 2003 | "version": "4.4.2", 2004 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 2005 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 2006 | "dev": true 2007 | }, 2008 | "lodash.kebabcase": { 2009 | "version": "4.1.1", 2010 | "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", 2011 | "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", 2012 | "dev": true 2013 | }, 2014 | "lodash.snakecase": { 2015 | "version": "4.1.1", 2016 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 2017 | "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", 2018 | "dev": true 2019 | }, 2020 | "lodash.throttle": { 2021 | "version": "4.1.1", 2022 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 2023 | "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", 2024 | "dev": true 2025 | }, 2026 | "lodash.upperfirst": { 2027 | "version": "4.3.1", 2028 | "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", 2029 | "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", 2030 | "dev": true 2031 | }, 2032 | "lodash.zip": { 2033 | "version": "4.2.0", 2034 | "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", 2035 | "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", 2036 | "dev": true 2037 | }, 2038 | "log-update": { 2039 | "version": "3.4.0", 2040 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz", 2041 | "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==", 2042 | "dev": true, 2043 | "requires": { 2044 | "ansi-escapes": "^3.2.0", 2045 | "cli-cursor": "^2.1.0", 2046 | "wrap-ansi": "^5.0.0" 2047 | }, 2048 | "dependencies": { 2049 | "ansi-escapes": { 2050 | "version": "3.2.0", 2051 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 2052 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 2053 | "dev": true 2054 | }, 2055 | "ansi-regex": { 2056 | "version": "4.1.0", 2057 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2058 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2059 | "dev": true 2060 | }, 2061 | "ansi-styles": { 2062 | "version": "3.2.1", 2063 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2064 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2065 | "dev": true, 2066 | "requires": { 2067 | "color-convert": "^1.9.0" 2068 | } 2069 | }, 2070 | "cli-cursor": { 2071 | "version": "2.1.0", 2072 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 2073 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 2074 | "dev": true, 2075 | "requires": { 2076 | "restore-cursor": "^2.0.0" 2077 | } 2078 | }, 2079 | "color-convert": { 2080 | "version": "1.9.3", 2081 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2082 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2083 | "dev": true, 2084 | "requires": { 2085 | "color-name": "1.1.3" 2086 | } 2087 | }, 2088 | "color-name": { 2089 | "version": "1.1.3", 2090 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2091 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 2092 | "dev": true 2093 | }, 2094 | "emoji-regex": { 2095 | "version": "7.0.3", 2096 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2097 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2098 | "dev": true 2099 | }, 2100 | "is-fullwidth-code-point": { 2101 | "version": "2.0.0", 2102 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2103 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2104 | "dev": true 2105 | }, 2106 | "mimic-fn": { 2107 | "version": "1.2.0", 2108 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 2109 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 2110 | "dev": true 2111 | }, 2112 | "onetime": { 2113 | "version": "2.0.1", 2114 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 2115 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 2116 | "dev": true, 2117 | "requires": { 2118 | "mimic-fn": "^1.0.0" 2119 | } 2120 | }, 2121 | "restore-cursor": { 2122 | "version": "2.0.0", 2123 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2124 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2125 | "dev": true, 2126 | "requires": { 2127 | "onetime": "^2.0.0", 2128 | "signal-exit": "^3.0.2" 2129 | } 2130 | }, 2131 | "string-width": { 2132 | "version": "3.1.0", 2133 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2134 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2135 | "dev": true, 2136 | "requires": { 2137 | "emoji-regex": "^7.0.1", 2138 | "is-fullwidth-code-point": "^2.0.0", 2139 | "strip-ansi": "^5.1.0" 2140 | } 2141 | }, 2142 | "strip-ansi": { 2143 | "version": "5.2.0", 2144 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2145 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2146 | "dev": true, 2147 | "requires": { 2148 | "ansi-regex": "^4.1.0" 2149 | } 2150 | }, 2151 | "wrap-ansi": { 2152 | "version": "5.1.0", 2153 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2154 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 2155 | "dev": true, 2156 | "requires": { 2157 | "ansi-styles": "^3.2.0", 2158 | "string-width": "^3.0.0", 2159 | "strip-ansi": "^5.0.0" 2160 | } 2161 | } 2162 | } 2163 | }, 2164 | "log4js": { 2165 | "version": "6.3.0", 2166 | "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", 2167 | "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", 2168 | "dev": true, 2169 | "requires": { 2170 | "date-format": "^3.0.0", 2171 | "debug": "^4.1.1", 2172 | "flatted": "^2.0.1", 2173 | "rfdc": "^1.1.4", 2174 | "streamroller": "^2.2.4" 2175 | } 2176 | }, 2177 | "loose-envify": { 2178 | "version": "1.4.0", 2179 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2180 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2181 | "dev": true, 2182 | "requires": { 2183 | "js-tokens": "^3.0.0 || ^4.0.0" 2184 | } 2185 | }, 2186 | "mdurl": { 2187 | "version": "1.0.1", 2188 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 2189 | "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", 2190 | "dev": true 2191 | }, 2192 | "mimic-fn": { 2193 | "version": "2.1.0", 2194 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2195 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2196 | "dev": true 2197 | }, 2198 | "minimatch": { 2199 | "version": "3.0.4", 2200 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2201 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2202 | "dev": true, 2203 | "requires": { 2204 | "brace-expansion": "^1.1.7" 2205 | } 2206 | }, 2207 | "minimist": { 2208 | "version": "1.2.5", 2209 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2210 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 2211 | "dev": true 2212 | }, 2213 | "mkdirp": { 2214 | "version": "0.5.5", 2215 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 2216 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 2217 | "dev": true, 2218 | "requires": { 2219 | "minimist": "^1.2.5" 2220 | } 2221 | }, 2222 | "ms": { 2223 | "version": "2.1.2", 2224 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2225 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2226 | "dev": true 2227 | }, 2228 | "mute-stream": { 2229 | "version": "0.0.7", 2230 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 2231 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 2232 | "dev": true 2233 | }, 2234 | "natural-compare": { 2235 | "version": "1.4.0", 2236 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2237 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2238 | "dev": true 2239 | }, 2240 | "nice-try": { 2241 | "version": "1.0.5", 2242 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 2243 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 2244 | "dev": true 2245 | }, 2246 | "object-assign": { 2247 | "version": "4.1.1", 2248 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2249 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2250 | "dev": true 2251 | }, 2252 | "object-inspect": { 2253 | "version": "1.8.0", 2254 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 2255 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 2256 | "dev": true 2257 | }, 2258 | "object-is": { 2259 | "version": "1.1.2", 2260 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", 2261 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", 2262 | "dev": true, 2263 | "requires": { 2264 | "define-properties": "^1.1.3", 2265 | "es-abstract": "^1.17.5" 2266 | } 2267 | }, 2268 | "object-keys": { 2269 | "version": "1.1.1", 2270 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2271 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2272 | "dev": true 2273 | }, 2274 | "object.assign": { 2275 | "version": "4.1.0", 2276 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 2277 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 2278 | "dev": true, 2279 | "requires": { 2280 | "define-properties": "^1.1.2", 2281 | "function-bind": "^1.1.1", 2282 | "has-symbols": "^1.0.0", 2283 | "object-keys": "^1.0.11" 2284 | } 2285 | }, 2286 | "object.entries": { 2287 | "version": "1.1.2", 2288 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", 2289 | "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", 2290 | "dev": true, 2291 | "requires": { 2292 | "define-properties": "^1.1.3", 2293 | "es-abstract": "^1.17.5", 2294 | "has": "^1.0.3" 2295 | } 2296 | }, 2297 | "object.fromentries": { 2298 | "version": "2.0.2", 2299 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", 2300 | "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", 2301 | "dev": true, 2302 | "requires": { 2303 | "define-properties": "^1.1.3", 2304 | "es-abstract": "^1.17.0-next.1", 2305 | "function-bind": "^1.1.1", 2306 | "has": "^1.0.3" 2307 | } 2308 | }, 2309 | "object.values": { 2310 | "version": "1.1.1", 2311 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 2312 | "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 2313 | "dev": true, 2314 | "requires": { 2315 | "define-properties": "^1.1.3", 2316 | "es-abstract": "^1.17.0-next.1", 2317 | "function-bind": "^1.1.1", 2318 | "has": "^1.0.3" 2319 | } 2320 | }, 2321 | "once": { 2322 | "version": "1.4.0", 2323 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2324 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2325 | "dev": true, 2326 | "requires": { 2327 | "wrappy": "1" 2328 | } 2329 | }, 2330 | "onetime": { 2331 | "version": "5.1.2", 2332 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2333 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2334 | "dev": true, 2335 | "requires": { 2336 | "mimic-fn": "^2.1.0" 2337 | } 2338 | }, 2339 | "oo-ascii-tree": { 2340 | "version": "1.10.0", 2341 | "resolved": "https://registry.npmjs.org/oo-ascii-tree/-/oo-ascii-tree-1.10.0.tgz", 2342 | "integrity": "sha512-M8Ukuc8ZbT91WafPuKvsddASKeG4XySGZxv969pCtcUz9eCqSsabrIC7aoBAdZ5fTEtFyG89tSUmK5Sqtk/hZQ==", 2343 | "dev": true 2344 | }, 2345 | "open": { 2346 | "version": "7.1.0", 2347 | "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz", 2348 | "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==", 2349 | "dev": true, 2350 | "requires": { 2351 | "is-docker": "^2.0.0", 2352 | "is-wsl": "^2.1.1" 2353 | } 2354 | }, 2355 | "optionator": { 2356 | "version": "0.8.3", 2357 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2358 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2359 | "dev": true, 2360 | "requires": { 2361 | "deep-is": "~0.1.3", 2362 | "fast-levenshtein": "~2.0.6", 2363 | "levn": "~0.3.0", 2364 | "prelude-ls": "~1.1.2", 2365 | "type-check": "~0.3.2", 2366 | "word-wrap": "~1.2.3" 2367 | } 2368 | }, 2369 | "os-tmpdir": { 2370 | "version": "1.0.2", 2371 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2372 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2373 | "dev": true 2374 | }, 2375 | "p-limit": { 2376 | "version": "2.3.0", 2377 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2378 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2379 | "dev": true, 2380 | "requires": { 2381 | "p-try": "^2.0.0" 2382 | } 2383 | }, 2384 | "p-locate": { 2385 | "version": "4.1.0", 2386 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2387 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2388 | "dev": true, 2389 | "requires": { 2390 | "p-limit": "^2.2.0" 2391 | } 2392 | }, 2393 | "p-try": { 2394 | "version": "2.2.0", 2395 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2396 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2397 | "dev": true 2398 | }, 2399 | "parent-module": { 2400 | "version": "1.0.1", 2401 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2402 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2403 | "dev": true, 2404 | "requires": { 2405 | "callsites": "^3.0.0" 2406 | } 2407 | }, 2408 | "path-exists": { 2409 | "version": "4.0.0", 2410 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2411 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2412 | "dev": true 2413 | }, 2414 | "path-is-absolute": { 2415 | "version": "1.0.1", 2416 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2417 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2418 | "dev": true 2419 | }, 2420 | "path-is-inside": { 2421 | "version": "1.0.2", 2422 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2423 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2424 | "dev": true 2425 | }, 2426 | "path-key": { 2427 | "version": "2.0.1", 2428 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2429 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2430 | "dev": true 2431 | }, 2432 | "path-parse": { 2433 | "version": "1.0.6", 2434 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2435 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2436 | "dev": true 2437 | }, 2438 | "prelude-ls": { 2439 | "version": "1.1.2", 2440 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2441 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2442 | "dev": true 2443 | }, 2444 | "progress": { 2445 | "version": "2.0.3", 2446 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2447 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2448 | "dev": true 2449 | }, 2450 | "prop-types": { 2451 | "version": "15.7.2", 2452 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 2453 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 2454 | "dev": true, 2455 | "requires": { 2456 | "loose-envify": "^1.4.0", 2457 | "object-assign": "^4.1.1", 2458 | "react-is": "^16.8.1" 2459 | } 2460 | }, 2461 | "punycode": { 2462 | "version": "2.1.1", 2463 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2464 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2465 | "dev": true 2466 | }, 2467 | "ramda": { 2468 | "version": "0.26.1", 2469 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", 2470 | "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", 2471 | "dev": true 2472 | }, 2473 | "react": { 2474 | "version": "16.13.1", 2475 | "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", 2476 | "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", 2477 | "dev": true, 2478 | "requires": { 2479 | "loose-envify": "^1.1.0", 2480 | "object-assign": "^4.1.1", 2481 | "prop-types": "^15.6.2" 2482 | } 2483 | }, 2484 | "react-is": { 2485 | "version": "16.13.1", 2486 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2487 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 2488 | "dev": true 2489 | }, 2490 | "react-reconciler": { 2491 | "version": "0.24.0", 2492 | "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.24.0.tgz", 2493 | "integrity": "sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw==", 2494 | "dev": true, 2495 | "requires": { 2496 | "loose-envify": "^1.1.0", 2497 | "object-assign": "^4.1.1", 2498 | "prop-types": "^15.6.2", 2499 | "scheduler": "^0.18.0" 2500 | } 2501 | }, 2502 | "readline-sync": { 2503 | "version": "1.4.10", 2504 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 2505 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 2506 | "dev": true 2507 | }, 2508 | "regexp.prototype.flags": { 2509 | "version": "1.3.0", 2510 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 2511 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 2512 | "dev": true, 2513 | "requires": { 2514 | "define-properties": "^1.1.3", 2515 | "es-abstract": "^1.17.0-next.1" 2516 | } 2517 | }, 2518 | "regexpp": { 2519 | "version": "2.0.1", 2520 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2521 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2522 | "dev": true 2523 | }, 2524 | "require-directory": { 2525 | "version": "2.1.1", 2526 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2527 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2528 | "dev": true 2529 | }, 2530 | "require-main-filename": { 2531 | "version": "2.0.0", 2532 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 2533 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 2534 | "dev": true 2535 | }, 2536 | "resolve": { 2537 | "version": "1.17.0", 2538 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 2539 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 2540 | "dev": true, 2541 | "requires": { 2542 | "path-parse": "^1.0.6" 2543 | } 2544 | }, 2545 | "resolve-from": { 2546 | "version": "4.0.0", 2547 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2548 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2549 | "dev": true 2550 | }, 2551 | "restore-cursor": { 2552 | "version": "3.1.0", 2553 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2554 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2555 | "dev": true, 2556 | "requires": { 2557 | "onetime": "^5.1.0", 2558 | "signal-exit": "^3.0.2" 2559 | } 2560 | }, 2561 | "ret": { 2562 | "version": "0.1.15", 2563 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2564 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2565 | "dev": true 2566 | }, 2567 | "rfdc": { 2568 | "version": "1.1.4", 2569 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", 2570 | "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", 2571 | "dev": true 2572 | }, 2573 | "rimraf": { 2574 | "version": "2.6.3", 2575 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2576 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2577 | "dev": true, 2578 | "requires": { 2579 | "glob": "^7.1.3" 2580 | } 2581 | }, 2582 | "run-async": { 2583 | "version": "2.4.1", 2584 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2585 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2586 | "dev": true 2587 | }, 2588 | "rxjs": { 2589 | "version": "6.6.3", 2590 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", 2591 | "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", 2592 | "dev": true, 2593 | "requires": { 2594 | "tslib": "^1.9.0" 2595 | } 2596 | }, 2597 | "safe-regex": { 2598 | "version": "1.1.0", 2599 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2600 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2601 | "dev": true, 2602 | "requires": { 2603 | "ret": "~0.1.10" 2604 | } 2605 | }, 2606 | "safer-buffer": { 2607 | "version": "2.1.2", 2608 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2609 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2610 | "dev": true 2611 | }, 2612 | "scheduler": { 2613 | "version": "0.18.0", 2614 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", 2615 | "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", 2616 | "dev": true, 2617 | "requires": { 2618 | "loose-envify": "^1.1.0", 2619 | "object-assign": "^4.1.1" 2620 | } 2621 | }, 2622 | "semver": { 2623 | "version": "7.3.2", 2624 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 2625 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 2626 | "dev": true 2627 | }, 2628 | "semver-intersect": { 2629 | "version": "1.4.0", 2630 | "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", 2631 | "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", 2632 | "dev": true, 2633 | "requires": { 2634 | "semver": "^5.0.0" 2635 | }, 2636 | "dependencies": { 2637 | "semver": { 2638 | "version": "5.7.1", 2639 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2640 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2641 | "dev": true 2642 | } 2643 | } 2644 | }, 2645 | "set-blocking": { 2646 | "version": "2.0.0", 2647 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2648 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 2649 | "dev": true 2650 | }, 2651 | "shebang-command": { 2652 | "version": "1.2.0", 2653 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2654 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2655 | "dev": true, 2656 | "requires": { 2657 | "shebang-regex": "^1.0.0" 2658 | } 2659 | }, 2660 | "shebang-regex": { 2661 | "version": "1.0.0", 2662 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2663 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2664 | "dev": true 2665 | }, 2666 | "side-channel": { 2667 | "version": "1.0.2", 2668 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", 2669 | "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", 2670 | "dev": true, 2671 | "requires": { 2672 | "es-abstract": "^1.17.0-next.1", 2673 | "object-inspect": "^1.7.0" 2674 | } 2675 | }, 2676 | "signal-exit": { 2677 | "version": "3.0.3", 2678 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2679 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 2680 | "dev": true 2681 | }, 2682 | "slice-ansi": { 2683 | "version": "3.0.0", 2684 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", 2685 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", 2686 | "dev": true, 2687 | "requires": { 2688 | "ansi-styles": "^4.0.0", 2689 | "astral-regex": "^2.0.0", 2690 | "is-fullwidth-code-point": "^3.0.0" 2691 | } 2692 | }, 2693 | "sort-json": { 2694 | "version": "2.0.0", 2695 | "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.0.tgz", 2696 | "integrity": "sha512-OgXPErPJM/rBK5OhzIJ+etib/BmLQ1JY55Nb/ElhoWUec62pXNF/X6DrecHq3NW5OAGX0KxYD7m0HtgB9dvGeA==", 2697 | "dev": true, 2698 | "requires": { 2699 | "detect-indent": "^5.0.0", 2700 | "detect-newline": "^2.1.0", 2701 | "minimist": "^1.2.0" 2702 | } 2703 | }, 2704 | "spdx-license-list": { 2705 | "version": "6.2.0", 2706 | "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.2.0.tgz", 2707 | "integrity": "sha512-sHM1eQz+yYrKRIO5j/tzu3yWhbouQc2RYmCn5nNC296nVztW0VSlpJvmgsWPKAMEIqjfghXy3vvIwCbEOJPSHg==", 2708 | "dev": true 2709 | }, 2710 | "sprintf-js": { 2711 | "version": "1.0.3", 2712 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2713 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2714 | "dev": true 2715 | }, 2716 | "sscaff": { 2717 | "version": "1.2.0", 2718 | "resolved": "https://registry.npmjs.org/sscaff/-/sscaff-1.2.0.tgz", 2719 | "integrity": "sha512-Xyf2tWLnO0Z297FKag0e8IXFIpnYRWZ3FBn4dN2qlMRsOcpf0P54FPhvdcb1Es0Fm4hbhYYXa23jR+VPGPQhSg==", 2720 | "dev": true 2721 | }, 2722 | "streamroller": { 2723 | "version": "2.2.4", 2724 | "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", 2725 | "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", 2726 | "dev": true, 2727 | "requires": { 2728 | "date-format": "^2.1.0", 2729 | "debug": "^4.1.1", 2730 | "fs-extra": "^8.1.0" 2731 | }, 2732 | "dependencies": { 2733 | "date-format": { 2734 | "version": "2.1.0", 2735 | "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", 2736 | "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", 2737 | "dev": true 2738 | } 2739 | } 2740 | }, 2741 | "string-length": { 2742 | "version": "3.1.0", 2743 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", 2744 | "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", 2745 | "dev": true, 2746 | "requires": { 2747 | "astral-regex": "^1.0.0", 2748 | "strip-ansi": "^5.2.0" 2749 | }, 2750 | "dependencies": { 2751 | "ansi-regex": { 2752 | "version": "4.1.0", 2753 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2754 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2755 | "dev": true 2756 | }, 2757 | "astral-regex": { 2758 | "version": "1.0.0", 2759 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 2760 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 2761 | "dev": true 2762 | }, 2763 | "strip-ansi": { 2764 | "version": "5.2.0", 2765 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2766 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2767 | "dev": true, 2768 | "requires": { 2769 | "ansi-regex": "^4.1.0" 2770 | } 2771 | } 2772 | } 2773 | }, 2774 | "string-width": { 2775 | "version": "4.2.0", 2776 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 2777 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 2778 | "dev": true, 2779 | "requires": { 2780 | "emoji-regex": "^8.0.0", 2781 | "is-fullwidth-code-point": "^3.0.0", 2782 | "strip-ansi": "^6.0.0" 2783 | } 2784 | }, 2785 | "string.prototype.matchall": { 2786 | "version": "4.0.2", 2787 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", 2788 | "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", 2789 | "dev": true, 2790 | "requires": { 2791 | "define-properties": "^1.1.3", 2792 | "es-abstract": "^1.17.0", 2793 | "has-symbols": "^1.0.1", 2794 | "internal-slot": "^1.0.2", 2795 | "regexp.prototype.flags": "^1.3.0", 2796 | "side-channel": "^1.0.2" 2797 | } 2798 | }, 2799 | "string.prototype.repeat": { 2800 | "version": "0.2.0", 2801 | "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", 2802 | "integrity": "sha1-q6Nt4I3O5qWjN9SbLqHaGyj8Ds8=", 2803 | "dev": true 2804 | }, 2805 | "string.prototype.trimend": { 2806 | "version": "1.0.1", 2807 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 2808 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 2809 | "dev": true, 2810 | "requires": { 2811 | "define-properties": "^1.1.3", 2812 | "es-abstract": "^1.17.5" 2813 | } 2814 | }, 2815 | "string.prototype.trimstart": { 2816 | "version": "1.0.1", 2817 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2818 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 2819 | "dev": true, 2820 | "requires": { 2821 | "define-properties": "^1.1.3", 2822 | "es-abstract": "^1.17.5" 2823 | } 2824 | }, 2825 | "strip-ansi": { 2826 | "version": "6.0.0", 2827 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2828 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2829 | "dev": true, 2830 | "requires": { 2831 | "ansi-regex": "^5.0.0" 2832 | } 2833 | }, 2834 | "strip-json-comments": { 2835 | "version": "2.0.1", 2836 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2837 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2838 | "dev": true 2839 | }, 2840 | "supports-color": { 2841 | "version": "7.1.0", 2842 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 2843 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 2844 | "dev": true, 2845 | "requires": { 2846 | "has-flag": "^4.0.0" 2847 | } 2848 | }, 2849 | "table": { 2850 | "version": "5.4.6", 2851 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 2852 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2853 | "dev": true, 2854 | "requires": { 2855 | "ajv": "^6.10.2", 2856 | "lodash": "^4.17.14", 2857 | "slice-ansi": "^2.1.0", 2858 | "string-width": "^3.0.0" 2859 | }, 2860 | "dependencies": { 2861 | "ansi-regex": { 2862 | "version": "4.1.0", 2863 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2864 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2865 | "dev": true 2866 | }, 2867 | "ansi-styles": { 2868 | "version": "3.2.1", 2869 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2870 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2871 | "dev": true, 2872 | "requires": { 2873 | "color-convert": "^1.9.0" 2874 | } 2875 | }, 2876 | "astral-regex": { 2877 | "version": "1.0.0", 2878 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 2879 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 2880 | "dev": true 2881 | }, 2882 | "color-convert": { 2883 | "version": "1.9.3", 2884 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2885 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2886 | "dev": true, 2887 | "requires": { 2888 | "color-name": "1.1.3" 2889 | } 2890 | }, 2891 | "color-name": { 2892 | "version": "1.1.3", 2893 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2894 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 2895 | "dev": true 2896 | }, 2897 | "emoji-regex": { 2898 | "version": "7.0.3", 2899 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2900 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2901 | "dev": true 2902 | }, 2903 | "is-fullwidth-code-point": { 2904 | "version": "2.0.0", 2905 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2906 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2907 | "dev": true 2908 | }, 2909 | "slice-ansi": { 2910 | "version": "2.1.0", 2911 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2912 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 2913 | "dev": true, 2914 | "requires": { 2915 | "ansi-styles": "^3.2.0", 2916 | "astral-regex": "^1.0.0", 2917 | "is-fullwidth-code-point": "^2.0.0" 2918 | } 2919 | }, 2920 | "string-width": { 2921 | "version": "3.1.0", 2922 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2923 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2924 | "dev": true, 2925 | "requires": { 2926 | "emoji-regex": "^7.0.1", 2927 | "is-fullwidth-code-point": "^2.0.0", 2928 | "strip-ansi": "^5.1.0" 2929 | } 2930 | }, 2931 | "strip-ansi": { 2932 | "version": "5.2.0", 2933 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2934 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2935 | "dev": true, 2936 | "requires": { 2937 | "ansi-regex": "^4.1.0" 2938 | } 2939 | } 2940 | } 2941 | }, 2942 | "text-table": { 2943 | "version": "0.2.0", 2944 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2945 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2946 | "dev": true 2947 | }, 2948 | "through": { 2949 | "version": "2.3.8", 2950 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2951 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2952 | "dev": true 2953 | }, 2954 | "tmp": { 2955 | "version": "0.0.33", 2956 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2957 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2958 | "dev": true, 2959 | "requires": { 2960 | "os-tmpdir": "~1.0.2" 2961 | } 2962 | }, 2963 | "tslib": { 2964 | "version": "1.14.1", 2965 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2966 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2967 | "dev": true 2968 | }, 2969 | "tsutils": { 2970 | "version": "3.17.1", 2971 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 2972 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 2973 | "dev": true, 2974 | "requires": { 2975 | "tslib": "^1.8.1" 2976 | } 2977 | }, 2978 | "type-check": { 2979 | "version": "0.3.2", 2980 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2981 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2982 | "dev": true, 2983 | "requires": { 2984 | "prelude-ls": "~1.1.2" 2985 | } 2986 | }, 2987 | "type-fest": { 2988 | "version": "0.11.0", 2989 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 2990 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 2991 | "dev": true 2992 | }, 2993 | "typescript": { 2994 | "version": "3.9.7", 2995 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 2996 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 2997 | "dev": true 2998 | }, 2999 | "universalify": { 3000 | "version": "0.1.2", 3001 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 3002 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 3003 | "dev": true 3004 | }, 3005 | "uri-js": { 3006 | "version": "4.4.0", 3007 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 3008 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 3009 | "dev": true, 3010 | "requires": { 3011 | "punycode": "^2.1.0" 3012 | } 3013 | }, 3014 | "which": { 3015 | "version": "1.3.1", 3016 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3017 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3018 | "dev": true, 3019 | "requires": { 3020 | "isexe": "^2.0.0" 3021 | } 3022 | }, 3023 | "which-boxed-primitive": { 3024 | "version": "1.0.1", 3025 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", 3026 | "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", 3027 | "dev": true, 3028 | "requires": { 3029 | "is-bigint": "^1.0.0", 3030 | "is-boolean-object": "^1.0.0", 3031 | "is-number-object": "^1.0.3", 3032 | "is-string": "^1.0.4", 3033 | "is-symbol": "^1.0.2" 3034 | } 3035 | }, 3036 | "which-collection": { 3037 | "version": "1.0.1", 3038 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 3039 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 3040 | "dev": true, 3041 | "requires": { 3042 | "is-map": "^2.0.1", 3043 | "is-set": "^2.0.1", 3044 | "is-weakmap": "^2.0.1", 3045 | "is-weakset": "^2.0.1" 3046 | } 3047 | }, 3048 | "which-module": { 3049 | "version": "2.0.0", 3050 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 3051 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 3052 | "dev": true 3053 | }, 3054 | "which-typed-array": { 3055 | "version": "1.1.2", 3056 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", 3057 | "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", 3058 | "dev": true, 3059 | "requires": { 3060 | "available-typed-arrays": "^1.0.2", 3061 | "es-abstract": "^1.17.5", 3062 | "foreach": "^2.0.5", 3063 | "function-bind": "^1.1.1", 3064 | "has-symbols": "^1.0.1", 3065 | "is-typed-array": "^1.1.3" 3066 | } 3067 | }, 3068 | "widest-line": { 3069 | "version": "3.1.0", 3070 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 3071 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", 3072 | "dev": true, 3073 | "requires": { 3074 | "string-width": "^4.0.0" 3075 | } 3076 | }, 3077 | "word-wrap": { 3078 | "version": "1.2.3", 3079 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3080 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3081 | "dev": true 3082 | }, 3083 | "wrap-ansi": { 3084 | "version": "6.2.0", 3085 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 3086 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 3087 | "dev": true, 3088 | "requires": { 3089 | "ansi-styles": "^4.0.0", 3090 | "string-width": "^4.1.0", 3091 | "strip-ansi": "^6.0.0" 3092 | } 3093 | }, 3094 | "wrappy": { 3095 | "version": "1.0.2", 3096 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3097 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3098 | "dev": true 3099 | }, 3100 | "write": { 3101 | "version": "1.0.3", 3102 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 3103 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 3104 | "dev": true, 3105 | "requires": { 3106 | "mkdirp": "^0.5.1" 3107 | } 3108 | }, 3109 | "xmlbuilder": { 3110 | "version": "15.1.1", 3111 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", 3112 | "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", 3113 | "dev": true 3114 | }, 3115 | "xmldom": { 3116 | "version": "0.3.0", 3117 | "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", 3118 | "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", 3119 | "dev": true 3120 | }, 3121 | "y18n": { 3122 | "version": "4.0.0", 3123 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 3124 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 3125 | "dev": true 3126 | }, 3127 | "yargs": { 3128 | "version": "15.4.1", 3129 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 3130 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 3131 | "dev": true, 3132 | "requires": { 3133 | "cliui": "^6.0.0", 3134 | "decamelize": "^1.2.0", 3135 | "find-up": "^4.1.0", 3136 | "get-caller-file": "^2.0.1", 3137 | "require-directory": "^2.1.1", 3138 | "require-main-filename": "^2.0.0", 3139 | "set-blocking": "^2.0.0", 3140 | "string-width": "^4.2.0", 3141 | "which-module": "^2.0.0", 3142 | "y18n": "^4.0.0", 3143 | "yargs-parser": "^18.1.2" 3144 | } 3145 | }, 3146 | "yargs-parser": { 3147 | "version": "18.1.3", 3148 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 3149 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 3150 | "dev": true, 3151 | "requires": { 3152 | "camelcase": "^5.0.0", 3153 | "decamelize": "^1.2.0" 3154 | } 3155 | }, 3156 | "yn": { 3157 | "version": "3.1.1", 3158 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3159 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3160 | "dev": true 3161 | }, 3162 | "yoga-layout-prebuilt": { 3163 | "version": "1.9.6", 3164 | "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.6.tgz", 3165 | "integrity": "sha512-Wursw6uqLXLMjBAO4SEShuzj8+EJXhCF71/rJ7YndHTkRAYSU0GY3OghRqfAk9HPUAAFMuqp3U1Wl+01vmGRQQ==", 3166 | "dev": true, 3167 | "requires": { 3168 | "@types/yoga-layout": "1.9.2" 3169 | } 3170 | } 3171 | } 3172 | } 3173 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-static-website", 3 | "description": "The AWS static website infrastructure", 4 | "version": "1.0.0", 5 | "main": "./dist/main.js", 6 | "types": "./src/main.ts", 7 | "license": "MIT", 8 | "private": true, 9 | "author": { 10 | "name": "Scaffold", 11 | "email": "support@scaffold.sh", 12 | "url": "https://scaffold.sh" 13 | }, 14 | "homepage": "https://scaffold.sh/docs/infrastructures/aws/static-website", 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/scaffold-sh/aws-static-website.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/scaffold-sh/aws-static-website/issues" 21 | }, 22 | "keywords": [ 23 | "scaffold", 24 | "aws", 25 | "s3", 26 | "cloudfront", 27 | "codebuild", 28 | "codepipeline" 29 | ], 30 | "scripts": { 31 | "get": "cdktf get", 32 | "build": "yarn get && tsc", 33 | "synth": "cdktf synth", 34 | "compile": "tsc --pretty", 35 | "watch": "tsc -w", 36 | "test": "echo ok", 37 | "upgrade": "npm i cdktf@latest cdktf-cli@latest", 38 | "upgrade:next": "npm i cdktf@next cdktf-cli@next", 39 | "lint": "eslint . --ext .ts --config .eslintrc", 40 | "lint:fix": "eslint --fix . --ext .ts --config .eslintrc" 41 | }, 42 | "engines": { 43 | "node": ">=12.16.0" 44 | }, 45 | "dependencies": { 46 | "cdktf": "0.0.14", 47 | "constructs": "3.0.4", 48 | "dotenv-flow": "3.2.0" 49 | }, 50 | "devDependencies": { 51 | "@types/dotenv-flow": "3.0.1", 52 | "@types/node": "14.0.27", 53 | "cdktf-cli": "0.0.14", 54 | "eslint": "5.16.0", 55 | "eslint-config-oclif": "3.1.0", 56 | "eslint-config-oclif-typescript": "0.1.0", 57 | "typescript": "3.9.7" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /scaffold.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "AWS Static Website", 3 | "provider": "aws", 4 | "type": "aws_static_website", 5 | "version:": "1.0.0", 6 | "sourceUrl": "https://github.com/scaffold-sh/aws-static-website", 7 | "docsUrl": "https://scaffold.sh/docs/infrastructures/aws/static-website" 8 | } 9 | -------------------------------------------------------------------------------- /src/lib/constructs/continuousDeployment/build.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from "path" 2 | import { readFileSync } from "fs" 3 | 4 | import { Token } from "cdktf" 5 | import { Construct } from "constructs" 6 | 7 | import { 8 | CloudfrontDistribution, 9 | CodebuildProject, 10 | DataAwsCallerIdentity, 11 | DataAwsIamPolicyDocument, 12 | DataAwsRegion, 13 | IamRole, 14 | IamRolePolicy, 15 | S3Bucket, 16 | SsmParameter, 17 | } from "../../../imports/providers/aws" 18 | import escapeTemplateForTerraform from "../../../utils/escapeTemplateForTerraform" 19 | 20 | /** 21 | * Represents the properties of the build construct. 22 | * @property buildCommand The command used to build your website. 23 | * @property buildOutputDir The directory where the build command will output your website. 24 | * @property buildsEnvironmentVariables The builds environment variables as SSM parameters. 25 | * @property cloudfrontDistribution The CloudFront distribution used as CDN for your website. 26 | * @property currentAccount The AWS named profile used to create your infrastructure. 27 | * @property currentRegion The AWS region used to create your infrastructure. 28 | * @property pipelineS3Bucket The S3 bucket containing your pipeline artifacts. 29 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 30 | * @property websiteS3Bucket The S3 bucket containing your website source code. 31 | */ 32 | export interface IBuildConstructProps { 33 | buildCommand: string; 34 | buildOutputDir: string; 35 | buildsEnvironmentVariables: SsmParameter[]; 36 | cloudfrontDistribution: CloudfrontDistribution; 37 | currentAccount: DataAwsCallerIdentity; 38 | currentRegion: DataAwsRegion; 39 | pipelineS3Bucket: S3Bucket; 40 | resourceNamesPrefix: string; 41 | websiteS3Bucket: S3Bucket; 42 | } 43 | 44 | /** 45 | * Represents the CodeBuild project that will build and deploy your website. 46 | * @class 47 | * @extends Construct 48 | */ 49 | export class BuildConstruct extends Construct { 50 | /** 51 | * The CodeBuild project used to build and deploy your website. 52 | */ 53 | readonly codebuildProject: CodebuildProject 54 | 55 | /** 56 | * Creates a build construct. 57 | * @param scope The scope to attach the build construct to. 58 | * @param id An unique id used to distinguish constructs. 59 | * @param props The build construct properties. 60 | */ 61 | constructor(scope: Construct, id: string, props: IBuildConstructProps) { 62 | super(scope, id) 63 | 64 | const buildLogsGroup = `${props.resourceNamesPrefix}_codebuild_logs_group` 65 | 66 | const buildAssumeRolePolicyDocument = new DataAwsIamPolicyDocument(this, "codebuild_assume_role_policy", { 67 | version: "2012-10-17", 68 | statement: [{ 69 | effect: "Allow", 70 | principals: [{ 71 | type: "Service", 72 | identifiers: [ 73 | "codebuild.amazonaws.com", 74 | ], 75 | }], 76 | actions: [ 77 | "sts:AssumeRole", 78 | ], 79 | }], 80 | }) 81 | 82 | const buildRole = new IamRole(this, "codebuild_role", { 83 | assumeRolePolicy: buildAssumeRolePolicyDocument.json, 84 | name: `${props.resourceNamesPrefix}_codebuild_role`, 85 | forceDetachPolicies: true, 86 | }) 87 | 88 | const buildRolePolicyDocument = new DataAwsIamPolicyDocument(this, "codebuild_role_policy_document", { 89 | version: "2012-10-17", 90 | statement: [{ 91 | effect: "Allow", 92 | actions: [ 93 | "s3:GetObject", 94 | "s3:GetObjectVersion", 95 | "s3:PutObject", 96 | "s3:GetBucketAcl", 97 | "s3:GetBucketLocation", 98 | ], 99 | resources: [ 100 | Token.asString(props.pipelineS3Bucket.arn), 101 | `${Token.asString(props.pipelineS3Bucket.arn)}/*`, 102 | ], 103 | }, { 104 | effect: "Allow", 105 | actions: [ 106 | "logs:CreateLogGroup", 107 | "logs:CreateLogStream", 108 | "logs:PutLogEvents", 109 | ], 110 | resources: [ 111 | `arn:aws:logs:${props.currentRegion.name}:${props.currentAccount.accountId}:log-group:${buildLogsGroup}`, 112 | `arn:aws:logs:${props.currentRegion.name}:${props.currentAccount.accountId}:log-group:${buildLogsGroup}:*`, 113 | ], 114 | }, { 115 | effect: "Allow", 116 | actions: [ 117 | "ssm:GetParameters", 118 | ], 119 | resources: [ 120 | `arn:aws:ssm:${Token.asString(props.currentRegion.name)}:${props.currentAccount.accountId}:parameter/${props.resourceNamesPrefix}/builds-env/*`, 121 | ], 122 | }, { 123 | effect: "Allow", 124 | actions: [ 125 | "s3:GetObject", 126 | "s3:DeleteObject", 127 | "s3:PutObject", 128 | "s3:ListBucket", 129 | ], 130 | resources: [ 131 | `${Token.asString(props.websiteS3Bucket.arn)}`, 132 | `${Token.asString(props.websiteS3Bucket.arn)}/*`, 133 | ], 134 | }, { 135 | effect: "Allow", 136 | actions: [ 137 | "cloudfront:CreateInvalidation", 138 | ], 139 | resources: [ 140 | "*", 141 | ], 142 | }], 143 | }) 144 | 145 | new IamRolePolicy(this, "codebuild_role_policy", { 146 | name: `${props.resourceNamesPrefix}_codebuild_role_policy`, 147 | policy: buildRolePolicyDocument.json, 148 | role: Token.asString(buildRole.id), 149 | }) 150 | 151 | const buildEnvironmentVariables = props.buildsEnvironmentVariables.map(environmentVariable => { 152 | return { 153 | name: environmentVariable.tags!.name, 154 | type: "PARAMETER_STORE", 155 | // Explicit dependency to SSM parameters 156 | value: `\${${environmentVariable.fqn}.name}`, 157 | } 158 | }) 159 | 160 | const buildspec = escapeTemplateForTerraform( 161 | readFileSync( 162 | resolve(__dirname, "..", "..", "..", "..", "templates", "buildspec.yml") 163 | ).toString() 164 | ) 165 | 166 | const buildProjectEnvironmentVariables = [{ 167 | name: "AWS_S3_WEBSITE_BUCKET", 168 | value: Token.asString(props.websiteS3Bucket.bucket), 169 | }, { 170 | name: "AWS_CLOUDFRONT_DISTRIBUTION_ID", 171 | value: Token.asString(props.cloudfrontDistribution.id), 172 | }, { 173 | name: "BUILD_COMMAND", 174 | value: props.buildCommand, 175 | }, { 176 | name: "BUILD_OUTPUT_DIR", 177 | value: props.buildOutputDir, 178 | }].concat(buildEnvironmentVariables) 179 | 180 | this.codebuildProject = new CodebuildProject(this, "codebuild_project", { 181 | artifacts: [{ 182 | type: "CODEPIPELINE", 183 | }], 184 | buildTimeout: 60, 185 | cache: [{ 186 | modes: [ 187 | "LOCAL_SOURCE_CACHE", 188 | ], 189 | type: "LOCAL", 190 | }], 191 | environment: [{ 192 | computeType: "BUILD_GENERAL1_SMALL", 193 | image: "aws/codebuild/standard:4.0", 194 | type: "LINUX_CONTAINER", 195 | environmentVariable: buildProjectEnvironmentVariables, 196 | }], 197 | logsConfig: [{ 198 | cloudwatchLogs: [{ 199 | groupName: buildLogsGroup, 200 | streamName: `${props.resourceNamesPrefix}_codebuild_logs_stream`, 201 | }], 202 | }], 203 | name: `${props.resourceNamesPrefix}_codebuild_build_project`, 204 | serviceRole: buildRole.arn, 205 | source: [{ 206 | buildspec, 207 | type: "CODEPIPELINE", 208 | }], 209 | dependsOn: [ 210 | buildRole, 211 | props.cloudfrontDistribution, 212 | ], 213 | }) 214 | } 215 | } 216 | 217 | export default BuildConstruct 218 | -------------------------------------------------------------------------------- /src/lib/constructs/continuousDeployment/index.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | 3 | import { 4 | CloudfrontDistribution, 5 | DataAwsCallerIdentity, 6 | DataAwsRegion, 7 | S3Bucket, 8 | SsmParameter, 9 | } from "../../../imports/providers/aws" 10 | 11 | import BuildConstruct from "./build" 12 | import PipelineConstruct from "./pipeline" 13 | 14 | /** 15 | * Represents the properties of the continuous deployment construct. 16 | * @property awsProfile The AWS named profile used to create your infrastructure. 17 | * @property buildCommand The command used to build your website. 18 | * @property buildOutputDir The directory where the build command will output your website. 19 | * @property buildsEnvironmentVariables The builds environment variables as SSM parameters. 20 | * @property cloudfrontDistribution The CloudFront distribution used as CDN for your website. 21 | * @property currentAccount The AWS named profile used to create your infrastructure. 22 | * @property currentRegion The AWS region used to create your infrastructure as data object. 23 | * @property currentRegionAsString The AWS region used to create your infrastructure as string. 24 | * @property githubBranch The GitHub branch from which you want to deploy. 25 | * @property githubOauthToken The GitHub OAuth token used by your pipeline to access your repository. 26 | * @property githubRepo The GitHub repository used as source for your pipeline. 27 | * @property githubRepoOwner The GitHub repository owner (an user or an organization). 28 | * @property githubWebhookToken A random token that will be used by CodePipeline and GitHub to prevent impersonation. 29 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 30 | * @property websiteS3Bucket The S3 bucket containing your website source code. 31 | */ 32 | export interface IContinuousDeploymentConstructProps { 33 | awsProfile: string; 34 | buildCommand: string; 35 | buildOutputDir: string; 36 | buildsEnvironmentVariables: SsmParameter[]; 37 | cloudfrontDistrib: CloudfrontDistribution; 38 | currentAccount: DataAwsCallerIdentity; 39 | currentRegion: DataAwsRegion; 40 | currentRegionAsString: string; 41 | githubBranch: string; 42 | githubOauthToken: string; 43 | githubRepo: string; 44 | githubRepoOwner: string; 45 | githubWebhookToken: string; 46 | resourceNamesPrefix: string; 47 | websiteS3Bucket: S3Bucket; 48 | } 49 | 50 | /** 51 | * Represents the components required to 52 | * build and deploy your website on AWS S3. 53 | * @class 54 | * @extends Construct 55 | */ 56 | export class ContinuousDeploymentConstruct extends Construct { 57 | /** 58 | * The URL to the deployment pipeline execution details on AWS. 59 | */ 60 | readonly pipelineExecutionDetailsUrl: string 61 | 62 | /** 63 | * Creates a continuous deployment construct. 64 | * @param scope The scope to attach the continuous deployment construct to. 65 | * @param id An unique id used to distinguish constructs. 66 | * @param props The continuous deployment construct properties. 67 | */ 68 | constructor(scope: Construct, id: string, props: IContinuousDeploymentConstructProps) { 69 | super(scope, id) 70 | 71 | const pipelineS3Bucket = new S3Bucket(this, "pipeline_bucket", { 72 | acl: "private", 73 | bucket: `${props.resourceNamesPrefix.replace(/[^a-z0-9.-]/gi, "-")}-codepipeline-bucket`, 74 | forceDestroy: true, 75 | }) 76 | 77 | const build = new BuildConstruct(this, "build", { 78 | buildsEnvironmentVariables: props.buildsEnvironmentVariables, 79 | resourceNamesPrefix: props.resourceNamesPrefix, 80 | currentAccount: props.currentAccount, 81 | currentRegion: props.currentRegion, 82 | pipelineS3Bucket, 83 | websiteS3Bucket: props.websiteS3Bucket, 84 | buildCommand: props.buildCommand, 85 | buildOutputDir: props.buildOutputDir, 86 | cloudfrontDistribution: props.cloudfrontDistrib, 87 | }) 88 | 89 | const pipeline = new PipelineConstruct(this, "pipeline", { 90 | awsProfile: props.awsProfile, 91 | resourceNamesPrefix: props.resourceNamesPrefix, 92 | currentRegionAsString: props.currentRegionAsString, 93 | websiteS3Bucket: props.websiteS3Bucket, 94 | codebuildProject: build.codebuildProject, 95 | selfS3Bucket: pipelineS3Bucket, 96 | githubBranch: props.githubBranch, 97 | githubRepo: props.githubRepo, 98 | githubRepoOwner: props.githubRepoOwner, 99 | githubOauthToken: props.githubOauthToken, 100 | githubWebhookToken: props.githubWebhookToken, 101 | }) 102 | 103 | this.pipelineExecutionDetailsUrl = pipeline.executionDetailsUrl 104 | } 105 | } 106 | 107 | export default ContinuousDeploymentConstruct 108 | -------------------------------------------------------------------------------- /src/lib/constructs/continuousDeployment/pipeline.ts: -------------------------------------------------------------------------------- 1 | import { Token } from "cdktf" 2 | import { Construct } from "constructs" 3 | 4 | import { 5 | CodebuildProject, 6 | Codepipeline, 7 | CodepipelineWebhook, 8 | DataAwsIamPolicyDocument, 9 | IamRole, 10 | IamRolePolicy, 11 | S3Bucket, 12 | } from "../../../imports/providers/aws" 13 | 14 | import * as Null from "../../../imports/providers/null" 15 | 16 | /** 17 | * Represents the properties of the pipeline construct. 18 | * @property awsProfile The AWS named profile used to create your infrastructure. 19 | * @property codebuildProject The CodeBuild project used to build and deploy your website. 20 | * @property currentRegionAsString The AWS region used to create your infrastructure as string. 21 | * @property githubBranch The GitHub branch from which you want to deploy. 22 | * @property githubOauthToken The GitHub OAuth token used by your pipeline to access your repository. 23 | * @property githubRepo The GitHub repository used as source for your pipeline. 24 | * @property githubRepoOwner The GitHub repository owner (an user or an organization). 25 | * @property githubWebhookToken A random token that will be used by CodePipeline and GitHub to prevent impersonation. 26 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 27 | * @property selfS3Bucket The S3 bucket containing your pipeline artifacts. 28 | * @property websiteS3Bucket The S3 bucket containing your website source code. 29 | */ 30 | export interface IPipelineConstructProps { 31 | awsProfile: string; 32 | codebuildProject: CodebuildProject; 33 | currentRegionAsString: string; 34 | githubBranch: string; 35 | githubOauthToken: string; 36 | githubRepo: string; 37 | githubRepoOwner: string; 38 | githubWebhookToken: string; 39 | resourceNamesPrefix: string; 40 | selfS3Bucket: S3Bucket; 41 | websiteS3Bucket: S3Bucket; 42 | } 43 | 44 | /** 45 | * Represents the deployment pipeline of your infrastructure. 46 | * @class 47 | * @extends Construct 48 | */ 49 | export class PipelineConstruct extends Construct { 50 | /** 51 | * The URL to the pipeline execution details on AWS. 52 | */ 53 | readonly executionDetailsUrl: string 54 | 55 | /** 56 | * Creates a pipeline construct. 57 | * @param scope The scope to attach the pipeline construct to. 58 | * @param id An unique id used to distinguish constructs. 59 | * @param props The pipeline construct properties. 60 | */ 61 | constructor(scope: Construct, id: string, props: IPipelineConstructProps) { 62 | super(scope, id) 63 | 64 | const pipelineAssumeRolePolicyDocument = new DataAwsIamPolicyDocument(this, "codepipeline_assume_role_policy", { 65 | version: "2012-10-17", 66 | statement: [{ 67 | effect: "Allow", 68 | principals: [{ 69 | type: "Service", 70 | identifiers: [ 71 | "codepipeline.amazonaws.com", 72 | ], 73 | }], 74 | actions: [ 75 | "sts:AssumeRole", 76 | ], 77 | }], 78 | }) 79 | 80 | const pipelineRole = new IamRole(this, "codepipeline_role", { 81 | assumeRolePolicy: pipelineAssumeRolePolicyDocument.json, 82 | name: `${props.resourceNamesPrefix}_codepipeline_role`, 83 | forceDetachPolicies: true, 84 | }) 85 | 86 | const pipelineRolePolicyDocument = new DataAwsIamPolicyDocument(this, "codepipeline_role_policy_document", { 87 | version: "2012-10-17", 88 | statement: [{ 89 | effect: "Allow", 90 | actions: [ 91 | "s3:GetObject", 92 | "s3:GetObjectVersion", 93 | "s3:GetBucketVersioning", 94 | "s3:PutObject", 95 | ], 96 | resources: [ 97 | Token.asString(props.selfS3Bucket.arn), 98 | `${Token.asString(props.selfS3Bucket.arn)}/*`, 99 | ], 100 | }, 101 | 102 | { 103 | effect: "Allow", 104 | actions: [ 105 | "codebuild:BatchGetBuilds", 106 | "codebuild:StartBuild", 107 | ], 108 | resources: [ 109 | props.codebuildProject.arn, 110 | ], 111 | }], 112 | }) 113 | 114 | new IamRolePolicy(this, "codepipeline_role_policy", { 115 | name: `${props.resourceNamesPrefix}_codepipeline_role_policy`, 116 | policy: pipelineRolePolicyDocument.json, 117 | role: Token.asString(pipelineRole.id), 118 | dependsOn: [ 119 | props.codebuildProject, 120 | ], 121 | }) 122 | 123 | const pipelineSourceActionName = `${props.resourceNamesPrefix}_source` 124 | const pipeline = new Codepipeline(this, "codepipeline_pipeline", { 125 | name: `${props.resourceNamesPrefix}_codepipeline_pipeline`, 126 | roleArn: pipelineRole.arn, 127 | artifactStore: [{ 128 | location: Token.asString(props.selfS3Bucket.bucket), 129 | type: "S3", 130 | }], 131 | stage: [{ 132 | name: "Source", 133 | action: [{ 134 | category: "Source", 135 | name: pipelineSourceActionName, 136 | // See below 137 | configuration: {}, 138 | outputArtifacts: [ 139 | "source_output", 140 | ], 141 | owner: "ThirdParty", 142 | provider: "GitHub", 143 | version: "1", 144 | }], 145 | }, { 146 | name: "BuildAndDeploy", 147 | action: [{ 148 | category: "Build", 149 | name: `${props.resourceNamesPrefix}_build_and_deploy`, 150 | // See below 151 | configuration: {}, 152 | inputArtifacts: [ 153 | "source_output", 154 | ], 155 | owner: "AWS", 156 | provider: "CodeBuild", 157 | version: "1", 158 | }], 159 | }], 160 | dependsOn: [ 161 | pipelineRole, 162 | props.codebuildProject, 163 | ], 164 | }) 165 | 166 | this.executionDetailsUrl = `https://console.aws.amazon.com/codesuite/codepipeline/pipelines/${pipeline.name}/view?region=${props.currentRegionAsString}` 167 | 168 | // Fix https://github.com/hashicorp/terraform-cdk/issues/291 169 | 170 | pipeline.addOverride("stage.0.action.0.configuration", { 171 | Branch: props.githubBranch, 172 | OAuthToken: props.githubOauthToken, 173 | Owner: props.githubRepoOwner, 174 | PollForSourceChanges: false, 175 | Repo: props.githubRepo, 176 | }) 177 | 178 | pipeline.addOverride("stage.1.action.0.configuration", { 179 | ProjectName: props.codebuildProject.name, 180 | }) 181 | 182 | // --- 183 | 184 | const pipelineWebhook = new CodepipelineWebhook(this, "codepipeline_webhook", { 185 | name: `${props.resourceNamesPrefix}_codepipeline_webhook`, 186 | targetAction: pipelineSourceActionName, 187 | targetPipeline: pipeline.name, 188 | authentication: "GITHUB_HMAC", 189 | authenticationConfiguration: [{ 190 | secretToken: props.githubWebhookToken, 191 | }], 192 | filter: [{ 193 | jsonPath: "$.ref", 194 | matchEquals: "refs/heads/{Branch}", 195 | }], 196 | dependsOn: [ 197 | pipeline, 198 | ], 199 | }) 200 | 201 | // The GitHub provider doesn't support the 202 | // creation of webhooks for personal accounts. 203 | // To avoid requiring an organization, we use a "null" resource 204 | // that will call the "register-webhook-with-third-party" command directly. 205 | 206 | const deregisterWebhook = new Null.Resource(this, "deregister_webhook", { 207 | triggers: { 208 | webhook: Token.asString(pipelineWebhook.id), 209 | owner: `\${${pipeline.fqn}.stage.0.action.0.configuration.Owner}`, 210 | repo: `\${${pipeline.fqn}.stage.0.action.0.configuration.Repo}`, 211 | }, 212 | 213 | dependsOn: [ 214 | pipelineWebhook, 215 | ], 216 | }) 217 | 218 | deregisterWebhook.addOverride( 219 | "provisioner.local-exec.command", 220 | `aws codepipeline deregister-webhook-with-third-party --webhook-name ${pipelineWebhook.name} --profile ${props.awsProfile} --region ${props.currentRegionAsString}` 221 | ) 222 | 223 | deregisterWebhook.addOverride( 224 | "provisioner.local-exec.when", 225 | "destroy" 226 | ) 227 | 228 | const registerWebhook = new Null.Resource(this, "register_webhook", { 229 | triggers: { 230 | webhook: Token.asString(pipelineWebhook.id), 231 | owner: `\${${pipeline.fqn}.stage.0.action.0.configuration.Owner}`, 232 | repo: `\${${pipeline.fqn}.stage.0.action.0.configuration.Repo}`, 233 | }, 234 | 235 | dependsOn: [ 236 | deregisterWebhook, 237 | ], 238 | }) 239 | 240 | registerWebhook.addOverride( 241 | "provisioner.local-exec.command", 242 | `aws codepipeline register-webhook-with-third-party --webhook-name ${pipelineWebhook.name} --profile ${props.awsProfile} --region ${props.currentRegionAsString}` 243 | ) 244 | 245 | // --- 246 | 247 | const startPipeline = new Null.Resource(this, "start_pipeline", { 248 | dependsOn: [ 249 | registerWebhook, 250 | ], 251 | }) 252 | 253 | startPipeline.addOverride( 254 | "provisioner.local-exec.command", 255 | `aws codepipeline start-pipeline-execution --name ${pipeline.name} --profile ${props.awsProfile} --region ${props.currentRegionAsString}` 256 | ) 257 | } 258 | } 259 | 260 | export default PipelineConstruct 261 | -------------------------------------------------------------------------------- /src/lib/constructs/staticWebsite/bucket.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | import { Token } from "cdktf" 3 | 4 | import { 5 | DataAwsIamPolicyDocument, 6 | S3Bucket, 7 | S3BucketObject, 8 | } from "../../../imports/providers/aws" 9 | 10 | /** 11 | * Represents the properties of the bucket construct. 12 | * @property hasBuildCommand Do your website has a build command? 13 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 14 | */ 15 | export interface IBucketConstructProps { 16 | hasBuildCommand: boolean; 17 | resourceNamesPrefix: string; 18 | } 19 | 20 | /** 21 | * Represents the S3 bucket that will contain your website source code. 22 | * @class 23 | * @extends Construct 24 | */ 25 | class BucketConstruct extends Construct { 26 | /** 27 | * The S3 bucket containing your website source code. 28 | */ 29 | readonly S3Bucket: S3Bucket 30 | 31 | /** 32 | * Creates a bucket construct. 33 | * @param scope The scope to attach the Bucket construct to. 34 | * @param id An unique id used to distinguish constructs. 35 | * @param props The Bucket construct properties. 36 | */ 37 | constructor(scope: Construct, id: string, props: IBucketConstructProps) { 38 | super(scope, id) 39 | 40 | const websiteBucketName = `${props.resourceNamesPrefix.replace(/[^a-z0-9.-]/gi, "-")}-website-bucket` 41 | 42 | const websiteBucketPolicy = new DataAwsIamPolicyDocument(this, "s3_bucket_policy", { 43 | statement: [{ 44 | actions: ["s3:GetObject"], 45 | resources: [ 46 | `arn:aws:s3:::${websiteBucketName}/*`, 47 | ], 48 | principals: [{ 49 | identifiers: ["*"], 50 | type: "*", 51 | }], 52 | }], 53 | }) 54 | 55 | this.S3Bucket = new S3Bucket(this, "s3_bucket", { 56 | bucket: websiteBucketName, 57 | policy: websiteBucketPolicy.json, 58 | website: [{ 59 | indexDocument: "index.html", 60 | // Routing managed by SPA framework? 61 | // Must match "customErrorResponse" CDN property 62 | errorDocument: props.hasBuildCommand ? "index.html" : "error.html", 63 | }], 64 | forceDestroy: true, 65 | }) 66 | 67 | new S3BucketObject(this, "s3_index_placeholder_file", { 68 | key: "index.html", 69 | bucket: Token.asString(this.S3Bucket.id), 70 | content: "It's a placeholder index.html file waiting for your pipeline to end!", 71 | contentType: "text/html", 72 | }) 73 | 74 | if (!props.hasBuildCommand) { 75 | new S3BucketObject(this, "s3_error_placeholder_file", { 76 | key: "error.html", 77 | bucket: Token.asString(this.S3Bucket.id), 78 | content: "It's a placeholder error.html file waiting for your pipeline to end!", 79 | contentType: "text/html", 80 | }) 81 | } 82 | } 83 | } 84 | 85 | export default BucketConstruct 86 | -------------------------------------------------------------------------------- /src/lib/constructs/staticWebsite/cdn.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | import { Token } from "cdktf" 3 | 4 | import { 5 | AcmCertificate, 6 | CloudfrontDistribution, 7 | S3Bucket, 8 | } from "../../../imports/providers/aws" 9 | 10 | /** 11 | * Represents the properties of the CDN construct. 12 | * @property acmCertificate The ACM certificate created for your website. 13 | * @property domainNames The domain names covered by the ACM certificate. 14 | * @property enableHttps Do HTTPS needs to be enabled? 15 | * @property hasBuildCommand Do your website has a build command? 16 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 17 | * @property websiteS3Bucket The S3 bucket containing your website source code. 18 | */ 19 | export interface ICdnConstructProps { 20 | acmCertificate: AcmCertificate; 21 | domainNames: string[]; 22 | enableHttps: boolean; 23 | hasBuildCommand: boolean; 24 | resourceNamesPrefix: string; 25 | websiteS3Bucket: S3Bucket; 26 | } 27 | 28 | /** 29 | * Represents the CloudFront distribution used as CDN for your website. 30 | * @class 31 | * @extends Construct 32 | */ 33 | class CdnConstruct extends Construct { 34 | /** 35 | * The CloudFront distribution created for your website. 36 | */ 37 | readonly cloudfrontDistribution: CloudfrontDistribution 38 | 39 | /** 40 | * Creates a CDN construct. 41 | * @param scope The scope to attach the CDN construct to. 42 | * @param id An unique id used to distinguish constructs. 43 | * @param props The CDN construct properties. 44 | */ 45 | constructor(scope: Construct, id: string, props: ICdnConstructProps) { 46 | super(scope, id) 47 | 48 | const websiteOriginID = props.resourceNamesPrefix 49 | 50 | const cloudfrontDistribution = new CloudfrontDistribution(this, "cloudfront_distribution", { 51 | enabled: true, 52 | defaultRootObject: "index.html", 53 | aliases: props.enableHttps ? props.domainNames : undefined, 54 | origin: [{ 55 | domainName: props.websiteS3Bucket.bucketRegionalDomainName, 56 | originId: websiteOriginID, 57 | }], 58 | customErrorResponse: [{ 59 | // If the routing is managed by a SPA framework 60 | // all paths must be forwarded to "index.html". 61 | // If the object isn’t in the bucket, S3 returns a 403 error. 62 | // Must match "errorDocument" website bucket property. 63 | errorCode: 403, 64 | responseCode: props.hasBuildCommand ? 200 : 403, 65 | responsePagePath: props.hasBuildCommand ? "/index.html" : "/error.html", 66 | }], 67 | defaultCacheBehavior: [{ 68 | targetOriginId: websiteOriginID, 69 | allowedMethods: ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"], 70 | cachedMethods: ["GET", "HEAD"], 71 | viewerProtocolPolicy: "redirect-to-https", 72 | forwardedValues: [{ 73 | queryString: false, 74 | cookies: [{ 75 | forward: "none", 76 | }], 77 | }], 78 | }], 79 | restrictions: [{ 80 | geoRestriction: [{ 81 | restrictionType: "none", 82 | }], 83 | }], 84 | // HTTPS activation is a two-step process because 85 | // ACM certificates need to be "issued" 86 | // before attaching to a Cloudfront distribution 87 | viewerCertificate: [props.enableHttps ? { 88 | acmCertificateArn: Token.asString(props.acmCertificate.id), 89 | sslSupportMethod: "sni-only", 90 | } : { 91 | cloudfrontDefaultCertificate: true, 92 | }], 93 | dependsOn: [ 94 | props.websiteS3Bucket, 95 | ], 96 | }) 97 | 98 | this.cloudfrontDistribution = cloudfrontDistribution 99 | } 100 | } 101 | 102 | export default CdnConstruct 103 | -------------------------------------------------------------------------------- /src/lib/constructs/staticWebsite/environmentVariables.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | 3 | import { 4 | SsmParameter, 5 | } from "../../../imports/providers/aws" 6 | 7 | import { EnvironmentVariables } from "../../../main" 8 | import escapeTemplateForTerraform from "../../../utils/escapeTemplateForTerraform" 9 | 10 | /** 11 | * Represents the properties of the environment variables construct. 12 | * @property buildsEnvironmentVariables The environment variables of your builds as "key => value" format. 13 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 14 | */ 15 | export interface IEnvironmentVariablesProps { 16 | buildsEnvironmentVariables: EnvironmentVariables; 17 | resourceNamesPrefix: string; 18 | } 19 | 20 | /** 21 | * Represents the SSM parameters that will store the 22 | * environment variables of your builds. 23 | * @class 24 | * @extends Construct 25 | */ 26 | export class EnvironmentVariablesConstruct extends Construct { 27 | /** 28 | * The builds SSM parameters. 29 | */ 30 | readonly buildsEnvironmentVariables: SsmParameter[] 31 | 32 | /** 33 | * Creates an environment variables construct. 34 | * @param scope The scope to attach the environment variables construct to. 35 | * @param id An unique id used to distinguish constructs. 36 | * @param props The environment variables construct properties. 37 | */ 38 | constructor(scope: Construct, id: string, props: IEnvironmentVariablesProps) { 39 | super(scope, id) 40 | 41 | this.buildsEnvironmentVariables = [] 42 | 43 | Object.keys(props.buildsEnvironmentVariables).forEach(environmentVariableName => { 44 | this.buildsEnvironmentVariables.push(new SsmParameter(this, `ssm_parameter_builds_${environmentVariableName.toLowerCase()}`, { 45 | // Must match build role IAM policy ressources 46 | name: `/${props.resourceNamesPrefix}/builds-env/${environmentVariableName}`, 47 | type: "SecureString", 48 | value: escapeTemplateForTerraform(props.buildsEnvironmentVariables[environmentVariableName]), 49 | // Used in builds project to 50 | // access environment variable name 51 | tags: { 52 | name: environmentVariableName, 53 | }, 54 | })) 55 | }) 56 | } 57 | } 58 | 59 | export default EnvironmentVariablesConstruct 60 | -------------------------------------------------------------------------------- /src/lib/constructs/staticWebsite/index.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | import { TerraformProvider } from "cdktf" 3 | 4 | import { CloudfrontDistribution, S3Bucket, SsmParameter } from "../../../imports/providers/aws" 5 | import SslConstruct from "./ssl" 6 | 7 | import BucketConstruct from "./bucket" 8 | import CdnConstruct from "./cdn" 9 | 10 | import { EnvironmentVariables } from "../../../main" 11 | import EnvironmentVariablesConstruct from "./environmentVariables" 12 | 13 | /** 14 | * Represents the properties of the static website construct. 15 | * @property awsUsEast1Provider The AWS US East 1 provider required to create ACM certificates for CloudFront. 16 | * @property buildsEnvironmentVariables The environment variables of your builds as "key => value" format. 17 | * @property domainNames The domain names that need to be covered by the ACM certificate. 18 | * @property enableHttps Do HTTPS needs to be enabled? 19 | * @property hasBuildCommand Do your website has a build command? 20 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 21 | */ 22 | export interface IStaticWebsiteConstructProps { 23 | awsUsEast1Provider: TerraformProvider; 24 | buildsEnvironmentVariables: EnvironmentVariables; 25 | domainNames: string[]; 26 | enableHttps: boolean; 27 | hasBuildCommand: boolean; 28 | resourceNamesPrefix: string; 29 | } 30 | 31 | /** 32 | * Represents a DNS record. 33 | * @property name The name of the DNS record. 34 | * @property type The type of the DNS record. 35 | * @property value The value of the DNS record. 36 | */ 37 | export interface IDnsRecord { 38 | name: string; 39 | type: string; 40 | value: string; 41 | } 42 | 43 | /** 44 | * Represents the components required to host a static website on AWS. 45 | * @class 46 | * @extends Construct 47 | */ 48 | class StaticWebsiteConstruct extends Construct { 49 | /** 50 | * The builds environment variables as SSM parameters. 51 | */ 52 | readonly buildsEnvironmentVariables: SsmParameter[] 53 | 54 | /** 55 | * The CloudFront distribution used for your website. 56 | */ 57 | readonly cloudfrontDistribution: CloudfrontDistribution 58 | 59 | /** 60 | * The DNS records that you need to set to validate your ACM certificate. 61 | */ 62 | readonly sslValidationDnsRecords: IDnsRecord[] 63 | 64 | /** 65 | * The S3 bucket containing your website source code. 66 | */ 67 | readonly websiteS3Bucket: S3Bucket 68 | 69 | /** 70 | * Creates a static website construct. 71 | * @param scope The scope to attach the static website construct to. 72 | * @param id An unique id used to distinguish constructs. 73 | * @param props The static website construct properties. 74 | */ 75 | constructor(scope: Construct, id: string, props: IStaticWebsiteConstructProps) { 76 | super(scope, id) 77 | 78 | if (props.domainNames.length === 0) { 79 | throw new Error("You must specify at least one domain name") 80 | } 81 | 82 | const environmentVariables = new EnvironmentVariablesConstruct(this, "environment_variables", { 83 | buildsEnvironmentVariables: props.buildsEnvironmentVariables, 84 | resourceNamesPrefix: props.resourceNamesPrefix, 85 | }) 86 | 87 | this.buildsEnvironmentVariables = environmentVariables.buildsEnvironmentVariables 88 | 89 | const ssl = new SslConstruct(this, "ssl", { 90 | resourceNamesPrefix: props.resourceNamesPrefix, 91 | domainNames: props.domainNames, 92 | awsUsEast1Provider: props.awsUsEast1Provider, 93 | }) 94 | 95 | this.sslValidationDnsRecords = ssl.validationDns 96 | 97 | const bucket = new BucketConstruct(this, "bucket", { 98 | resourceNamesPrefix: props.resourceNamesPrefix, 99 | hasBuildCommand: props.hasBuildCommand, 100 | }) 101 | 102 | this.websiteS3Bucket = bucket.S3Bucket 103 | 104 | const cdn = new CdnConstruct(this, "cdn", { 105 | websiteS3Bucket: this.websiteS3Bucket, 106 | acmCertificate: ssl.acmCertificate, 107 | domainNames: props.domainNames, 108 | resourceNamesPrefix: props.resourceNamesPrefix, 109 | hasBuildCommand: props.hasBuildCommand, 110 | enableHttps: props.enableHttps, 111 | }) 112 | 113 | this.cloudfrontDistribution = cdn.cloudfrontDistribution 114 | } 115 | } 116 | 117 | export default StaticWebsiteConstruct 118 | -------------------------------------------------------------------------------- /src/lib/constructs/staticWebsite/ssl.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs" 2 | import { TerraformProvider } from "cdktf" 3 | 4 | import { AcmCertificate } from "../../../imports/providers/aws" 5 | import { IDnsRecord } from "." 6 | 7 | /** 8 | * Represents the properties of the SSL construct. 9 | * @property awsUsEast1Provider The AWS US East 1 provider required to create ACM certificates for CloudFront. 10 | * @property domainNames The domain names that need to be covered by the ACM certificate. 11 | * @property resourceNamesPrefix An unique custom prefix used to avoid name colision with existing resources. 12 | */ 13 | export interface ISslConstructProps { 14 | awsUsEast1Provider: TerraformProvider; 15 | domainNames: string[]; 16 | resourceNamesPrefix: string; 17 | } 18 | 19 | /** 20 | * Represents the ACM certificate used to add SSL to your website. 21 | * @class 22 | * @extends Construct 23 | */ 24 | class SslConstruct extends Construct { 25 | /** 26 | * The ACM certificate created for your website. 27 | */ 28 | readonly acmCertificate: AcmCertificate 29 | 30 | /** 31 | * The DNS records that you need to set to validate your ACM certificate. 32 | */ 33 | readonly validationDns: IDnsRecord[] 34 | 35 | /** 36 | * Creates a SSL construct. 37 | * @param scope The scope to attach the SSL construct to. 38 | * @param id An unique id used to distinguish constructs. 39 | * @param props The SSL construct properties. 40 | */ 41 | constructor(scope: Construct, id: string, props: ISslConstructProps) { 42 | super(scope, id) 43 | 44 | if (props.domainNames.length === 0) { 45 | throw new Error("You must specify at least one domain name") 46 | } 47 | 48 | this.acmCertificate = new AcmCertificate(this, "acm_certificate", { 49 | provider: props.awsUsEast1Provider, 50 | domainName: props.domainNames[0], 51 | subjectAlternativeNames: props.domainNames.slice(1), 52 | validationMethod: "DNS", 53 | tags: { 54 | Name: `${props.resourceNamesPrefix}_acm_certificate`, 55 | }, 56 | lifecycle: { 57 | createBeforeDestroy: true, 58 | }, 59 | }) 60 | 61 | this.validationDns = props.domainNames.map((_, index) => { 62 | // Raw Terraform while waiting for the CDKTF to support complex types 63 | return { 64 | name: `\${tolist(${this.acmCertificate.fqn}.domain_validation_options)["${index}"].resource_record_name}`, 65 | type: `\${tolist(${this.acmCertificate.fqn}.domain_validation_options)["${index}"].resource_record_type}`, 66 | value: `\${tolist(${this.acmCertificate.fqn}.domain_validation_options)["${index}"].resource_record_value}`, 67 | } 68 | }) 69 | } 70 | } 71 | 72 | export default SslConstruct 73 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | // Populate "process.env" 2 | require("dotenv-flow").config({ path: require("path").resolve(__dirname, "..") }) 3 | 4 | import { Construct } from "constructs" 5 | 6 | import { 7 | App, 8 | S3Backend, 9 | TerraformOutput, 10 | TerraformStack, 11 | } from "cdktf" 12 | 13 | import { 14 | AwsProvider, 15 | DataAwsCallerIdentity, 16 | DataAwsRegion, 17 | } from "./imports/providers/aws" 18 | 19 | import ContinuousDeploymentConstruct from "./lib/constructs/continuousDeployment" 20 | import StaticWebsiteConstruct from "./lib/constructs/staticWebsite" 21 | 22 | /** 23 | * Represents your build environment variables as "key => value" format. 24 | */ 25 | export type EnvironmentVariables = { [key: string]: string } 26 | 27 | /** 28 | * Represents the Scaffold AWS Static website infrastructure. 29 | * @class 30 | * @extends TerraformStack 31 | */ 32 | class ScaffoldAWSStaticWebsite extends TerraformStack { 33 | /** 34 | * Creates the Scaffold AWS Serverless Docker infrastructure. 35 | * @param scope The scope to attach the infrastructure to. 36 | * @param id An unique id used to distinguish constructs. 37 | */ 38 | constructor(scope: Construct, id: string) { 39 | super(scope, id) 40 | 41 | Object.keys(process.env).forEach(environmentVariableName => { 42 | if (!environmentVariableName.match(/^[a-z0-9_-]+$/gi)) { 43 | throw new Error("Environment variable names must match /^[a-z0-9_-]+$/i format") 44 | } 45 | }) 46 | 47 | const resourceNamesPrefix = process.env.SCAFFOLD_RESOURCE_NAMES_PREFIX 48 | 49 | const domainNames = process.env.DOMAIN_NAMES.split(",") 50 | const enableHTTPS = process.env.ENABLE_HTTPS === "true" 51 | 52 | const githubOauthToken = process.env.GITHUB_OAUTH_TOKEN 53 | const githubWebhookToken = process.env.GITHUB_WEBHOOK_TOKEN 54 | 55 | const githubRepo = process.env.GITHUB_REPO 56 | const githubRepoOwner = process.env.GITHUB_REPO_OWNER 57 | const githubBranch = process.env.GITHUB_BRANCH 58 | 59 | const hasBuildCommand = Boolean(process.env.BUILD_COMMAND) 60 | const buildCommand = process.env.BUILD_COMMAND || "echo No build command" 61 | const buildOutputDir = process.env.BUILD_OUTPUT_DIR || "." 62 | 63 | // Environment variables that start with "BUILD_" 64 | // will become your builds environment variables 65 | const buildsEnvironmentVariables = Object 66 | .keys(process.env) 67 | .filter(environmentVariableKey => environmentVariableKey.startsWith("BUILD_") && !["BUILD_COMMAND", "BUILD_OUTPUT_DIR"].includes(environmentVariableKey)) 68 | .reduce((acc, environmentVariableKey) => { 69 | acc[environmentVariableKey.replace(/^BUILD_/, "")] = process.env[environmentVariableKey] as string 70 | return acc 71 | }, {} as EnvironmentVariables) 72 | 73 | const awsS3BackendKey = process.env.SCAFFOLD_AWS_S3_BACKEND_KEY 74 | const awsS3BackendBucket = process.env.SCAFFOLD_AWS_S3_BACKEND_BUCKET 75 | const awsS3BackendDynamodbTable = process.env.SCAFFOLD_AWS_S3_BACKEND_DYNAMODB_TABLE 76 | 77 | const awsRegion = process.env.SCAFFOLD_AWS_REGION 78 | const awsProfile = process.env.SCAFFOLD_AWS_PROFILE 79 | 80 | new S3Backend(this, { 81 | key: awsS3BackendKey, 82 | bucket: awsS3BackendBucket, 83 | dynamodbTable: awsS3BackendDynamodbTable, 84 | encrypt: true, 85 | region: awsRegion, 86 | profile: awsProfile, 87 | }) 88 | 89 | new AwsProvider(this, "aws", { 90 | region: awsRegion, 91 | profile: awsProfile, 92 | }) 93 | 94 | // To assign an ACM certificate 95 | // to a CloudFront distribution, 96 | // we must request the certificate 97 | // in the US East (N. Virginia) Region 98 | const AWSUSEast1Provider = new AwsProvider(this, "aws_acm", { 99 | alias: "aws_acm", 100 | region: "us-east-1", 101 | profile: awsProfile, 102 | }) 103 | 104 | const currentRegion = new DataAwsRegion(this, "current_region", {}) 105 | const currentAccount = new DataAwsCallerIdentity(this, "current_account", {}) 106 | 107 | const staticWebsite = new StaticWebsiteConstruct(this, "static_website", { 108 | awsUsEast1Provider: AWSUSEast1Provider, 109 | buildsEnvironmentVariables, 110 | domainNames, 111 | resourceNamesPrefix, 112 | hasBuildCommand, 113 | enableHttps: enableHTTPS, 114 | }) 115 | 116 | const continuousDeployment = new ContinuousDeploymentConstruct(this, "continuous_deployment", { 117 | awsProfile: awsProfile, 118 | buildsEnvironmentVariables: staticWebsite.buildsEnvironmentVariables, 119 | resourceNamesPrefix, 120 | currentAccount, 121 | currentRegion, 122 | currentRegionAsString: awsRegion, 123 | websiteS3Bucket: staticWebsite.websiteS3Bucket, 124 | cloudfrontDistrib: staticWebsite.cloudfrontDistribution, 125 | buildCommand, 126 | buildOutputDir: buildOutputDir, 127 | githubBranch, 128 | githubOauthToken, 129 | githubRepo, 130 | githubRepoOwner, 131 | githubWebhookToken, 132 | }) 133 | 134 | new TerraformOutput(this, "cloudfront_distribution_uri", { 135 | value: staticWebsite.cloudfrontDistribution.domainName, 136 | }) 137 | 138 | new TerraformOutput(this, "pipeline_execution_details_url", { 139 | value: continuousDeployment.pipelineExecutionDetailsUrl, 140 | }) 141 | 142 | new TerraformOutput(this, "ssl_validation_dns_records", { 143 | value: staticWebsite.sslValidationDnsRecords, 144 | }) 145 | } 146 | } 147 | 148 | const app = new App() 149 | new ScaffoldAWSStaticWebsite(app, "scaffold_aws_static_website") 150 | app.synth() 151 | -------------------------------------------------------------------------------- /src/utils/escapeTemplateForTerraform.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Escapes template to use with Terraform. 3 | * @param template The template that you want to escape. 4 | * 5 | * @returns The escaped template. 6 | */ 7 | const escapeTemplateForTerraform = (template: string) => { 8 | return template.replace(/\$\{/gi, "$$${") 9 | } 10 | 11 | export default escapeTemplateForTerraform 12 | -------------------------------------------------------------------------------- /templates/buildspec.yml: -------------------------------------------------------------------------------- 1 | # Running on Ubuntu 18.04 (aws/codebuild/standard:4.0) 2 | # https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/4.0/Dockerfile 3 | version: 0.2 4 | 5 | phases: 6 | pre_build: 7 | commands: 8 | - echo "No pre build commands" 9 | build: 10 | commands: 11 | - eval $BUILD_COMMAND 12 | post_build: 13 | commands: 14 | - aws s3 sync --delete $BUILD_OUTPUT_DIR s3://$AWS_S3_WEBSITE_BUCKET 15 | - aws cloudfront create-invalidation --distribution-id $AWS_CLOUDFRONT_DISTRIBUTION_ID --paths '/*' 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "src", 4 | "outDir": "dist", 5 | "alwaysStrict": true, 6 | "charset": "utf8", 7 | "declaration": true, 8 | "experimentalDecorators": true, 9 | "inlineSourceMap": true, 10 | "inlineSources": true, 11 | "lib": [ 12 | "es2018" 13 | ], 14 | "module": "CommonJS", 15 | "noEmitOnError": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "noImplicitAny": true, 18 | "noImplicitReturns": true, 19 | "noImplicitThis": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "resolveJsonModule": true, 23 | "strict": true, 24 | "strictNullChecks": true, 25 | "strictPropertyInitialization": true, 26 | "stripInternal": true, 27 | "target": "ES2018", 28 | "typeRoots": ["./node_modules/@types", "./types"], 29 | "esModuleInterop": true, 30 | "skipLibCheck": true 31 | }, 32 | "include": [ 33 | "**/*.ts" 34 | ], 35 | "exclude": [ 36 | "node_modules", 37 | "dist" 38 | ] 39 | } -------------------------------------------------------------------------------- /types/environment.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | namespace NodeJS { 3 | /** 4 | * Represents the environment variables of your infrastructure. 5 | * @property BUILD_COMMAND The command that needs to be run to build your website. 6 | * @property BUILD_OUTPUT_DIR The directory where the build command output your website. 7 | * @property DOMAIN_NAMES The domain names that need to be covered by your ACM certificate. 8 | * @property ENABLE_HTTPS Do HTTPS needs to be enabled? 9 | * @property GITHUB_BRANCH The branch from which you want to deploy. 10 | * @property GITHUB_OAUTH_TOKEN The GitHub OAuth token that will be used by CodePipeline to pull your source code from your repository. 11 | * @property GITHUB_REPO The GitHub repository that contains your source code. 12 | * @property GITHUB_REPO_OWNER The owner of your GitHub repository. Can be a regular user or an organization. 13 | * @property GITHUB_WEBHOOK_TOKEN A random token that will be used by CodePipeline and GitHub to prevent impersonation. 14 | * @property NODE_ENV The current loaded environment. 15 | * @property SCAFFOLD_AWS_PROFILE The AWS named profile used to create your infrastructure. 16 | * @property SCAFFOLD_AWS_REGION The AWS region where you want to create your infrastructure. 17 | * @property SCAFFOLD_AWS_S3_BACKEND_BUCKET The AWS S3 bucket that will contain the Terraform state of your infrastructure. 18 | * @property SCAFFOLD_AWS_S3_BACKEND_DYNAMODB_TABLE The AWS DynamoDB table that will be used to store the Terraform state locks. 19 | * @property SCAFFOLD_AWS_S3_BACKEND_KEY The S3 bucket key under which your Terraform state will be saved. 20 | * @property SCAFFOLD_RESOURCE_NAMES_PREFIX An unique custom prefix used to avoid name colision with existing resources. 21 | */ 22 | // eslint-disable-next-line @typescript-eslint/interface-name-prefix 23 | interface ProcessEnv { 24 | BUILD_COMMAND: string; 25 | BUILD_OUTPUT_DIR: string; 26 | DOMAIN_NAMES: string; 27 | ENABLE_HTTPS: string; 28 | GITHUB_BRANCH: string; 29 | GITHUB_OAUTH_TOKEN: string; 30 | GITHUB_REPO: string; 31 | GITHUB_REPO_OWNER: string; 32 | GITHUB_WEBHOOK_TOKEN: string; 33 | NODE_ENV: string; 34 | SCAFFOLD_AWS_PROFILE: string; 35 | SCAFFOLD_AWS_REGION: string; 36 | SCAFFOLD_AWS_S3_BACKEND_BUCKET: string; 37 | SCAFFOLD_AWS_S3_BACKEND_DYNAMODB_TABLE: string; 38 | SCAFFOLD_AWS_S3_BACKEND_KEY: string; 39 | SCAFFOLD_RESOURCE_NAMES_PREFIX: string; 40 | } 41 | } 42 | } 43 | 44 | // If this file has no import/export statements (i.e. is a script) 45 | // convert it into a module by adding an empty export statement. 46 | export {} 47 | --------------------------------------------------------------------------------