├── .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 |
3 |
4 |
5 | AWS Static Website
6 |
7 |
14 |
15 | + $1.5 / month ~ 4min / create
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
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 | 
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 |
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 | Name |
103 |
104 | Description |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | BUILD_COMMAND |
115 |
116 | The command that needs to be run to build your website (e.g. npm i && npm run build) (optional). |
117 |
118 |
119 |
120 |
121 |
122 | BUILD_OUTPUT_DIR |
123 |
124 | The directory where the build command output your website (e.g. build/) (optional). |
125 |
126 |
127 |
128 |
129 |
130 | DOMAIN_NAMES |
131 |
132 | The domain name(s) that you want to use for your website. |
133 |
134 |
135 |
136 |
137 |
138 | ENABLE_HTTPS |
139 |
140 | We need to wait for the ACM certificate to be "issued" to enable HTTPS. See the "after install" section to learn more. |
141 |
142 |
143 |
144 |
145 |
146 | GITHUB_BRANCH |
147 |
148 | The branch from which you want to deploy. |
149 |
150 |
151 |
152 |
153 |
154 | GITHUB_OAUTH_TOKEN |
155 |
156 | The GitHub OAuth token that will be used by CodePipeline to pull your source code from your repository. |
157 |
158 |
159 |
160 |
161 |
162 | GITHUB_REPO |
163 |
164 | The GitHub repository that contains your source code. |
165 |
166 |
167 |
168 |
169 |
170 | GITHUB_REPO_OWNER |
171 |
172 | The owner of your GitHub repository. Can be a regular user or an organization. |
173 |
174 |
175 |
176 |
177 |
178 | GITHUB_WEBHOOK_TOKEN |
179 |
180 | A random token that will be used by CodePipeline and GitHub to prevent impersonation. |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 | ### Inherited
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 | Name |
197 |
198 | Description |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 | SCAFFOLD_AWS_PROFILE |
209 |
210 | The AWS named profile used to create your infrastructure. |
211 |
212 |
213 |
214 |
215 |
216 | SCAFFOLD_AWS_REGION |
217 |
218 | The AWS region where you want to create your infrastructure. |
219 |
220 |
221 |
222 |
223 |
224 | SCAFFOLD_AWS_S3_BACKEND_BUCKET |
225 |
226 | The AWS S3 bucket that will contain the Terraform state of your infrastructure. |
227 |
228 |
229 |
230 |
231 |
232 | SCAFFOLD_AWS_S3_BACKEND_DYNAMODB_TABLE |
233 |
234 | The AWS DynamoDB table that will be used to store the Terraform state locks. |
235 |
236 |
237 |
238 |
239 |
240 | SCAFFOLD_AWS_S3_BACKEND_KEY |
241 |
242 | The S3 bucket key under which your Terraform state will be saved. |
243 |
244 |
245 |
246 |
247 |
248 | SCAFFOLD_RESOURCE_NAMES_PREFIX |
249 |
250 | An unique custom prefix used to avoid name colision with existing resources. |
251 |
252 |
253 |
254 |
255 |
256 |
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 |
--------------------------------------------------------------------------------