From bdafebcca2715ede58e8b0007ef87a972ff46d51 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Tue, 10 Dec 2019 13:48:48 +0100 Subject: [PATCH 01/29] Create main.yml --- .github/workflows/main.yml | 63 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..208487f --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,63 @@ +# https://github.com/yildizozan/tenserflow-lambda/blob/2c29535b9af0a396ca13e53aada10e46b0579791/.github/workflows/deploy.yml +# https://github.com/destination-unknown/destination-unknown-backend-serverless/blob/master/.github/workflows/main.yml +# https://github.com/search?utf8=%E2%9C%93&q=extension%3Ayml+path%3A.github%2Fworkflows%2F+serverless+python&type=Code&ref=advsearch&l=&l= + +name: Verify and autodeploy to staging environment + +on: + push: + branches: + - deploy-alb-external + - master + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --user pipenv +# PATH="$PATH:/home/runner/.local/bin" +# pipenv install +# - name: Update backend +# run: | +# PATH="$PATH:/home/runner/.local/bin" +# pipenv run python import_data/main.py +# env: +# GOOGLE_SHEETS_API_KEY: ${{ secrets.GOOGLE_SHEETS_API_KEY }} +# - uses: stefanzweifel/git-auto-commit-action@v2.3.0 +# with: +# commit_message: Update backend +# branch: master +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# - name: Setup Node.js for use with actions +# uses: actions/setup-node@v1.1.0 +# with: +# version: 10.x +# - name: Install Serverless and run deploy +# run: | +# npm install -g serverless +# yarn install +# PATH="$PATH:/home/runner/.local/bin" +# serverless deploy +# env: +# SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} + + + - name: serverless deploy + uses: serverless/github-action@v1.53.0 + with: + args: deploy + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} From 4d1146a6e477e693873644cb4c0cbe293e2405a7 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Tue, 10 Dec 2019 13:53:17 +0100 Subject: [PATCH 02/29] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 208487f..075695d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,7 +55,7 @@ jobs: - name: serverless deploy - uses: serverless/github-action@v1.53.0 + uses: serverless/github-action@v1.51.0 with: args: deploy env: From 54546d3d74452e880d0e1d3cc4fe93d65523297b Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Fri, 6 Mar 2020 20:51:10 +0100 Subject: [PATCH 03/29] Do trigger with ALB instead of API GW (#19) --- .editorconfig | 2 +- .flake8 | 3 +- .github/workflows/main.yml | 58 +- .pre-commit-config.yaml | 2 +- DEVELOPMENT.md | 4 +- KNOWN_ISSUES.md | 3 - README.md | 2 +- handler.py | 100 +- .../autoscaling/terraform.tfvars | 49 - misc/ipexpo-demo-tfvars/elb/terraform.tfvars | 46 - misc/modulestf-logo2.png | Bin 0 -> 6890 bytes misc/tmp_readme.md | 85 - modules-metadata/alb.json | 95 +- modules-metadata/alb_variables.json | 95 +- modules-metadata/alb_version.txt | 1 + modules-metadata/autoscaling.json | 5 + modules-metadata/autoscaling_variables.json | 5 + modules-metadata/autoscaling_version.txt | 1 + modules-metadata/ec2-instance.json | 18 +- modules-metadata/ec2-instance_variables.json | 18 +- modules-metadata/ec2-instance_version.txt | 1 + modules-metadata/elb_version.txt | 1 + modules-metadata/rds-aurora.json | 22 +- modules-metadata/rds-aurora_variables.json | 22 +- modules-metadata/rds-aurora_version.txt | 1 + modules-metadata/rds.json | 16 +- modules-metadata/rds_variables.json | 16 +- modules-metadata/rds_version.txt | 1 + modules-metadata/redshift.json | 10 + modules-metadata/redshift_variables.json | 10 + modules-metadata/redshift_version.txt | 1 + modules-metadata/s3-bucket.json | 10 + modules-metadata/s3-bucket_variables.json | 10 + modules-metadata/s3-bucket_version.txt | 1 + modules-metadata/security-group.json | 45 + .../security-group_variables.json | 45 + modules-metadata/security-group_version.txt | 1 + modules-metadata/sns_version.txt | 1 + modules-metadata/sqs_version.txt | 1 + modules-metadata/update_modules_metadata.sh | 10 + modules-metadata/vpc.json | 52 +- modules-metadata/vpc_variables.json | 52 +- modules-metadata/vpc_version.txt | 1 + modulestf/cloudcraft/graph.py | 6 +- modulestf/const.py | 2 + modulestf/convert.py | 19 +- modulestf/modules.py | 62 +- modulestf/render.py | 6 +- modulestf/upload.py | 7 +- package-lock.json | 1578 +++++++++++------ package.json | 11 +- serverless.yml | 64 +- templates/root/template/.gitignore | 6 - .../root/template/.pre-commit-config.yaml | 4 +- templates/root/template/LICENSE | 2 +- templates/root/template/README.md | 8 +- .../common/main_providers.tf | 13 - .../region/terragrunt.hcl | 40 +- test_fixtures/input_cloudcraft.json | 2 +- tests/cloudcraft_graph_test.py | 68 + tests/pytest.ini | 5 + tests/pytest.ini.sample | 4 + tests/requirements.txt | 4 + 63 files changed, 1757 insertions(+), 1076 deletions(-) delete mode 100644 KNOWN_ISSUES.md delete mode 100644 misc/ipexpo-demo-tfvars/autoscaling/terraform.tfvars delete mode 100644 misc/ipexpo-demo-tfvars/elb/terraform.tfvars create mode 100644 misc/modulestf-logo2.png delete mode 100644 misc/tmp_readme.md create mode 100644 modules-metadata/alb_version.txt create mode 100644 modules-metadata/autoscaling_version.txt create mode 100644 modules-metadata/ec2-instance_version.txt create mode 100644 modules-metadata/elb_version.txt create mode 100644 modules-metadata/rds-aurora_version.txt create mode 100644 modules-metadata/rds_version.txt create mode 100644 modules-metadata/redshift_version.txt create mode 100644 modules-metadata/s3-bucket_version.txt create mode 100644 modules-metadata/security-group_version.txt create mode 100644 modules-metadata/sns_version.txt create mode 100644 modules-metadata/sqs_version.txt create mode 100644 modules-metadata/vpc_version.txt delete mode 100644 templates/terragrunt-common-layer/common/main_providers.tf create mode 100644 tests/cloudcraft_graph_test.py create mode 100644 tests/pytest.ini create mode 100644 tests/pytest.ini.sample create mode 100644 tests/requirements.txt diff --git a/.editorconfig b/.editorconfig index 0d034b9..02fe218 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,7 +23,7 @@ max_line_length = 0 trim_trailing_whitespace = false [*.py] -max_line_length = 120 +max_line_length = 200 indent_style = space indent_size = 4 ignore_frosted_errors = E103 diff --git a/.flake8 b/.flake8 index 8cb28ac..445c0de 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,6 @@ [flake8] ignore = W504, F401 -max-line-length = 150 +exclude = tests/* +max-line-length = 200 max-complexity = 18 select = B,C,E,F,W,T4,B9 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 075695d..d574a39 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,13 +1,8 @@ -# https://github.com/yildizozan/tenserflow-lambda/blob/2c29535b9af0a396ca13e53aada10e46b0579791/.github/workflows/deploy.yml -# https://github.com/destination-unknown/destination-unknown-backend-serverless/blob/master/.github/workflows/main.yml -# https://github.com/search?utf8=%E2%9C%93&q=extension%3Ayml+path%3A.github%2Fworkflows%2F+serverless+python&type=Code&ref=advsearch&l=&l= - -name: Verify and autodeploy to staging environment +name: Autodeploy to dev environment on: push: branches: - - deploy-alb-external - master jobs: @@ -15,49 +10,32 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Set up Python 3.7 - uses: actions/setup-python@v1 + uses: actions/setup-python@v1.1.1 with: python-version: 3.7 - - name: Install dependencies + - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install --user pipenv -# PATH="$PATH:/home/runner/.local/bin" -# pipenv install -# - name: Update backend -# run: | -# PATH="$PATH:/home/runner/.local/bin" -# pipenv run python import_data/main.py -# env: -# GOOGLE_SHEETS_API_KEY: ${{ secrets.GOOGLE_SHEETS_API_KEY }} -# - uses: stefanzweifel/git-auto-commit-action@v2.3.0 -# with: -# commit_message: Update backend -# branch: master -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# - name: Setup Node.js for use with actions -# uses: actions/setup-node@v1.1.0 -# with: -# version: 10.x -# - name: Install Serverless and run deploy -# run: | -# npm install -g serverless -# yarn install -# PATH="$PATH:/home/runner/.local/bin" -# serverless deploy -# env: -# SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} - - - - name: serverless deploy - uses: serverless/github-action@v1.51.0 + + - uses: actions/setup-node@v1.4.0 with: - args: deploy + node-version: 13 + + - name: Install Serverless Framework and other project dependencies + run: | + npm install -g serverless + npm install + pip install -r requirements.txt + + - name: Deploy Lambda function to dev + run: | + PATH="$PATH:/home/runner/.local/bin" + serverless deploy --stage dev --force --verbose env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2c85bb8..461f5b9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: isort - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.4.0 + rev: v2.5.0 hooks: - id: check-ast - id: check-merge-conflict diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 9679b40..e0c1f65 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -6,10 +6,10 @@ As a short cheatsheet, you will need to use these commands: ``` # dev -$ http --print Hhb --all --follow https://dev-lambda.modules.tf/ @input/blueprint_my.json +$ http --print Hhb --all --follow https://dev.modules.tf/ @input/blueprint_my.json # prod -$ http --print Hhb --all --follow https://lambda.modules.tf/ @input/blueprint_my.json +$ http --print Hhb --all --follow https://prod.modules.tf/ @input/blueprint_my.json ``` * Invoke function locally providing `input.json`: diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md deleted file mode 100644 index b6229b1..0000000 --- a/KNOWN_ISSUES.md +++ /dev/null @@ -1,3 +0,0 @@ -# Known issues in modules.tf-lambda - -* Serverless framework version shouldn't be newer than 1.51.0 unless [this](https://github.com/serverless/serverless/issues/6752) and [this](https://github.com/UnitedIncome/serverless-python-requirements/issues/414) bugs are fixed diff --git a/README.md b/README.md index ef0ff5f..95ab37d 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ In [modules.tf-demo](https://github.com/antonbabenko/modules.tf-demo) repository This project was partially sponsored by [Cloudcraft - the best way to draw AWS diagrams](https://cloudcraft.co).
-Monitoring of serverless applications provided by [Dashbird.io](https://dashbird.io/). Dashbird - Monitor serverless applications
+Monitoring of serverless applications provided by [Thundra](https://www.thundra.io/). [Become a sponsor to @antonbabenko on GitHub](https://github.com/sponsors/antonbabenko/). diff --git a/handler.py b/handler.py index f05ad38..ea89c92 100755 --- a/handler.py +++ b/handler.py @@ -60,29 +60,86 @@ def load_data(event): return data +def validation_result(config): + return True + + def handler(event, context): link = "" - try: - data = load_data(event) - except ValueError as error: - logger.error(error) + # ALB response is different: + # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#respond-to-load-balancer + request_from_lb = bool(event.get("requestContext", {}).get("elb")) + http_method = event.get("httpMethod") + is_validate_action = event.get("path") == "/validate" + if http_method == "OPTIONS": return { - "body": error.args[0], + "isBase64Encoded": False, + "statusCode": 200, + "statusDescription": "200 OK", "headers": { + "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": True + "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", + # "Access-Control-Allow-Credentials": True # this header is not allowed by ALB + }, + } + + if request_from_lb and event.get("path") == "/healthz": + return { + "isBase64Encoded": False, + "statusCode": 200, + "statusDescription": "200 OK", + "headers": { + "Content-Type": "text/html" }, - "statusCode": error.args[1], + "body": "Health OK" } + try: + data = load_data(event) + except ValueError as error: + logger.error(error) + + if request_from_lb: + return { + "isBase64Encoded": False, + "statusCode": error.args[1], + "statusDescription": str(error.args[1]) + " Server Error", + "headers": { + "Content-Type": "text/html", + }, + "body": error.args[0], + } + else: + return { + "body": error.args[0], + "headers": { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": True + }, + "statusCode": error.args[1], + } + # logger.info(pformat(data, indent=2)) graph = populate_graph(data) config = convert_graph_to_modulestf_config(graph) + if is_validate_action: + return { + "isBase64Encoded": False, + "statusCode": 200, + "statusDescription": "200 OK", + "headers": { + "Content-Type": "application/json", + }, + "body": json.dumps(validation_result(config)) + } + prepare_render_dirs() render_from_modulestf_config(config, source=graph.source, regions=graph.regions) @@ -93,12 +150,23 @@ def handler(event, context): link = upload_file_to_s3(filename="archive.zip") - return { - "body": "", - "headers": { - "Location": link, - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": True - }, - "statusCode": 302, - } + if request_from_lb: + return { + "isBase64Encoded": False, + "headers": { + "Location": link, + "Access-Control-Allow-Origin": "*", + }, + "statusCode": 302, + "statusDescription": "302 Found", + } + else: + return { + "body": "", + "headers": { + "Location": link, + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": True + }, + "statusCode": 302, + } diff --git a/misc/ipexpo-demo-tfvars/autoscaling/terraform.tfvars b/misc/ipexpo-demo-tfvars/autoscaling/terraform.tfvars deleted file mode 100644 index fb870cc..0000000 --- a/misc/ipexpo-demo-tfvars/autoscaling/terraform.tfvars +++ /dev/null @@ -1,49 +0,0 @@ -terragrunt = { - terraform { - source = "git::git@github.com:terraform-aws-modules/terraform-aws-autoscaling.git" - } - - include = { - path = "${find_in_parent_folders()}" - } -} - -# The number of Amazon EC2 instances that should be running in the group -# type: string -desired_capacity = "1" - -# Controls how health checking is done. Values are - EC2 and ELB -# type: string -health_check_type = "EC2" - -# The EC2 image ID to launch -# type: string -image_id = "ami-03255d32a8bf59788" - -# The size of instance to launch -# type: string -instance_type = "t2.small" - -# The maximum size of the auto scale group -# type: string -max_size = "1" - -# The minimum size of the auto scale group -# type: string -min_size = "0" - -# Creates a unique name beginning with the specified prefix -# type: string -name = "modulestf-demo" - -# A list of security group IDs to assign to the launch configuration -# type: list -security_groups = ["sg-9eb9c1e7"] - -# A list of subnet IDs to launch resources in -# type: list -vpc_zone_identifier = ["subnet-6fe3d837", "subnet-9211eef5"] - -# A list of elastic load balancer names to add to the autoscaling group names -# type: list -load_balancers = ["modulestf-demo"] diff --git a/misc/ipexpo-demo-tfvars/elb/terraform.tfvars b/misc/ipexpo-demo-tfvars/elb/terraform.tfvars deleted file mode 100644 index f73a1e8..0000000 --- a/misc/ipexpo-demo-tfvars/elb/terraform.tfvars +++ /dev/null @@ -1,46 +0,0 @@ -terragrunt = { - terraform { - source = "git::git@github.com:terraform-aws-modules/terraform-aws-elb.git" - } - - include = { - path = "${find_in_parent_folders()}" - } -} - -# A health check block -# type: list -health_check = [ - { - target = "HTTP:80/" - interval = 30 - healthy_threshold = 2 - unhealthy_threshold = 2 - timeout = 5 - }, -] - -# If true, ELB will be an internal ELB -# type: string -internal = "false" - -# A list of listener blocks -# type: list -listener = [{ - instance_port = "80" - instance_protocol = "HTTP" - lb_port = "80" - lb_protocol = "HTTP" -}] - -# The name of the ELB -# type: string -name = "modulestf-demo" - -# A list of security group IDs to assign to the ELB -# type: list -security_groups = ["sg-9eb9c1e7"] - -# A list of subnet IDs to attach to the ELB -# type: list -subnets = ["subnet-6fe3d837", "subnet-9211eef5"] diff --git a/misc/modulestf-logo2.png b/misc/modulestf-logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..94a7e2e3bcdc12bfbf4dbdce44c002f391e3c7e9 GIT binary patch literal 6890 zcmbtZRa_KauqGr#Lb_d8x|B|31(v0|kuGUi=~kL0C6`V~k*+@=&C=bq(jd*!AYAU- zeZLR$&BHv*IrIC@neUv5QdgBDz@x!KLqj7_kOyl%`>AJx;9@^xi}MgA8X8TF0$57h zJL@Rh3$A_Hg6R0{yPVC#-CjplhJmL@3Wj0%b@4qR?f1L+IJ=Oz2svU zFAM3)`>3;d>Zh%(S0NfG7`!SWvv6&I8|ZSsK?@^f|67b$IJ1eNa*{@(L&zu&%!Rok z5#Q8#hRX=W8W`&#fv{?4EfE^ z`O1w|a+5=3#mg+naS?eDW$LAUvBH!Ty0|fMmqYZ2g-4CoHQZLg8P*f(m=s0_oh`ec zGVN*_ODlA0%wqu#Yp6m_C6&2~syAsyJDp(yKY{8_HCrqqYeCBq9~rijZEfon4FOTo zV5!^Hpjk#b@z&B(;$N+^j7#gCYq){;;L5|TMUvQFsH@A1AW@BY0~Ay9W9s`C51nkE z9u}@NO8Z>U#;Be8v$!1DK@?q6eI|zsBqRIwx>=FtXQ)e2O^SXUk*)mCE+Mv~JhZ{C zvwbwC^Il)kr)?IunmvH484Pw?5JM@Fjm}?c!MMz$j2U+SaHuB>(};CSEN_r(Zlndp zrvV3gIK79Neqr?3Nx}4=GG8f3eShIy1mu$ zNHg|{!~0;VBzQIr%@NDNsfZBx=^J)wji~1dezz8~#ukns@A=kl9(7Dk#taNl8GNTc zQId8`tYU0dEuG`kPKl>pa%Q-#PhUq;tuaS5 zVzX@(d?YDtQ~4bw59yK`y#;^2{zAd*ywiS9<2oOpx);k4G=^6v+trNXX+FPe6E;8IL*>GA$v}c0c&85?@)F$ctzkFu8;m8kRMrH}1m$VG z5m^~p5+`>~%aG6G{JQ#!G+&72pGYdRPIjEdC@07>kgm54%jcPd{)}7IVCG*~ zu*HYsk?MT+X5vpGSgu7aFx!3Dqq(_SM3+yS-=7JwCdVFBW8=`yG8%R_vlcjoRn9_MOE`T29B!uh+g}@ z8q12aIOu0kr5k-aRGR;tN9^VEt{+z!-=hx1SN?rOcWir!s>KInsKj_Be>7;S`C zq2H$KY50bi1E;SlrP^*H?#Sw@&>?6@gX6HS7s~Ae;ZwvmcI~dBq|%vX(#D+AT!pT! z7Mis3rsW$}WL52lU5zUATq1Xz786{1lS)W9cvtAp&Kxy4Qvy#6i?KKvMRxn+<)uBW zfIw**sOtBVjhmrSPc{L^8saCV7Awr z>R}N2_Q7wTC0$9Hk^Equ8R*5MGT?%7@#*AA;rm4xvFB^hzhOgdo5i>(3P@q_KIO9O zH2rOCmA_XQQPtb>h&ytEV|OmTKVyF9e7V&tl={1t5qmwAzOLdfN91Jh2T;foO`6R3 z%Y@Ugl=Ob=>2C;}ROZ3Ni^Z|VxKnTlrQcPnDX5l@sBjrcGVDqjZlBV=Q3*z;Z<4^4 zYbT6ryD)5H>fJm8FZKNBw%6(X`NU~CfeG?&M#IF;+-jz}-Nqi#z-yqccT^4T?SG%4 zKfjX2W?bUJeHIy%q@ray0YJp@FdnWE_YXi>SKQ^^+z|<`XJn!@w2UK$NXtO3oea;7 zb@yY(qpzdk0ph&FN8N}2(t{@|oSG_XW1!2|@uoB0fr8b)==POksh4cc9eogl@j+Zu zi@xVwkO`CIc45cgxqUgRD2xi^<#4bilCnWdFN_xDlfYj5!nE2GYLx;Z1#-ur6KZSC9=jP{;WJyKXK)1n+G%jrka%^m zwxrt8cCCwtlHDHjP{b0N2&I2}8 z5L`cFPII4M*Y-hV(LhkJ)&^5jC@~V+R990ncoM()Zv4NA_B7(U-DPHP3to&_9nQJR ztKrw=ReF61noK*!c8E{~T|2-!ehmF`u=kmob9!WQR3K(d^X-^_49(|Meh%isY#b1g zdxR?#=z>X> zS61iPe8Cx^U2^Jw3g=XXR3GZR^K^ctm@G<~)#BafL1=(U7u@q_VEn00|96@tX^u}h z;hT8Q!23`I3No_4`6BFJR@B~W0g(+JmS{>Q7gj%cmD~(J$^ACV!s?NueU{-xv-6FR z>m1*afo=|Z(caLqxbD(v!s$i{&pxBlL+|f1<8Cs+Jgg%#Mbh3vz|W^RIuuulS=%DwXwq7IyMMpM6JA%#b4Wp|7(G zLcA66hNpW_&t$cJ8Za1=g!)9tJh(6ZcD_gzf@lqw_?o7J1(bk?s+$lQ8!+dw{Lc)@@S@e#G z|4;aG7FB@rvMPw^u|UZ&vI0tdF(Ce*5j*GPCd`2z4png8>@Xz3?LRxuJ>dKDlNv=K zYQ<#s82Wwq5^%%f)z7|Zd`(&KgjNWqrS>$bn~K+Q@zF3KPKx$9>h6`^z@il#iCmSC z9;MT_|Kk^^&#=3XT4j8=iu$krmdX*c@&E2fL?n^f>;!HU`z*EM0jaX#ar}y&H|iEi#VnmF5j*=1(W@lT z%Uf-OX}z_*1WOAX3<%BMWOeL_!{i>2@ zFG-9JhT9YJq!Fqx&7GKJ|LW?!O0H86W;~h2*tRF1j|F`-VV?+h{07+P#kwnS{b59_ zLBFP#OM;p51ub3B6VgL-U-j`0;oEi>Ok1Mb$ILfKY&H%$uphCUY~xGMG!4c9a8Q8a zSpRIs&k54K4p?sS>{DDr>cW75f;-5?hX@*7*{yo2+dItDx29bg{ z%Bm%*57yo0dCIK}WmI$RfCP*Erc~eU>k`re8^J95D2Dp8CAvWarpY3oU5|IL)&pLr zVq?#04$8%%ZZqUDuPU9Iws2^swy^7Q_aAdsd^*S15?Q%ti*b1i8;5rG1jj#PnvH$h zWkxdcnP9z5?8|`u$)2bo>?R*n@*Anay#j&nA~`-jo&biRw;kkWc?80M2mPSm zWHs#d+FPr;jJIs3Px7qL^W8>5Rl+lhBpSnGZtrF#4_C>1>!Y3E{5_nie|um3JRf+W zMiG_~2f~p)XC{2JSK_i*?BYGH!8LJ5t_SddSE~tU!&Nr0vr+QFp z_LMyW8{u<$fv^0Jd;8odIBEsHsL~yMo@=ggi3~a37u6)CiWN`)`S+|B%mR=k>(Bp3 zJfp)lf+=3DoRH|M9)_5GIJFJ-UMW9RCM+?*(@$$ZBo$0`=fmNt zxY@p`-zUK_4I5rFx@D0H=JO(t*Z3t^JdD&Qs_PO=$%u-_{!+{jX zU8i<7I7E$P8?+Kur-bLWG{$Zzf!*kdr!u--luVb=5IGQC#N}n)Kq@ho0(OYq3NBPaIZ_-S&*(OtAT7n&#M@D$N-`W|Y zs-IVgD6&f*ZJx`!6?BU;R&6sWG5eSC6`o?8y_mLS^;c8rhVBy(P6Ufi5AZzWg?BR_ z-k?5-WKZP}F^u&B$bL9Ujiuz}reH+vF;+}2D|zVPpZs3$33{&{My}L8^?}zqRj1r? zsesS^9;>t{OO^7-MOV#D&%EHYrUbUlfNv0&WvPY4ny$Q=9LIy6`Dfy@`kWAe2#=I< z8CHI=oD+|Y+{j@fEU#sGS$Ok8!G0M z{8gxK3DmT%BJaE#vM0;}0mX5S)Sis7ISoVczisV*yDLuV?PNSynmt*hw8|_|y5)TU zUdCl++^xJCnP1JOT%O()(1@X_x{$Gl6d*N~0r>T$4-U zKV-@h-1iW1H)obSxu1W9nBL6syA;MxqOm>kqC?iH-F{&uy{%V-x5xpQMr;^ekRP2c3t2A~{oQeuv0YNr65^dkV)!ZY)8s+S2yN+XGQHif`YfQ2QYA{jzFk_WD2Fceqjpira ze^PLPE0KS*I*!{dLVmo8<8YlvY*FpiO&NXep0}7*;D=`to~(3TqiFD{?YrB!=;1>1 zcu5Lu3fhgNytdtDXq2wwYrZkrwvc_^BxaWYXPrROdEy|ZadMPwOdEfVvXpfpU3})_ zd4f4>867}uj(K-9iH?!i2d2|caB8CGANTl9#mwZAL%>P1Y}BpBT;=1KzybS7P&4kU zj%~8afCu@4bTSe}Jzf(|O813&;R(2*Z34$tbu5*2f2rH(mxl)<-RcRPstUW+GiAS^ zBFePuRL)>OmkQf9T3My$$VHUEQ#ttdmCU$P7wM-!?ieCHEEbo9{eIK^yi=%Wk1XmZ zmFNJxMxv2pWclzxG?Ym9&b5d;@k}*zH%4eZd^x*Ts_iM2NHXZ}tCr!K#C&U#^rLIF z_lD86nC1@~^DI*$vt)Nzpw=op@{)o?k^j!F9&Azw6a152Ip|`)Rw0xD1m$2|gNzpR z?Obc$19h(2{^7@GN*ok?K41YZk{x$y+317aQ0<8=MCF?6od+_2Z{JeG-4JLKNgbu% z6U6cdy?dN);esqeKBEe%WLX=|FNGA25WEtZEGiHzH_C-fp)09#lMCZE{WGulhul{w znag3*l_bA*UGnpWj@%Q6BWCBKDO+kbH+!*%NhcZWj6z|7~h z3pBaxoc5^F@nh{#R$o!algfvm!cDgHV{&Fvj4U}it43hwCRn*5x!f>Nv>wFl_IC-> zOC7IwX;!j@p+_!#TUdZVLmCna&n;70les$Wii9iBw>v;EpMNP;MH+Y&;8{N)Qnk_y zbJCfUgU$=Y2L~4H_wSh{g0zf;?17Fsq0xIKNKi-^awv_yUace46;}5MMH{B@gKoK& ziz%xp0utu8VF&b7B3;~r%GmCWPWTqncMLY;O^P8*VtqRUtR=hdviMbR&*g)CrnIAz zC)Jm0yDc`CzH)mDdjJ<(4pFQWrRA*RsYLb7%Zx#4PDyBJ6%r-}Tf~f6VhGj`pb??- zX87USe~e#a0oWO`e})KUN#g$zb2q;w`oRgnr=oV3yPEdIY{T&3lAV|?1gn#_J5`9 z#72K)BKIl^3$3#YkDW$%6_4oLHkIYkJ;Ue%~m9W7ZPJ&n? z1qoUC=cve(Ju?9Tfl7j);N!k+a8dr`%m0HKXb+&zMf multi_az (modules.tf) ==> multi_az (terraform-aws-modules) - - -## To-do - - - [x] Convert blueprint.json (cloudcraft) into generic json config for cookiecutter (output.json) - - [x] Cookiecutter should render one directory with all content as specified in json config - - [x] Create zip archive, upload it to S3 - - [x] Return content of zip file back to the user to initiate download - - [x] Make content of archive real and usable - - [x] Print only required key/values into terraform.tfvars - - [x] Improve config generator to follow links/edges/etc - - [ ] Get connections between (using data-sources): - - [ ] ELB & ASG target_group_arns (Figure out how to pass dynamic value of target_group_arns (eg, ${data.terraform_remote_state.elb.arn}) to autoscaling group terraform module. Maybe using "locals", "overrides", data-sources, tfstate, etc) - - [ ] S3 & Cloudfront - - [x] ELB or ALB - - [ ] VPC - - [ ] Security group - - [x] Generate real meta data from modules (or hardcode some) - - [ ] Add basic S3 and Cloudfront modules - - [ ] Circleci - https://serverless.com/blog/automating-ci-for-python-serverless-app-with-circleci/ - -@todo: # terragrunt hook which scans terraform.tfvars and replaces "data.terraform_remote_state.vpc.vpc_id" with the the real value fetched from datasource before calling the main module; using null_resource; http; external as a "glue" - - -Before IPEXPO (19.8.2018): - - - [ ] Generate Terraform code instead of Terragrunt - -Extract data from "nodes" and convert it into single "terraform-aws-module" + available arguments (instanceType, instanceSize, elbType) - -## Notes - -"A" get concept of "area/zone", which means it can be grouped into single "infrastructure module" before passing to modules.tf web-site and populate the forms or to modules.tf converter (MTC) before sending to MTG. - - -### Output structure - -``` -project/ - eu-west-1/ - layer1/ - terraform.tfvars - layer2/ - terraform.tfvars - common.tfvars - terraform.tfvars - .gitignore - LICENSE - README.md - ... -``` - -### Run pre-commit after code was rendered: - -cd final - -// iterate through all files: -pre-commit run -c $(pwd)/.pre-commit-config.yaml --files $(pwd)/eu-west-1/rds/terraform.tfvars -pre-commit run -c $(pwd)/.pre-commit-config.yaml --files $(pwd)/.... - - -### Comments from Dmytro: -8. if it python 3 - mb better to use pathlib -https://www.scivision.co/python-idiomatic-pathlib-use/ -16. https://docs.python.org/3/library/typing.html diff --git a/modules-metadata/alb.json b/modules-metadata/alb.json index 24b2b93..7d100d6 100644 --- a/modules-metadata/alb.json +++ b/modules-metadata/alb.json @@ -1,7 +1,12 @@ { - "create_alb": { + "access_logs": { + "default": {}, + "description": "Map containing access logging configuration for load balancer.", + "type": "map(string)" + }, + "create_lb": { "default": true, - "description": "Controls if the ALB should be created", + "description": "Controls if the Load Balancer should be created", "type": "bool" }, "enable_cross_zone_load_balancing": { @@ -22,38 +27,28 @@ "extra_ssl_certs": { "default": [], "description": "A list of maps describing any extra SSL certificates to apply to the HTTPS listeners. Required key/values: certificate_arn, https_listener_index (the index of the listener within https_listeners which the cert applies toward).", - "type": "object" - }, - "extra_ssl_certs_count": { - "default": 0, - "description": "A manually provided count/length of the extra_ssl_certs list of maps since the list cannot be computed.", - "type": "number" + "type": "list(map(string))" }, "http_tcp_listeners": { "default": [], - "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to 0)", + "description": "A list of maps describing the HTTP listeners or TCP ports for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to http_tcp_listeners[count.index])", "type": "list(map(string))" }, - "http_tcp_listeners_count": { - "default": 0, - "description": "A manually provided count/length of the http_tcp_listeners list of maps since the list cannot be computed.", - "type": "number" - }, "https_listeners": { "default": [], - "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to 0)", + "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to https_listeners[count.index])", "type": "list(map(string))" }, - "https_listeners_count": { - "default": 0, - "description": "A manually provided count/length of the https_listeners list of maps since the list cannot be computed.", - "type": "number" - }, "idle_timeout": { "default": 60, "description": "The time in seconds that the connection is allowed to be idle.", "type": "number" }, + "internal": { + "default": false, + "description": "Boolean determining if the load balancer is internal or externally facing.", + "type": "bool" + }, "ip_address_type": { "default": "ipv4", "description": "The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack.", @@ -74,13 +69,9 @@ "description": "Timeout value when deleting the ALB.", "type": "string" }, - "load_balancer_is_internal": { - "default": false, - "description": "Boolean determining if the load balancer is internal or externally facing.", - "type": "bool" - }, - "load_balancer_name": { - "description": "The resource name and Name tag of the load balancer.", + "load_balancer_type": { + "default": "application", + "description": "The type of load balancer to create. Possible values are application or network.", "type": "string" }, "load_balancer_update_timeout": { @@ -88,26 +79,28 @@ "description": "Timeout value when updating the ALB.", "type": "string" }, - "log_bucket_name": { - "default": "", - "description": "S3 bucket (externally created) for storing load balancer access logs. Required if logging_enabled is true.", + "name": { + "default": "null", + "description": "The resource name and Name tag of the load balancer.", "type": "string" }, - "log_location_prefix": { - "default": "", - "description": "S3 prefix within the log_bucket_name under which logs are stored.", + "name_prefix": { + "default": "null", + "description": "The resource name prefix and Name tag of the load balancer.", "type": "string" }, - "logging_enabled": { - "default": true, - "description": "Controls if the ALB will log requests to S3.", - "type": "bool" - }, "security_groups": { + "default": [], "description": "The security groups to attach to the load balancer. e.g. [\"sg-edcd9784\",\"sg-edcd9785\"]", "type": "list(string)" }, + "subnet_mapping": { + "default": [], + "description": "A list of subnet mapping blocks describing subnets to attach to network load balancer", + "type": "list(map(string))" + }, "subnets": { + "default": "null", "description": "A list of subnets to associate with the load balancer. e.g. ['subnet-1a2b3c4d','subnet-1a2b3c4e','subnet-1a2b3c4f']", "type": "list(string)" }, @@ -119,32 +112,10 @@ "target_groups": { "default": [], "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port. Optional key/values are in the target_groups_defaults variable.", - "type": "list(map(string))" - }, - "target_groups_count": { - "default": 0, - "description": "A manually provided count/length of the target_groups list of maps since the list cannot be computed.", - "type": "number" - }, - "target_groups_defaults": { - "default": { - "cookie_duration": 86400, - "deregistration_delay": 300, - "health_check_healthy_threshold": 3, - "health_check_interval": 10, - "health_check_matcher": "200-299", - "health_check_path": "/", - "health_check_port": "traffic-port", - "health_check_timeout": 5, - "health_check_unhealthy_threshold": 3, - "slow_start": 0, - "stickiness_enabled": true, - "target_type": "instance" - }, - "description": "Default values for target groups as defined by the list of maps.", - "type": "object" + "type": "any" }, "vpc_id": { + "default": "null", "description": "VPC id where the load balancer and other resources will be deployed.", "type": "string" } diff --git a/modules-metadata/alb_variables.json b/modules-metadata/alb_variables.json index 24b2b93..7d100d6 100644 --- a/modules-metadata/alb_variables.json +++ b/modules-metadata/alb_variables.json @@ -1,7 +1,12 @@ { - "create_alb": { + "access_logs": { + "default": {}, + "description": "Map containing access logging configuration for load balancer.", + "type": "map(string)" + }, + "create_lb": { "default": true, - "description": "Controls if the ALB should be created", + "description": "Controls if the Load Balancer should be created", "type": "bool" }, "enable_cross_zone_load_balancing": { @@ -22,38 +27,28 @@ "extra_ssl_certs": { "default": [], "description": "A list of maps describing any extra SSL certificates to apply to the HTTPS listeners. Required key/values: certificate_arn, https_listener_index (the index of the listener within https_listeners which the cert applies toward).", - "type": "object" - }, - "extra_ssl_certs_count": { - "default": 0, - "description": "A manually provided count/length of the extra_ssl_certs list of maps since the list cannot be computed.", - "type": "number" + "type": "list(map(string))" }, "http_tcp_listeners": { "default": [], - "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to 0)", + "description": "A list of maps describing the HTTP listeners or TCP ports for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to http_tcp_listeners[count.index])", "type": "list(map(string))" }, - "http_tcp_listeners_count": { - "default": 0, - "description": "A manually provided count/length of the http_tcp_listeners list of maps since the list cannot be computed.", - "type": "number" - }, "https_listeners": { "default": [], - "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to 0)", + "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to https_listeners[count.index])", "type": "list(map(string))" }, - "https_listeners_count": { - "default": 0, - "description": "A manually provided count/length of the https_listeners list of maps since the list cannot be computed.", - "type": "number" - }, "idle_timeout": { "default": 60, "description": "The time in seconds that the connection is allowed to be idle.", "type": "number" }, + "internal": { + "default": false, + "description": "Boolean determining if the load balancer is internal or externally facing.", + "type": "bool" + }, "ip_address_type": { "default": "ipv4", "description": "The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack.", @@ -74,13 +69,9 @@ "description": "Timeout value when deleting the ALB.", "type": "string" }, - "load_balancer_is_internal": { - "default": false, - "description": "Boolean determining if the load balancer is internal or externally facing.", - "type": "bool" - }, - "load_balancer_name": { - "description": "The resource name and Name tag of the load balancer.", + "load_balancer_type": { + "default": "application", + "description": "The type of load balancer to create. Possible values are application or network.", "type": "string" }, "load_balancer_update_timeout": { @@ -88,26 +79,28 @@ "description": "Timeout value when updating the ALB.", "type": "string" }, - "log_bucket_name": { - "default": "", - "description": "S3 bucket (externally created) for storing load balancer access logs. Required if logging_enabled is true.", + "name": { + "default": "null", + "description": "The resource name and Name tag of the load balancer.", "type": "string" }, - "log_location_prefix": { - "default": "", - "description": "S3 prefix within the log_bucket_name under which logs are stored.", + "name_prefix": { + "default": "null", + "description": "The resource name prefix and Name tag of the load balancer.", "type": "string" }, - "logging_enabled": { - "default": true, - "description": "Controls if the ALB will log requests to S3.", - "type": "bool" - }, "security_groups": { + "default": [], "description": "The security groups to attach to the load balancer. e.g. [\"sg-edcd9784\",\"sg-edcd9785\"]", "type": "list(string)" }, + "subnet_mapping": { + "default": [], + "description": "A list of subnet mapping blocks describing subnets to attach to network load balancer", + "type": "list(map(string))" + }, "subnets": { + "default": "null", "description": "A list of subnets to associate with the load balancer. e.g. ['subnet-1a2b3c4d','subnet-1a2b3c4e','subnet-1a2b3c4f']", "type": "list(string)" }, @@ -119,32 +112,10 @@ "target_groups": { "default": [], "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port. Optional key/values are in the target_groups_defaults variable.", - "type": "list(map(string))" - }, - "target_groups_count": { - "default": 0, - "description": "A manually provided count/length of the target_groups list of maps since the list cannot be computed.", - "type": "number" - }, - "target_groups_defaults": { - "default": { - "cookie_duration": 86400, - "deregistration_delay": 300, - "health_check_healthy_threshold": 3, - "health_check_interval": 10, - "health_check_matcher": "200-299", - "health_check_path": "/", - "health_check_port": "traffic-port", - "health_check_timeout": 5, - "health_check_unhealthy_threshold": 3, - "slow_start": 0, - "stickiness_enabled": true, - "target_type": "instance" - }, - "description": "Default values for target groups as defined by the list of maps.", - "type": "object" + "type": "any" }, "vpc_id": { + "default": "null", "description": "VPC id where the load balancer and other resources will be deployed.", "type": "string" } diff --git a/modules-metadata/alb_version.txt b/modules-metadata/alb_version.txt new file mode 100644 index 0000000..6b7ace3 --- /dev/null +++ b/modules-metadata/alb_version.txt @@ -0,0 +1 @@ +v5.1.0 diff --git a/modules-metadata/autoscaling.json b/modules-metadata/autoscaling.json index dc51100..7ab4da7 100644 --- a/modules-metadata/autoscaling.json +++ b/modules-metadata/autoscaling.json @@ -204,6 +204,11 @@ "description": "A list of security group IDs to assign to the launch configuration", "type": "list(string)" }, + "service_linked_role_arn": { + "default": "", + "description": "The ARN of the service-linked role that the ASG will use to call other AWS services.", + "type": "string" + }, "spot_price": { "default": "", "description": "The price to use for reserving spot instances", diff --git a/modules-metadata/autoscaling_variables.json b/modules-metadata/autoscaling_variables.json index d23c92b..b5841aa 100644 --- a/modules-metadata/autoscaling_variables.json +++ b/modules-metadata/autoscaling_variables.json @@ -203,6 +203,11 @@ "description": "A list of security group IDs to assign to the launch configuration", "type": "list(string)" }, + "service_linked_role_arn": { + "default": "", + "description": "The ARN of the service-linked role that the ASG will use to call other AWS services.", + "type": "string" + }, "spot_price": { "default": "", "description": "The price to use for reserving spot instances", diff --git a/modules-metadata/autoscaling_version.txt b/modules-metadata/autoscaling_version.txt new file mode 100644 index 0000000..c219f72 --- /dev/null +++ b/modules-metadata/autoscaling_version.txt @@ -0,0 +1 @@ +v3.4.0 diff --git a/modules-metadata/ec2-instance.json b/modules-metadata/ec2-instance.json index fff73ef..410c4ab 100644 --- a/modules-metadata/ec2-instance.json +++ b/modules-metadata/ec2-instance.json @@ -4,7 +4,7 @@ "type": "string" }, "associate_public_ip_address": { - "default": false, + "default": "null", "description": "If true, the EC2 instance will have associated public IP address", "type": "bool" }, @@ -59,12 +59,12 @@ "cloudcraft_name": "instanceType" }, "ipv6_address_count": { - "default": 0, + "default": "null", "description": "A number of IPv6 addresses to associate with the primary network interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet.", "type": "number" }, "ipv6_addresses": { - "default": [], + "default": "null", "description": "Specify one or more IPv6 addresses from the range of the subnet to associate with the primary network interface", "type": "list(string)" }, @@ -93,7 +93,7 @@ "type": "string" }, "private_ip": { - "default": "", + "default": "null", "description": "Private IP address to associate with the instance in a VPC", "type": "string" }, @@ -138,8 +138,13 @@ "type": "bool" }, "user_data": { - "default": "", - "description": "The user data to provide when launching the instance", + "default": "null", + "description": "The user data to provide when launching the instance. Do not pass gzip-compressed data via this argument; see user_data_base64 instead.", + "type": "string" + }, + "user_data_base64": { + "default": "null", + "description": "Can be used instead of user_data to pass base64-encoded binary data directly. Use this instead of user_data whenever the value is not a valid UTF-8 string. For example, gzip-encoded user data must be base64-encoded and passed via this argument to avoid corruption.", "type": "string" }, "volume_tags": { @@ -148,6 +153,7 @@ "type": "map(string)" }, "vpc_security_group_ids": { + "default": "null", "description": "A list of security group IDs to associate with", "type": "list(string)" } diff --git a/modules-metadata/ec2-instance_variables.json b/modules-metadata/ec2-instance_variables.json index b1f873c..76e759d 100644 --- a/modules-metadata/ec2-instance_variables.json +++ b/modules-metadata/ec2-instance_variables.json @@ -4,7 +4,7 @@ "type": "string" }, "associate_public_ip_address": { - "default": false, + "default": "null", "description": "If true, the EC2 instance will have associated public IP address", "type": "bool" }, @@ -58,12 +58,12 @@ "type": "string" }, "ipv6_address_count": { - "default": 0, + "default": "null", "description": "A number of IPv6 addresses to associate with the primary network interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet.", "type": "number" }, "ipv6_addresses": { - "default": [], + "default": "null", "description": "Specify one or more IPv6 addresses from the range of the subnet to associate with the primary network interface", "type": "list(string)" }, @@ -92,7 +92,7 @@ "type": "string" }, "private_ip": { - "default": "", + "default": "null", "description": "Private IP address to associate with the instance in a VPC", "type": "string" }, @@ -137,8 +137,13 @@ "type": "bool" }, "user_data": { - "default": "", - "description": "The user data to provide when launching the instance", + "default": "null", + "description": "The user data to provide when launching the instance. Do not pass gzip-compressed data via this argument; see user_data_base64 instead.", + "type": "string" + }, + "user_data_base64": { + "default": "null", + "description": "Can be used instead of user_data to pass base64-encoded binary data directly. Use this instead of user_data whenever the value is not a valid UTF-8 string. For example, gzip-encoded user data must be base64-encoded and passed via this argument to avoid corruption.", "type": "string" }, "volume_tags": { @@ -147,6 +152,7 @@ "type": "map(string)" }, "vpc_security_group_ids": { + "default": "null", "description": "A list of security group IDs to associate with", "type": "list(string)" } diff --git a/modules-metadata/ec2-instance_version.txt b/modules-metadata/ec2-instance_version.txt new file mode 100644 index 0000000..c757c98 --- /dev/null +++ b/modules-metadata/ec2-instance_version.txt @@ -0,0 +1 @@ +v2.13.0 diff --git a/modules-metadata/elb_version.txt b/modules-metadata/elb_version.txt new file mode 100644 index 0000000..b1d18bc --- /dev/null +++ b/modules-metadata/elb_version.txt @@ -0,0 +1 @@ +v2.3.0 diff --git a/modules-metadata/rds-aurora.json b/modules-metadata/rds-aurora.json index 8802e33..e0e8a1c 100644 --- a/modules-metadata/rds-aurora.json +++ b/modules-metadata/rds-aurora.json @@ -6,7 +6,8 @@ }, "allowed_security_groups": { "default": [], - "description": "A list of Security Group ID's to allow access to." + "description": "A list of Security Group ID's to allow access to.", + "type": "list(string)" }, "apply_immediately": { "default": false, @@ -28,6 +29,11 @@ "description": "How long to keep backups for (in days)", "type": "number" }, + "ca_cert_identifier": { + "default": "rds-ca-2019", + "description": "The identifier of the CA certificate for the DB instance", + "type": "string" + }, "copy_tags_to_snapshot": { "default": false, "description": "Copy all Cluster tags to snapshots.", @@ -44,12 +50,12 @@ "type": "string" }, "db_cluster_parameter_group_name": { - "default": "default.aurora5.6", + "default": "null", "description": "The name of a DB Cluster parameter group to use", "type": "string" }, "db_parameter_group_name": { - "default": "default.aurora5.6", + "default": "null", "description": "The name of a DB parameter group to use", "type": "string" }, @@ -98,6 +104,11 @@ "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported.", "type": "bool" }, + "iam_roles": { + "default": [], + "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster.", + "type": "list(string)" + }, "instance_type": { "description": "Instance type to use", "type": "string", @@ -204,6 +215,11 @@ "description": "Map of nested attributes with scaling properties. Only valid when engine_mode is set to `serverless`", "type": "map(string)" }, + "security_group_description": { + "default": "Managed by Terraform", + "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description.", + "type": "string" + }, "skip_final_snapshot": { "default": false, "description": "Should a final snapshot be created on cluster destroy", diff --git a/modules-metadata/rds-aurora_variables.json b/modules-metadata/rds-aurora_variables.json index 7ba98fc..a1921ce 100644 --- a/modules-metadata/rds-aurora_variables.json +++ b/modules-metadata/rds-aurora_variables.json @@ -6,7 +6,8 @@ }, "allowed_security_groups": { "default": [], - "description": "A list of Security Group ID's to allow access to." + "description": "A list of Security Group ID's to allow access to.", + "type": "list(string)" }, "apply_immediately": { "default": false, @@ -28,6 +29,11 @@ "description": "How long to keep backups for (in days)", "type": "number" }, + "ca_cert_identifier": { + "default": "rds-ca-2019", + "description": "The identifier of the CA certificate for the DB instance", + "type": "string" + }, "copy_tags_to_snapshot": { "default": false, "description": "Copy all Cluster tags to snapshots.", @@ -44,12 +50,12 @@ "type": "string" }, "db_cluster_parameter_group_name": { - "default": "default.aurora5.6", + "default": "null", "description": "The name of a DB Cluster parameter group to use", "type": "string" }, "db_parameter_group_name": { - "default": "default.aurora5.6", + "default": "null", "description": "The name of a DB parameter group to use", "type": "string" }, @@ -98,6 +104,11 @@ "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported.", "type": "bool" }, + "iam_roles": { + "default": [], + "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster.", + "type": "list(string)" + }, "instance_type": { "description": "Instance type to use", "type": "string" @@ -203,6 +214,11 @@ "description": "Map of nested attributes with scaling properties. Only valid when engine_mode is set to `serverless`", "type": "map(string)" }, + "security_group_description": { + "default": "Managed by Terraform", + "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description.", + "type": "string" + }, "skip_final_snapshot": { "default": false, "description": "Should a final snapshot be created on cluster destroy", diff --git a/modules-metadata/rds-aurora_version.txt b/modules-metadata/rds-aurora_version.txt new file mode 100644 index 0000000..0c29db7 --- /dev/null +++ b/modules-metadata/rds-aurora_version.txt @@ -0,0 +1 @@ +v2.16.0 diff --git a/modules-metadata/rds.json b/modules-metadata/rds.json index a9e34cc..5291598 100644 --- a/modules-metadata/rds.json +++ b/modules-metadata/rds.json @@ -32,6 +32,11 @@ "description": "The daily time range (in UTC) during which automated backups are created if they are enabled. Example: '09:46-10:16'. Must not overlap with maintenance_window", "type": "string" }, + "ca_cert_identifier": { + "default": "rds-ca-2019", + "description": "Specifies the identifier of the CA certificate for the DB instance", + "type": "string" + }, "character_set_name": { "default": "", "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS for more information", @@ -49,7 +54,7 @@ }, "create_db_option_group": { "default": true, - "description": "Whether to create a database option group", + "description": "(Optional) Create a database option group", "type": "bool" }, "create_db_parameter_group": { @@ -177,9 +182,16 @@ }, "option_group_name": { "default": "", - "description": "Name of the DB option group to associate. Setting this automatically disables option_group creation", + "description": "Name of the DB option group to associate", "type": "string" }, + "option_group_timeouts": { + "default": { + "delete": "15m" + }, + "description": "Define maximum timeout for deletion of `aws_db_option_group` resource", + "type": "map(string)" + }, "options": { "default": [], "description": "A list of Options to apply.", diff --git a/modules-metadata/rds_variables.json b/modules-metadata/rds_variables.json index 34257fc..100be6d 100644 --- a/modules-metadata/rds_variables.json +++ b/modules-metadata/rds_variables.json @@ -32,6 +32,11 @@ "description": "The daily time range (in UTC) during which automated backups are created if they are enabled. Example: '09:46-10:16'. Must not overlap with maintenance_window", "type": "string" }, + "ca_cert_identifier": { + "default": "rds-ca-2019", + "description": "Specifies the identifier of the CA certificate for the DB instance", + "type": "string" + }, "character_set_name": { "default": "", "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS for more information", @@ -49,7 +54,7 @@ }, "create_db_option_group": { "default": true, - "description": "Whether to create a database option group", + "description": "(Optional) Create a database option group", "type": "bool" }, "create_db_parameter_group": { @@ -174,9 +179,16 @@ }, "option_group_name": { "default": "", - "description": "Name of the DB option group to associate. Setting this automatically disables option_group creation", + "description": "Name of the DB option group to associate", "type": "string" }, + "option_group_timeouts": { + "default": { + "delete": "15m" + }, + "description": "Define maximum timeout for deletion of `aws_db_option_group` resource", + "type": "map(string)" + }, "options": { "default": [], "description": "A list of Options to apply.", diff --git a/modules-metadata/rds_version.txt b/modules-metadata/rds_version.txt new file mode 100644 index 0000000..d4174a4 --- /dev/null +++ b/modules-metadata/rds_version.txt @@ -0,0 +1 @@ +v2.14.0 diff --git a/modules-metadata/redshift.json b/modules-metadata/redshift.json index 20fa8be..02923e7 100644 --- a/modules-metadata/redshift.json +++ b/modules-metadata/redshift.json @@ -95,6 +95,11 @@ "description": "(Optional) The prefix applied to the log file names.", "type": "string" }, + "owner_account": { + "default": "null", + "description": "(Optional) The AWS customer account used to create or copy the snapshot. Required if you are restoring a snapshot you do not own, optional if you own the snapshot.", + "type": "string" + }, "parameter_group_name": { "default": "", "description": "The name of the parameter group to be associated with this cluster. If not specified new parameter group will be created.", @@ -130,6 +135,11 @@ "description": "(Optional) The name of the cluster the source snapshot was created from.", "type": "string" }, + "snapshot_copy_destination_region": { + "default": "null", + "description": "(Optional) The name of the region where the snapshot will be copied.", + "type": "string" + }, "snapshot_identifier": { "default": "null", "description": "(Optional) The name of the snapshot from which to create the new cluster.", diff --git a/modules-metadata/redshift_variables.json b/modules-metadata/redshift_variables.json index 737c37f..0fd732e 100644 --- a/modules-metadata/redshift_variables.json +++ b/modules-metadata/redshift_variables.json @@ -93,6 +93,11 @@ "description": "(Optional) The prefix applied to the log file names.", "type": "string" }, + "owner_account": { + "default": "null", + "description": "(Optional) The AWS customer account used to create or copy the snapshot. Required if you are restoring a snapshot you do not own, optional if you own the snapshot.", + "type": "string" + }, "parameter_group_name": { "default": "", "description": "The name of the parameter group to be associated with this cluster. If not specified new parameter group will be created.", @@ -128,6 +133,11 @@ "description": "(Optional) The name of the cluster the source snapshot was created from.", "type": "string" }, + "snapshot_copy_destination_region": { + "default": "null", + "description": "(Optional) The name of the region where the snapshot will be copied.", + "type": "string" + }, "snapshot_identifier": { "default": "null", "description": "(Optional) The name of the snapshot from which to create the new cluster.", diff --git a/modules-metadata/redshift_version.txt b/modules-metadata/redshift_version.txt new file mode 100644 index 0000000..8721bbc --- /dev/null +++ b/modules-metadata/redshift_version.txt @@ -0,0 +1 @@ +v2.4.0 diff --git a/modules-metadata/s3-bucket.json b/modules-metadata/s3-bucket.json index 9ad8a5e..c4309f6 100644 --- a/modules-metadata/s3-bucket.json +++ b/modules-metadata/s3-bucket.json @@ -9,6 +9,16 @@ "description": "(Optional) The canned ACL to apply. Defaults to 'private'.", "type": "string" }, + "attach_elb_log_delivery_policy": { + "default": false, + "description": "Controls if S3 bucket should have ELB log delivery policy attached", + "type": "bool" + }, + "attach_policy": { + "default": false, + "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", + "type": "bool" + }, "bucket": { "default": "null", "description": "(Optional, Forces new resource) The name of the bucket. If omitted, Terraform will assign a random, unique name.", diff --git a/modules-metadata/s3-bucket_variables.json b/modules-metadata/s3-bucket_variables.json index 9ad8a5e..c4309f6 100644 --- a/modules-metadata/s3-bucket_variables.json +++ b/modules-metadata/s3-bucket_variables.json @@ -9,6 +9,16 @@ "description": "(Optional) The canned ACL to apply. Defaults to 'private'.", "type": "string" }, + "attach_elb_log_delivery_policy": { + "default": false, + "description": "Controls if S3 bucket should have ELB log delivery policy attached", + "type": "bool" + }, + "attach_policy": { + "default": false, + "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", + "type": "bool" + }, "bucket": { "default": "null", "description": "(Optional, Forces new resource) The name of the bucket. If omitted, Terraform will assign a random, unique name.", diff --git a/modules-metadata/s3-bucket_version.txt b/modules-metadata/s3-bucket_version.txt new file mode 100644 index 0000000..2e7bd91 --- /dev/null +++ b/modules-metadata/s3-bucket_version.txt @@ -0,0 +1 @@ +v1.5.0 diff --git a/modules-metadata/security-group.json b/modules-metadata/security-group.json index 3926022..32b6ff3 100644 --- a/modules-metadata/security-group.json +++ b/modules-metadata/security-group.json @@ -1,6 +1,21 @@ { "auto_groups": { "default": { + "activemq": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "activemq-5671-tcp", + "activemq-8883-tcp", + "activemq-61614-tcp", + "activemq-61617-tcp", + "activemq-61619-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "carbon-relay-ng": { "egress_rules": [ "all-all" @@ -656,6 +671,36 @@ "", "" ], + "activemq-5671-tcp": [ + 5671, + 5671, + "tcp", + "ActiveMQ AMQP" + ], + "activemq-61614-tcp": [ + 61614, + 61614, + "tcp", + "ActiveMQ STOMP" + ], + "activemq-61617-tcp": [ + 61617, + 61617, + "tcp", + "ActiveMQ OpenWire" + ], + "activemq-61619-tcp": [ + 61619, + 61619, + "tcp", + "ActiveMQ WebSocket" + ], + "activemq-8883-tcp": [ + 8883, + 8883, + "tcp", + "ActiveMQ MQTT" + ], "all-all": [ -1, -1, diff --git a/modules-metadata/security-group_variables.json b/modules-metadata/security-group_variables.json index 3926022..32b6ff3 100644 --- a/modules-metadata/security-group_variables.json +++ b/modules-metadata/security-group_variables.json @@ -1,6 +1,21 @@ { "auto_groups": { "default": { + "activemq": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "activemq-5671-tcp", + "activemq-8883-tcp", + "activemq-61614-tcp", + "activemq-61617-tcp", + "activemq-61619-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "carbon-relay-ng": { "egress_rules": [ "all-all" @@ -656,6 +671,36 @@ "", "" ], + "activemq-5671-tcp": [ + 5671, + 5671, + "tcp", + "ActiveMQ AMQP" + ], + "activemq-61614-tcp": [ + 61614, + 61614, + "tcp", + "ActiveMQ STOMP" + ], + "activemq-61617-tcp": [ + 61617, + 61617, + "tcp", + "ActiveMQ OpenWire" + ], + "activemq-61619-tcp": [ + 61619, + 61619, + "tcp", + "ActiveMQ WebSocket" + ], + "activemq-8883-tcp": [ + 8883, + 8883, + "tcp", + "ActiveMQ MQTT" + ], "all-all": [ -1, -1, diff --git a/modules-metadata/security-group_version.txt b/modules-metadata/security-group_version.txt new file mode 100644 index 0000000..c219f72 --- /dev/null +++ b/modules-metadata/security-group_version.txt @@ -0,0 +1 @@ +v3.4.0 diff --git a/modules-metadata/sns_version.txt b/modules-metadata/sns_version.txt new file mode 100644 index 0000000..1defe53 --- /dev/null +++ b/modules-metadata/sns_version.txt @@ -0,0 +1 @@ +v2.1.0 diff --git a/modules-metadata/sqs_version.txt b/modules-metadata/sqs_version.txt new file mode 100644 index 0000000..46b105a --- /dev/null +++ b/modules-metadata/sqs_version.txt @@ -0,0 +1 @@ +v2.0.0 diff --git a/modules-metadata/update_modules_metadata.sh b/modules-metadata/update_modules_metadata.sh index 2af95bd..f45c361 100755 --- a/modules-metadata/update_modules_metadata.sh +++ b/modules-metadata/update_modules_metadata.sh @@ -37,4 +37,14 @@ for module in "${MODULES[@]}"; do jq -s '.[0] * .[1]' ${module}_variables.json ${module}_cloudcraft.json > ${module}.json rm -f "$tmp_file_tf" + + # Write module version + pushd ${MODULES_DIR}/terraform-aws-${module} > /dev/null + latest_tag=$(git describe --tags --abbrev=0) + echo "$module => $latest_tag" + popd > /dev/null + + echo -n $latest_tag > ${module}_version.txt + + echo "*********" done diff --git a/modules-metadata/vpc.json b/modules-metadata/vpc.json index 4cd1565..6cd87f8 100644 --- a/modules-metadata/vpc.json +++ b/modules-metadata/vpc.json @@ -70,7 +70,7 @@ }, "azs": { "default": [], - "description": "A list of availability zones in the region", + "description": "A list of availability zones names or ids in the region", "type": "list(string)" }, "cidr": { @@ -78,6 +78,21 @@ "description": "The CIDR block for the VPC. Default value is a valid CIDR, but not acceptable by AWS and should be overridden", "type": "string" }, + "cloud_directory_endpoint_private_dns_enabled": { + "default": false, + "description": "Whether or not to associate a private hosted zone with the specified VPC for Cloud Directory endpoint", + "type": "bool" + }, + "cloud_directory_endpoint_security_group_ids": { + "default": [], + "description": "The ID of one or more security groups to associate with the network interface for Cloud Directory endpoint", + "type": "list(string)" + }, + "cloud_directory_endpoint_subnet_ids": { + "default": [], + "description": "The ID of one or more subnets in which to create a network interface for Cloud Directory endpoint. Only a single subnet within an AZ is supported. Ifomitted, private subnets will be used.", + "type": "list(string)" + }, "cloudformation_endpoint_private_dns_enabled": { "default": false, "description": "Whether or not to associate a private hosted zone with the specified VPC for Cloudformation endpoint", @@ -204,6 +219,16 @@ "description": "Controls if VPC should be created (it affects almost all resources)", "type": "bool" }, + "customer_gateway_tags": { + "default": {}, + "description": "Additional tags for the Customer Gateway", + "type": "map(string)" + }, + "customer_gateways": { + "default": {}, + "description": "Maps of Customer Gateway's attributes (BGP ASN and Gateway's Internet-routable external IP address)", + "type": "map(map(any))" + }, "database_acl_tags": { "default": {}, "description": "Additional tags for the database subnets network ACL", @@ -493,6 +518,21 @@ "description": "The ID of one or more subnets in which to create a network interface for ECS Telemetry endpoint. Only a single subnet within an AZ is supported. If omitted, private subnets will be used.", "type": "list(string)" }, + "efs_endpoint_private_dns_enabled": { + "default": false, + "description": "Whether or not to associate a private hosted zone with the specified VPC for EFS endpoint", + "type": "bool" + }, + "efs_endpoint_security_group_ids": { + "default": [], + "description": "The ID of one or more security groups to associate with the network interface for EFS endpoint", + "type": "list(string)" + }, + "efs_endpoint_subnet_ids": { + "default": [], + "description": "The ID of one or more subnets in which to create a network interface for EFS endpoint. Only a single subnet within an AZ is supported. Ifomitted, private subnets will be used.", + "type": "list(string)" + }, "elasticache_acl_tags": { "default": {}, "description": "Additional tags for the elasticache subnets network ACL", @@ -606,6 +646,11 @@ "description": "Should be true to enable ClassicLink DNS Support for the VPC. Only valid in regions and accounts that support EC2 Classic.", "type": "bool" }, + "enable_cloud_directory_endpoint": { + "default": false, + "description": "Should be true if you want to provision an Cloud Directory endpoint to the VPC", + "type": "bool" + }, "enable_cloudformation_endpoint": { "default": false, "description": "Should be true if you want to provision a Cloudformation endpoint to the VPC", @@ -688,6 +733,11 @@ "description": "Should be true if you want to provision a ECS Telemetry endpoint to the VPC", "type": "bool" }, + "enable_efs_endpoint": { + "default": false, + "description": "Should be true if you want to provision an EFS endpoint to the VPC", + "type": "bool" + }, "enable_elasticloadbalancing_endpoint": { "default": false, "description": "Should be true if you want to provision a Elastic Load Balancing endpoint to the VPC", diff --git a/modules-metadata/vpc_variables.json b/modules-metadata/vpc_variables.json index 4cd1565..6cd87f8 100644 --- a/modules-metadata/vpc_variables.json +++ b/modules-metadata/vpc_variables.json @@ -70,7 +70,7 @@ }, "azs": { "default": [], - "description": "A list of availability zones in the region", + "description": "A list of availability zones names or ids in the region", "type": "list(string)" }, "cidr": { @@ -78,6 +78,21 @@ "description": "The CIDR block for the VPC. Default value is a valid CIDR, but not acceptable by AWS and should be overridden", "type": "string" }, + "cloud_directory_endpoint_private_dns_enabled": { + "default": false, + "description": "Whether or not to associate a private hosted zone with the specified VPC for Cloud Directory endpoint", + "type": "bool" + }, + "cloud_directory_endpoint_security_group_ids": { + "default": [], + "description": "The ID of one or more security groups to associate with the network interface for Cloud Directory endpoint", + "type": "list(string)" + }, + "cloud_directory_endpoint_subnet_ids": { + "default": [], + "description": "The ID of one or more subnets in which to create a network interface for Cloud Directory endpoint. Only a single subnet within an AZ is supported. Ifomitted, private subnets will be used.", + "type": "list(string)" + }, "cloudformation_endpoint_private_dns_enabled": { "default": false, "description": "Whether or not to associate a private hosted zone with the specified VPC for Cloudformation endpoint", @@ -204,6 +219,16 @@ "description": "Controls if VPC should be created (it affects almost all resources)", "type": "bool" }, + "customer_gateway_tags": { + "default": {}, + "description": "Additional tags for the Customer Gateway", + "type": "map(string)" + }, + "customer_gateways": { + "default": {}, + "description": "Maps of Customer Gateway's attributes (BGP ASN and Gateway's Internet-routable external IP address)", + "type": "map(map(any))" + }, "database_acl_tags": { "default": {}, "description": "Additional tags for the database subnets network ACL", @@ -493,6 +518,21 @@ "description": "The ID of one or more subnets in which to create a network interface for ECS Telemetry endpoint. Only a single subnet within an AZ is supported. If omitted, private subnets will be used.", "type": "list(string)" }, + "efs_endpoint_private_dns_enabled": { + "default": false, + "description": "Whether or not to associate a private hosted zone with the specified VPC for EFS endpoint", + "type": "bool" + }, + "efs_endpoint_security_group_ids": { + "default": [], + "description": "The ID of one or more security groups to associate with the network interface for EFS endpoint", + "type": "list(string)" + }, + "efs_endpoint_subnet_ids": { + "default": [], + "description": "The ID of one or more subnets in which to create a network interface for EFS endpoint. Only a single subnet within an AZ is supported. Ifomitted, private subnets will be used.", + "type": "list(string)" + }, "elasticache_acl_tags": { "default": {}, "description": "Additional tags for the elasticache subnets network ACL", @@ -606,6 +646,11 @@ "description": "Should be true to enable ClassicLink DNS Support for the VPC. Only valid in regions and accounts that support EC2 Classic.", "type": "bool" }, + "enable_cloud_directory_endpoint": { + "default": false, + "description": "Should be true if you want to provision an Cloud Directory endpoint to the VPC", + "type": "bool" + }, "enable_cloudformation_endpoint": { "default": false, "description": "Should be true if you want to provision a Cloudformation endpoint to the VPC", @@ -688,6 +733,11 @@ "description": "Should be true if you want to provision a ECS Telemetry endpoint to the VPC", "type": "bool" }, + "enable_efs_endpoint": { + "default": false, + "description": "Should be true if you want to provision an EFS endpoint to the VPC", + "type": "bool" + }, "enable_elasticloadbalancing_endpoint": { "default": false, "description": "Should be true if you want to provision a Elastic Load Balancing endpoint to the VPC", diff --git a/modules-metadata/vpc_version.txt b/modules-metadata/vpc_version.txt new file mode 100644 index 0000000..098c531 --- /dev/null +++ b/modules-metadata/vpc_version.txt @@ -0,0 +1 @@ +v2.25.0 diff --git a/modulestf/cloudcraft/graph.py b/modulestf/cloudcraft/graph.py index 75faca7..557cf58 100644 --- a/modulestf/cloudcraft/graph.py +++ b/modulestf/cloudcraft/graph.py @@ -66,6 +66,10 @@ def populate_graph(data): # noqa: C901 if group_node not in G.nodes: continue + # nodes type "icon" does not have "data", so we skip them + if "data" not in G.nodes[group_node]: + continue + if group_type == "asg": G.nodes[group_node]["data"]["asg_id"] = group_id elif group_type == "sg": @@ -109,7 +113,7 @@ def populate_graph(data): # noqa: C901 relTo = mapPos.get("relTo") if relTo in G.nodes: - G.nodes[relTo]["text"] = text["text"] + G.nodes[relTo]["text"] = text["text"].strip() ########### # REGION diff --git a/modulestf/const.py b/modulestf/const.py index a08d3a9..31d3171 100644 --- a/modulestf/const.py +++ b/modulestf/const.py @@ -14,6 +14,8 @@ S3_BUCKET = "dl.modules.tf" S3_BUCKET_REGION = "eu-west-1" +THUNDRA_API_KEY = os.environ.get('THUNDRA_API_KEY') + if os.environ.get("IS_LOCAL"): tmp_dir = os.getcwd() else: diff --git a/modulestf/convert.py b/modulestf/convert.py index d7c1020..db0aaab 100644 --- a/modulestf/convert.py +++ b/modulestf/convert.py @@ -146,13 +146,13 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if node.get("engine") == "aurora-mysql": r.update_params({ - "engine": "aurora-postgres", + "engine": "aurora-mysql", "port": "3306", "engine_version": "5.7.12", }) elif node.get("engine") == "postgres": r.update_params({ - "engine": "aurora-postgres", + "engine": "aurora-postgresql", "port": "5432", "engine_version": "9.6.9", }) @@ -319,8 +319,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r = Resource(key, "alb", node.get("text")) r.update_params({ - "load_balancer_name": random_pet(), - "logging_enabled": "false", + "name": random_pet(), }) if vpc_id: @@ -332,6 +331,18 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r.append_dependency(sg_id) r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.this_security_group_id]") + elif node.get("elbType") == "network": + r = Resource(key, "nlb", node.get("text")) + + r.update_params({ + "name": random_pet(), + }) + + if vpc_id: + r.append_dependency(vpc_id) + r.update_dynamic_params("subnets", "dependency." + vpc_id + ".outputs.public_subnets") + r.update_dynamic_params("vpc_id", "dependency." + vpc_id + ".outputs.vpc_id") + else: r = Resource(key, "elb", node.get("text")) diff --git a/modulestf/modules.py b/modulestf/modules.py index 71bf0ae..a3adb8e 100644 --- a/modulestf/modules.py +++ b/modulestf/modules.py @@ -5,6 +5,15 @@ BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +def get_version(relative_path, remove_v=False): + path = os.path.join(BASE_PATH, relative_path) + with open(path) as file: + if remove_v: + return file.read().replace("v", "") + else: + return file.read() + + def load_local_json(relative_path): path = os.path.join(BASE_PATH, relative_path) with open(path) as file: @@ -65,63 +74,68 @@ def update_template_variables(var): MODULES = { "alb": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-alb.git?ref=v4.1.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/alb/aws/4.1.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-alb.git?ref=" + get_version("../modules-metadata/alb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/alb/aws/" + get_version("../modules-metadata/alb_version.txt", True), + "variables": update_template_variables(load_local_json("../modules-metadata/alb.json")), + }, + "nlb": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-alb.git?ref=" + get_version("../modules-metadata/alb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/alb/aws/" + get_version("../modules-metadata/alb_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/alb.json")), }, "elb": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-elb.git?ref=v2.3.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/elb/aws/2.3.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-elb.git?ref=" + get_version("../modules-metadata/elb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/elb/aws/" + get_version("../modules-metadata/elb_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/elb.json")), }, "rds": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds.git?ref=v2.5.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds/aws/2.5.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds.git?ref=" + get_version("../modules-metadata/rds_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds/aws/" + get_version("../modules-metadata/rds_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/rds.json")), }, "rds-aurora": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds-aurora.git?ref=v2.6.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds-aurora/aws/2.6.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds-aurora.git?ref=" + get_version("../modules-metadata/rds-aurora_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds-aurora/aws/" + get_version("../modules-metadata/rds-aurora_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/rds-aurora.json")), }, "autoscaling": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-autoscaling.git?ref=v3.1.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/autoscaling/aws/3.1.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-autoscaling.git?ref=" + get_version("../modules-metadata/autoscaling_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/autoscaling/aws/" + get_version("../modules-metadata/autoscaling_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/autoscaling.json")), }, "ec2-instance": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-ec2-instance.git?ref=v2.8.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/2.8.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-ec2-instance.git?ref=" + get_version("../modules-metadata/ec2-instance_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/" + get_version("../modules-metadata/ec2-instance_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/ec2-instance.json")), }, "sns": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sns.git?ref=v2.0.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sns/aws/2.0.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sns.git?ref=" + get_version("../modules-metadata/sns_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sns/aws/" + get_version("../modules-metadata/sns_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/sns.json")), }, "sqs": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sqs.git?ref=v2.0.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sqs/aws/2.0.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sqs.git?ref=" + get_version("../modules-metadata/sqs_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sqs/aws/" + get_version("../modules-metadata/sqs_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/sqs.json")), }, "security-group": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-security-group.git?ref=v3.1.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/security-group/aws/3.1.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-security-group.git?ref=" + get_version("../modules-metadata/security-group_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/security-group/aws/" + get_version("../modules-metadata/security-group_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/security-group.json")), }, "vpc": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-vpc.git?ref=v2.18.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/2.18.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-vpc.git?ref=" + get_version("../modules-metadata/vpc_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/" + get_version("../modules-metadata/vpc_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/vpc.json")), }, "s3-bucket": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=v1.0.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/s3-bucket/aws/1.0.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=" + get_version("../modules-metadata/s3-bucket_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/s3-bucket/aws/" + get_version("../modules-metadata/s3-bucket_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/s3-bucket.json")), }, "redshift": { - "source": "git::git@github.com:terraform-aws-modules/terraform-aws-redshift.git?ref=v2.2.0", - "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/redshift/aws/2.2.0", + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-redshift.git?ref=" + get_version("../modules-metadata/redshift_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/redshift/aws/" + get_version("../modules-metadata/redshift_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/redshift.json")), }, "cloudfront": { diff --git a/modulestf/render.py b/modulestf/render.py index af4c06e..37910d3 100644 --- a/modulestf/render.py +++ b/modulestf/render.py @@ -264,9 +264,9 @@ def render_from_modulestf_config(config, source, regions): module_type: MODULES[module_type]["variables"], }) - logger.info("Prepare common files") - templates_dir = path.realpath(path.join(COOKIECUTTER_TEMPLATES_DIR, "terragrunt-common-layer/common")) - copy_to_working_dir(templates_dir, "common") + # logger.info("Prepare common files") + # templates_dir = path.realpath(path.join(COOKIECUTTER_TEMPLATES_DIR, "terragrunt-common-layer/common")) + # copy_to_working_dir(templates_dir, "common") logger.info("Prepare common regional files") templates_dir = path.realpath(path.join(COOKIECUTTER_TEMPLATES_DIR, "terragrunt-common-layer/region")) diff --git a/modulestf/upload.py b/modulestf/upload.py index 4841382..a1f490c 100644 --- a/modulestf/upload.py +++ b/modulestf/upload.py @@ -11,7 +11,6 @@ def upload_file_to_s3(filename): - s3_bucket = os.environ.get("S3_BUCKET", S3_BUCKET) s3_dir = os.environ.get("S3_DIR", "local") @@ -26,7 +25,11 @@ def upload_file_to_s3(filename): StorageClass="ONEZONE_IA" )) - link = "https://" + s3_bucket + "/" + s3_key + # Perfect: With Cloudfront https is available + # link = "https://" + s3_bucket + "/" + s3_key + + # Long URL because there is no Cloudfront distribution (yet) + link = "https://s3-" + S3_BUCKET_REGION + ".amazonaws.com/" + s3_bucket + "/" + s3_key logger.info("LINK=" + link) diff --git a/package-lock.json b/package-lock.json index 1094140..fb94093 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,26 +4,41 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "2-thenable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", + "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", + "requires": { + "d": "1", + "es5-ext": "^0.10.47" + } + }, "@iarna/toml": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.3.tgz", "integrity": "sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg==" }, - "@serverless/cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.4.0.tgz", - "integrity": "sha512-YqlCiYmRFeGksw6XJaXbigIDlktc7OfRuVpyPB7IZgkCJ9mUlBmvyWdwqJEQdkUz0xPTGsd4Jd/XSrwyiw1Brg==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "@serverless/core": "^1.0.0", - "@serverless/template": "^1.1.0", - "ansi-escapes": "^4.2.0", - "chalk": "^2.4.2", - "chokidar": "^3.0.2", - "dotenv": "^8.0.0", - "figures": "^3.0.0", - "minimist": "^1.2.0", - "prettyoutput": "^1.2.0", - "strip-ansi": "^5.2.0" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, "@serverless/component-metrics": { @@ -42,6 +57,65 @@ } } }, + "@serverless/components": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@serverless/components/-/components-2.22.3.tgz", + "integrity": "sha512-RXRKt1RAi+zdvzBkwdrl2viOEo0mjMXOXMk2wayIT6NQ5hNUbptkFIhldXK4Q3n7f4xEHf6ufrax4YGhMHBR3Q==", + "requires": { + "@serverless/platform-client": "^0.23.0", + "@serverless/platform-sdk": "^2.3.0", + "adm-zip": "^0.4.14", + "ansi-escapes": "^4.2.0", + "axios": "^0.19.2", + "chalk": "^2.4.2", + "chokidar": "^3.3.1", + "dotenv": "^8.0.0", + "figures": "^3.0.0", + "fs-extra": "^8.1.0", + "globby": "^10.0.2", + "js-yaml": "^3.13.1", + "minimist": "^1.2.0", + "moment": "^2.24.0", + "prettyoutput": "^1.2.0", + "ramda": "^0.26.1", + "strip-ansi": "^5.2.0", + "traverse": "^0.6.6", + "uuid": "^3.4.0", + "ws": "^7.1.2" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "@serverless/core": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@serverless/core/-/core-1.1.2.tgz", @@ -72,38 +146,41 @@ } }, "@serverless/enterprise-plugin": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-1.3.11.tgz", - "integrity": "sha512-/SnlzaqDmGnNwDWCWd2GkhTEUTdZh73JdQVHU33rirJEi/uZSS8e/qyCrczuB6kTIJFSX4ZfXe1IYhVzZQXqTQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-3.4.1.tgz", + "integrity": "sha512-xo887e8GdumWY4iUxlgm3vrIZqVxFXvYk/fGORS+uTa4QG5t6iiJlPy7P0S8KKr90UBWE3eSg9w4tGAgVw2fIg==", "requires": { "@serverless/event-mocks": "^1.1.1", - "@serverless/platform-sdk": "^2.0.3", + "@serverless/platform-sdk": "^2.3.0", "chalk": "^2.4.2", - "flat": "^4.1.0", - "fs-extra": "^7.0.1", - "iso8601-duration": "^1.1.7", + "cli-color": "^2.0.0", + "flat": "^5.0.0", + "fs-extra": "^8.1.0", + "iso8601-duration": "^1.2.0", "isomorphic-fetch": "^2.2.1", "js-yaml": "^3.13.1", - "jsonata": "^1.6.4", - "jszip": "^3.2.1", - "lodash": "^4.17.11", + "jsonata": "^1.8.1", + "jszip": "^3.2.2", + "lodash": "^4.17.15", + "memoizee": "^0.4.14", "moment": "^2.24.0", "node-dir": "^0.1.17", - "node-fetch": "^2.3.0", - "regenerator-runtime": "^0.13.1", - "semver": "^5.6.0", - "simple-git": "^1.118.0", - "source-map-support": "^0.5.12", - "uuid": "^3.3.2", + "node-fetch": "^2.6.0", + "regenerator-runtime": "^0.13.3", + "semver": "^6.3.0", + "simple-git": "^1.131.0", + "source-map-support": "^0.5.16", + "update-notifier": "^2.5.0", + "uuid": "^3.4.0", "yamljs": "^0.3.0" }, "dependencies": { "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } @@ -113,10 +190,15 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -129,13 +211,26 @@ "lodash": "^4.17.11" } }, + "@serverless/platform-client": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-0.23.0.tgz", + "integrity": "sha512-fp0ya8x/aDBSJOpyXQsQGXBYKyhMSUhEojo2RHItMSimU9oclYBfVr9XdJ4YAWzgddyRjDdrPp2HxPaNzn2N2w==", + "requires": { + "adm-zip": "^0.4.13", + "axios": "^0.19.2", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.13.1", + "traverse": "^0.6.6", + "ws": "^7.2.1" + } + }, "@serverless/platform-sdk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@serverless/platform-sdk/-/platform-sdk-2.2.0.tgz", - "integrity": "sha512-w5A/szD0ZMUIuqUt5HyHllQ9LKO9/mpgv3rtJjLRI5ZJq1GvY4pv2pyQQPxGLT1gv0ER+b5vF+4tfrkx6MEuEw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@serverless/platform-sdk/-/platform-sdk-2.3.0.tgz", + "integrity": "sha512-+9TiMYDVKJOyDWg9p/k0kmGVZ3+rjB8DXpACDxxyUChDSsRS55CTJnt321Yx7APfHctNRSnv3ubYmx7oGSTETQ==", "requires": { "chalk": "^2.4.1", - "https-proxy-agent": "^3.0.0", + "https-proxy-agent": "^4.0.0", "is-docker": "^1.1.0", "isomorphic-fetch": "^2.2.1", "jwt-decode": "^2.2.0", @@ -150,24 +245,23 @@ "ws": "<7.0.0" }, "dependencies": { - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, "ramda": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } } } }, @@ -195,23 +289,45 @@ "defer-to-connect": "^1.0.1" } }, - "@types/lodash": { - "version": "4.14.144", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.144.tgz", - "integrity": "sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg==" + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "requires": { - "es6-promisify": "^5.0.0" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "13.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", + "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==" + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" }, "ansi-align": { "version": "2.0.0", @@ -222,11 +338,11 @@ } }, "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.5.2" + "type-fest": "^0.11.0" } }, "ansi-regex": { @@ -256,6 +372,21 @@ "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=" }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" + } + } + }, "archiver": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", @@ -305,15 +436,6 @@ } } }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -333,12 +455,9 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array-uniq": { "version": "1.0.3", @@ -376,9 +495,9 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sdk": { - "version": "2.562.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.562.0.tgz", - "integrity": "sha512-Uvt7qUXufjSxWMMfTs62xulGY7wnRut3y3daDtHSUdY62BnGjZGpp0dq/RW/bNi3aAjogEZNjWNZkLdtkHFeiQ==", + "version": "2.633.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.633.0.tgz", + "integrity": "sha512-C28/GefIQ+Dk1hjPQrpG1Yt9RdvqeFMP4nb6iActanoGq5JTSJU9103ukpBzrHz96fvjhIRogrvfOhDKubbcjw==", "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -408,6 +527,14 @@ } } }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -462,17 +589,53 @@ "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" }, "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", "term-size": "^1.2.0", + "type-fest": "^0.3.0", "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } } }, "brace-expansion": { @@ -581,9 +744,9 @@ } }, "cachedir": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz", - "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==" }, "camelcase": { "version": "4.1.0", @@ -621,19 +784,45 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "child-process-ext": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.0.tgz", + "integrity": "sha512-SGyUp8OVf0KgafShpiCKgCMWQoDL5nkqNc6RKXVyFwA4V1cbgIREi0r/B2xjdbgrIa0G1+2MGtxkndsvIwrBhw==", + "requires": { + "cross-spawn": "^6.0.5", + "es5-ext": "^0.10.51", + "log": "^6.0.0", + "split2": "^3.1.1", + "stream-promise": "^3.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.1", + "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "readdirp": "~3.3.0" } }, "ci-info": { @@ -723,6 +912,26 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, + "cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "requires": { + "ansi-regex": "^2.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.51", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.7" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -744,11 +953,6 @@ "mimic-response": "^1.0.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -820,17 +1024,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", @@ -853,6 +1046,21 @@ "xdg-basedir": "^3.0.0" } }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -922,14 +1130,24 @@ "type": "^1.0.1" } }, + "dayjs": { + "version": "1.8.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.21.tgz", + "integrity": "sha512-1kbWK0hziklUHkGgiKr7xm59KwAg/K3Tp7H/8X+f58DnNCwY3pKYjOCJpIlVs125FRBukGVZdKZojC073D0IeQ==" + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -948,6 +1166,13 @@ "make-dir": "^1.0.0", "pify": "^2.3.0", "strip-dirs": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "decompress-response": { @@ -1021,6 +1246,11 @@ "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -1030,9 +1260,9 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "defer-to-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", - "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "deferred": { "version": "0.7.11", @@ -1060,10 +1290,13 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } }, "dot-prop": { "version": "4.2.0", @@ -1079,53 +1312,118 @@ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "download": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/download/-/download-5.0.3.tgz", - "integrity": "sha1-Y1N/l3+ZJmow64oqL70fILgAD3o=", - "requires": { - "caw": "^2.0.0", - "decompress": "^4.0.0", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", "filenamify": "^2.0.0", "get-stream": "^3.0.0", - "got": "^6.3.0", - "mkdirp": "^0.5.1", - "pify": "^2.3.0" + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" }, "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "requires": { - "create-error-class": "^3.0.0", + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" } }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "requires": { - "prepend-http": "^1.0.1" + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" } } } @@ -1135,6 +1433,20 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -1152,12 +1464,12 @@ } }, "es5-ext": { - "version": "0.10.52", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz", - "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==", + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.2", + "es6-symbol": "~3.1.3", "next-tick": "~1.0.0" } }, @@ -1171,18 +1483,10 @@ "es6-symbol": "^3.1.1" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.2.tgz", + "integrity": "sha512-eO6vFm0JvqGzjWIQA6QVKjxpmELfhWbDUWHm1rPfIbn55mhKPiAa5xpLmQWJrNa629ZIeQ8ZvMAi13kvrjK6Mg==" }, "es6-set": { "version": "0.1.5", @@ -1246,6 +1550,11 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "essentials": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", + "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==" + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -1281,15 +1590,10 @@ } } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, "ext": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.1.2.tgz", - "integrity": "sha512-/KLjJdTNyDepCihrk4HQt57nAE1IRCEo5jUt+WgWGCr1oARhibDvmI2DMcSNWood1T9AUWwq+jaV1wvRqaXfnA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "requires": { "type": "^2.0.0" }, @@ -1301,6 +1605,23 @@ } } }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1325,11 +1646,32 @@ "tmp": "^0.0.33" } }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "requires": { + "reusify": "^1.0.4" + } + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -1339,9 +1681,9 @@ } }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -1389,11 +1731,34 @@ } }, "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.0.tgz", + "integrity": "sha512-6KSMM+cHHzXC/hpldXApL2S8Uz+QZv+tq5o/L0KQYleoG+GcwrnIJhTWC7tCOiKQp8D/fIvryINU1OZCCwevjA==", "requires": { - "is-buffer": "~2.0.3" + "is-buffer": "~2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "for-in": { @@ -1412,9 +1777,9 @@ } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, "fragment-cache": { "version": "0.2.1", @@ -1424,6 +1789,15 @@ "map-cache": "^0.2.2" } }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1457,9 +1831,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fs2": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.6.tgz", - "integrity": "sha512-Zs7c3SBPiiNEEg+w3PTIgxTbWA6ZWVJP+1DlwUCxNDtwQD2qM5pfdho7IaiR0ceu4UVvXRj9l6Ml+X6rs21ERw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.7.tgz", + "integrity": "sha512-fwfd9MBI/fnXtR/ClVTyeuPXJ+oI5WNyXvBQPmc4btgqLYTKOuBRTRUVjmVpDUri0C88HLwMlc5ESg48fEAGjw==", "requires": { "d": "^1.0.1", "deferred": "^0.7.11", @@ -1471,23 +1845,11 @@ } }, "fsevents": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", - "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "optional": true }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "requires": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -1562,6 +1924,21 @@ "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "got": { @@ -1593,26 +1970,11 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "graphlib": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", - "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", - "requires": { - "lodash": "^4.17.5" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } + "lodash": "^4.17.15" } }, "has-flag": { @@ -1633,11 +1995,6 @@ "has-symbol-support-x": "^1.4.1" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1691,17 +2048,17 @@ } }, "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "5", + "debug": "4" } }, "iconv-lite": { @@ -1791,6 +2148,15 @@ } } }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -1911,6 +2277,11 @@ "path-is-inside": "^1.0.1" } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -1978,6 +2349,11 @@ "whatwg-fetch": ">=0.10.0" } }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" + }, "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", @@ -2023,6 +2399,13 @@ "path-loader": "^1.0.2", "slash": "^1.0.0", "uri-js": "^3.0.2" + }, + "dependencies": { + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } } }, "json-stringify-safe": { @@ -2031,9 +2414,9 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "jsonata": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.7.0.tgz", - "integrity": "sha512-W1qxnGXtbaboFFA8DMLL2GZgiWoeFuMo0Yf3J23o03omzIuW9a9hgowgfUChQq8bfMfh/zmQJpwn/gQirn46ew==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.1.tgz", + "integrity": "sha512-Lw1ApNtYH9i/lWBuRSm1I/xfhPyTvlVslVIaGLW/bxFimxQYzQx2y3+DNRmbx5mmCmRb+bCLdIJasEFyb+aUlQ==" }, "jsonfile": { "version": "4.0.0", @@ -2068,9 +2451,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "klaw": { "version": "1.3.1", @@ -2175,30 +2558,25 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + "lodash.last": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", + "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" }, "lodash.set": { "version": "4.3.2", @@ -2220,6 +2598,19 @@ "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=" }, + "log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log/-/log-6.0.0.tgz", + "integrity": "sha512-sxChESNYJ/EcQv8C7xpmxhtTOngoXuMEqGDAkhXBEmt3MAzM3SM/TmIBOqnMEVdrOv1+VgZoYbo6U2GemQiU4g==", + "requires": { + "d": "^1.0.0", + "duration": "^0.2.2", + "es5-ext": "^0.10.49", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.0", + "type": "^1.0.1" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2253,13 +2644,6 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "map-cache": { @@ -2290,27 +2674,41 @@ "timers-ext": "^0.1.5" } }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.43.0" } }, "mimic-fn": { @@ -2376,9 +2774,9 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nanoid": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.6.tgz", - "integrity": "sha512-2NDzpiuEy3+H0AVtdt8LoFi7PnqkOnIzYmJQp7xsEU6VexLluHQwKREuiz57XaQC5006seIadPrIZJhyS2n7aw==" + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, "nanomatch": { "version": "1.2.13", @@ -2404,17 +2802,24 @@ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" }, "ncjsm": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-2.3.0.tgz", - "integrity": "sha512-VdfQ2cdfzPtdCeccVS1DipEvO2XiIHy61SHhFIHaHbA7KNelzlviDy5MGYANPjBHlJwHfu96DWQTS6P+rrowAA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.0.1.tgz", + "integrity": "sha512-gxh5Sgait8HyclaulfhgetHQGyhFm00ZQqISIfqtwFVnyWJ20rk+55SUamo9n3KhM6Vk63gemKPxIDYiSV/xZw==", "requires": { "builtin-modules": "^3.1.0", - "deferred": "^0.7.10", - "es5-ext": "^0.10.49", + "deferred": "^0.7.11", + "es5-ext": "^0.10.51", "es6-set": "^0.1.5", "find-requires": "^1.0.0", - "fs2": "^0.3.4", - "type": "^1.0.1" + "fs2": "^0.3.6", + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } } }, "next-tick": { @@ -2422,6 +2827,11 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-dir": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", @@ -2456,13 +2866,6 @@ "requires": { "config-chain": "^1.1.11", "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "npm-run-path": { @@ -2473,21 +2876,6 @@ "path-key": "^2.0.0" } }, - "npmlog": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", - "requires": { - "ansi": "~0.3.1", - "are-we-there-yet": "~1.1.2", - "gauge": "~1.2.5" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2560,9 +2948,9 @@ } }, "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" }, "object-visit": { "version": "1.0.1", @@ -2616,11 +3004,6 @@ } } }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -2631,11 +3014,45 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "requires": { + "p-timeout": "^2.0.1" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -2688,20 +3105,25 @@ "superagent": "^3.8.3" } }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "picomatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.0.tgz", - "integrity": "sha512-uhnEDzAbrcJ8R3g2fANnSuXZMBtkpSjxTTgn2LeSiQlfmq72enQJWdQllXW24MBLYnA1SBD2vfvx2o0Zw3Ielw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pinkie": { "version": "2.0.4", @@ -2766,9 +3188,19 @@ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } }, "querystring": { "version": "0.2.0", @@ -2832,11 +3264,11 @@ } }, "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.0.7" } }, "regenerator-runtime": { @@ -2854,12 +3286,11 @@ } }, "registry-auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", - "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", "requires": { - "rc": "^1.2.8", - "safe-buffer": "^5.0.1" + "rc": "^1.2.8" } }, "registry-url": { @@ -2907,6 +3338,11 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -2916,22 +3352,22 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "requires": { "is-promise": "^2.1.0" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "requires": { "tslib": "^1.9.0" } @@ -2996,57 +3432,88 @@ "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" }, "serverless": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.51.0.tgz", - "integrity": "sha512-OwBCC8joJ93GEjoG6ygx0cZHnHkQxdNtuxJ2bgyg94uxup3FUOBUPujUbAVrJsoZs1p5bz2/YIA1QzOnLz/crQ==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.65.0.tgz", + "integrity": "sha512-V5qhLMUdPXgJ5+lBoIAd21Nqj2IWoZLyK30pQn7UqfzDyKasAW9XnMQjJL0zvpbZk6kaV/V8OkGcreJ4kHij6g==", "requires": { - "@serverless/cli": "^1.0.3", - "@serverless/enterprise-plugin": "^1.3.9", + "@serverless/cli": "^1.4.0", + "@serverless/components": "^2.22.3", + "@serverless/enterprise-plugin": "^3.4.1", "archiver": "^1.3.0", "async": "^1.5.2", - "aws-sdk": "^2.518.0", - "bluebird": "^3.5.5", - "cachedir": "^2.2.0", + "aws-sdk": "^2.628.0", + "bluebird": "^3.7.2", + "boxen": "^3.2.0", + "cachedir": "^2.3.0", "chalk": "^2.4.2", + "child-process-ext": "^2.1.0", "ci-info": "^1.6.0", - "download": "^5.0.3", + "d": "^1.0.1", + "dayjs": "^1.8.21", + "decompress": "^4.2.0", + "download": "^7.1.0", + "essentials": "^1.1.1", "fast-levenshtein": "^2.0.6", "filesize": "^3.6.1", "fs-extra": "^0.30.0", "get-stdin": "^5.0.1", "globby": "^6.1.0", - "graceful-fs": "^4.2.2", - "https-proxy-agent": "^2.2.2", + "graceful-fs": "^4.2.3", + "https-proxy-agent": "^4.0.0", "inquirer": "^6.5.2", "is-docker": "^1.1.0", - "is-wsl": "^2.1.0", + "is-wsl": "^2.1.1", "js-yaml": "^3.13.1", "json-cycle": "^1.3.0", "json-refs": "^2.1.7", "jszip": "^3.2.2", "jwt-decode": "^2.2.0", "lodash": "^4.17.15", - "minimist": "^1.2.0", + "memoizee": "^0.4.14", "mkdirp": "^0.5.1", - "moment": "^2.24.0", "nanomatch": "^1.2.13", - "ncjsm": "^2.3.0", + "ncjsm": "^4.0.1", "node-fetch": "^1.7.3", - "object-hash": "^1.3.1", + "object-hash": "^2.0.3", + "p-limit": "^2.2.2", "promise-queue": "^2.2.5", "raven": "^1.2.1", "rc": "^1.2.8", "replaceall": "^0.1.6", "semver": "^5.7.1", "semver-regex": "^1.0.0", - "tabtab": "^2.2.2", + "stream-promise": "^3.2.0", + "tabtab": "^3.0.2", "untildify": "^3.0.3", "update-notifier": "^2.5.0", "uuid": "^2.0.3", "write-file-atomic": "^2.4.3", - "yaml-ast-parser": "0.0.43" + "yaml-ast-parser": "0.0.43", + "yargs-parser": "^16.1.0" }, "dependencies": { + "@serverless/cli": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.4.0.tgz", + "integrity": "sha512-YqlCiYmRFeGksw6XJaXbigIDlktc7OfRuVpyPB7IZgkCJ9mUlBmvyWdwqJEQdkUz0xPTGsd4Jd/XSrwyiw1Brg==", + "requires": { + "@serverless/core": "^1.0.0", + "@serverless/template": "^1.1.0", + "ansi-escapes": "^4.2.0", + "chalk": "^2.4.2", + "chokidar": "^3.0.2", + "dotenv": "^8.0.0", + "figures": "^3.0.0", + "minimist": "^1.2.0", + "prettyoutput": "^1.2.0", + "strip-ansi": "^5.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -3054,26 +3521,41 @@ } } }, - "serverless-domain-manager": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/serverless-domain-manager/-/serverless-domain-manager-3.3.0.tgz", - "integrity": "sha512-oGZDNzI/Y15QusC/E+Zm6VaXoAwnbQnm6e6wyXPFDi1Sqoeo8xarKNj0fZODhEf4DKggAqxVfkiXjhuC8yZu0Q==", - "dev": true, + "serverless-plugin-thundra": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/serverless-plugin-thundra/-/serverless-plugin-thundra-2.4.2.tgz", + "integrity": "sha512-Kd73XjospYtnMRPmxqsnMCfWjJU3UgJr4u1h8vd1/i6gKx99vsA93/k7Koa86WL0gyLbOH3vE1M8PfnfxJsUuw==", "requires": { - "aws-sdk": "^2.490.0", - "chalk": "^2.4.1" + "axios": "^0.19.0", + "bluebird": "^3.5.5", + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0", + "lodash.isstring": "^4.0.1", + "lodash.last": "^3.0.0", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } } }, "serverless-plugin-tracing": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/serverless-plugin-tracing/-/serverless-plugin-tracing-2.0.0.tgz", - "integrity": "sha1-32uLMWasm7cKN8f8h1AUsjaRWPY=", - "dev": true + "integrity": "sha1-32uLMWasm7cKN8f8h1AUsjaRWPY=" }, "serverless-python-requirements": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-5.0.1.tgz", - "integrity": "sha512-FKFS93oxmLEico0GnVnnO287xrUZmCuk6vX//Tq4F/PXXn9eu1xVnjnyaGDvzQbc6OQPsBdJjCC/bBlp/U+Kdg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-5.1.0.tgz", + "integrity": "sha512-lJhikc6wJsOYFxYNGK763xtQITrtGPHD2KJvs8qaBkkOET4RVk8E0N3d8wAO22k+Tk7N6a6Jonnvsmo3W8vtCA==", "requires": { "@iarna/toml": "^2.2.3", "appdirectory": "^0.1.0", @@ -3086,7 +3568,7 @@ "lodash.set": "^4.3.2", "lodash.uniqby": "^4.0.0", "lodash.values": "^4.3.0", - "rimraf": "^2.6.2", + "rimraf": "^3.0.2", "sha256-file": "1.0.0", "shell-quote": "^1.6.1" }, @@ -3100,6 +3582,14 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } } } }, @@ -3171,27 +3661,17 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-git": { - "version": "1.126.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.126.0.tgz", - "integrity": "sha512-47mqHxgZnN8XRa9HbpWprzUv3Ooqz9RY/LSZgvA7jCkW8jcwLahMz7LKugY91KZehfG0sCVPtgXiU72hd6b1Bw==", + "version": "1.131.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.131.0.tgz", + "integrity": "sha512-z/art7YYtmPnnLItT/j+nKwJt6ap6nHZ4D8sYo9PdCKK/ug56SN6m/evfxJk7uDV3e9JuCa8qIyDU2P3cxmiNQ==", "requires": { "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } } }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "snapdragon": { "version": "0.8.2", @@ -3305,17 +3785,33 @@ } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "requires": { + "sort-keys": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -3336,15 +3832,6 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, - "spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", - "requires": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -3353,11 +3840,39 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", + "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "sprintf-kit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.0.tgz", + "integrity": "sha512-/0d2YTn8ZFVpIPAU230S9ZLF8WDkSSRWvh/UOLM7zzvkCchum1TtouRgyV8OfgOaYilSGU4lSSqzwBXJVlAwUw==", + "requires": { + "es5-ext": "^0.10.46" + } + }, "stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", @@ -3438,6 +3953,21 @@ } } }, + "stream-promise": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", + "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", + "requires": { + "2-thenable": "^1.0.0", + "es5-ext": "^0.10.49", + "is-stream": "^1.1.0" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3526,6 +4056,16 @@ "mime": "^1.4.1", "qs": "^6.5.1", "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "supports-color": { @@ -3537,166 +4077,16 @@ } }, "tabtab": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", - "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", + "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", "requires": { - "debug": "^2.2.0", - "inquirer": "^1.0.2", - "lodash.difference": "^4.5.0", - "lodash.uniq": "^4.5.0", + "debug": "^4.0.1", + "es6-promisify": "^6.0.0", + "inquirer": "^6.0.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "npmlog": "^2.0.3", - "object-assign": "^4.1.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "external-editor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", - "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", - "requires": { - "extend": "^3.0.0", - "spawn-sync": "^1.0.15", - "tmp": "^0.0.29" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "inquirer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", - "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", - "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "external-editor": "^1.1.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "mute-stream": "0.0.6", - "pinkie-promise": "^2.0.0", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "requires": { - "os-tmpdir": "~1.0.1" - } - } + "untildify": "^3.0.3" } }, "tar-stream": { @@ -3814,9 +4204,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tunnel-agent": { "version": "0.6.0", @@ -3832,14 +4222,9 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" }, "unbzip2-stream": { "version": "1.3.3", @@ -3942,6 +4327,22 @@ "latest-version": "^3.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + } } }, "uri-js": { @@ -4043,12 +4444,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", + "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" }, "xdg-basedir": { "version": "3.0.0", @@ -4103,11 +4501,27 @@ "dependencies": { "minimist": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" } } }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index ae44c97..e176c32 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,13 @@ ], "author": "Anton Babenko ", "license": "MIT", - "devDependencies": { - "serverless-domain-manager": "^3.3.0", - "serverless-plugin-tracing": "^2.0.0" - }, + "devDependencies": {}, "dependencies": { "opencollective-postinstall": "^2.0.2", - "serverless": "1.51.0", - "serverless-python-requirements": "^5.0.1" + "serverless": "1.65.0", + "serverless-plugin-thundra": "^2.4.2", + "serverless-plugin-tracing": "^2.0.0", + "serverless-python-requirements": "^5.1.0" }, "collective": { "type": "opencollective", diff --git a/serverless.yml b/serverless.yml index 79ff628..1a0177e 100644 --- a/serverless.yml +++ b/serverless.yml @@ -1,7 +1,6 @@ service: modules-tf -#frameworkVersion: ">=1.26.0 <2.0.0" -frameworkVersion: "1.51.0" # see KNOWN_ISSUES.md +frameworkVersion: ">=1.65.0 <2.0.0" provider: name: aws @@ -10,9 +9,13 @@ provider: region: eu-west-1 tracing: true timeout: 30 +# profile: modules-deploy environment: - S3_BUCKET: "dl.modules.tf" + S3_BUCKET: ${ssm:/modulestf/${self:custom.stage}/dl_bucket_id} S3_DIR: ${self:custom.stage} + thundra_apiKey: ${ssm:/modulestf/${self:custom.stage}/thundra_api_key~true} + alb: + targetGroupPrefix: modulestf- iamRoleStatements: - Effect: "Allow" Action: @@ -33,33 +36,56 @@ functions: handler: handler.handler description: Generate all from Cloudcraft URL (stage=${self:custom.stage}) memorySize: 1536 + package: {} events: - - http: - method: get - path: / - cors: true - - http: - method: post - path: / + - alb: + listenerArn: ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} + priority: ${self:custom.alb_priority.${self:custom.stage}} cors: true + conditions: + host: ${self:custom.domains.${self:custom.stage}} + path: "*" + method: + - GET + - POST + - OPTIONS + +# validate-cloudcraft: +# name: ${self:service}-${self:custom.stage}-validate-cloudcraft +# handler: handler.handler +# description: Validate inputs from Cloudcraft (stage=${self:custom.stage}) +# memorySize: 1536 +# package: {} +# events: +# - alb: +# # ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} +# listenerArn: ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} +# priority: 1 +# conditions: +# path: /validate +# method: +# - GET +# - POST +# - OPTIONS plugins: - - serverless-domain-manager - serverless-python-requirements - serverless-plugin-tracing + - serverless-plugin-thundra custom: stage: ${opt:stage, self:provider.stage} + + thundra: + apiKey: ${ssm:/modulestf/${self:custom.stage}/thundra_api_key~true} + domains: - prod: lambda.modules.tf - dev: dev-lambda.modules.tf + prod: ${ssm:/modulestf/prod/prod_route53_record_fqdn} # lambda.modules.tf + dev: ${ssm:/modulestf/dev/dev_route53_record_fqdn} # dev-lambda.modules.tf - customDomain: - domainName: "${self:custom.domains.${self:custom.stage}}" - basePath: "" - stage: "${self:custom.stage}" - certificateName: "*.modules.tf" - createRoute53Record: true + alb_priority: + prod: 20 + dev: 10 pythonRequirements: fileName: requirements-lambda.txt # requirements-lambda.txt does not have heavy libraries like matplotlib, python-lambda-local which are required for debug locally diff --git a/templates/root/template/.gitignore b/templates/root/template/.gitignore index 5080bb0..0e18c53 100644 --- a/templates/root/template/.gitignore +++ b/templates/root/template/.gitignore @@ -4,12 +4,6 @@ *.tfstate* crash.log -# Copies of main_providers.tf -main_providers.tf - -# Except original (see related issue - https://github.com/gruntwork-io/terragrunt/issues/785) -!common/main_providers.tf - # Secrets are not allowed in general *.key *.pem diff --git a/templates/root/template/.pre-commit-config.yaml b/templates/root/template/.pre-commit-config.yaml index 6b5fbe3..b59b613 100644 --- a/templates/root/template/.pre-commit-config.yaml +++ b/templates/root/template/.pre-commit-config.yaml @@ -1,10 +1,10 @@ repos: - repo: git://github.com/antonbabenko/pre-commit-terraform - rev: v1.20.0 + rev: v1.25.0 hooks: - id: terraform_fmt - id: terraform_docs - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.4.0 + rev: v2.5.0 hooks: - id: check-merge-conflict diff --git a/templates/root/template/LICENSE b/templates/root/template/LICENSE index 7f519e8..85ff1f7 100644 --- a/templates/root/template/LICENSE +++ b/templates/root/template/LICENSE @@ -1,5 +1,5 @@ The MIT License (MIT) -Copyright (c) 2018-2019 Anton Babenko +Copyright (c) 2018-2020 Anton Babenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/templates/root/template/README.md b/templates/root/template/README.md index 46f6ce3..2c9d04e 100644 --- a/templates/root/template/README.md +++ b/templates/root/template/README.md @@ -2,7 +2,7 @@ This repository contains infrastructure as Terraform configurations which were automatically generated from blueprint created using [cloudcraft.co](https://cloudcraft.co/app). -[Terragrunt](https://github.com/gruntwork-io/terragrunt) is used to work with Terraform configurations which allows to orchestrate dependent layers, update arguments dynamically and keep configurations [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). +[Terragrunt](https://terragrunt.gruntwork.io/) is used to work with Terraform configurations which allows to orchestrate dependent layers, update arguments dynamically and keep configurations [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). ## Table of Contents @@ -16,7 +16,7 @@ This repository contains infrastructure as Terraform configurations which were a ## Quick start 1. [Install Terraform 0.12 or newer](https://www.terraform.io/intro/getting-started/install.html) -1. [Install Terragrunt 0.19 or newer](https://github.com/gruntwork-io/terragrunt#install-terragrunt) +1. [Install Terragrunt 0.22 or newer](https://terragrunt.gruntwork.io/docs/getting-started/install/) 1. Optionally, [install pre-commit hooks](https://pre-commit.com/#install) to keep Terraform formatting and documentation up-to-date. If you are using macOS you can install all dependencies using [Homebrew](https://brew.sh/): @@ -33,7 +33,7 @@ $ export AWS_ACCESS_KEY_ID=... $ export AWS_SECRET_ACCESS_KEY=... ``` -Alternatively, you can edit `common/main_providers.tf` and use another authentication mechanism as described in [AWS provider documentation](https://www.terraform.io/docs/providers/aws/index.html#authentication). +Alternatively, you can edit `terragrunt.hcl` and use another authentication mechanism as described in [AWS provider documentation](https://www.terraform.io/docs/providers/aws/index.html#authentication). ## Create and manage your infrastructure @@ -67,7 +67,7 @@ After the confirmation your infrastructure should be created. ## References -* [Terraform documentation](https://terraform.io/) and [Terragrunt documentation](https://github.com/gruntwork-io/terragrunt/blob/master/README.md) for all available commands and features. +* [Terraform documentation](https://www.terraform.io/docs/) and [Terragrunt documentation](https://terragrunt.gruntwork.io/docs/) for all available commands and features. * [Terraform AWS modules](https://github.com/terraform-aws-modules/). * [Terraform modules registry](https://registry.terraform.io/). diff --git a/templates/terragrunt-common-layer/common/main_providers.tf b/templates/terragrunt-common-layer/common/main_providers.tf deleted file mode 100644 index 23b25d7..0000000 --- a/templates/terragrunt-common-layer/common/main_providers.tf +++ /dev/null @@ -1,13 +0,0 @@ -provider "aws" { - region = "{{ cookiecutter.region }}" - - # Make it faster by skipping something - skip_get_ec2_platforms = true - skip_metadata_api_check = true - skip_region_validation = true - skip_credentials_validation = true -} - -terraform { - backend "s3" {} -} diff --git a/templates/terragrunt-common-layer/region/terragrunt.hcl b/templates/terragrunt-common-layer/region/terragrunt.hcl index 11b1de4..c0585b8 100644 --- a/templates/terragrunt-common-layer/region/terragrunt.hcl +++ b/templates/terragrunt-common-layer/region/terragrunt.hcl @@ -3,31 +3,41 @@ terraform { commands = get_terraform_commands_that_need_input() arguments = ["-input=false"] } - - after_hook "copy_common_main_providers" { - commands = ["init-from-module"] - execute = ["cp", "${get_parent_terragrunt_dir()}/../../common/main_providers.tf", "."] - } - - // Do not delete the copied file because of the odd behavior described in this related issue - https://github.com/gruntwork-io/terragrunt/issues/785 - // after_hook "remove_useless_copy_of_main_providers" { - // commands = ["init"] - // execute = ["rm", "-f", "${get_parent_terragrunt_dir()}/${path_relative_to_include()}/main_providers.tf"] - // } } remote_state { - backend = "s3" + backend = "s3" disable_init = tobool(get_env("TERRAGRUNT_DISABLE_INIT", "false")) + generate = { + path = "_backend.tf" + if_exists = "overwrite" + } + config = { encrypt = true region = "{{ cookiecutter.region }}" - key = "${path_relative_to_include()}/terraform.tfstate" - bucket = "terraform-states-${get_aws_account_id()}" - dynamodb_table = "terraform-locks-${get_aws_account_id()}" + key = format("%s/terraform.tfstate", path_relative_to_include()) + bucket = format("terraform-states-%s", get_aws_account_id()) + dynamodb_table = format("terraform-locks-%s", get_aws_account_id()) skip_metadata_api_check = true skip_credentials_validation = true } } + +generate "main_providers" { + path = "main_providers.tf" + if_exists = "overwrite" + contents = < 0: +# pytest.exit('Missing environment variables: {}'.format(", ".join(missing_environment_variables))) +# +# +# @pytest.mark.parametrize("event", events) +# def test_cloudcraft_graph(event): +# # if 'Records' in event: +# # response = notify_slack.lambda_handler(event, 'self-context') +# # +# # else: +# file = open(event, 'r') +# data = json.load(file) +# +# graph = populate_graph(data) +# +# # response = loads(response) +# assert graph is not False diff --git a/tests/pytest.ini b/tests/pytest.ini new file mode 100644 index 0000000..89c5c0d --- /dev/null +++ b/tests/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +addopts = --disable-pytest-warnings +env = + AA=something + IS_LOCAL=1 diff --git a/tests/pytest.ini.sample b/tests/pytest.ini.sample new file mode 100644 index 0000000..527a004 --- /dev/null +++ b/tests/pytest.ini.sample @@ -0,0 +1,4 @@ +[pytest] +addopts = --disable-pytest-warnings +env = + AA=something diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..cf01492 --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,4 @@ +boto3 + +pytest +pytest-env From 2c7c091ced750f63c2f70b7f995950e96cab8ee2 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Fri, 6 Mar 2020 21:46:36 +0100 Subject: [PATCH 04/29] [ci skip] Updated docs --- .github/workflows/main.yml | 10 ++++++++++ DEVELOPMENT.md | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d574a39..ab07d7a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,3 +1,6 @@ +# [ci skip] workaround from https://github.com/srz-zumix/ci-skip/blob/master/docs/github/WORKAROUND.md + + name: Autodeploy to dev environment on: @@ -6,8 +9,15 @@ on: - master jobs: + prepare: + runs-on: ubuntu-latest + if: "! contains(github.event.head_commit.message, '[ci skip]')" + steps: + - run: echo "${{ github.event.head_commit.message }}" + deploy: runs-on: ubuntu-latest + needs: prepare steps: - uses: actions/checkout@v2 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index e0c1f65..8789192 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -36,6 +36,12 @@ $ serverless deploy function --function generate-cloudcraft --stage dev $ serverless deploy function --function generate-cloudcraft --stage prod ``` +## Infrastructure + +modules.tf can be self-hosted on your own infrastructure (if you want to expand it for some reason). + +See [modules.tf-infra](https://github.com/antonbabenko/modules.tf-infra) repository for complete setup. + ## Spellchecker ``` From 85e4ecc76a4d292abf352ea8f87a4641cdb04c34 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sat, 7 Mar 2020 18:30:32 +0100 Subject: [PATCH 05/29] Added CORS for ALB requests --- handler.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/handler.py b/handler.py index ea89c92..218744d 100755 --- a/handler.py +++ b/handler.py @@ -110,6 +110,9 @@ def handler(event, context): "statusDescription": str(error.args[1]) + " Server Error", "headers": { "Content-Type": "text/html", + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", }, "body": error.args[0], } @@ -136,6 +139,9 @@ def handler(event, context): "statusDescription": "200 OK", "headers": { "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", }, "body": json.dumps(validation_result(config)) } @@ -156,6 +162,8 @@ def handler(event, context): "headers": { "Location": link, "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", + "Access-Control-Allow-Methods": "POST,GET,OPTIONS", }, "statusCode": 302, "statusDescription": "302 Found", From a1856e09f52f7ad17a4cccc87ceac73319a404b4 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 22 Mar 2020 15:40:59 +0100 Subject: [PATCH 06/29] feat: Added DynamoDB Table (#23) --- modules-metadata/dynamodb-table.json | 101 ++++++++++++++++++ .../dynamodb-table_cloudcraft.json | 1 + .../dynamodb-table_variables.json | 101 ++++++++++++++++++ modules-metadata/dynamodb-table_version.txt | 1 + modules-metadata/s3-bucket.json | 20 ++++ modules-metadata/s3-bucket_variables.json | 20 ++++ modules-metadata/s3-bucket_version.txt | 2 +- modules-metadata/update_modules_metadata.sh | 6 +- modules-metadata/vpc.json | 65 +++++++++++ modules-metadata/vpc_variables.json | 65 +++++++++++ modules-metadata/vpc_version.txt | 2 +- modulestf/convert.py | 14 ++- modulestf/modules.py | 5 + 13 files changed, 398 insertions(+), 5 deletions(-) create mode 100644 modules-metadata/dynamodb-table.json create mode 100644 modules-metadata/dynamodb-table_cloudcraft.json create mode 100644 modules-metadata/dynamodb-table_variables.json create mode 100644 modules-metadata/dynamodb-table_version.txt diff --git a/modules-metadata/dynamodb-table.json b/modules-metadata/dynamodb-table.json new file mode 100644 index 0000000..4b40d00 --- /dev/null +++ b/modules-metadata/dynamodb-table.json @@ -0,0 +1,101 @@ +{ + "attributes": { + "default": [], + "description": "List of nested attribute definitions. Only required for hash_key and range_key attributes. Each attribute has two properties: name - (Required) The name of the attribute, type - (Required) Attribute type, which must be a scalar type: S, N, or B for (S)tring, (N)umber or (B)inary data", + "type": "list(map(string))" + }, + "billing_mode": { + "default": "PAY_PER_REQUEST", + "description": "Controls how you are billed for read/write throughput and how you manage capacity. The valid values are PROVISIONED or PAY_PER_REQUEST", + "type": "string" + }, + "create_table": { + "default": true, + "description": "Controls if DynamoDB table and associated resources are created", + "type": "bool" + }, + "global_secondary_indexes": { + "default": [], + "description": "Describe a GSI for the table; subject to the normal limits on the number of GSIs, projected attributes, etc.", + "type": "list(any)" + }, + "hash_key": { + "default": "null", + "description": "The attribute to use as the hash (partition) key. Must also be defined as an attribute", + "type": "string" + }, + "local_secondary_indexes": { + "default": [], + "description": "Describe an LSI on the table; these can only be allocated at creation so you cannot change this definition after you have created the resource.", + "type": "list(any)" + }, + "name": { + "default": "null", + "description": "Name of the DynamoDB table", + "type": "string" + }, + "point_in_time_recovery_enabled": { + "default": false, + "description": "Whether to enable point-in-time recovery", + "type": "bool" + }, + "range_key": { + "default": "null", + "description": "The attribute to use as the range (sort) key. Must also be defined as an attribute", + "type": "string" + }, + "read_capacity": { + "default": "null", + "description": "The number of read units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", + "type": "number" + }, + "server_side_encryption_enabled": { + "default": false, + "description": "Whether or not to enable encryption at rest using an AWS managed KMS customer master key (CMK)", + "type": "bool" + }, + "server_side_encryption_kms_key_arn": { + "default": "null", + "description": "The ARN of the CMK that should be used for the AWS KMS encryption. This attribute should only be specified if the key is different from the default DynamoDB CMK, alias/aws/dynamodb.", + "type": "string" + }, + "stream_enabled": { + "default": false, + "description": "Indicates whether Streams are to be enabled (true) or disabled (false).", + "type": "bool" + }, + "stream_view_type": { + "default": "null", + "description": "When an item in the table is modified, StreamViewType determines what information is written to the table's stream. Valid values are KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "A map of tags to add to all resources", + "type": "map(string)" + }, + "timeouts": { + "default": { + "create": "10m", + "delete": "10m", + "update": "60m" + }, + "description": "Updated Terraform resource management timeouts", + "type": "map(string)" + }, + "ttl_attribute_name": { + "default": "", + "description": "The name of the table attribute to store the TTL timestamp in", + "type": "string" + }, + "ttl_enabled": { + "default": false, + "description": "Indicates whether ttl is enabled", + "type": "bool" + }, + "write_capacity": { + "default": "null", + "description": "The number of write units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", + "type": "number" + } +} diff --git a/modules-metadata/dynamodb-table_cloudcraft.json b/modules-metadata/dynamodb-table_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/modules-metadata/dynamodb-table_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/modules-metadata/dynamodb-table_variables.json b/modules-metadata/dynamodb-table_variables.json new file mode 100644 index 0000000..4b40d00 --- /dev/null +++ b/modules-metadata/dynamodb-table_variables.json @@ -0,0 +1,101 @@ +{ + "attributes": { + "default": [], + "description": "List of nested attribute definitions. Only required for hash_key and range_key attributes. Each attribute has two properties: name - (Required) The name of the attribute, type - (Required) Attribute type, which must be a scalar type: S, N, or B for (S)tring, (N)umber or (B)inary data", + "type": "list(map(string))" + }, + "billing_mode": { + "default": "PAY_PER_REQUEST", + "description": "Controls how you are billed for read/write throughput and how you manage capacity. The valid values are PROVISIONED or PAY_PER_REQUEST", + "type": "string" + }, + "create_table": { + "default": true, + "description": "Controls if DynamoDB table and associated resources are created", + "type": "bool" + }, + "global_secondary_indexes": { + "default": [], + "description": "Describe a GSI for the table; subject to the normal limits on the number of GSIs, projected attributes, etc.", + "type": "list(any)" + }, + "hash_key": { + "default": "null", + "description": "The attribute to use as the hash (partition) key. Must also be defined as an attribute", + "type": "string" + }, + "local_secondary_indexes": { + "default": [], + "description": "Describe an LSI on the table; these can only be allocated at creation so you cannot change this definition after you have created the resource.", + "type": "list(any)" + }, + "name": { + "default": "null", + "description": "Name of the DynamoDB table", + "type": "string" + }, + "point_in_time_recovery_enabled": { + "default": false, + "description": "Whether to enable point-in-time recovery", + "type": "bool" + }, + "range_key": { + "default": "null", + "description": "The attribute to use as the range (sort) key. Must also be defined as an attribute", + "type": "string" + }, + "read_capacity": { + "default": "null", + "description": "The number of read units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", + "type": "number" + }, + "server_side_encryption_enabled": { + "default": false, + "description": "Whether or not to enable encryption at rest using an AWS managed KMS customer master key (CMK)", + "type": "bool" + }, + "server_side_encryption_kms_key_arn": { + "default": "null", + "description": "The ARN of the CMK that should be used for the AWS KMS encryption. This attribute should only be specified if the key is different from the default DynamoDB CMK, alias/aws/dynamodb.", + "type": "string" + }, + "stream_enabled": { + "default": false, + "description": "Indicates whether Streams are to be enabled (true) or disabled (false).", + "type": "bool" + }, + "stream_view_type": { + "default": "null", + "description": "When an item in the table is modified, StreamViewType determines what information is written to the table's stream. Valid values are KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "A map of tags to add to all resources", + "type": "map(string)" + }, + "timeouts": { + "default": { + "create": "10m", + "delete": "10m", + "update": "60m" + }, + "description": "Updated Terraform resource management timeouts", + "type": "map(string)" + }, + "ttl_attribute_name": { + "default": "", + "description": "The name of the table attribute to store the TTL timestamp in", + "type": "string" + }, + "ttl_enabled": { + "default": false, + "description": "Indicates whether ttl is enabled", + "type": "bool" + }, + "write_capacity": { + "default": "null", + "description": "The number of write units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", + "type": "number" + } +} diff --git a/modules-metadata/dynamodb-table_version.txt b/modules-metadata/dynamodb-table_version.txt new file mode 100644 index 0000000..268b033 --- /dev/null +++ b/modules-metadata/dynamodb-table_version.txt @@ -0,0 +1 @@ +v0.3.0 diff --git a/modules-metadata/s3-bucket.json b/modules-metadata/s3-bucket.json index c4309f6..fe54516 100644 --- a/modules-metadata/s3-bucket.json +++ b/modules-metadata/s3-bucket.json @@ -19,6 +19,16 @@ "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", "type": "bool" }, + "block_public_acls": { + "default": false, + "description": "Whether Amazon S3 should block public ACLs for this bucket.", + "type": "bool" + }, + "block_public_policy": { + "default": false, + "description": "Whether Amazon S3 should block public bucket policies for this bucket.", + "type": "bool" + }, "bucket": { "default": "null", "description": "(Optional, Forces new resource) The name of the bucket. If omitted, Terraform will assign a random, unique name.", @@ -44,6 +54,11 @@ "description": "(Optional, Default:false ) A boolean that indicates all objects should be deleted from the bucket so that the bucket can be destroyed without error. These objects are not recoverable.", "type": "bool" }, + "ignore_public_acls": { + "default": false, + "description": "Whether Amazon S3 should ignore public ACLs for this bucket.", + "type": "bool" + }, "lifecycle_rule": { "default": [], "description": "List of maps containing configuration of object lifecycle management.", @@ -79,6 +94,11 @@ "description": "(Optional) Specifies who should bear the cost of Amazon S3 data transfer. Can be either BucketOwner or Requester. By default, the owner of the S3 bucket would incur the costs of any data transfer. See Requester Pays Buckets developer guide for more information.", "type": "string" }, + "restrict_public_buckets": { + "default": false, + "description": "Whether Amazon S3 should restrict public bucket policies for this bucket.", + "type": "bool" + }, "server_side_encryption_configuration": { "default": {}, "description": "Map containing server-side encryption configuration.", diff --git a/modules-metadata/s3-bucket_variables.json b/modules-metadata/s3-bucket_variables.json index c4309f6..fe54516 100644 --- a/modules-metadata/s3-bucket_variables.json +++ b/modules-metadata/s3-bucket_variables.json @@ -19,6 +19,16 @@ "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", "type": "bool" }, + "block_public_acls": { + "default": false, + "description": "Whether Amazon S3 should block public ACLs for this bucket.", + "type": "bool" + }, + "block_public_policy": { + "default": false, + "description": "Whether Amazon S3 should block public bucket policies for this bucket.", + "type": "bool" + }, "bucket": { "default": "null", "description": "(Optional, Forces new resource) The name of the bucket. If omitted, Terraform will assign a random, unique name.", @@ -44,6 +54,11 @@ "description": "(Optional, Default:false ) A boolean that indicates all objects should be deleted from the bucket so that the bucket can be destroyed without error. These objects are not recoverable.", "type": "bool" }, + "ignore_public_acls": { + "default": false, + "description": "Whether Amazon S3 should ignore public ACLs for this bucket.", + "type": "bool" + }, "lifecycle_rule": { "default": [], "description": "List of maps containing configuration of object lifecycle management.", @@ -79,6 +94,11 @@ "description": "(Optional) Specifies who should bear the cost of Amazon S3 data transfer. Can be either BucketOwner or Requester. By default, the owner of the S3 bucket would incur the costs of any data transfer. See Requester Pays Buckets developer guide for more information.", "type": "string" }, + "restrict_public_buckets": { + "default": false, + "description": "Whether Amazon S3 should restrict public bucket policies for this bucket.", + "type": "bool" + }, "server_side_encryption_configuration": { "default": {}, "description": "Map containing server-side encryption configuration.", diff --git a/modules-metadata/s3-bucket_version.txt b/modules-metadata/s3-bucket_version.txt index 2e7bd91..b7c0a9b 100644 --- a/modules-metadata/s3-bucket_version.txt +++ b/modules-metadata/s3-bucket_version.txt @@ -1 +1 @@ -v1.5.0 +v1.6.0 diff --git a/modules-metadata/update_modules_metadata.sh b/modules-metadata/update_modules_metadata.sh index f45c361..7856c94 100755 --- a/modules-metadata/update_modules_metadata.sh +++ b/modules-metadata/update_modules_metadata.sh @@ -16,10 +16,11 @@ sns sqs vpc redshift -s3-bucket) +s3-bucket +dynamodb-table) #cloudfront -MODULES_DIR=/Users/Bob/Sites/terraform-aws-modules +MODULES_DIR=~/Sites/terraform-aws-modules for module in "${MODULES[@]}"; do @@ -34,6 +35,7 @@ for module in "${MODULES[@]}"; do # hcltool comes from https://github.com/virtuald/pyhcl/blob/master/scripts/hcltool hcltool "$tmp_file_tf" | jq -r '.variable' > ${module}_variables.json + test -f ${module}_cloudcraft.json || echo "{}" > ${module}_cloudcraft.json jq -s '.[0] * .[1]' ${module}_variables.json ${module}_cloudcraft.json > ${module}.json rm -f "$tmp_file_tf" diff --git a/modules-metadata/vpc.json b/modules-metadata/vpc.json index 6cd87f8..ef5f690 100644 --- a/modules-metadata/vpc.json +++ b/modules-metadata/vpc.json @@ -204,6 +204,16 @@ "description": "Controls if separate route table for elasticache should be created", "type": "bool" }, + "create_flow_log_cloudwatch_iam_role": { + "default": false, + "description": "Whether to create IAM role for VPC Flow Logs", + "type": "bool" + }, + "create_flow_log_cloudwatch_log_group": { + "default": false, + "description": "Whether to create CloudWatch log group for VPC Flow Logs", + "type": "bool" + }, "create_redshift_subnet_group": { "default": true, "description": "Controls if redshift subnet group should be created", @@ -748,6 +758,11 @@ "description": "Should be true if you want to provision a CloudWatch Events endpoint to the VPC", "type": "bool" }, + "enable_flow_log": { + "default": false, + "description": "Whether or not to enable VPC Flow Logs", + "type": "bool" + }, "enable_git_codecommit_endpoint": { "default": false, "description": "Should be true if you want to provision an Git Codecommit endpoint to the VPC" @@ -896,6 +911,46 @@ "description": "List of EIP IDs to be assigned to the NAT Gateways (used in combination with reuse_nat_ips)", "type": "list(string)" }, + "flow_log_cloudwatch_iam_role_arn": { + "default": "", + "description": "The ARN for the IAM role that's used to post flow logs to a CloudWatch Logs log group. When flow_log_destination_arn is set to ARN of Cloudwatch Logs, this argument needs to be provided.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_name_prefix": { + "default": "/aws/vpc-flow-log/", + "description": "Specifies the name prefix of CloudWatch Log Group for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group for VPC flow logs.", + "type": "number" + }, + "flow_log_destination_arn": { + "default": "", + "description": "The ARN of the CloudWatch log group or S3 bucket where VPC Flow Logs will be pushed. If this ARN is a S3 bucket the appropriate permissions need to be set on that bucket's policy. When create_flow_log_cloudwatch_log_group is set to false this argument must be provided.", + "type": "string" + }, + "flow_log_destination_type": { + "default": "cloud-watch-logs", + "description": "Type of flow log destination. Can be s3 or cloud-watch-logs.", + "type": "string" + }, + "flow_log_log_format": { + "default": "null", + "description": "The fields to include in the flow log record, in the order in which they should appear.", + "type": "string" + }, + "flow_log_traffic_type": { + "default": "ALL", + "description": "The type of traffic to capture. Valid values: ACCEPT, REJECT, ALL.", + "type": "string" + }, "git_codecommit_endpoint_private_dns_enabled": { "default": false, "description": "Whether or not to associate a private hosted zone with the specified VPC for Git Codecommit endpoint" @@ -1567,11 +1622,21 @@ "description": "Additional tags for the VPC Endpoints", "type": "map(string)" }, + "vpc_flow_log_tags": { + "default": {}, + "description": "Additional tags for the VPC Flow Logs", + "type": "map(string)" + }, "vpc_tags": { "default": {}, "description": "Additional tags for the VPC", "type": "map(string)" }, + "vpn_gateway_az": { + "default": "null", + "description": "The Availability Zone for the VPN Gateway", + "type": "string" + }, "vpn_gateway_id": { "default": "", "description": "ID of VPN Gateway to attach to the VPC" diff --git a/modules-metadata/vpc_variables.json b/modules-metadata/vpc_variables.json index 6cd87f8..ef5f690 100644 --- a/modules-metadata/vpc_variables.json +++ b/modules-metadata/vpc_variables.json @@ -204,6 +204,16 @@ "description": "Controls if separate route table for elasticache should be created", "type": "bool" }, + "create_flow_log_cloudwatch_iam_role": { + "default": false, + "description": "Whether to create IAM role for VPC Flow Logs", + "type": "bool" + }, + "create_flow_log_cloudwatch_log_group": { + "default": false, + "description": "Whether to create CloudWatch log group for VPC Flow Logs", + "type": "bool" + }, "create_redshift_subnet_group": { "default": true, "description": "Controls if redshift subnet group should be created", @@ -748,6 +758,11 @@ "description": "Should be true if you want to provision a CloudWatch Events endpoint to the VPC", "type": "bool" }, + "enable_flow_log": { + "default": false, + "description": "Whether or not to enable VPC Flow Logs", + "type": "bool" + }, "enable_git_codecommit_endpoint": { "default": false, "description": "Should be true if you want to provision an Git Codecommit endpoint to the VPC" @@ -896,6 +911,46 @@ "description": "List of EIP IDs to be assigned to the NAT Gateways (used in combination with reuse_nat_ips)", "type": "list(string)" }, + "flow_log_cloudwatch_iam_role_arn": { + "default": "", + "description": "The ARN for the IAM role that's used to post flow logs to a CloudWatch Logs log group. When flow_log_destination_arn is set to ARN of Cloudwatch Logs, this argument needs to be provided.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_name_prefix": { + "default": "/aws/vpc-flow-log/", + "description": "Specifies the name prefix of CloudWatch Log Group for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group for VPC flow logs.", + "type": "number" + }, + "flow_log_destination_arn": { + "default": "", + "description": "The ARN of the CloudWatch log group or S3 bucket where VPC Flow Logs will be pushed. If this ARN is a S3 bucket the appropriate permissions need to be set on that bucket's policy. When create_flow_log_cloudwatch_log_group is set to false this argument must be provided.", + "type": "string" + }, + "flow_log_destination_type": { + "default": "cloud-watch-logs", + "description": "Type of flow log destination. Can be s3 or cloud-watch-logs.", + "type": "string" + }, + "flow_log_log_format": { + "default": "null", + "description": "The fields to include in the flow log record, in the order in which they should appear.", + "type": "string" + }, + "flow_log_traffic_type": { + "default": "ALL", + "description": "The type of traffic to capture. Valid values: ACCEPT, REJECT, ALL.", + "type": "string" + }, "git_codecommit_endpoint_private_dns_enabled": { "default": false, "description": "Whether or not to associate a private hosted zone with the specified VPC for Git Codecommit endpoint" @@ -1567,11 +1622,21 @@ "description": "Additional tags for the VPC Endpoints", "type": "map(string)" }, + "vpc_flow_log_tags": { + "default": {}, + "description": "Additional tags for the VPC Flow Logs", + "type": "map(string)" + }, "vpc_tags": { "default": {}, "description": "Additional tags for the VPC", "type": "map(string)" }, + "vpn_gateway_az": { + "default": "null", + "description": "The Availability Zone for the VPN Gateway", + "type": "string" + }, "vpn_gateway_id": { "default": "", "description": "ID of VPN Gateway to attach to the VPC" diff --git a/modules-metadata/vpc_version.txt b/modules-metadata/vpc_version.txt index 098c531..1423e98 100644 --- a/modules-metadata/vpc_version.txt +++ b/modules-metadata/vpc_version.txt @@ -1 +1 @@ -v2.25.0 +v2.31.0 diff --git a/modulestf/convert.py b/modulestf/convert.py index db0aaab..580a749 100644 --- a/modulestf/convert.py +++ b/modulestf/convert.py @@ -82,7 +82,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 parsed_asg_id = set() warnings = set() - supported_node_types = ["rds", "ec2", "elb", "sns", "sqs", "sg", "vpc", "s3", "redshift"] + supported_node_types = ["rds", "ec2", "elb", "sns", "sqs", "sg", "vpc", "s3", "redshift", "dynamodb"] # supported_node_types = ["sg", "vpc"] for key, node_complete in G.nodes.items(): @@ -400,6 +400,18 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) + if node.get("type") == "dynamodb": + r = Resource(key, "dynamodb-table", node.get("text")) + + r.update_params({ + "name": random_pet(), + "read_capacity": node.get("readUnits"), + "write_capacity": node.get("writeUnits"), + "billing_mode": "PROVISIONED" if node.get("capacityMode") == "provisioned" else "PAY_PER_REQUEST", + }) + + resources.append(r.content()) + if node.get("type") == "s3": r = Resource(key, "s3-bucket", node.get("text")) diff --git a/modulestf/modules.py b/modulestf/modules.py index a3adb8e..ef9ae07 100644 --- a/modulestf/modules.py +++ b/modulestf/modules.py @@ -138,6 +138,11 @@ def update_template_variables(var): "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/redshift/aws/" + get_version("../modules-metadata/redshift_version.txt", True), "variables": update_template_variables(load_local_json("../modules-metadata/redshift.json")), }, + "dynamodb-table": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-dynamodb-table.git?ref=" + get_version("../modules-metadata/dynamodb-table_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/dynamodb-table/aws/" + get_version("../modules-metadata/dynamodb-table_version.txt", True), + "variables": update_template_variables(load_local_json("../modules-metadata/dynamodb-table.json")), + }, "cloudfront": { "source": "terraform-aws-modules/cloudfront/aws", "registry_url": "", From a6b61b64b2eb73855c01cf511b8879f1d751dc5f Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 22 Mar 2020 15:47:13 +0100 Subject: [PATCH 07/29] chore: Added CHANGELOG (#24) --- .chglog/CHANGELOG.tpl.md | 63 ++++++++++++++++++++++++++++++++++++++++ .chglog/config.yml | 48 ++++++++++++++++++++++++++++++ CHANGELOG.md | 40 +++++++++++++++++++++++++ Makefile | 7 +++++ 4 files changed, 158 insertions(+) create mode 100644 .chglog/CHANGELOG.tpl.md create mode 100644 .chglog/config.yml create mode 100644 CHANGELOG.md create mode 100644 Makefile diff --git a/.chglog/CHANGELOG.tpl.md b/.chglog/CHANGELOG.tpl.md new file mode 100644 index 0000000..1b3087e --- /dev/null +++ b/.chglog/CHANGELOG.tpl.md @@ -0,0 +1,63 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +{{ if .Versions -}} + +## [Unreleased] +{{ if .Unreleased.CommitGroups -}} +{{ range .Unreleased.CommitGroups -}} +{{ .Title }}: +{{ range .Commits -}} +{{- if .Subject -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} +{{ end -}} +{{ end }} +{{ end -}} +{{ else }} +{{ range .Unreleased.Commits -}} +{{- if .Subject -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} +{{ end -}} +{{ end }} +{{ end -}} +{{ end -}} + +{{ range .Versions }} + +## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }} +{{ if .CommitGroups -}} +{{ range .CommitGroups -}} +{{ .Title }}: +{{ range .Commits -}} +{{- if .Subject -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} +{{ end -}} +{{ end }} +{{ end -}} +{{ else }} +{{ range .Commits -}} +{{- if .Subject -}} +- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} +{{ end -}} +{{ end }} +{{ end -}} + +{{- if .NoteGroups -}} +{{ range .NoteGroups -}} +{{ .Title }}: +{{ range .Notes }} +{{ .Body }} +{{ end }} +{{ end -}} +{{ end -}} +{{ end -}} + +{{- if .Versions }} +[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD +{{ range .Versions -}} +{{ if .Tag.Previous -}} +[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }} +{{ end -}} +{{ end -}} +{{ end -}} diff --git a/.chglog/config.yml b/.chglog/config.yml new file mode 100644 index 0000000..7ca18c9 --- /dev/null +++ b/.chglog/config.yml @@ -0,0 +1,48 @@ +style: github +template: CHANGELOG.tpl.md +info: + title: CHANGELOG + repository_url: https://github.com/antonbabenko/modules.tf-lambda +options: + + commits: + sort_by: Type + filters: + Type: + - feat + - fix + - improvement + - docs + - refactor + - test + - ci + - chore + + commit_groups: + group_by: Type + title_maps: + feat: FEATURES + fix: BUG FIXES + improvement: ENHANCEMENTS + docs: DOCS + refactor: REFACTORS + test: TESTS + ci: CI + chore: CHORES + + header: + pattern: "^(.+)\\s*:\\s*(.+)$" + pattern_maps: + - Type + - Subject + + notes: + keywords: + - BREAKING CHANGE + - NOTES + + refs: + actions: + - Closes + - Fixes + - Resolves diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..82cade6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,40 @@ +# Change Log + +All notable changes to this project will be documented in this file. + + +## [Unreleased] +FEATURES: +- Added DynamoDB Table + + + +## [v1.4.0] - 2019-11-05 + + + + +## [v1.3.0] - 2019-11-04 + + + + +## [v1.2.0] - 2019-04-15 + + + + +## [v1.1.0] - 2018-11-25 + + + + +## v1.0.0 - 2018-11-19 + + + +[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.4.0...HEAD +[v1.4.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.3.0...v1.4.0 +[v1.3.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.2.0...v1.3.0 +[v1.2.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.1.0...v1.2.0 +[v1.1.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.0.0...v1.1.0 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..558dac5 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +.PHONY: changelog release + +changelog: + git-chglog -o CHANGELOG.md --next-tag `semtag final -s minor -o` + +release: + semtag final -s minor From 25457884a036107d9251adab4ed02cf5801f9175 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 22 Mar 2020 15:47:56 +0100 Subject: [PATCH 08/29] Updated CHANGELOG --- CHANGELOG.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82cade6..5128878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,16 @@ All notable changes to this project will be documented in this file. ## [Unreleased] + + + + +## [v1.5.0] - 2020-03-22 +CHORES: +- Added CHANGELOG ([#24](https://github.com/antonbabenko/modules.tf-lambda/issues/24)) + FEATURES: -- Added DynamoDB Table +- Added DynamoDB Table ([#23](https://github.com/antonbabenko/modules.tf-lambda/issues/23)) @@ -33,7 +41,8 @@ FEATURES: -[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.4.0...HEAD +[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.5.0...HEAD +[v1.5.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.4.0...v1.5.0 [v1.4.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.3.0...v1.4.0 [v1.3.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.2.0...v1.3.0 [v1.2.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.1.0...v1.2.0 From bea3ac51e9fee23ff339faadd0cf4bee09edb6b9 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 22 Mar 2020 16:29:43 +0100 Subject: [PATCH 09/29] feat: Set folder names correctly (fixes #22) (#25) --- modulestf/convert.py | 30 +- test_fixtures/input/blueprint_small.json | 444 ++++++++++++++++------- 2 files changed, 327 insertions(+), 147 deletions(-) diff --git a/modulestf/convert.py b/modulestf/convert.py index 580a749..0b31299 100644 --- a/modulestf/convert.py +++ b/modulestf/convert.py @@ -117,7 +117,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 tmp_edges = [] if node.get("type") == "rds" and node.get("engine") in ["aurora-mysql", "aurora-postgresql"]: - r = Resource(key, "rds-aurora", node.get("text")) + r = Resource(key, "rds-aurora", node_text) r.update_params({ "isMultiAZ": node.get("multiAZ"), @@ -171,7 +171,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "rds" and node.get("engine") not in ["aurora-mysql", "aurora-postgresql"]: - r = Resource(key, "rds", node.get("text")) + r = Resource(key, "rds", node_text) r.update_params({ "isMultiAZ": node.get("multiAZ"), @@ -253,7 +253,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 asg_name = G.nodes.get(asg_id, {}).get("text") - r = Resource(asg_id, "autoscaling", node.get("text")) + r = Resource(asg_id, "autoscaling", asg_name) r.update_params({ "name": asg_name if asg_name else random_pet(), @@ -293,7 +293,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 parsed_asg_id.add(asg_id) else: - r = Resource(key, "ec2-instance", node.get("text")) + r = Resource(key, "ec2-instance", node_text) r.update_params({ "name": node_text if node_text else random_pet(), @@ -316,7 +316,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 # break if node.get("elbType") == "application": - r = Resource(key, "alb", node.get("text")) + r = Resource(key, "alb", node_text) r.update_params({ "name": random_pet(), @@ -332,7 +332,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.this_security_group_id]") elif node.get("elbType") == "network": - r = Resource(key, "nlb", node.get("text")) + r = Resource(key, "nlb", node_text) r.update_params({ "name": random_pet(), @@ -344,7 +344,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r.update_dynamic_params("vpc_id", "dependency." + vpc_id + ".outputs.vpc_id") else: - r = Resource(key, "elb", node.get("text")) + r = Resource(key, "elb", node_text) r.update_params({ "name": random_pet(), @@ -374,7 +374,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "redshift": - r = Resource(key, "redshift", node.get("text")) + r = Resource(key, "redshift", node_text) r.update_params({ "cluster_identifier": random_pet(), @@ -401,7 +401,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "dynamodb": - r = Resource(key, "dynamodb-table", node.get("text")) + r = Resource(key, "dynamodb-table", node_text) r.update_params({ "name": random_pet(), @@ -413,7 +413,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "s3": - r = Resource(key, "s3-bucket", node.get("text")) + r = Resource(key, "s3-bucket", node_text) r.update_params({ "bucket": node_text if node_text else random_pet(), @@ -423,17 +423,17 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "cloudfront": - r = Resource(key, "cloudfront", node.get("text")) + r = Resource(key, "cloudfront", node_text) resources.append(r.content()) if node.get("type") == "sns": - r = Resource(key, "sns", node.get("text")) + r = Resource(key, "sns", node_text) resources.append(r.content()) if node.get("type") == "sqs": - r = Resource(key, "sqs", node.get("text")) + r = Resource(key, "sqs", node_text) r.update_params({ "fifoQueue": node.get("queueType") == "fifo", @@ -442,7 +442,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "sg": - r = Resource(key, "security-group", node.get("text")) + r = Resource(key, "security-group", node.get("group_name")) r.update_params({ "name": node.get("group_name", random_pet()), @@ -457,7 +457,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 resources.append(r.content()) if node.get("type") == "vpc": - r = Resource(key, "vpc", node.get("text")) + r = Resource(key, "vpc", node.get("group_name")) selected_vpc_cidr = "10.0.0.0/16" diff --git a/test_fixtures/input/blueprint_small.json b/test_fixtures/input/blueprint_small.json index d1d31b5..eda2c38 100644 --- a/test_fixtures/input/blueprint_small.json +++ b/test_fixtures/input/blueprint_small.json @@ -1,16 +1,34 @@ { - "id": "a84ffac3-4d03-48a4-b261-bb3ac38285d5", + "id": "b2eda0eb-21b2-45d8-93d5-c0b4906eb69e", "data": { "grid": "infinite", - "name": "hashitalk", + "name": "test-small", "text": [ { - "id": "baed8f37-64d8-461f-8a07-9d29ec970775", - "text": "RDS-name", + "id": "6c2e4c17-42b0-4f0a-9f93-9bc5dcd6c4ad", + "text": "SQS-number1", "type": "isotext", "color": "#4286c5", "mapPos": { - "relTo": "37bccc85-a83f-4f1f-aafc-3eb78293aefb", + "relTo": "6f6bbbea-4ec0-40dc-ad2e-c81b4a56a42e", + "offset": [ + 0.3500000000000001, + 1.3900000000000006 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }, + { + "id": "d6325c13-9822-43b7-8a0f-bed52a217b67", + "text": "RDS-cluster", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "29e8479c-67e7-4286-a060-d46529413fce", "offset": [ 0.125, 1 @@ -23,15 +41,15 @@ "isometric": true }, { - "id": "52a08696-d9a8-49c7-bbf0-5d62e45da5e3", - "text": "asg-name", + "id": "319db0da-7337-4b01-a213-46bdaf84ff60", + "text": "Assets", "type": "isotext", "color": "#4286c5", "mapPos": { - "relTo": "e8a7caf4-3075-49d4-b085-ff407dbfd7e9", + "relTo": "f034bcfb-6a1b-4925-9b64-5c76c90f2c17", "offset": [ - -0.5049999999999999, - 1.1400000000000006 + 0.245, + 0.6999999999999993 ] }, "outline": true, @@ -41,12 +59,66 @@ "isometric": true }, { - "id": "8e76ebea-0ab2-49d5-b8a0-191d18634df7", - "text": "one-ec2", + "id": "4b302c11-e0a6-4079-973d-4f436b56d4f5", + "text": "CloudFront", "type": "isotext", "color": "#4286c5", "mapPos": { - "relTo": "75614915-5ccc-44b8-9b7f-9b049a413635", + "relTo": "fbfca042-a593-49ca-90db-a3a035c140f1", + "offset": [ + -0.7549999999999999, + 0.8299999999999983 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }, + { + "id": "7db3f5f0-6601-4dcc-8140-982cf74d7b19", + "text": "User", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "d8100514-1122-458c-94f6-718ebcec16af", + "offset": [ + -0.015000000000000013, + 0.629999999999999 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }, + { + "id": "e9f6e53e-03af-4362-aa39-5b9cc09684b4", + "text": "My-table", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "d0814941-436f-49e0-81f2-8f682550ec2c", + "offset": [ + -0.5, + 1 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }, + { + "id": "7b3c6e0f-1f84-454e-8869-2c47d7a8da96", + "text": "Public ELB", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1", "offset": [ 0.125, 1 @@ -57,15 +129,71 @@ "textSize": 25, "direction": "down", "isometric": true + }, + { + "id": "4529d7b3-121e-49d9-a3f8-c32c3bebd3ce", + "text": "Web autoscaling group", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "e37ba346-a434-4383-99ab-501b61f908c8", + "offset": [ + 0.43500000000000005, + 1.1400000000000006 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true } ], "edges": [ { - "id": "e8a7caf4-3075-49d4-b085-ff407dbfd7e9-37bccc85-a83f-4f1f-aafc-3eb78293aefb", - "to": "37bccc85-a83f-4f1f-aafc-3eb78293aefb", - "from": "e8a7caf4-3075-49d4-b085-ff407dbfd7e9", - "type": "autoedge", - "color": "#000000", + "to": "3c7ab31f-4fc7-47fd-b226-87d5e5f7a2b5", + "from": "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, + "width": 2, + "dashed": false, + "endCap": "arrow" + }, + { + "to": "fbfca042-a593-49ca-90db-a3a035c140f1", + "from": "d8100514-1122-458c-94f6-718ebcec16af", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, + "width": 2, + "dashed": false, + "endCap": "arrow" + }, + { + "to": "f034bcfb-6a1b-4925-9b64-5c76c90f2c17", + "from": "fbfca042-a593-49ca-90db-a3a035c140f1", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, + "width": 2, + "dashed": false, + "endCap": "arrow" + }, + { + "to": "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1", + "from": "fbfca042-a593-49ca-90db-a3a035c140f1", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, "width": 2, "dashed": false, "endCap": "arrow" @@ -74,174 +202,204 @@ "icons": [], "nodes": [ { - "id": "37bccc85-a83f-4f1f-aafc-3eb78293aefb", - "role": "primary", - "type": "rds", - "color": "#ececed", - "engine": "mysql", + "id": "3c7ab31f-4fc7-47fd-b226-87d5e5f7a2b5", + "type": "ec2", + "color": { + "2d": "#d86613", + "isometric": "#ececed" + }, "mapPos": [ - 4.5, - 3.75 + 2.19, + 9.75 ], "region": "eu-west-1", - "multiAZ": true, - "accentColor": "#4286c5", - "instanceSize": "large", - "instanceType": "m4", - "maximumCapacityUnit": 2, - "minimumCapacityUnit": 2 + "platform": "linux", + "accentColor": { + "2d": "#d86613", + "isometric": "#4286c5" + }, + "transparent": false, + "instanceSize": "micro", + "instanceType": "t3", + "billingOptions": { + "type": "ri", + "utilization": 1, + "offeringClass": "standard", + "purchaseOption": "No Upfront", + "leaseContractLength": 12 + } }, { - "id": "eb3470fe-23ba-4c07-9dcb-0b1cadcf9c85", - "type": "s3", + "id": "29e8479c-67e7-4286-a060-d46529413fce", + "role": "primary", + "type": "rds", "color": { - "2d": "#3f8624", - "isometric": "#4286c5" + "2d": "#3b48cc", + "isometric": "#ececed" }, - "dataGb": 10, + "engine": "aurora-postgresql", "mapPos": [ - -0.25, - 4.25 + 9, + 9.75 ], "region": "eu-west-1", - "volumeType": "Standard", + "multiAZ": false, "accentColor": { "2d": "#ffffff", "isometric": "#4286c5" }, - "getAndOtherRequests": 0, - "putCopyPostRequests": 0, - "lifecycleTransitions": 0 + "instanceSize": "medium", + "instanceType": "t3", + "maximumCapacityUnit": 2, + "minimumCapacityUnit": 2 }, { - "id": "974a93a8-e564-48a6-9434-6e5946a75558", - "type": "redshift", - "color": "#80b1dc", + "id": "6f6bbbea-4ec0-40dc-ad2e-c81b4a56a42e", + "type": "sqs", + "color": { + "2d": "#cc2264", + "isometric": "#ececed" + }, "mapPos": [ - -2, - 7 + 8, + 15.25 ], "region": "eu-west-1", - "nodeCount": 1, + "requests": 1, + "direction": "down", + "queueType": "standard", "accentColor": { "2d": "#ffffff", - "isometric": "#ffffff" - }, - "instanceSize": "large", - "instanceType": "dc2" + "isometric": "#f4b934" + } }, { - "id": "75614915-5ccc-44b8-9b7f-9b049a413635", - "type": "ec2", + "id": "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1", + "lcu": 1, + "type": "elb", "color": { - "2d": "#d86613", + "2d": "#693cc5", "isometric": "#ececed" }, + "dataGb": 10, "mapPos": [ - 11, - 8.75 + 2.25, + 15.75 ], "region": "eu-west-1", - "platform": "linux", + "elbType": "classic", "accentColor": { - "2d": "#d86613", + "2d": "#ffffff", "isometric": "#4286c5" - }, - "transparent": false, - "instanceSize": "large", - "instanceType": "t3", - "billingOptions": { - "type": "ri", - "utilization": 1, - "offeringClass": "standard", - "purchaseOption": "No Upfront", - "leaseContractLength": 12 } }, { - "id": "3695999f-958f-43bc-9f2d-1f6ed132a9b9", - "type": "ec2", + "id": "d0814941-436f-49e0-81f2-8f682550ec2c", + "type": "dynamodb", "color": { - "2d": "#d86613", + "2d": "#3b48cc", "isometric": "#ececed" }, "mapPos": [ - 4, - 9 + 11.25, + 16.75 ], "region": "eu-west-1", - "platform": "linux", + "datasetGb": 10, + "readUnits": 51, + "writeUnits": 5, "accentColor": { - "2d": "#d86613", + "2d": "#ffffff", "isometric": "#4286c5" }, - "transparent": false, - "instanceSize": "large", - "instanceType": "t2", - "billingOptions": { - "type": "si", - "utilization": 1, - "offeringClass": "standard", - "purchaseOption": "No Upfront", - "leaseContractLength": 12 - } + "capacityMode": "on-demand", + "readConsistency": "strong" }, { - "id": "e370b986-c558-452f-a988-3f92b6c72670", - "type": "ec2", + "id": "f034bcfb-6a1b-4925-9b64-5c76c90f2c17", + "type": "s3", "color": { - "2d": "#d86613", - "isometric": "#ececed" + "2d": "#3f8624", + "isometric": "#4286c5" }, + "dataGb": 10, "mapPos": [ - 5, - 9 + 8, + 19.25 ], "region": "eu-west-1", - "platform": "linux", + "volumeType": "Standard", "accentColor": { - "2d": "#d86613", + "2d": "#ffffff", "isometric": "#4286c5" }, - "transparent": false, - "instanceSize": "large", - "instanceType": "t2", - "billingOptions": { - "type": "si", - "utilization": 1, - "offeringClass": "standard", - "purchaseOption": "No Upfront", - "leaseContractLength": 12 + "getAndOtherRequests": 0, + "putCopyPostRequests": 0, + "lifecycleTransitions": 0 + }, + { + "id": "fbfca042-a593-49ca-90db-a3a035c140f1", + "type": "cloudfront", + "color": { + "2d": "#693cc5", + "isometric": "#ececed" + }, + "mapPos": [ + 2.25, + 21.5 + ], + "accentColor": { + "2d": "#ffffff", + "isometric": "#4286c5" } + }, + { + "id": "d8100514-1122-458c-94f6-718ebcec16af", + "type": "user", + "color": { + "2d": "#232f3e", + "isometric": "#000000" + }, + "mapPos": [ + 2.25, + 25 + ], + "direction": "down" } ], "groups": [ { - "id": "e8a7caf4-3075-49d4-b085-ff407dbfd7e9", + "id": "e37ba346-a434-4383-99ab-501b61f908c8", "type": "asg", - "color": "#f5b720", + "color": { + "2d": "#f5b720", + "isometric": "#f5b720" + }, "nodes": [ - "3695999f-958f-43bc-9f2d-1f6ed132a9b9", - "e370b986-c558-452f-a988-3f92b6c72670" + "3c7ab31f-4fc7-47fd-b226-87d5e5f7a2b5" ], "layout": "even", "mapPos": [ - 4, - 9 + 0.75, + 9.75 ], "region": "eu-west-1", "mapSize": [ - 2, + 3.88, 1 ] }, { - "id": "3fa236bd-66f0-4034-b761-49f7e24e56c9", - "name": "hashitalk-rds-sg", + "id": "a26a39ac-bfa9-4ba1-9d2b-f748bb0a7e11", + "name": "sgtest", "type": "sg", - "color": "#673ab7", + "color": { + "2d": "#3f51b5", + "isometric": "#3f51b5" + }, "nodes": [ - "37bccc85-a83f-4f1f-aafc-3eb78293aefb" + "e37ba346-a434-4383-99ab-501b61f908c8", + "3c7ab31f-4fc7-47fd-b226-87d5e5f7a2b5" ], "shape": "dynamic", "region": "eu-west-1", @@ -250,14 +408,15 @@ "outboundRules": [] }, { - "id": "e76c023e-611f-4479-8aae-eaf138786467", - "name": "hashitalk-asg-sg", + "id": "0358dcc4-fa4a-4ea5-b00d-b67748e99c27", + "name": "sgelb", "type": "sg", - "color": "#2196f3", + "color": { + "2d": "#3f51b5", + "isometric": "#3f51b5" + }, "nodes": [ - "e8a7caf4-3075-49d4-b085-ff407dbfd7e9", - "3695999f-958f-43bc-9f2d-1f6ed132a9b9", - "e370b986-c558-452f-a988-3f92b6c72670" + "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1" ], "shape": "dynamic", "region": "eu-west-1", @@ -266,18 +425,38 @@ "outboundRules": [] }, { - "id": "f3e4dffa-dd6e-4ce7-ae37-544663f6a439", - "name": "hashitalk-vpc", + "id": "8bb8ba7e-fb88-4137-b614-ad1adef32101", + "name": "sgrds", + "type": "sg", + "color": { + "2d": "#9c27b0", + "isometric": "#9c27b0" + }, + "nodes": [ + "29e8479c-67e7-4286-a060-d46529413fce" + ], + "shape": "dynamic", + "region": "eu-west-1", + "padding": 1.5, + "inboundRules": [], + "outboundRules": [] + }, + { + "id": "b6b59004-dc97-4fd6-8d8c-424b54c3174b", + "name": "vpc-test", "type": "vpc", - "color": "#00bcd4", + "color": { + "2d": "#673ab7", + "isometric": "#673ab7" + }, "nodes": [ - "e8a7caf4-3075-49d4-b085-ff407dbfd7e9", - "3695999f-958f-43bc-9f2d-1f6ed132a9b9", - "e370b986-c558-452f-a988-3f92b6c72670", - "37bccc85-a83f-4f1f-aafc-3eb78293aefb", - "3fa236bd-66f0-4034-b761-49f7e24e56c9", - "e76c023e-611f-4479-8aae-eaf138786467", - "75614915-5ccc-44b8-9b7f-9b049a413635" + "e37ba346-a434-4383-99ab-501b61f908c8", + "3c7ab31f-4fc7-47fd-b226-87d5e5f7a2b5", + "a26a39ac-bfa9-4ba1-9d2b-f748bb0a7e11", + "e3ed6863-4d78-4e0b-8a5f-1f485fda98d1", + "0358dcc4-fa4a-4ea5-b00d-b67748e99c27", + "29e8479c-67e7-4286-a060-d46529413fce", + "8bb8ba7e-fb88-4137-b614-ad1adef32101" ], "shape": "dynamic", "region": "eu-west-1", @@ -286,6 +465,7 @@ } ], "images": [], + "linkKey": "XlAaasYL4pOa5f-Wzkt5CQ", "version": 1, "surfaces": [], "shareDocs": false, @@ -295,8 +475,8 @@ }, "readAccess": null, "writeAccess": null, - "createdAt": "2019-02-19T10:16:30.193Z", - "updatedAt": "2019-11-04T14:09:15.791Z", + "createdAt": "2020-01-29T19:26:41.856Z", + "updatedAt": "2020-03-22T15:15:19.712Z", "CreatorId": "354474ae-8248-45a8-a1ef-34de7c2a4d47", "LastUserId": "354474ae-8248-45a8-a1ef-34de7c2a4d47" } From 932657d830b59cd420409c9f14ed55e93720f3bc Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 22 Mar 2020 16:29:58 +0100 Subject: [PATCH 10/29] Updated CHANGELOG --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5128878..5e451ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ All notable changes to this project will be documented in this file. + +## [v1.6.0] - 2020-03-22 +FEATURES: +- Set folder names correctly (fixes [#22](https://github.com/antonbabenko/modules.tf-lambda/issues/22)) ([#25](https://github.com/antonbabenko/modules.tf-lambda/issues/25)) + + ## [v1.5.0] - 2020-03-22 CHORES: @@ -41,7 +47,8 @@ FEATURES: -[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.5.0...HEAD +[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.6.0...HEAD +[v1.6.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.5.0...v1.6.0 [v1.5.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.4.0...v1.5.0 [v1.4.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.3.0...v1.4.0 [v1.3.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.2.0...v1.3.0 From 01f08f7a69c42589ca3e11c4e914916910e1f42c Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 23 Mar 2020 22:15:17 +0100 Subject: [PATCH 11/29] feat: Adding security group rules (#27) --- modulestf/cloudcraft/graph.py | 6 + modulestf/convert.py | 57 ++++++ modulestf/render.py | 47 +++-- requirements-lambda.txt | 2 +- requirements.txt | 4 +- test_fixtures/input/blueprint_sg_rules.json | 186 ++++++++++++++++++++ test_fixtures/input_localfile.json | 2 +- tests/test_dynamic_params.py | 85 +++++++++ 8 files changed, 368 insertions(+), 21 deletions(-) create mode 100644 test_fixtures/input/blueprint_sg_rules.json create mode 100644 tests/test_dynamic_params.py diff --git a/modulestf/cloudcraft/graph.py b/modulestf/cloudcraft/graph.py index 557cf58..2cc0ca2 100644 --- a/modulestf/cloudcraft/graph.py +++ b/modulestf/cloudcraft/graph.py @@ -61,6 +61,12 @@ def populate_graph(data): # noqa: C901 "group_name": group_name, }) + if group_type == "sg": + G.nodes[group_id]["data"]["inbound_rules"] = group.get("inboundRules") + G.nodes[group_id]["data"]["outbound_rules"] = group.get("outboundRules") + elif group_type == "vpc": + G.nodes[group_id]["data"]["peering_connections"] = group.get("peeringConnections") + for group_node in group_nodes: # some items (like "text") may belong to groups, but are not in "nodes" if group_node not in G.nodes: diff --git a/modulestf/convert.py b/modulestf/convert.py index 0b31299..f2174c8 100644 --- a/modulestf/convert.py +++ b/modulestf/convert.py @@ -50,6 +50,17 @@ def random_password(length=12): return ''.join(random.choice(chars) for _ in range(length)) +# Security group helper - port range +def convert_port_range(port_range): + group = port_range.split("-") + return group[0], group[1 if len(group) > 1 else 0] + + +# Security group helper - protocol +def convert_protocol(protocol): + return {"tcp": 6, "udp": 16, "icmp": 1, "icmpv6": 58}.get(protocol, "-1") + + def get_node(G, node_id): try: return G.nodes.get(node_id) @@ -444,6 +455,52 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if node.get("type") == "sg": r = Resource(key, "security-group", node.get("group_name")) + # Security group rules are disabled here because there is no functionality in renderer + # which allows to convert from Python dict or JSON into valid HCL2 syntax + # Issue: https://github.com/antonbabenko/modules.tf-lambda/issues/26 + enable_sg_rules = False + + # START disabled sg rules + if enable_sg_rules: + + all_rules = { + "ingress": node.get("inbound_rules"), + "egress": node.get("outbound_rules") + } + + for rule_type, rules in all_rules.items(): + rules_with_cidr_blocks = [] + rules_with_source_security_group_id = [] + + for rule in rules: + port_range = convert_port_range(rule.get("portRange")) + + tmp_rule = { + "from_port": port_range[0], + "to_port": port_range[1], + "protocol": convert_protocol(rule.get("protocol")), + "description": rule.get("description"), + } + + if rule.get("targetType") == "ip": + tmp_rule.update({"cidr_blocks": rule.get("target")}) + rules_with_cidr_blocks.append(tmp_rule) + else: + dependency_sg_id = rule.get("target") + tmp_rule.update({"source_security_group_id": "HCL:dependency." + dependency_sg_id + ".outputs.this_security_group_id"}) + rules_with_source_security_group_id.append(tmp_rule) + + r.append_dependency(dependency_sg_id) + + r.update_params({rule_type + "_with_cidr_blocks": rules_with_cidr_blocks}) + r.update_dynamic_params(rule_type + "_with_source_security_group_id", rules_with_source_security_group_id) + + r.update_params({ + "ingress_with_source_security_group_id": [], + "egress_with_source_security_group_id": [], + }) + # END disabled sg rules + r.update_params({ "name": node.get("group_name", random_pet()), "ingress_rules": ["all-all"], diff --git a/modulestf/render.py b/modulestf/render.py index 37910d3..217d174 100644 --- a/modulestf/render.py +++ b/modulestf/render.py @@ -42,14 +42,12 @@ def prepare_render_dirs(): def find_templates_files(dir): - files = glob.glob(dir + "/*") + \ - glob.glob(dir + "/.*") + files = glob.glob(dir + "/*") + glob.glob(dir + "/.*") return files def prepare_single_layer(resource, source_dir_name, region, templates_dir, templates_files): - dir_name = resource.get("dir_name") full_dir_name = ("%s/%s/%s" % (source_dir_name, region, dir_name)).lower() @@ -89,7 +87,6 @@ def prepare_single_layer(resource, source_dir_name, region, templates_dir, templ # Copy all files and subdirectories into working directory def copy_to_working_dir(templates_dir, work_dir=""): - dst_dir = path.join(WORK_DIR_FOR_COOKIECUTTER, work_dir) try: @@ -111,7 +108,6 @@ def copy_to_working_dir(templates_dir, work_dir=""): def render_all(extra_context): - output_dir = path.join(tmp_dir, OUTPUT_DIR, WORK_DIR) cookiecutter(output_dir, @@ -138,7 +134,6 @@ def get_types_text(resources): def make_dir_name(type, text, appendix=""): - path_parts = [] if text is not None and len(text): @@ -158,8 +153,34 @@ def make_dir_name(type, text, appendix=""): return dir_name -def render_from_modulestf_config(config, source, regions): +# Update dynamic parameters with correct dir name +# Value to scan and replace can be inside of any structure (dict, list, string) +# Should start with "dependency." +# +# Examples: +# dependency.a3bfbba6-ff09-4efc-a56b-39b647f203f6.outputs.this_security_group_id => dependency.sg_2.outputs.this_security_group_id +# Source: https://stackoverflow.com/a/38970181/550451 +def recursive_replace_dependency(input, dirs): + if isinstance(input, dict): + items = input.items() + elif isinstance(input, (list, tuple)): + items = enumerate(input) + else: + + # just a value, replace and return + found = re.findall(r"dependency\.([^.]+)", str(input)) + for f in found: + input = re.sub(f, dirs.get(f, f), input) + return input + + # now call itself for every value and replace in the input + for key, value in items: + input[key] = recursive_replace_dependency(value, dirs) + return input + + +def render_from_modulestf_config(config, source, regions): resources = json.loads(config) # pprint(resources) @@ -230,16 +251,8 @@ def render_from_modulestf_config(config, source, regions): # Update dynamic parameters with correct dir name dynamic_params = resource.get("dynamic_params") - if dynamic_params: - for k in dynamic_params: - - try: - v = dynamic_params[k].split(".") - - # replace second element with real directory name - dynamic_params.update({k: v[0] + "." + dirs[v[1]] + "." + ".".join(v[2:])}) - except KeyError: - pass + for k, v in dynamic_params.items(): + dynamic_params[k] = recursive_replace_dependency(v, dirs) # Set correct dir name resource.update({"dir_name": dirs.get(resource.get("ref_id"))}) diff --git a/requirements-lambda.txt b/requirements-lambda.txt index 88b4976..482ca04 100644 --- a/requirements-lambda.txt +++ b/requirements-lambda.txt @@ -1,4 +1,4 @@ -cookiecutter==1.6.0 +cookiecutter==1.7.0 networkx==2.4 petname==2.6 requests>=2.22.0 diff --git a/requirements.txt b/requirements.txt index 6f0f417..b65ab6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ aws-xray-sdk>=2.0 boto3==1.7.3 botocore<1.11.0,>=1.10.3 -cookiecutter==1.6.0 +cookiecutter==1.7.0 networkx==2.4 petname==2.6 -python-lambda-local==0.1.9 +python-lambda-local==0.1.12 requests>=2.22.0 diff --git a/test_fixtures/input/blueprint_sg_rules.json b/test_fixtures/input/blueprint_sg_rules.json new file mode 100644 index 0000000..864c064 --- /dev/null +++ b/test_fixtures/input/blueprint_sg_rules.json @@ -0,0 +1,186 @@ +{ + "id": "3ccc65b3-54ec-43d9-903e-f7b3450f4921", + "data": { + "grid": "standard", + "name": "empty", + "text": [ + { + "id": "baa3ffb0-484a-4032-b04b-e4c7678416ad", + "text": " \n\n\n\n\n", + "type": "isotext", + "color": { + "2d": "#f5b720", + "isometric": "#f5b720" + }, + "mapPos": { + "relTo": "88afbf86-0731-4c50-a463-f38b1b28926e", + "offset": [ + 0.25, + 1 + ] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + } + ], + "edges": [], + "icons": [], + "nodes": [ + { + "id": "88afbf86-0731-4c50-a463-f38b1b28926e", + "type": "ec2", + "color": { + "2d": "#d86613", + "isometric": "#ececed" + }, + "mapPos": [ + 3.75, + 3.5 + ], + "region": "eu-west-1", + "platform": "linux", + "accentColor": { + "2d": "#d86613", + "isometric": "#4286c5" + }, + "transparent": false, + "instanceSize": "small", + "instanceType": "t2" + }, + { + "id": "31941807-3112-4cdc-b49f-9048d867551e", + "type": "ec2", + "color": { + "2d": "#d86613", + "isometric": "#ececed" + }, + "mapPos": [ + 3.75, + 11.25 + ], + "region": "eu-west-1", + "platform": "linux", + "accentColor": { + "2d": "#d86613", + "isometric": "#4286c5" + }, + "transparent": false, + "instanceSize": "small", + "instanceType": "t2" + } + ], + "groups": [ + { + "id": "a3bfbba6-ff09-4efc-a56b-39b647f203f6", + "name": "sg2", + "type": "sg", + "color": { + "2d": "#673ab7", + "isometric": "#673ab7" + }, + "nodes": [ + "31941807-3112-4cdc-b49f-9048d867551e" + ], + "shape": "dynamic", + "region": "eu-west-1", + "padding": 1.5, + "inboundRules": [], + "outboundRules": [] + }, + { + "id": "13bcc0a0-9b0d-4b81-906b-79169cfdfb89", + "name": "sg1", + "type": "sg", + "color": { + "2d": "#00bcd4", + "isometric": "#00bcd4" + }, + "nodes": [ + "88afbf86-0731-4c50-a463-f38b1b28926e" + ], + "shape": "dynamic", + "region": "eu-west-1", + "padding": 1.5, + "inboundRules": [ + { + "hidden": false, + "target": "0.0.0.0/0", + "protocol": "tcp", + "portRange": "3389", + "targetType": "ip", + "description": "RDP for all" + }, + { + "hidden": false, + "target": "a3bfbba6-ff09-4efc-a56b-39b647f203f6", + "protocol": "tcp", + "portRange": "0-65535", + "targetType": "sg", + "description": "All TCP from sg2" + }, + { + "hidden": false, + "target": "10.10.0.0/20,20.20.0.0/20", + "protocol": "tcp", + "portRange": "389", + "targetType": "ip", + "description": "LDAP for some" + }, + { + "hidden": false, + "target": "0.0.0.0/0", + "protocol": "icmpv6", + "portRange": "0", + "targetType": "ip", + "description": "ICMPv6 for all" + } + ], + "outboundRules": [ + { + "hidden": false, + "target": "0.0.0.0/0", + "protocol": "-1", + "portRange": "1-100", + "targetType": "ip", + "description": "Custom outbound rule" + } + ] + }, + { + "id": "db9212bd-708e-4f8b-b152-df3be824b08f", + "name": "my-vpc", + "type": "vpc", + "color": { + "2d": "#00bcd4", + "isometric": "#00bcd4" + }, + "nodes": [ + "13bcc0a0-9b0d-4b81-906b-79169cfdfb89", + "88afbf86-0731-4c50-a463-f38b1b28926e", + "a3bfbba6-ff09-4efc-a56b-39b647f203f6", + "31941807-3112-4cdc-b49f-9048d867551e" + ], + "shape": "dynamic", + "region": "eu-west-1", + "padding": 1.5, + "peeringConnections": [] + } + ], + "images": [], + "version": 1, + "surfaces": [], + "shareDocs": false, + "connectors": [], + "projection": "isometric", + "disabledLayers": [] + }, + "readAccess": null, + "writeAccess": null, + "createdAt": "2018-11-26T16:54:25.323Z", + "updatedAt": "2020-03-22T20:31:41.147Z", + "CreatorId": "e188a76e-d460-43b2-b57f-a3ed871ffaa0", + "LastUserId": "e188a76e-d460-43b2-b57f-a3ed871ffaa0" +} diff --git a/test_fixtures/input_localfile.json b/test_fixtures/input_localfile.json index 6460cae..b2cc62d 100644 --- a/test_fixtures/input_localfile.json +++ b/test_fixtures/input_localfile.json @@ -1,6 +1,6 @@ { "queryStringParameters": { - "localfile": "test_fixtures/input/blueprint_small.json" + "localfile": "test_fixtures/input/blueprint_sg_rules.json" } } diff --git a/tests/test_dynamic_params.py b/tests/test_dynamic_params.py new file mode 100644 index 0000000..1e49e30 --- /dev/null +++ b/tests/test_dynamic_params.py @@ -0,0 +1,85 @@ +import re +from pprint import pprint + +dynamic_params = { + 'key': 'dependency.a3bfbbf.outputs.this_security_group_id', + 'egress_with_source_security_group_id': [], + 'ingress_with_source_security_group_id': [ + { + 'description': 'All TCP from sg2', + 'from_port': '0', + 'protocol': 6, + 'source_security_group_id': 'dependency.a3bfbb.outputs.this_security_group_id', + 'to_port': '65535' + }, + { + 'description': 'All TCP from sg3', + 'from_port': '0', + 'protocol': 6, + 'source_security_group_id': '[dependency.a3bfbb.outputs.this_security_group_id] + dependency.abcdef.outputs.this_security_group_id', + 'to_port': '65535' + } + ] +} + +dirs = { + "a3bfbb": "sg-111", + "abcdef": "sg-999" +} + + +def recursive_replace_dependency(input): + # check whether it's a dict, list, tuple, or scalar + if isinstance(input, dict): + items = input.items() + elif isinstance(input, (list, tuple)): + items = enumerate(input) + else: + + # just a value, replace and return + found = re.findall(r"dependency\.([^.]+)", str(input)) + for f in found: + input = re.sub(f, dirs.get(f, f), input) + + return input + + # now call itself for every value and replace in the input + for key, value in items: + input[key] = recursive_replace_dependency(value) + return input + + +pprint(dynamic_params) + +if dynamic_params: + for k, v in dynamic_params.items(): + + dynamic_params[k] = recursive_replace_dependency(v) + pprint(dynamic_params[k]) + +pprint("FINAL = ") +pprint(dynamic_params) + +pprint("") +pprint("") +pprint("") + +#### +# +# import hcl +# import json +# +# # hcl_json = hcl.loads(json.dumps(dynamic_params)) +# +# # hcl_json_input = "{\"key\": \"var.value\"}" +# hcl_json_input = "{\"key\": { \"key1\" : \"value\" } }" +# hcl_json = hcl.loads(hcl_json_input) +# +# # val2 = hcl.dumps(value) +# +# # with open('file.hcl', 'r') as fp: +# # obj = hcl.load(fp) +# +# result = json.dumps(hcl_json) +# print(hcl_json) +# print(result) From 6d217385f296242dba22bc3b2f9981a8713a869d Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Tue, 24 Mar 2020 10:48:19 +0100 Subject: [PATCH 12/29] fix: Fixed case of dependencies to be always lowercase --- modulestf/render.py | 1 + test_fixtures/input/blueprint_sg_rules.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modulestf/render.py b/modulestf/render.py index 217d174..c1220aa 100644 --- a/modulestf/render.py +++ b/modulestf/render.py @@ -149,6 +149,7 @@ def make_dir_name(type, text, appendix=""): dir_name = re.sub(' ', '_', dir_name.strip()) dir_name = re.sub('[^a-zA-Z0-9-_]', '', dir_name) dir_name = re.sub('_+', '_', dir_name) + dir_name = dir_name.lower() return dir_name diff --git a/test_fixtures/input/blueprint_sg_rules.json b/test_fixtures/input/blueprint_sg_rules.json index 864c064..48b001c 100644 --- a/test_fixtures/input/blueprint_sg_rules.json +++ b/test_fixtures/input/blueprint_sg_rules.json @@ -75,7 +75,7 @@ "groups": [ { "id": "a3bfbba6-ff09-4efc-a56b-39b647f203f6", - "name": "sg2", + "name": "SG...привет...2", "type": "sg", "color": { "2d": "#673ab7", @@ -151,7 +151,7 @@ }, { "id": "db9212bd-708e-4f8b-b152-df3be824b08f", - "name": "my-vpc", + "name": "MY-vpc", "type": "vpc", "color": { "2d": "#00bcd4", From 737097cd7e8962c86ce2a3894d0ebfedd1d66ea7 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Thu, 26 Mar 2020 17:31:00 +0100 Subject: [PATCH 13/29] fix: Skip edges without from/to values (eg, VPN) --- modulestf/cloudcraft/graph.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modulestf/cloudcraft/graph.py b/modulestf/cloudcraft/graph.py index 2cc0ca2..396cdc2 100644 --- a/modulestf/cloudcraft/graph.py +++ b/modulestf/cloudcraft/graph.py @@ -38,7 +38,8 @@ def populate_graph(data): # noqa: C901 # EDGES ######## for edge in data_edges: - G.add_edge(edge["from"], edge["to"]) + if "from" in edge and "to" in edge: + G.add_edge(edge["from"], edge["to"]) ##################### # AUTOSCALING GROUPS, SECURITY GROUPS AND VPCS From 204b5975d5667018652f976898973abbc98136b9 Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Thu, 9 Apr 2020 17:49:27 +0300 Subject: [PATCH 14/29] fix: resolved conflict for dependent botocore library (#34) --- .gitignore | 4 ++++ bin/test_lambda_local.sh | 2 +- requirements.txt | 3 +-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 222e4e9..94674ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Distribution / packaging +__pycache__ .Python env/ build/ @@ -26,3 +27,6 @@ output/* # Graph image graph.png + +/.venv +/.idea diff --git a/bin/test_lambda_local.sh b/bin/test_lambda_local.sh index a5aefed..14328e9 100755 --- a/bin/test_lambda_local.sh +++ b/bin/test_lambda_local.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -/usr/local/bin/python-lambda-local -t 10 -f $1 $2 $3 +python-lambda-local -t 10 -f "$1" "$2" "$3" diff --git a/requirements.txt b/requirements.txt index b65ab6c..bed0bf2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ aws-xray-sdk>=2.0 -boto3==1.7.3 -botocore<1.11.0,>=1.10.3 +boto3<1.13 cookiecutter==1.7.0 networkx==2.4 petname==2.6 From 3376f9fba81e57188c07232a9b1c5f85ff458d90 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 13 Apr 2020 12:50:07 +0200 Subject: [PATCH 15/29] fix: Fixed version of minimist package (#35) --- package-lock.json | 8 ++++---- package.json | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb94093..601b5fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2730,9 +2730,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mixin-deep": { "version": "1.3.2", @@ -4501,7 +4501,7 @@ "dependencies": { "minimist": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" } } diff --git a/package.json b/package.json index e176c32..e844cfa 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "serverless": "1.65.0", "serverless-plugin-thundra": "^2.4.2", "serverless-plugin-tracing": "^2.0.0", - "serverless-python-requirements": "^5.1.0" + "serverless-python-requirements": "^5.1.0", + "minimist": ">=1.2.3" }, "collective": { "type": "opencollective", From f83350043c0f15f9d4d15700d5e98347dcdfb8bb Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Tue, 28 Apr 2020 12:54:19 +0200 Subject: [PATCH 16/29] docs: Updated link to modules.tf-lambda-infra repo --- DEVELOPMENT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 8789192..a506546 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -40,7 +40,7 @@ $ serverless deploy function --function generate-cloudcraft --stage prod modules.tf can be self-hosted on your own infrastructure (if you want to expand it for some reason). -See [modules.tf-infra](https://github.com/antonbabenko/modules.tf-infra) repository for complete setup. +See [modules.tf-lambda-infra](https://github.com/antonbabenko/modules.tf-lambda-infra) repository for complete setup. ## Spellchecker From 30954c29c8361364a79632349aa8de47efb62735 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Fri, 1 May 2020 11:16:48 +0300 Subject: [PATCH 17/29] [Snyk] Fix for 1 vulnerabilities (#38) --- .snyk | 32 + package-lock.json | 1856 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 10 +- 3 files changed, 1868 insertions(+), 30 deletions(-) create mode 100644 .snyk diff --git a/.snyk b/.snyk new file mode 100644 index 0000000..61d3af4 --- /dev/null +++ b/.snyk @@ -0,0 +1,32 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.14.1 +ignore: {} +# patches apply the minimum changes required to fix a vulnerability +patch: + SNYK-JS-LODASH-567746: + - serverless > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > @serverless/enterprise-plugin > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > archiver > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > inquirer > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > json-refs > graphlib > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > @serverless/components > prettyoutput > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > @serverless/enterprise-plugin > @serverless/event-mocks > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > archiver > archiver-utils > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > archiver > async > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > archiver > zip-stream > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > tabtab > inquirer > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > @serverless/cli > @serverless/template > graphlib > lodash: + patched: '2020-05-01T07:28:39.062Z' + - serverless > archiver > zip-stream > archiver-utils > lodash: + patched: '2020-05-01T07:28:39.062Z' diff --git a/package-lock.json b/package-lock.json index 601b5fe..7aeb854 100644 --- a/package-lock.json +++ b/package-lock.json @@ -281,6 +281,255 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, + "@snyk/cli-interface": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.6.0.tgz", + "integrity": "sha512-jtk0gf80v4mFyDqaQNokD8GOPMTXpIUL35ewg6jtmuZw41xt56WF9kqCjiiViSRRRYA0RK+RuiVfmJA5pxvMUQ==", + "requires": { + "@snyk/graphlib": "2.1.9-patch", + "tslib": "^1.9.3" + } + }, + "@snyk/cocoapods-lockfile-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.2.0.tgz", + "integrity": "sha512-DyFqZudOlGXHBOVneLnQnyQ97xZLq+PTF9PhWOmrEzH/tKcLyXhdW/WmDPVNJVyNvogyRZ4cXIj487xy/EeZEw==", + "requires": { + "@snyk/dep-graph": "1.18.2", + "@snyk/ruby-semver": "^2.0.4", + "@types/js-yaml": "^3.12.1", + "core-js": "^3.2.0", + "js-yaml": "^3.13.1", + "source-map-support": "^0.5.7", + "tslib": "^1.10.0" + } + }, + "@snyk/composer-lockfile-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.4.0.tgz", + "integrity": "sha512-ga4YTRjJUuP0Ufr+t1IucwVjEFAv66JSBB/zVHP2zy/jmfA3l3ZjlGQSjsRC6Me9P2Z0esQ83AYNZvmIf9pq2w==", + "requires": { + "@snyk/lodash": "^4.17.15-patch" + } + }, + "@snyk/configstore": { + "version": "3.2.0-rc1", + "resolved": "https://registry.npmjs.org/@snyk/configstore/-/configstore-3.2.0-rc1.tgz", + "integrity": "sha512-CV3QggFY8BY3u8PdSSlUGLibqbqCG1zJRmGM2DhnhcxQDRRPTGTP//l7vJphOVsUP1Oe23+UQsj7KRWpRUZiqg==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + } + }, + "@snyk/dep-graph": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.18.2.tgz", + "integrity": "sha512-v7tIiCH4LmYOSc0xGHKSxSZ2PEDv8zDlYU7ZKSH+1Hk8Qvj3YYEFvtV1iFBHUEQFUen4kQA6lWxlwF8chsNw+w==", + "requires": { + "@snyk/graphlib": "2.1.9-patch", + "@snyk/lodash": "4.17.15-patch", + "object-hash": "^1.3.1", + "prettier": "^1.19.1", + "semver": "^6.0.0", + "source-map-support": "^0.5.11", + "tslib": "^1.10.0" + }, + "dependencies": { + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@snyk/gemfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", + "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==" + }, + "@snyk/graphlib": { + "version": "2.1.9-patch", + "resolved": "https://registry.npmjs.org/@snyk/graphlib/-/graphlib-2.1.9-patch.tgz", + "integrity": "sha512-uFO/pNMm3pN15QB+hVMU7uaQXhsBNwEA8lOET/VDcdOzLptODhXzkJqSHqt0tZlpdAz6/6Uaj8jY00UvPFgFMA==", + "requires": { + "@snyk/lodash": "4.17.15-patch" + } + }, + "@snyk/inquirer": { + "version": "6.2.2-patch", + "resolved": "https://registry.npmjs.org/@snyk/inquirer/-/inquirer-6.2.2-patch.tgz", + "integrity": "sha512-IUq5bHRL0vtVKtfvd4GOccAIaLYHbcertug2UVZzk5+yY6R/CxfYsnFUTho1h4BdkfNdin2tPjE/5jRF4SKSrw==", + "requires": { + "@snyk/lodash": "4.17.15-patch", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "@snyk/java-call-graph-builder": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.8.0.tgz", + "integrity": "sha512-dD7hVdEKMMU9CP0jQLm6Q1+l6506rjW0dqQflJ3QOVohNzptYJtTv9pHKzgRu5+q/fgEc35oYi02A0WIQwSvpw==", + "requires": { + "@snyk/graphlib": "2.1.9-patch", + "@snyk/lodash": "4.17.15-patch", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "glob": "^7.1.6", + "jszip": "^3.2.2", + "needle": "^2.3.3", + "progress": "^2.0.3", + "snyk-config": "^3.0.0", + "source-map-support": "^0.5.7", + "temp-dir": "^2.0.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "@snyk/lodash": { + "version": "4.17.15-patch", + "resolved": "https://registry.npmjs.org/@snyk/lodash/-/lodash-4.17.15-patch.tgz", + "integrity": "sha512-e4+t34bGyjjRnwXwI14hqye9J/nRbG9iwaqTgXWHskm5qC+iK0UrjgYdWXiHJCf3Plbpr+1rpW+4LPzZnCGMhQ==" + }, + "@snyk/rpm-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@snyk/rpm-parser/-/rpm-parser-1.1.0.tgz", + "integrity": "sha512-+DyCagvnpyBjwYTxaPMQGLW4rkpKAw1Jrh8YbZCg7Ix172InBxdve/0zud18Lu2H6xWtDDdMvRDdfl82wlTBvA==", + "requires": { + "event-loop-spinner": "1.1.0", + "typescript": "3.8.3" + } + }, + "@snyk/ruby-semver": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@snyk/ruby-semver/-/ruby-semver-2.2.0.tgz", + "integrity": "sha512-FqUayoVjcyCsQFYPm3DcaCKdFR4xmapUkCGY+bcNBs3jqCUw687PoP9CPQ1Jvtaw5YpfBNl/62jyntsWCeciuA==", + "requires": { + "@snyk/lodash": "4.17.15-patch" + } + }, + "@snyk/snyk-cocoapods-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.2.0.tgz", + "integrity": "sha512-Ux7hXKawbk30niGBToGkKqHyKzhT3E7sCl0FNkPkHaaGZwPwhFCDyNFxBd4uGgWiQ+kT+RjtH5ahna+bSP69Yg==", + "requires": { + "@snyk/cli-interface": "1.5.0", + "@snyk/cocoapods-lockfile-parser": "3.2.0", + "@snyk/dep-graph": "^1.18.2", + "source-map-support": "^0.5.7", + "tslib": "^1.10.0" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-1.5.0.tgz", + "integrity": "sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "@snyk/update-notifier": { + "version": "2.5.1-rc2", + "resolved": "https://registry.npmjs.org/@snyk/update-notifier/-/update-notifier-2.5.1-rc2.tgz", + "integrity": "sha512-dlled3mfpnAt3cQb5hxkFiqfPCj4Yk0xV8Yl5P8PeVv1pUmO7vI4Ka4Mjs4r6CYM5f9kZhviFPQQcWOIDlMRcw==", + "requires": { + "@snyk/configstore": "3.2.0-rc1", + "boxen": "^1.3.0", + "chalk": "^2.3.2", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.1.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + } + } + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -289,6 +538,20 @@ "defer-to-connect": "^1.0.1" } }, + "@types/agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==", + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -304,6 +567,11 @@ "@types/node": "*" } }, + "@types/js-yaml": { + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.3.tgz", + "integrity": "sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==" + }, "@types/lodash": { "version": "4.14.149", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", @@ -319,6 +587,29 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/xml2js": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.5.tgz", + "integrity": "sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==", + "requires": { + "@types/node": "*" + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "adm-zip": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", @@ -358,6 +649,11 @@ "color-convert": "^1.9.0" } }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -436,6 +732,11 @@ } } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -469,11 +770,21 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "ast-types": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", + "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==" + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -698,6 +1009,11 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -940,11 +1256,68 @@ "restore-cursor": "^2.0.0" } }, + "cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==" + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + } + } + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -953,6 +1326,16 @@ "mimic-response": "^1.0.0" } }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1076,6 +1459,11 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1130,6 +1518,11 @@ "type": "^1.0.1" } }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" + }, "dayjs": { "version": "1.8.21", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.21.tgz", @@ -1259,6 +1652,11 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -1285,11 +1683,38 @@ "isobject": "^3.0.1" } }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1298,6 +1723,14 @@ "path-type": "^4.0.0" } }, + "dockerfile-ast": { + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.19.tgz", + "integrity": "sha512-iDRNFeAB2j4rh/Ecc2gh3fjciVifCMsszfCfHlYF5Wv8yybjZLiRDZUBt/pS3xrAz8uWT8fCHLq4pOQMmwCDwA==", + "requires": { + "vscode-languageserver-types": "^3.5.0" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -1311,6 +1744,34 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, + "dotnet-deps-parser": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/dotnet-deps-parser/-/dotnet-deps-parser-4.10.0.tgz", + "integrity": "sha512-dEO1oTvreaDCtcvhRdOmmAMubyC+MWqVr1c/1Wvasi+NW4NZeB67qGh1taqowUFh+aCXtPw3SP2eExn6aNkhwA==", + "requires": { + "@snyk/lodash": "4.17.15-patch", + "@types/xml2js": "0.4.5", + "source-map-support": "^0.5.7", + "tslib": "^1.10.0", + "xml2js": "0.4.23" + }, + "dependencies": { + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } + }, "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", @@ -1442,6 +1903,11 @@ "es5-ext": "~0.10.46" } }, + "email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -1483,6 +1949,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, "es6-promisify": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.2.tgz", @@ -1536,6 +2007,18 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, "esniff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", @@ -1555,6 +2038,16 @@ "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==" }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -1564,6 +2057,14 @@ "es5-ext": "~0.10.14" } }, + "event-loop-spinner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/event-loop-spinner/-/event-loop-spinner-1.1.0.tgz", + "integrity": "sha512-YVFs6dPpZIgH665kKckDktEVvSBccSYJmoZUfhNUdv5d3Xv+Q+SKF4Xis1jolq9aBzuW1ZZhQh/m/zU/TPdDhw==", + "requires": { + "tslib": "^1.10.0" + } + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1693,6 +2194,11 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -1850,6 +2356,38 @@ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "optional": true }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -1871,23 +2409,68 @@ "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "requires": { + "git-up": "^4.0.0" + } + }, + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "glob-all": { "version": "3.1.0", @@ -2047,11 +2630,68 @@ } } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "https-proxy-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", @@ -2157,6 +2797,16 @@ "p-is-promise": "^1.1.0" } }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -2305,6 +2955,14 @@ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, + "is-ssh": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", + "requires": { + "protocols": "^1.1.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -2545,6 +3203,23 @@ "readable-stream": "^2.0.5" } }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -2558,6 +3233,31 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -2638,6 +3338,11 @@ "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -2822,6 +3527,99 @@ } } }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "requires": { + "async": "^1.4.0", + "ini": "^1.3.0", + "secure-keys": "^1.0.0", + "yargs": "^3.19.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "needle": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", + "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + } + } + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -2876,6 +3674,11 @@ "path-key": "^2.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2984,6 +3787,22 @@ "mimic-fn": "^1.0.0" } }, + "open": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + } + } + }, "opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", @@ -3004,6 +3823,36 @@ } } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -3040,6 +3889,11 @@ "p-try": "^2.0.0" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, "p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", @@ -3053,6 +3907,70 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "requires": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -3076,6 +3994,33 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -3138,11 +4083,21 @@ "pinkie": "^2.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + }, "prettyoutput": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/prettyoutput/-/prettyoutput-1.2.0.tgz", @@ -3158,6 +4113,19 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, "promise-queue": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", @@ -3168,6 +4136,81 @@ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==" + }, + "proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "requires": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -3231,6 +4274,17 @@ } } }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -3395,6 +4449,11 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" + }, "seek-bzip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", @@ -3624,6 +4683,11 @@ } } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "sha256-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sha256-file/-/sha256-file-1.0.0.tgz", @@ -3673,6 +4737,11 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -3785,16 +4854,589 @@ } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "sort-keys-length": { - "version": "1.0.1", + "snyk": { + "version": "1.316.1", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.316.1.tgz", + "integrity": "sha512-z+LWT14QoOyOsqCcWGkTNlIBpCQmv7E+kMX3r43/vZeU1F9E6Ll+KVcu1simXZixZaOb97IHHIf4rxxYGw65MA==", + "requires": { + "@snyk/cli-interface": "2.6.0", + "@snyk/configstore": "^3.2.0-rc1", + "@snyk/dep-graph": "1.18.2", + "@snyk/gemfile": "1.2.0", + "@snyk/graphlib": "2.1.9-patch", + "@snyk/inquirer": "6.2.2-patch", + "@snyk/lodash": "^4.17.15-patch", + "@snyk/ruby-semver": "2.2.0", + "@snyk/snyk-cocoapods-plugin": "2.2.0", + "@snyk/update-notifier": "^2.5.1-rc2", + "@types/agent-base": "^4.2.0", + "abbrev": "^1.1.1", + "ansi-escapes": "3.2.0", + "chalk": "^2.4.2", + "cli-spinner": "0.2.10", + "debug": "^3.1.0", + "diff": "^4.0.1", + "git-url-parse": "11.1.2", + "glob": "^7.1.3", + "needle": "^2.2.4", + "open": "^7.0.3", + "os-name": "^3.0.0", + "proxy-agent": "^3.1.1", + "proxy-from-env": "^1.0.0", + "semver": "^6.0.0", + "snyk-config": "3.1.0", + "snyk-docker-plugin": "3.1.0", + "snyk-go-plugin": "1.14.0", + "snyk-gradle-plugin": "3.2.5", + "snyk-module": "1.9.1", + "snyk-mvn-plugin": "2.15.0", + "snyk-nodejs-lockfile-parser": "1.22.0", + "snyk-nuget-plugin": "1.17.0", + "snyk-php-plugin": "1.9.0", + "snyk-policy": "1.13.5", + "snyk-python-plugin": "1.17.0", + "snyk-resolve": "1.0.1", + "snyk-resolve-deps": "4.4.0", + "snyk-sbt-plugin": "2.11.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "1.3.1", + "source-map-support": "^0.5.11", + "strip-ansi": "^5.2.0", + "tempfile": "^2.0.0", + "then-fs": "^2.0.0", + "uuid": "^3.3.2", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "snyk-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-3.1.0.tgz", + "integrity": "sha512-3UlyogA67/9WOssJ7s4d7gqWQRWyO/LbgdBBNMhhmFDKa7eTUSW+A782CVHgyDSJZ2kNANcMWwMiOL+h3p6zQg==", + "requires": { + "@snyk/lodash": "4.17.15-patch", + "debug": "^4.1.1", + "nconf": "^0.10.0" + } + }, + "snyk-docker-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-3.1.0.tgz", + "integrity": "sha512-ggGTiiCuwLYGdlGW/UBuUXJ7omliH0EnbpLfdlTBoRKvmvgoUo1l4Menk18R1ZVXgcXTwwGK9jmuUpPH+X0VNw==", + "requires": { + "@snyk/rpm-parser": "^1.1.0", + "debug": "^4.1.1", + "dockerfile-ast": "0.0.19", + "event-loop-spinner": "^1.1.0", + "semver": "^6.1.0", + "tar-stream": "^2.1.0", + "tslib": "^1" + }, + "dependencies": { + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "snyk-go-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.4.0.tgz", + "integrity": "sha512-zcLA8u/WreycCjFKBblYfxszg7Fmnemuu9Ug/CE/jqF0yBXsI5DCWMteUvFkoa8DRntfGTlgf98TRl2aTSc2MQ==", + "requires": { + "toml": "^3.0.0", + "tslib": "^1.10.0" + } + }, + "snyk-go-plugin": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.14.0.tgz", + "integrity": "sha512-9L+76De8F6yXWb+O3DA8QUi7+eDF2mOzCOveEPUJGkqWIDmurIiFcVxHJoj0EStjcxb3dX367KKlDlfFx+HiyA==", + "requires": { + "@snyk/graphlib": "2.1.9-patch", + "debug": "^4.1.1", + "snyk-go-parser": "1.4.0", + "tmp": "0.1.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, + "snyk-gradle-plugin": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.5.tgz", + "integrity": "sha512-XxPi/B16dGkV1USoyFbpn6LlSJ9SUC6Y6z/4lWuF4spLnKtWwpEb1bwTdBFsxnkUfqzIRtPr0+wcxxXvv9Rvcw==", + "requires": { + "@snyk/cli-interface": "2.3.0", + "@types/debug": "^4.1.4", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "tmp": "0.0.33", + "tslib": "^1.9.3" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.0.tgz", + "integrity": "sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "snyk-module": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", + "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", + "requires": { + "debug": "^3.1.0", + "hosted-git-info": "^2.7.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-mvn-plugin": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.15.0.tgz", + "integrity": "sha512-24HWz27Hc5sw+iHtxtQFy0kltjyFZXJ3vfsPA0TTZAL0tOJXInIuZpWD6njC0Y3/sn9CH5kS2KM8GAM7FyKVig==", + "requires": { + "@snyk/cli-interface": "2.5.0", + "@snyk/java-call-graph-builder": "1.8.0", + "debug": "^4.1.1", + "needle": "^2.4.0", + "tmp": "^0.1.0", + "tslib": "1.11.1" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.5.0.tgz", + "integrity": "sha512-XMc2SCFH4RBSncZgoPb+BBlNq0NYpEpCzptKi69qyMpBy0VsRqIQqddedaazMCU1xEpXTytq6KMYpzUafZzp5Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, + "snyk-nodejs-lockfile-parser": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.22.0.tgz", + "integrity": "sha512-l6jLoJxqcIIkQopSdQuAstXdMw5AIgLu+uGc5CYpHyw8fYqOwna8rawwofNeGuwJAAv4nEiNiexeYaR88OCq6Q==", + "requires": { + "@snyk/graphlib": "2.1.9-patch", + "@snyk/lodash": "^4.17.15-patch", + "@yarnpkg/lockfile": "^1.0.2", + "event-loop-spinner": "^1.1.0", + "p-map": "2.1.0", + "snyk-config": "^3.0.0", + "source-map-support": "^0.5.7", + "tslib": "^1.9.3", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "snyk-nuget-plugin": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.17.0.tgz", + "integrity": "sha512-t7iZ87LBhCK6P2/mJsQh7Dmk3J9zd+IHL4yoSK95Iyk/gP8r++DZijoRHEXy8BlS+eOtSAj1vgCYvv2eAmG28w==", + "requires": { + "@snyk/lodash": "4.17.15-patch", + "debug": "^3.1.0", + "dotnet-deps-parser": "4.10.0", + "jszip": "3.1.5", + "snyk-paket-parser": "1.6.0", + "tslib": "^1.9.3", + "xml2js": "^0.4.17" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "requires": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "requires": { + "immediate": "~3.0.5" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "snyk-paket-parser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.6.0.tgz", + "integrity": "sha512-6htFynjBe/nakclEHUZ1A3j5Eu32/0pNve5Qm4MFn3YQmJgj7UcAO8hdyK3QfzEY29/kAv/rkJQg+SKshn+N9Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "snyk-php-plugin": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.9.0.tgz", + "integrity": "sha512-uORrEoC47dw0ITZYu5vKqQtmXnbbQs+ZkWeo5bRHGdf10W8e4rNr1S1R4bReiLrSbSisYhVHeFMkdOAiLIPJVQ==", + "requires": { + "@snyk/cli-interface": "2.3.2", + "@snyk/composer-lockfile-parser": "1.4.0", + "tslib": "1.11.1" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.2.tgz", + "integrity": "sha512-jmZyxVHqzYU1GfdnWCGdd68WY/lAzpPVyqalHazPj4tFJehrSfEFc82RMTYAMgXEJuvFRFIwhsvXh3sWUhIQmg==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "snyk-policy": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", + "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", + "requires": { + "debug": "^3.1.0", + "email-validator": "^2.0.4", + "js-yaml": "^3.13.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.0.0", + "snyk-module": "^1.9.1", + "snyk-resolve": "^1.0.1", + "snyk-try-require": "^1.3.1", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "snyk-python-plugin": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.17.0.tgz", + "integrity": "sha512-EKdVOUlvhiVpXA5TeW8vyxYVqbITAfT+2AbL2ZRiiUNLP5ae+WiNYaPy7aB5HAS9IKBKih+IH8Ag65Xu1IYSYA==", + "requires": { + "@snyk/cli-interface": "^2.0.3", + "tmp": "0.0.33" + } + }, + "snyk-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", + "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", + "requires": { + "debug": "^3.1.0", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-resolve-deps": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz", + "integrity": "sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==", + "requires": { + "@types/node": "^6.14.4", + "@types/semver": "^5.5.0", + "ansicolors": "^0.3.2", + "debug": "^3.2.5", + "lodash.assign": "^4.2.0", + "lodash.assignin": "^4.2.0", + "lodash.clone": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lru-cache": "^4.0.0", + "semver": "^5.5.1", + "snyk-module": "^1.6.0", + "snyk-resolve": "^1.0.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "^1.1.1", + "then-fs": "^2.0.0" + }, + "dependencies": { + "@types/node": { + "version": "6.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", + "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-sbt-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz", + "integrity": "sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA==", + "requires": { + "debug": "^4.1.1", + "semver": "^6.1.2", + "tmp": "^0.1.0", + "tree-kill": "^1.2.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, + "snyk-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", + "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", + "requires": { + "archy": "^1.0.0" + } + }, + "snyk-try-require": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", + "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", + "requires": { + "debug": "^3.1.0", + "lodash.clonedeep": "^4.3.0", + "lru-cache": "^4.0.0", + "then-fs": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", "requires": { @@ -3953,6 +5595,11 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stream-promise": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", @@ -4103,6 +5750,32 @@ "xtend": "^4.0.0" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -4111,11 +5784,24 @@ "execa": "^0.7.0" } }, + "then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "requires": { + "promise": ">=3.2 <8" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -4190,11 +5876,26 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -4221,11 +5922,24 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" + }, "unbzip2-stream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", @@ -4266,6 +5980,11 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -4402,6 +6121,11 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" }, + "vscode-languageserver-types": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", + "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" + }, "walkdir": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", @@ -4428,6 +6152,74 @@ "string-width": "^2.1.1" } }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "windows-release": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", + "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", + "requires": { + "execa": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4467,11 +6259,21 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index e844cfa..488b5f2 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "private": true, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "postinstall": "opencollective-postinstall || true" + "postinstall": "opencollective-postinstall || true", + "snyk-protect": "snyk protect", + "prepare": "npm run snyk-protect" }, "keywords": [ "Infrastructure as code", @@ -24,10 +26,12 @@ "serverless-plugin-thundra": "^2.4.2", "serverless-plugin-tracing": "^2.0.0", "serverless-python-requirements": "^5.1.0", - "minimist": ">=1.2.3" + "minimist": ">=1.2.3", + "snyk": "^1.316.1" }, "collective": { "type": "opencollective", "url": "https://opencollective.com/modulestf" - } + }, + "snyk": true } From e9d1510eaebea5b876a36782900567fc3ec9d10c Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Sat, 23 May 2020 12:30:16 +0300 Subject: [PATCH 18/29] [Snyk] Upgrade snyk from 1.316.1 to 1.316.2 (#42) --- package-lock.json | 31 +++++++++++++++---------------- package.json | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7aeb854..fe4ac33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -539,11 +539,10 @@ } }, "@types/agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-GRmnDTq6ajyRyT8Ybg4IVVOyYqqFIAR4Zo9L+fdMAP+IJxd0nlTV99/IelJCBF629WOj6MpE9ohLHYCmkeJqRA==", "requires": { - "@types/events": "*", "@types/node": "*" } }, @@ -568,9 +567,9 @@ } }, "@types/js-yaml": { - "version": "3.12.3", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.3.tgz", - "integrity": "sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==" + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.4.tgz", + "integrity": "sha512-fYMgzN+9e28R81weVN49inn/u798ruU91En1ZnGvSZzCRc5jXx9B2EDhlRaWmcO1RIxFHL8AajRXzxDuJu93+A==" }, "@types/lodash": { "version": "4.14.149", @@ -3591,9 +3590,9 @@ } }, "needle": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", - "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -3788,9 +3787,9 @@ } }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -4855,9 +4854,9 @@ } }, "snyk": { - "version": "1.316.1", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.316.1.tgz", - "integrity": "sha512-z+LWT14QoOyOsqCcWGkTNlIBpCQmv7E+kMX3r43/vZeU1F9E6Ll+KVcu1simXZixZaOb97IHHIf4rxxYGw65MA==", + "version": "1.316.2", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.316.2.tgz", + "integrity": "sha512-jbO2yUxu0kM6v8jLP1Vn64ZIeznFBBfujaurKYtXUR0mnRzr64V5kEuNeCIjAp9qlSM0RjuEqOCH7eAlFTxOHw==", "requires": { "@snyk/cli-interface": "2.6.0", "@snyk/configstore": "^3.2.0-rc1", diff --git a/package.json b/package.json index 488b5f2..86c5493 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "serverless-plugin-tracing": "^2.0.0", "serverless-python-requirements": "^5.1.0", "minimist": ">=1.2.3", - "snyk": "^1.316.1" + "snyk": "^1.316.2" }, "collective": { "type": "opencollective", From 122b4c69edc823680852778fb07c3c95f12ff23c Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Mon, 25 May 2020 10:29:50 +0300 Subject: [PATCH 19/29] [Snyk] Upgrade snyk from 1.316.2 to 1.317.0 (#43) * fix: upgrade snyk from 1.316.2 to 1.317.0 Snyk has created this PR to upgrade snyk from 1.316.2 to 1.317.0. See this package in NPM: https://www.npmjs.com/package/snyk See this project in Snyk: https://app.snyk.io/org/antonbabenko/project/2ee6f39a-0307-444f-9086-43a28234c087?utm_source=github&utm_medium=upgrade-pr * fix: upgrade snyk from 1.316.2 to 1.317.0 Snyk has created this PR to upgrade snyk from 1.316.2 to 1.317.0. See this package in NPM: https://www.npmjs.com/package/snyk See this project in Snyk: https://app.snyk.io/org/antonbabenko/project/2ee6f39a-0307-444f-9086-43a28234c087?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe4ac33..b3c4ca2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4854,9 +4854,9 @@ } }, "snyk": { - "version": "1.316.2", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.316.2.tgz", - "integrity": "sha512-jbO2yUxu0kM6v8jLP1Vn64ZIeznFBBfujaurKYtXUR0mnRzr64V5kEuNeCIjAp9qlSM0RjuEqOCH7eAlFTxOHw==", + "version": "1.317.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.317.0.tgz", + "integrity": "sha512-zNUvvT50Ii5TpHEo9YmDo+j5tqO1b8jXQK9XygfgiuXPRUwxf6PMSqDM5hKkfzuBhaBYZ4IbZWQFQPbMkprj0w==", "requires": { "@snyk/cli-interface": "2.6.0", "@snyk/configstore": "^3.2.0-rc1", diff --git a/package.json b/package.json index 86c5493..2a6d35b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "serverless-plugin-tracing": "^2.0.0", "serverless-python-requirements": "^5.1.0", "minimist": ">=1.2.3", - "snyk": "^1.316.2" + "snyk": "^1.317.0" }, "collective": { "type": "opencollective", From d631fcc3dbea752e5ed3ba23ce59ab47b4dc28e7 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 27 May 2020 10:33:39 +0300 Subject: [PATCH 20/29] [Snyk] Upgrade snyk from 1.317.0 to 1.319.0 (#44) * fix: upgrade snyk from 1.317.0 to 1.319.0 Snyk has created this PR to upgrade snyk from 1.317.0 to 1.319.0. See this package in NPM: https://www.npmjs.com/package/snyk See this project in Snyk: https://app.snyk.io/org/antonbabenko/project/2ee6f39a-0307-444f-9086-43a28234c087?utm_source=github&utm_medium=upgrade-pr * fix: upgrade snyk from 1.317.0 to 1.319.0 Snyk has created this PR to upgrade snyk from 1.317.0 to 1.319.0. See this package in NPM: https://www.npmjs.com/package/snyk See this project in Snyk: https://app.snyk.io/org/antonbabenko/project/2ee6f39a-0307-444f-9086-43a28234c087?utm_source=github&utm_medium=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3c4ca2..9043bee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4854,9 +4854,9 @@ } }, "snyk": { - "version": "1.317.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.317.0.tgz", - "integrity": "sha512-zNUvvT50Ii5TpHEo9YmDo+j5tqO1b8jXQK9XygfgiuXPRUwxf6PMSqDM5hKkfzuBhaBYZ4IbZWQFQPbMkprj0w==", + "version": "1.319.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.319.0.tgz", + "integrity": "sha512-tOFkZuJYPxzT50joiHd/bxdfsWd/cqFZcfEj6VxRJ28wYBC7imzodp4m8cC6Rcox4++2WEm6ZHNlPLyYjmfPOg==", "requires": { "@snyk/cli-interface": "2.6.0", "@snyk/configstore": "^3.2.0-rc1", diff --git a/package.json b/package.json index 2a6d35b..a8d7993 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "serverless-plugin-tracing": "^2.0.0", "serverless-python-requirements": "^5.1.0", "minimist": ">=1.2.3", - "snyk": "^1.317.0" + "snyk": "^1.319.0" }, "collective": { "type": "opencollective", From d590e01ad0835bd02c8250d65946f38d86f23787 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Wed, 4 Nov 2020 17:44:00 +0100 Subject: [PATCH 21/29] docs: Updated links in README --- README.md | 8 ++++---- handler.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 95ab37d..88b73e1 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,14 @@ modules.tf - Infrastructure as code generator - from visual diagrams to Terraform -Code in this repository is used for generating infrastructure as Terraform configurations from visual diagrams created using [Cloudcraft](https://cloudcraft.co). +Code in this repository is used for generating infrastructure as Terraform configurations from visual diagrams created using [Cloudcraft](https://www.cloudcraft.co). [modules.tf](https://github.com/antonbabenko/modules.tf-lambda) is an open-source project by [Anton Babenko](https://github.com/antonbabenko). ## How can I try this? -1. Sign up for free account to [Cloudcraft.co](https://cloudcraft.co/app). +1. Sign up for free account to [Cloudcraft.co](https://www.cloudcraft.co/app). 1. Draw AWS architecture in web-browser (you can import live AWS resources, too). 1. Click "Export" and "Terraform code export" at the top right side. 1. Download archive and extract it locally. @@ -33,9 +33,9 @@ In [modules.tf-demo](https://github.com/antonbabenko/modules.tf-demo) repository ## Supporters -Cloudcraft - the best way to draw AWS diagrams +Cloudcraft - the best way to draw AWS diagrams -This project was partially sponsored by [Cloudcraft - the best way to draw AWS diagrams](https://cloudcraft.co).
+This project was partially sponsored by [Cloudcraft - the best way to draw AWS diagrams](https://www.cloudcraft.co).
Monitoring of serverless applications provided by [Thundra](https://www.thundra.io/). diff --git a/handler.py b/handler.py index 218744d..66fd5a1 100755 --- a/handler.py +++ b/handler.py @@ -43,7 +43,7 @@ def load_data(event): if 403 == r.status_code: raise ValueError("Sharing has been disabled for this blueprint." + " You have to enable it by clicking 'Export' -> 'Get shareable link'" + - " on https://cloudcraft.co/app/", 403) + " on https://www.cloudcraft.co/app/", 403) elif r.status_code >= 500: raise ValueError("Something went wrong on cloudcraft side. Can't fetch specified blueprint." + From 0163081142748fadc27898923cb906e4c8cfb500 Mon Sep 17 00:00:00 2001 From: Tomas Junnonen Date: Wed, 4 Nov 2020 09:02:22 -0800 Subject: [PATCH 22/29] docs: Fix a few more links (#52) - Direct traffic to app.cloudcraft.co subdomain where applicable - Fix shared blueprint test link - Minor grammar fixes --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- README.md | 2 +- handler.py | 2 +- package.json | 2 +- templates/root/template/README.md | 2 +- test_fixtures/input_cloudcraft.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a9e6029..f24e8b8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -8,7 +8,7 @@ about: Create a report to help us improve A clear and concise description of what the bug is. diff --git a/README.md b/README.md index 88b73e1..e37ce66 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Code in this repository is used for generating infrastructure as Terraform confi ## How can I try this? -1. Sign up for free account to [Cloudcraft.co](https://www.cloudcraft.co/app). +1. Sign up for a free account with [Cloudcraft](https://app.cloudcraft.co/signup). 1. Draw AWS architecture in web-browser (you can import live AWS resources, too). 1. Click "Export" and "Terraform code export" at the top right side. 1. Download archive and extract it locally. diff --git a/handler.py b/handler.py index 66fd5a1..c5d89e3 100755 --- a/handler.py +++ b/handler.py @@ -43,7 +43,7 @@ def load_data(event): if 403 == r.status_code: raise ValueError("Sharing has been disabled for this blueprint." + " You have to enable it by clicking 'Export' -> 'Get shareable link'" + - " on https://www.cloudcraft.co/app/", 403) + " on https://app.cloudcraft.co", 403) elif r.status_code >= 500: raise ValueError("Something went wrong on cloudcraft side. Can't fetch specified blueprint." + diff --git a/package.json b/package.json index a8d7993..bd89faf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "modules.tf-lambda", "version": "2.0.0", - "description": "From visual diagrams created with Cloudcraft.co to infrastructure as code using Terraform and Terragrunt", + "description": "From visual diagrams created with Cloudcraft to infrastructure as code using Terraform and Terragrunt", "main": "index.js", "private": true, "scripts": { diff --git a/templates/root/template/README.md b/templates/root/template/README.md index 2c9d04e..48fe47b 100644 --- a/templates/root/template/README.md +++ b/templates/root/template/README.md @@ -1,6 +1,6 @@ # Infrastructure code for "{{ cookiecutter.source_name }}" -This repository contains infrastructure as Terraform configurations which were automatically generated from blueprint created using [cloudcraft.co](https://cloudcraft.co/app). +This repository contains infrastructure as Terraform configurations which were automatically generated from blueprint created using [Cloudcraft](https://www.cloudcraft.co). [Terragrunt](https://terragrunt.gruntwork.io/) is used to work with Terraform configurations which allows to orchestrate dependent layers, update arguments dynamically and keep configurations [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). diff --git a/test_fixtures/input_cloudcraft.json b/test_fixtures/input_cloudcraft.json index 26e6a39..40f5f7d 100644 --- a/test_fixtures/input_cloudcraft.json +++ b/test_fixtures/input_cloudcraft.json @@ -1,6 +1,6 @@ { "queryStringParameters": { - "cloudcraft": "https://cloudcraft.co/api/blueprint/b2eda0eb-21b2-45d8-93d5-c0b4906eb69e?key=XlAaasYL4pOa5f-Wzkt5CQ" + "cloudcraft": "https://app.cloudcraft.co/api/blueprint/b2eda0eb-21b2-45d8-93d5-c0b4906eb69e?key=XlAaasYL4pOa5f-Wzkt5CQ" } } From 852e725603ff76596a5e98b1f8ceaff8567293bd Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 9 May 2021 22:01:56 +0200 Subject: [PATCH 23/29] feat: Added Lambda, API Gateway, CloudFront modules, and some refactoring (#60) --- .gitignore | 28 +- .pre-commit-config.yaml | 22 +- .vscode/launch.json | 19 + .vscode/settings.json | 6 + DEVELOPMENT.md | 50 - LICENSE | 2 +- README.md | 30 +- bin/test_lambda_local.sh | 3 - handler.py | 180 - misc/dashbird-logo.png | Bin 32617 -> 0 bytes modules-metadata/alb_version.txt | 1 - modules-metadata/autoscaling.json | 264 - modules-metadata/autoscaling_variables.json | 262 - modules-metadata/autoscaling_version.txt | 1 - modules-metadata/dynamodb-table_version.txt | 1 - modules-metadata/ec2-instance_version.txt | 1 - modules-metadata/elb_version.txt | 1 - modules-metadata/rds-aurora_version.txt | 1 - modules-metadata/rds_version.txt | 1 - modules-metadata/s3-bucket_version.txt | 1 - modules-metadata/security-group_version.txt | 1 - modules-metadata/vpc.json | 1649 ----- modules-metadata/vpc_variables.json | 1649 ----- modules-metadata/vpc_version.txt | 1 - modulestf/modules.py | 160 - package-lock.json | 6347 ----------------- package.json | 37 - requirements-lambda.txt | 4 - requirements.txt | 7 - serverless.yml | 102 - src/handler.py | 150 + {modulestf => src/modulestf}/__init__.py | 0 .../modulestf}/cloudcraft/__init__.py | 0 .../modulestf}/cloudcraft/graph.py | 0 {modulestf => src/modulestf}/const.py | 8 +- {modulestf => src/modulestf}/convert.py | 40 +- {modulestf => src/modulestf}/logger.py | 0 src/modulestf/modules.py | 175 + {modulestf => src/modulestf}/render.py | 7 + {modulestf => src/modulestf}/upload.py | 0 src/requirements.txt | 6 + .../templates}/config_aws_lambda.yaml | 0 .../lambda/handler.py | 4 + .../templates}/root/cookiecutter.json | 0 .../templates}/root/template/.editorconfig | 0 src/templates/root/template/.gitignore | 42 + .../root/template/.pre-commit-config.yaml | 6 +- .../templates}/root/template/LICENSE | 2 +- .../templates}/root/template/README.md | 25 +- .../root/template/modules/aws-data/README.md | 42 + .../root/template/modules/aws-data/main.tf | 2 +- .../root/template/modules/aws-data/outputs.tf | 0 .../region/terragrunt.hcl | 0 .../terragrunt-single-layer/terragrunt.hcl | 0 .../terraform-aws-modules-metadata}/alb.json | 28 +- .../alb_cloudcraft.json | 0 .../alb_variables.json | 28 +- .../alb_version.txt | 1 + .../apigateway-v2.json | 157 + .../apigateway-v2_cloudcraft.json | 0 .../apigateway-v2_variables.json | 157 + .../apigateway-v2_version.txt | 1 + .../autoscaling.json | 408 ++ .../autoscaling_cloudcraft.json | 0 .../autoscaling_variables.json | 406 ++ .../autoscaling_version.txt | 1 + .../cloudfront.json | 115 + .../cloudfront_cloudcraft.json | 0 .../cloudfront_variables.json | 115 + .../cloudfront_version.txt | 0 .../dynamodb-table.json | 33 +- .../dynamodb-table_cloudcraft.json | 0 .../dynamodb-table_variables.json | 33 +- .../dynamodb-table_version.txt | 1 + .../ec2-instance.json | 10 + .../ec2-instance_cloudcraft.json | 0 .../ec2-instance_variables.json | 10 + .../ec2-instance_version.txt | 1 + .../terraform-aws-modules-metadata}/elb.json | 5 + .../elb_cloudcraft.json | 0 .../elb_variables.json | 5 + .../elb_version.txt | 1 + .../lambda.json | 452 ++ .../lambda_cloudcraft.json | 0 .../lambda_variables.json | 452 ++ .../lambda_version.txt | 0 .../rds-aurora.json | 159 +- .../rds-aurora_cloudcraft.json | 0 .../rds-aurora_variables.json | 159 +- .../rds-aurora_version.txt | 1 + .../terraform-aws-modules-metadata}/rds.json | 126 +- .../rds_cloudcraft.json | 0 .../rds_variables.json | 126 +- .../rds_version.txt | 1 + .../redshift.json | 15 +- .../redshift_cloudcraft.json | 0 .../redshift_variables.json | 15 +- .../redshift_version.txt | 1 + .../route53.json | 0 .../route53_cloudcraft.json | 0 .../route53_variables.json | 1 + .../route53_version.txt | 1 + .../s3-bucket.json | 26 +- .../s3-bucket_cloudcraft.json | 1 + .../s3-bucket_variables.json | 26 +- .../s3-bucket_version.txt | 0 .../security-group.json | 268 +- .../security-group_cloudcraft.json | 1 + .../security-group_variables.json | 268 +- .../security-group_version.txt | 1 + .../terraform-aws-modules-metadata}/sns.json | 0 .../sns_cloudcraft.json | 1 + .../sns_variables.json | 0 .../sns_version.txt | 1 + .../terraform-aws-modules-metadata}/sqs.json | 0 .../sqs_cloudcraft.json | 0 .../sqs_variables.json | 0 .../sqs_version.txt | 1 + .../terraform_hcl2.awk | 0 .../update_modules_metadata.sh | 45 +- src/terraform-aws-modules-metadata/vpc.json | 959 +++ .../vpc_cloudcraft.json | 1 + .../vpc_variables.json | 959 +++ .../vpc_version.txt | 1 + .../vpn-gateway.json | 231 + .../vpn-gateway_cloudcraft.json | 1 + .../vpn-gateway_variables.json | 231 + .../vpn-gateway_version.txt | 1 + templates/root/template/.gitignore | 25 - .../root/template/modules/aws-data/README.md | 16 - terraform/.gitignore | 1 + terraform/.terraform-version | 1 + terraform/Makefile | 7 + terraform/README.md | 79 + terraform/betajob/backend.hcl | 3 + terraform/cloudcraft/backend.hcl | 3 + terraform/main.tf | 262 + terraform/outputs.tf | 4 + terraform/terraform.tfvars.sample | 10 + terraform/variables.tf | 50 + test_fixtures/api_gateway_request.json | 69 + .../blueprint_cloudfront_lambda_apigw.json | 190 + test_fixtures/input_cloudcraft.json | 6 +- test_fixtures/input_localfile.json | 6 +- 144 files changed, 7149 insertions(+), 10971 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json delete mode 100644 DEVELOPMENT.md delete mode 100755 bin/test_lambda_local.sh delete mode 100755 handler.py delete mode 100644 misc/dashbird-logo.png delete mode 100644 modules-metadata/alb_version.txt delete mode 100644 modules-metadata/autoscaling.json delete mode 100644 modules-metadata/autoscaling_variables.json delete mode 100644 modules-metadata/autoscaling_version.txt delete mode 100644 modules-metadata/dynamodb-table_version.txt delete mode 100644 modules-metadata/ec2-instance_version.txt delete mode 100644 modules-metadata/elb_version.txt delete mode 100644 modules-metadata/rds-aurora_version.txt delete mode 100644 modules-metadata/rds_version.txt delete mode 100644 modules-metadata/s3-bucket_version.txt delete mode 100644 modules-metadata/security-group_version.txt delete mode 100644 modules-metadata/vpc.json delete mode 100644 modules-metadata/vpc_variables.json delete mode 100644 modules-metadata/vpc_version.txt delete mode 100644 modulestf/modules.py delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 requirements-lambda.txt delete mode 100644 requirements.txt delete mode 100644 serverless.yml create mode 100755 src/handler.py rename {modulestf => src/modulestf}/__init__.py (100%) rename {modulestf => src/modulestf}/cloudcraft/__init__.py (100%) rename {modulestf => src/modulestf}/cloudcraft/graph.py (100%) rename {modulestf => src/modulestf}/const.py (83%) rename {modulestf => src/modulestf}/convert.py (92%) rename {modulestf => src/modulestf}/logger.py (100%) create mode 100644 src/modulestf/modules.py rename {modulestf => src/modulestf}/render.py (94%) rename {modulestf => src/modulestf}/upload.py (100%) create mode 100644 src/requirements.txt rename {templates => src/templates}/config_aws_lambda.yaml (100%) create mode 100644 src/templates/extra-files-single-layer/lambda/handler.py rename {templates => src/templates}/root/cookiecutter.json (100%) rename {templates => src/templates}/root/template/.editorconfig (100%) create mode 100644 src/templates/root/template/.gitignore rename {templates => src/templates}/root/template/.pre-commit-config.yaml (50%) rename {templates => src/templates}/root/template/LICENSE (96%) rename {templates => src/templates}/root/template/README.md (81%) create mode 100644 src/templates/root/template/modules/aws-data/README.md rename {templates => src/templates}/root/template/modules/aws-data/main.tf (95%) rename {templates => src/templates}/root/template/modules/aws-data/outputs.tf (100%) rename {templates => src/templates}/terragrunt-common-layer/region/terragrunt.hcl (100%) rename {templates => src/templates}/terragrunt-single-layer/terragrunt.hcl (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/alb.json (84%) rename {modules-metadata => src/terraform-aws-modules-metadata}/alb_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/alb_variables.json (84%) create mode 100644 src/terraform-aws-modules-metadata/alb_version.txt create mode 100644 src/terraform-aws-modules-metadata/apigateway-v2.json rename modules-metadata/dynamodb-table_cloudcraft.json => src/terraform-aws-modules-metadata/apigateway-v2_cloudcraft.json (100%) create mode 100644 src/terraform-aws-modules-metadata/apigateway-v2_variables.json create mode 100644 src/terraform-aws-modules-metadata/apigateway-v2_version.txt create mode 100644 src/terraform-aws-modules-metadata/autoscaling.json rename {modules-metadata => src/terraform-aws-modules-metadata}/autoscaling_cloudcraft.json (100%) create mode 100644 src/terraform-aws-modules-metadata/autoscaling_variables.json create mode 100644 src/terraform-aws-modules-metadata/autoscaling_version.txt create mode 100644 src/terraform-aws-modules-metadata/cloudfront.json rename modules-metadata/elb_cloudcraft.json => src/terraform-aws-modules-metadata/cloudfront_cloudcraft.json (100%) create mode 100644 src/terraform-aws-modules-metadata/cloudfront_variables.json rename modules-metadata/redshift_version.txt => src/terraform-aws-modules-metadata/cloudfront_version.txt (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/dynamodb-table.json (78%) rename modules-metadata/s3-bucket_cloudcraft.json => src/terraform-aws-modules-metadata/dynamodb-table_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/dynamodb-table_variables.json (78%) create mode 100644 src/terraform-aws-modules-metadata/dynamodb-table_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/ec2-instance.json (94%) rename {modules-metadata => src/terraform-aws-modules-metadata}/ec2-instance_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/ec2-instance_variables.json (94%) create mode 100644 src/terraform-aws-modules-metadata/ec2-instance_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/elb.json (94%) rename modules-metadata/security-group_cloudcraft.json => src/terraform-aws-modules-metadata/elb_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/elb_variables.json (94%) create mode 100644 src/terraform-aws-modules-metadata/elb_version.txt create mode 100644 src/terraform-aws-modules-metadata/lambda.json rename modules-metadata/sns_cloudcraft.json => src/terraform-aws-modules-metadata/lambda_cloudcraft.json (100%) create mode 100644 src/terraform-aws-modules-metadata/lambda_variables.json rename modules-metadata/sqs_version.txt => src/terraform-aws-modules-metadata/lambda_version.txt (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/rds-aurora.json (60%) rename {modules-metadata => src/terraform-aws-modules-metadata}/rds-aurora_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/rds-aurora_variables.json (60%) create mode 100644 src/terraform-aws-modules-metadata/rds-aurora_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/rds.json (74%) rename {modules-metadata => src/terraform-aws-modules-metadata}/rds_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/rds_variables.json (74%) create mode 100644 src/terraform-aws-modules-metadata/rds_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/redshift.json (93%) rename {modules-metadata => src/terraform-aws-modules-metadata}/redshift_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/redshift_variables.json (93%) create mode 100644 src/terraform-aws-modules-metadata/redshift_version.txt create mode 100644 src/terraform-aws-modules-metadata/route53.json rename modules-metadata/vpc_cloudcraft.json => src/terraform-aws-modules-metadata/route53_cloudcraft.json (100%) create mode 100644 src/terraform-aws-modules-metadata/route53_variables.json create mode 100644 src/terraform-aws-modules-metadata/route53_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/s3-bucket.json (86%) create mode 100644 src/terraform-aws-modules-metadata/s3-bucket_cloudcraft.json rename {modules-metadata => src/terraform-aws-modules-metadata}/s3-bucket_variables.json (86%) rename modules-metadata/sns_version.txt => src/terraform-aws-modules-metadata/s3-bucket_version.txt (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/security-group.json (83%) create mode 100644 src/terraform-aws-modules-metadata/security-group_cloudcraft.json rename {modules-metadata => src/terraform-aws-modules-metadata}/security-group_variables.json (83%) create mode 100644 src/terraform-aws-modules-metadata/security-group_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/sns.json (100%) create mode 100644 src/terraform-aws-modules-metadata/sns_cloudcraft.json rename {modules-metadata => src/terraform-aws-modules-metadata}/sns_variables.json (100%) create mode 100644 src/terraform-aws-modules-metadata/sns_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/sqs.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/sqs_cloudcraft.json (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/sqs_variables.json (100%) create mode 100644 src/terraform-aws-modules-metadata/sqs_version.txt rename {modules-metadata => src/terraform-aws-modules-metadata}/terraform_hcl2.awk (100%) rename {modules-metadata => src/terraform-aws-modules-metadata}/update_modules_metadata.sh (59%) create mode 100644 src/terraform-aws-modules-metadata/vpc.json create mode 100644 src/terraform-aws-modules-metadata/vpc_cloudcraft.json create mode 100644 src/terraform-aws-modules-metadata/vpc_variables.json create mode 100644 src/terraform-aws-modules-metadata/vpc_version.txt create mode 100644 src/terraform-aws-modules-metadata/vpn-gateway.json create mode 100644 src/terraform-aws-modules-metadata/vpn-gateway_cloudcraft.json create mode 100644 src/terraform-aws-modules-metadata/vpn-gateway_variables.json create mode 100644 src/terraform-aws-modules-metadata/vpn-gateway_version.txt delete mode 100644 templates/root/template/.gitignore delete mode 100644 templates/root/template/modules/aws-data/README.md create mode 100644 terraform/.gitignore create mode 100644 terraform/.terraform-version create mode 100644 terraform/Makefile create mode 100644 terraform/README.md create mode 100644 terraform/betajob/backend.hcl create mode 100644 terraform/cloudcraft/backend.hcl create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/terraform.tfvars.sample create mode 100644 terraform/variables.tf create mode 100644 test_fixtures/api_gateway_request.json create mode 100644 test_fixtures/input/blueprint_cloudfront_lambda_apigw.json diff --git a/.gitignore b/.gitignore index 94674ec..6f32d9f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,6 @@ var/ # Serverless directories .serverless - .requirements-cache node_modules output/* @@ -30,3 +29,30 @@ graph.png /.venv /.idea + +# Terraform +.terraform +.terragrunt-cache +*.tfstate* +.terraform.lock.hcl +crash.log + +# OS X +.history +.DS_Store + +# IntelliJ +.idea_modules +*.iml +*.iws +*.ipr +.idea/ +build/ +*/build/ +out/ + +# Lambda builds by Terraform AWS Lambda module +builds/ + +# Vim +*.sw[op] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 461f5b9..507c410 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,17 +1,25 @@ repos: -- repo: git://github.com/doublify/pre-commit-isort +- repo: https://github.com/doublify/pre-commit-isort rev: v4.3.0 hooks: - id: isort -- repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.5.0 +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.4.0 hooks: - id: check-ast - id: check-merge-conflict - id: requirements-txt-fixer - id: end-of-file-fixer +- repo: https://gitlab.com/pycqa/flake8 + rev: 3.9.2 + hooks: - id: flake8 -#- repo: git://github.com/codespell-project/codespell -# rev: v1.16.0 -# hooks: -# - id: codespell +- repo: https://github.com/antonbabenko/pre-commit-terraform + rev: v1.50.0 + hooks: + - id: terraform_fmt + - id: terraform_docs +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.4.0 + hooks: + - id: check-merge-conflict diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..800a0ef --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + "configurations": [ + { + "name": "Python: src/handler.py", + "type": "python", + "request": "launch", + "program": "src/handler.py", + "console": "integratedTerminal", + "cwd": "${workspaceFolder}" + }, + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c9b64c8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "python.pythonPath": "/Users/Bob/.local/share/virtualenvs/modules.tf-diagrams/bin/python", + "python.linting.enabled": true, + "python.linting.flake8Enabled": true, + "python.formatting.provider": "autopep8" +} diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md deleted file mode 100644 index a506546..0000000 --- a/DEVELOPMENT.md +++ /dev/null @@ -1,50 +0,0 @@ -# Notes for developers - -As a short cheatsheet, you will need to use these commands: - -* Invoke real endpoint in `dev` and `prod` environments using [httpie](https://github.com/jakubroztocil/httpie/): - -``` -# dev -$ http --print Hhb --all --follow https://dev.modules.tf/ @input/blueprint_my.json - -# prod -$ http --print Hhb --all --follow https://prod.modules.tf/ @input/blueprint_my.json -``` - -* Invoke function locally providing `input.json`: - -``` -$ serverless invoke local --function generate-cloudcraft --path test_fixtures/input_localfile.json -``` - -* Deploy all functions to `prod` environment: - -``` -$ serverless deploy --stage prod -``` - -* Deploy single function to `dev` environment: - -``` -$ serverless deploy function --function generate-cloudcraft --stage dev -``` - -* Deploy single function to `prod` environment: - -``` -$ serverless deploy function --function generate-cloudcraft --stage prod -``` - -## Infrastructure - -modules.tf can be self-hosted on your own infrastructure (if you want to expand it for some reason). - -See [modules.tf-lambda-infra](https://github.com/antonbabenko/modules.tf-lambda-infra) repository for complete setup. - -## Spellchecker - -``` -$ brew install codespell -$ pre-commit try-repo git://github.com/codespell-project/codespell codespell --all-files -``` diff --git a/LICENSE b/LICENSE index 503ab7d..96f46c6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Anton Babenko +Copyright (c) 2018-2021 Anton Babenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index e37ce66..656703f 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,11 @@ -# modules.tf - Infrastructure as code generator - from visual diagrams to Terraform +# Diagrams to code (d2c) - Infrastructure as code generator - from visual diagrams to Terraform [![Financial Contributors on Open Collective](https://opencollective.com/modulestf/all/badge.svg?label=financial+contributors)](https://opencollective.com/modulestf) [![MIT license](https://img.shields.io/github/license/antonbabenko/modules.tf-lambda.svg)]() [![@antonbabenko](https://img.shields.io/twitter/follow/antonbabenko.svg?style=flat&label=Follow%20@antonbabenko%20on%20Twitter)](https://twitter.com/antonbabenko) - modules.tf - Infrastructure as code generator - from visual diagrams to Terraform Code in this repository is used for generating infrastructure as Terraform configurations from visual diagrams created using [Cloudcraft](https://www.cloudcraft.co). -[modules.tf](https://github.com/antonbabenko/modules.tf-lambda) is an open-source project by [Anton Babenko](https://github.com/antonbabenko). - ## How can I try this? @@ -37,8 +34,6 @@ In [modules.tf-demo](https://github.com/antonbabenko/modules.tf-demo) repository This project was partially sponsored by [Cloudcraft - the best way to draw AWS diagrams](https://www.cloudcraft.co).
-Monitoring of serverless applications provided by [Thundra](https://www.thundra.io/). - [Become a sponsor to @antonbabenko on GitHub](https://github.com/sponsors/antonbabenko/). [![@antonbabenko](https://img.shields.io/twitter/follow/antonbabenko.svg?style=flat&label=Follow%20@antonbabenko%20on%20Twitter)](https://twitter.com/antonbabenko) @@ -48,11 +43,26 @@ Monitoring of serverless applications provided by [Thundra](https://www.thundra. ## Developer's guide -This project is Python 3.7 application written using [Serverless framework](https://serverless.com) which runs on [AWS Lambda](https://aws.amazon.com/lambda/). +This project is Python 3.8 serverless application written using [serverless.tf](https://serverless.tf) framework and open-source components ([Terraform AWS modules](https://github.com/terraform-aws-modules)). + +### Notes for developers + +Terraform is used to provision infrastructure resources as well as packaging artifacts and to do the deployments (check out [serverless.tf](https://serverless.tf) for more details). + +Source code is located in `src/handler.py`. + +Go to directory `terraform`, verify/update file `terraform.tfvars` and run: + +``` +$ terraform init # Download required Terraform providers and modules +$ terraform apply # Create or update infrastructure resources or do a new deployment of Lambda function (if source code has changed) +``` -Read [official quick start guide](https://serverless.com/framework/docs/providers/aws/guide/quick-start/) and [installation instructions](https://serverless.com/framework/docs/providers/aws/guide/installation/) to familiarise yourself with it. +When infrastructure is created, you should be able to `POST` using [httpie](https://github.com/jakubroztocil/httpie/) or `curl` like this: -Read [DEVELOPMENT.md](https://github.com/antonbabenko/modules.tf-lambda/blob/master/DEVELOPMENT.md) for more insights if you want to contribute to this project. +``` +$ http --print Hhb --all --follow https://dev-d2c.modules.tf @test_fixtures/input/blueprint_my.json +``` ## Contributors @@ -89,4 +99,4 @@ Support this project with your organization. Your logo will show up here with a This work is licensed under MIT License. See LICENSE for full details. -Copyright (c) 2019 Anton Babenko +Copyright (c) 2018-2021 Anton Babenko diff --git a/bin/test_lambda_local.sh b/bin/test_lambda_local.sh deleted file mode 100755 index 14328e9..0000000 --- a/bin/test_lambda_local.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -python-lambda-local -t 10 -f "$1" "$2" "$3" diff --git a/handler.py b/handler.py deleted file mode 100755 index c5d89e3..0000000 --- a/handler.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python3 - -import json -import os -import shutil -from pprint import pformat, pprint - -import requests -from modulestf.cloudcraft.graph import populate_graph -from modulestf.const import FINAL_DIR -from modulestf.convert import convert_graph_to_modulestf_config -from modulestf.logger import setup_logging -from modulestf.render import prepare_render_dirs, render_from_modulestf_config -from modulestf.upload import upload_file_to_s3 - -logger = setup_logging() - - -def load_data(event): - body = event.get("body") - logger.info("body = %s" % body) - - qs = event.get("queryStringParameters") - logger.info("queryStringParameters = %s" % qs) - - if body is None and qs is None: - raise ValueError("Some query string parameters should be defined or use HTTP POST method", 400) - - if qs is None: - blueprint_url = localfile = None - else: - blueprint_url = qs.get("cloudcraft") - localfile = qs.get("localfile") - - if body: - data = json.loads(body) - elif blueprint_url: - r = requests.get(blueprint_url) - data = r.json() - - logger.info("Blueprint url: %s, response code: %s" % (blueprint_url, r.status_code)) - - if 403 == r.status_code: - raise ValueError("Sharing has been disabled for this blueprint." + - " You have to enable it by clicking 'Export' -> 'Get shareable link'" + - " on https://app.cloudcraft.co", 403) - - elif r.status_code >= 500: - raise ValueError("Something went wrong on cloudcraft side. Can't fetch specified blueprint." + - " Check URL and try again later.", 404) - - elif localfile: - file = open(localfile, 'r') - data = json.load(file) - else: - raise ValueError("'cloudcraft' or 'localfile' query string parameter should be defined", 400) - - print("event = %s" % json.dumps(event)) - - return data - - -def validation_result(config): - return True - - -def handler(event, context): - link = "" - - # ALB response is different: - # https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html#respond-to-load-balancer - request_from_lb = bool(event.get("requestContext", {}).get("elb")) - http_method = event.get("httpMethod") - is_validate_action = event.get("path") == "/validate" - - if http_method == "OPTIONS": - return { - "isBase64Encoded": False, - "statusCode": 200, - "statusDescription": "200 OK", - "headers": { - "Content-Type": "application/json", - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", - "Access-Control-Allow-Methods": "POST,GET,OPTIONS", - # "Access-Control-Allow-Credentials": True # this header is not allowed by ALB - }, - } - - if request_from_lb and event.get("path") == "/healthz": - return { - "isBase64Encoded": False, - "statusCode": 200, - "statusDescription": "200 OK", - "headers": { - "Content-Type": "text/html" - }, - "body": "Health OK" - } - - try: - data = load_data(event) - except ValueError as error: - logger.error(error) - - if request_from_lb: - return { - "isBase64Encoded": False, - "statusCode": error.args[1], - "statusDescription": str(error.args[1]) + " Server Error", - "headers": { - "Content-Type": "text/html", - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", - "Access-Control-Allow-Methods": "POST,GET,OPTIONS", - }, - "body": error.args[0], - } - else: - return { - "body": error.args[0], - "headers": { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": True - }, - "statusCode": error.args[1], - } - - # logger.info(pformat(data, indent=2)) - - graph = populate_graph(data) - - config = convert_graph_to_modulestf_config(graph) - - if is_validate_action: - return { - "isBase64Encoded": False, - "statusCode": 200, - "statusDescription": "200 OK", - "headers": { - "Content-Type": "application/json", - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", - "Access-Control-Allow-Methods": "POST,GET,OPTIONS", - }, - "body": json.dumps(validation_result(config)) - } - - prepare_render_dirs() - - render_from_modulestf_config(config, source=graph.source, regions=graph.regions) - - # Do not upload to S3 when working locally - if not os.environ.get("IS_LOCAL"): - shutil.make_archive("archive", "zip", FINAL_DIR) - - link = upload_file_to_s3(filename="archive.zip") - - if request_from_lb: - return { - "isBase64Encoded": False, - "headers": { - "Location": link, - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with", - "Access-Control-Allow-Methods": "POST,GET,OPTIONS", - }, - "statusCode": 302, - "statusDescription": "302 Found", - } - else: - return { - "body": "", - "headers": { - "Location": link, - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": True - }, - "statusCode": 302, - } diff --git a/misc/dashbird-logo.png b/misc/dashbird-logo.png deleted file mode 100644 index 3f22ae20f521a38cc9cb0296af1e7b05bf06caea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32617 zcmZU(W0YpWuP@x1HlDU^+qP}nwr$(C-P5*h8`I{r-FN=y-uIld*1JFKRlAa3QkA5t zvTG$$K~5YF8Vec-2nbG6LPQA&2pIfdTNCm>@9nIpDj*2@WOeMZ+Yd8(HKBFyTR32oTT<^RDM)Wj5a3}bC6$7rh=>3pi%e*>sRS;7 zq5>rdG{-zRC5RL)yntva{rqa{o_p`@gy-y6uK&%~si(b@+&56dcBYLR2n~>ckrLI| z*n}Dz1&0V4JFr3k_-g7mU&z;@@&+|e7(;9@Z0OxKw0J#JjNZW=E1K@k(W!BG0~wG9Q}RS4c)+-T z%La=Y%b_r=kOn&?5gXJ2s=u@vEHlV~UI=S3QadJOpY}#_M*FV?$tcL`u%8*`cl_@I z|2O8$1%F2)ko2c9=h|&ZPNs=Hbj^{(G%!U0Y!V>4aiFFEI1U4tqG2K_5~r7+FC62i z9Nea4xK<)^BSDr3;L35&u|ChYI&uEh)I=e9ll9`ZX5z)08s&)YJgG!Vm9cZ08R&FtzXsw0ye<# z4&$z$!~^Q2A4DUF01`rxfQkfsLO?13yaa)fKzbb5Dcq;PfC4ruEQx@w1$PtlSXfj6 zQ{~r+@SZSwq4hki1;7h3R+xDn`;0gyXo3MQEhyCxHv@R9->w0_8!;{{`9OvPf)6Nt zaODoO9kmyHFEHE??-MCc92f;kRD7baMFBPicM=&jC`!mtfm_kD0!f9n3Th?rLU2d; zuR?PLf(1=hRGO%D;mpFUg+B{SZp>~Zoj`iw<$Ud#-6QWKhZp?UFW~_RBNhfT40IU) z8CG)K#7K&P6$5Psc81|Ji5YP8$YLXv267EE8wPgxP8e-J-WZ!PcVqB6)D;hWIP#F? zK8-^j2N@k|dNg+!cW_q}_Mq(H?vbPiW;fq1B7Ttkp!t#X9o#GRE8!=KUnGHm0#ODc z4-{fZZHUmIr4Ymconcag2ntCRfHuN!n8OIIF=bt(TM&o1mo!o0o)PoR#}JqbT)Pl*D>G>VlpBuR=>pt4-2oTs$=wD{igq2o^U z?)s4W)cP3v(0fFFU;VJ{U~f2oLVwUd@Q3cF21rmqvtKTNvO&2(XTPYwqQ9F!RY87U znL)8Zph561ZNCK|C!skmNFhWaewH%tS_nlIRVDDdxT(UsqP&v5BAJCoHuOX&y7+i$ zcJbZPc~EFDY!G-5bMSaDJ=D_$MK|+CNWK7lac)Wc3}3WF#72Zj^f{U(5;l@1N-9Dt zS}f`$k}VoO+7Bfe)fo_t&P}pP_AG)!TSs?8n@8s-^cnVA113AD6GWOw?x=T|NJ3Ld zcTU_Pd!J&G|ED{pB_$a}`yyl6wNlfvv*ou-j!WYs>NzH6RZOW&jZEXTY9@NqU=v#t zR8wiwPLs1!lGCh{P6t(oUk9lts;B>(&70X9Ikd>HFrgHoMxpeyi!q9)MJ6;o=MxuC8{DSI;u>nSSsTx6jkaKlNGC#4=WAUFs<%Q$KSxN z8aooaVm&%vb>KCIHHg)YI>rjf#gC7QLIRidj+3sOr~%UEk=)?L=-)@_!3i;Bxo z3!EiO#Sfxu66}I6EjPxzguLoKHa+k??C%%vG+$0%AK)mU;=#J$*WmSVtgysz@)&#! zMOdB~*Q^&z?>06@(~NdZd5nrIP|TGKn5Od>dNCkk^^~K_t1jv1q)P~9qh^(6r!#)c zYfSO%_6+%YJLj&*X!mF`(Nr*br8TA*$CA={sX3@iRht)?zk^&uTw|Y7VzXp( zW-znWTRU5Ew$QdjxtY6g-EyBPyvaX!KKvjEA^gLc!pr0C;}+s#&WW3b-H%O?RxD@?dG;ub~tZv@fyOb#|+~epQJ96SKB;6?;*iWo8jjtM< zHhE5%O^7F*a@gf$p-`9_OL}Muy$-&y6d7bQuAGw+w5EwUAcRM zytw?4IKGuW{9@Xj9k-It5d+161nEx<(dAem^_qX{;?~dr+dh2{6eanZ|_|?|8 z^3nRZbquNq@eUIUBabtTC&R_zG=8C=n`oeDwlHiMKU6!?G~zjO8)w7kR6X2Ka!>J> z;)SAqxu@kTe;)C637aao~%U8jpuqe!L(t1>@olUMaw53sN1Uvlh zGq1+#q3+^i@oRi*`UzdCJ{q5nJLtbsv#H0`nd+z98@bJEMfI{Swl`iryl3xUcDFa* z*mmq*_FTK&yT(h-zt@Uh7HONc(e0V-+IARwmp09p*Y1-SbZ_=B_4s)>4*Bm5SX@$G2o47xheE>Z@k@ENyt=(%nbTfG_9Z8j zC(2j&tG~9VnNM`_+VF3^Pd={xf>|FP(^K~OWKDa@dFnBdGOO~}^7~qjI-2c|grO(X zZ_uZkIs2o2{yt2-sK)ne{;svBv#`5oJ$<^*4r(*9x8B3-z07*a^6yM&Z)nMQ(Yx~9 zffxB{Jz-cU28^=kpn?KqZfCX{|nh?TX zWm?1c1b^3VdP^3xUsdP3bD&MHO=ARF$pr!Kp*s51!7}(t^TP< zp#c5*JxB1HaG}J+^Uan3h=Ub~FP@H`{x>bXf1O~MZ^)mF&>!xtJ`Y-ix|DuQAi32u z@OpQA##ykRx;@~*f4&jBYu*2sDCStIXt-#|%5WLm+tL}D*c+MBdDuGq%Nv1!cs#iN zHEm5@3<*4JZS0)6Ja~!zi-YT5`#;_EL(7AZ+hsO2A6TLdQVF2Tedg zz~f|M#-$`8_W$7jzIcf&TwENu=;__v-Raz!>Fk}%=@~gWIq4ag=$V*k|8dYdd)m1e zdeGWA6aQZ!|DPNYQ)go*O9vNAdpm;v$Tc*wcXi<vlbsT5B+~zo)7w?rG^g(NB~GuL{P;8_^Jmg z!$jS+z>}DmiRfioOI39fy#)pga+r#tO9KmZ^vkgAdUXBf9IvZ9y?$%y`{eTP%ae@z zoJ<#b_A~stKr>`xFc1_;3yh?NsJ11wBx&VyP0cnl6Vb`foG(2yQ?-;tK%@4bTCX>~ z?qj;sJm(wE(>!mx(j`k*C9CojEgas;ow^dU=2WaFv5S_iN+sJd&&G{pFK_E!q5H3! zVeXMRIh_&dN~E8A*Ox8->@{2}txB9q@Rq>v)Y5SOwhP}9toj}8;Ql=nuzo+N0v@J; zwaX`p`o*Q>ESQH0XTUTfl$GlWli&mjG+onsXy3}7w2Oa;77cSKF^^8yZ}7l;LdeHq zpuNP5YRAWZFf?@ZB_kLzU|V%>@1?74o2r%S$`!ifprk~ad}@Ytj`8a7?)%$(LWw$7 zS2&P4V#osQgpwC2ymQ=RZrqh{DGK!a@ZM2@h>Z%|?hO9F&BrQ!Tcl;;c~kZ^y0wA^ za3DVq0tC{qtL!0xdCP-;6voo-V(op{ak-YIerxgm=3Z%O;K&D%Io9)#=QTz{B*|Ad?LJ$t}`SOXy6_*KFfpnw2RHl-o;es7a5EADoZ%Hd6% zjhkEPToq_oXH3d>)6J-3%z`SQrs(A!W$OM?bCaDvDN)+gX8#7WBv7En6yj7SD15Zd z0=A7OqyO_RYw1^*wfj5^vv@}V3pyc4mt>oO#EDZ<@YG&jYb05t0Tn!r((;*ZG&Xta zsYb$F_W8%+w)WfZ_|`y&+P?NxwertK_)YdbmogjQx5e=Z&gyra;QkvhFf4e~KG`({ zz`vTD^_|+%OpR8p=gSopy|8vOS6_LWhpTaf!`z~ocVXYmgyR_*1sSk zghauUW(pmIhw`1C6THK~)xO?UseUdUF=O6w`10*uOy2!?(aX4yfOm$$ptSZ`T9Slu zh_U)T*)^-tZxTdUL&Aibpg?YdBd$vB*OWksDVSLuWAxN>zp?50ACGB-2@GINPDHv@ zscBgTo;uHTENkP-IzL>qa4$)Ezo;#?^?GV!VdKfwdmT?$4v~GK84yL&W(eVyDM&_N zn^iqM(w*+Qrv8ecJDGo?p+hi6W1?P?0#Cl>eb^&L{As!_oNk*w>NwT+>u~#Lu?JL; zOk$K#_Q-~rzTR&XIXUMCSrQ1pM_2>zGkNFcuk(leAGywR@A%U5O88p}k^Siq6~=It z#w1D{xd8rJ%}AwC4Kr{^#?bdWpX>48Znc8@SO{a}XiNR`0Bd5erN?QX zi)w^l&KdePCFkegk8A!o-rG==9Z$|7(`M+UlSDoQ_MM^ z*<-EN-_(06QHOmzu2^f-W!mW+C93+;)_~W{P=Qs5s1xqd%V!=I6=OzK2v$Qz)^~6Q zN+abAd&l~`lhY5v8rSpW{8z8e_Y3mDv-W_Sg*E=Qb-g@%>FD4AX=#`iIaRovlP!Ne z$-@?otw4IRbgAc#wHSILdY_1y!i>BL2RLwToRvJvS8s}IA8-58_CvO2OS7-skp*Vr%KK?rVYgpa{_p1ipyVuS5-^PItX+jfD<|2C+ zep!+NB7XH|$7OtJ&>5^G!B ze|lT&Y?Q6qyb{Sq7l%cp@ZYB9$}j8uL5f1I9CGvYuS$A*`9OLf!>A4;c9aJ|wc9R& z7&Gk6pr!=qCgjo*HU{sR>rHf`Yky$`B#EYhsUUb=(xBT5FFT~0MVlTuRC<9zg)mk1 zFc9Eqau0xgCFYkGdNIf4b2mkt1I#b=R}rAD4l ztC8Y1zpc0U|LnE|pv)^*mubQ#Q^uCX|D=LXj4ckgKOn0@q8f!t;1+&dd|A4wtqc!y z&^ZeP8R!K!<0VTQbL_p>yVN~<&*cAwju9WL+9h~In-;GWc_tOEWN_t*9#^VIAc%M@ znaGs%P++EYJ2}kNqF1b}P_N+b#+SsMyjPciIZ0I3HLB&IJinEJ2M1qnk~oRed6@y*|i@?F2hS;{e+>x3JnyV6h%3m zwIx8p6OSNjBOSUoG2=N)8_m|gPcLw*{|>kR%!P~e+0Y!`T`0i=@P8gpR^Lebf0FCV zy=?!+4-CO^ywtPdTna)_5?qY%H!*KKMpQ$!#XT;hHA1zhnb!JuBFsU8sTuwtShB_x z1R)B6sEy@kJGaymGr}@stu0*zJ%iM zidDYU`z%fy<#}{xeqYV?rP+1avSlDo zad_Z|6?qz?25RTQ76o4y7qbjRElv|e-A`UPx=Z#%T>j>_26%i66_m6NX=!YtOQ8;; zvpheo;(VPF7D-{@V3@iUg!zN=A*=(edcG=m`P1NM)BwjHOQ!l=oW7UZ@!*oy=poS( z!8ojN0`hkanMiGTDN^)O8U(z{ zqI>U`#``_Gy@(ZNm?f+deoo^_m8De``PU1AKh=)UgE9uqM1Z{x3`leV9t@6Lq1TM! zGP!yKO$|>yV=xku^=UpFB+e+t{aMHMtCCX$H=xuJz2(qb-*?Y)9C|7AK>`ug=NEVw zI3lc-C3IzBIa5|%7^lwrufbv62N5z!QixpzQpeVU(78ZQN=1%>?7oxmadyAuAYcmH zmRuOpClzcR;$H=P+b%K?gXj5{GOsa9qA9OPWoMUi8nZB>g@8wfRPqvua?Jl0JbJV|oBumb%pq~Yj*&{o z5|zx5GC7*-W?cc*F9j-P__?(6@dK)vwaemqOyQL-6Xt!Xbscu*e|TA^l$u zGH+~*e9jC-*mH(Hd1S)1R1*bqL>(Tmm8*X(JfB4aAs1Ez%S7(_Obxh9kgAhxQ)L_& zEU3F?+`f-jvtMs{Gr+;w4I4M-;dwtQyf6LuNqU_XPOxw_@m=HRj{>4LgD;wa+RmJv zbBn$eGyLI$2e6bif@U^H9`HcI8N-Ty|Jzd?f@KI$F+m!!QAQ9iIL*TjUbxt31@@z5 zM^DgXiaPnOceiBle_l<`H?8vn2rhA^&Gx-%1=TKlPseBAHNL7ynhAN&(ypQB@M^-L z5z-3whDoG*?K^DU-=pJwxMcAcL$M=G@iGqlfSjTu7EE2TCW+^}3RrMvR$ zN)Ue1=a{t_Wo05|?-*m!Yk_T0WGoM}8zpoiv8WP13E{Du(pCxXn4tsBXD~wK&ER1# zFTNOpcw#9!4p$%rJvp=)I5}hWL7P#h(P#u*a3dNvha`IVOXvKax6Zxywooqw<>wf{ z1;fp3VE=?C06bZ-V)oBiq`+lM!aB&5Aa5yXW#rrzuiN6w<$W)xIn)M{DyHV|EK<1V z2I~t85g~hp^_Q=zQWM32b`bl^`28=UJs4BQhHk(_A|m2g3bkkW7;+!*GbL=r zp0&V^H*)9oe9tp3m$b-M;L|kw#sWZEd#ZEeFl`FB(B49*dk~}u#nPAPj$g6zz!g)7!I8-Nj~P3^@-1h&adm@bg~F` z`G&O+so`&D`i$JdZ<_o~nxb09@T4TGv;5isju^%oHomm|2+WWbrq*dfj1cpRoT2r2 zrqIO1L>4|iM7AI}?0CU7b46r7_|#c1knYFw_|FmbMc1|KW8Y8QOgEdyLalw#%8LRT zq-Io3=?rQ5kX(l>FB0FkDfI)HmE^Lwor)Ji%*Q($E;x9k{3dj@0me3lywTNi7mN4A z^1#x^cs|VxrJnv^Ey&@f6PR%h#43^2&DT38SEHFPe0>GfR zyR#{*xU{rVh)h92(c~fpwW{D^%saTZA_xZV$Xwv5GPCn5d;5&8(5HN5egM7v&2}!| z+u9z{=pXGRYrSTu#ytaiVQDsgb)i{I7?3SN`T=wN_7{QoS=2U$ZiG_XEwKa;0yC93 zPaKpO&W$~86zQQ4td$niElSHJ#&xy}=bBuO1oaTQoFuFYblWm*Z*S7ai5Bm@XP5Uw zNTpCKXqm{<#zW^{Kt3-OIL0H{*8Kkh*(XrI3^w!t;1usdax(v%%fNvq(iBAK5*#ea z3mZ}e#=Btwq`3k(%G@M5YMn*s0j*qEPjI{5m9}`V&XjDY=(!4-0hp`F>S!6_a=qdb zNR))*XO6AE0>J#eHv7dmR^AP){x-!__06>->O9!m`y$7fG4_0>l9w^hh7220*lpML z1rNrt0jkiJ(%ubKtVJq}R8M$h3gML*`if`9UD_P3J3|5juI2clz&CSGnY8ZU{LFUghEGV3#W)7et@c)RT3lQAC24G3nr_(j=;*ThBWRYItg z19vP%3D9_K#P9LIc4|s-zC8;;uVY6wL;0JwS>C3XXFR6%Yn9YZ;BeZz1GYZ;h4&yo$#By7mfw0Ecb9GL z)}{Q$X!3*eqiMQ{YHE-7@^A`PJ;yjyX`7OPYg2bSBH2E}hmN(giDDY)6(-W0Q!{^? zFPJ*D(py2NSG${HXKtTk`E04tB2SUS`~*_ledB&X3tU-4PNm+*{(P`#JEtrOURHLH zqsnsUy>=b<;ym!WYss9?)wA<_l-Dr91ui6LpQvKHIc;R2 zM<;7U#q$D1yc!xZQy`*#jBEQXzqnW1X zn}&|1Bwa>E*5w(0dYs^lDL0p)%U+THcO-vwsEA$-^>>Jg4of5F2v_PLDQ{n=43FFK zJ%GNfi-#~`)7}inP1LNmbxNPITCHxp2zc=Xs-H-yQyuoJM`W+PXW&dlHWGF zDI{WT44e50fzGh=9rP@Qj1W9@PZvv}j2t}OSCQ|plXTgo!ipg*NG|8ZU*N;eHRF~Z z)#Q-meK*TRkG&!frZh`~v%t(c(f^B3RnSDE95lYcLpi<3PLsCm;y~`#h>3#a>ds=2)#Hpm4CD4>V z3VlXPY|gSR?O;j;8@Ata7MXV+D6nbHoh#pL{G3&62rD^0!_c_$#tF=3EJMZo=$yMh zqGriUws!@q19S({ZHE2;lOp)dK-)GtC$d+EV_S z9}YM5JMP%WLrvqA_LfterJp{q4`_7oB7}RYH}A)hSb=8?C(k}t&Tr@0@z^oxJjjAr z3jDfeVQGLmFGTZ0WGZQJ1?#7zUd}mwhj1tRxk}u58m*?-?%!I3 zXTefMMHCuMI1<%ptkZ%VLrT+a`?1r3UP}dXZ@EuPDt9ZZ!IK=1mdL^Ine64Z0-d%u z^{4Hd^xZdkp){nuIFegb)#FYE)lh-(Fx_fzZ;Zk3{YaMnWmr4jKvP}AZ~l>FOq!zR z^N8b@Veg6a#$3J|E1xukjKaoj;gDw_MTk1}izn?}5IkLZo34&>WR%9Z2q>R;d~%E4 z50}_Gm&dH}q>b?&QEAtZ0CH#Y_z#+EE?zrw?m=UUk;p;MS>e4ePGOY_T95thH!lWq zylJCycxr~~a6TeQcr8t4o_zj0zIs`CzR`%8D{?i7XvH@mUJA;oGNv>-)wV&lT zZq-ZoJB>18ShHpFnm(V_)O#3a>cZ+2agXy}7I8B+u-fiAJc$@0{olWvu1rteXA_My zS#8y$&LnN0uCJcvVEm(Ww^rc!_qZ?4@C3bhCD$m`QAiaQ*C4%dX6gHsv1|6UIcJ~D z+4hChFa7vlmT+h)Gf?7|V@PRHlXZK?IQGuoXD3#fPXBr@*GNEZx*N@?S}+=VV6^Yn z=852_JBLp=2Z7_W`y)1or-t^|ySNP7)KJSZ`XTdUQ0NY;1nDqoAQvIp!OR=B#gaMZ ztwk4-b)u|iE2-#YtP>bEPE|=;_i^btt-Y`5X8V8uxy;*B(>m0We_DIG)nHq70F^LB zrVt^mh5*p7Sv!H$VC0WQMs2oI-w%yHK>JuBM%HZ~4opf_7}Cv4tYzf+gL}ZZIhZk( zmfJawT28VfNJO-Vk;mzhVF{P3w3Pku9)$QCc?ob#ek-)BDKbSLdYR5|HJ@KYv(*m~ zx0O}cpwx+#sF&FY2v-&u+g_@?6}%kQQoa))IXZE6v6bO9^QP4>YY% zYBj77OzFQKxZw8@XQn;cnZ{E4wjYM=n{>g6=Cf#RK+A}DJyU=B2Q+-tkrpOv{6h49 z`MDpLC!}ok&!E2U?Vtr9YWcY9e?yLZNUCp4ac0yzsy+xPD?=aW_X@7c&rCUIHc2Uc zY88?Cqrd$Te{PMvGv-Rs!TL&lJZZ~G-+e8ENx-=i&2TzrD$;fU4?JS$Onznfo~M+6 z|bd#_XlIpq~ox!9-u&FF>%W=KIpNi*o2Q@f? zxP&+ieMGKPUvuh|8Lpo?O~@SbspE&JO0V~Viy+=^qpy)WchQP_{dRC0Nm6#Nqc;Vp z>v^_ggY+W-qvWAr`((i{Y9-b$q;^sz($^!J^?e#I#@o52*QbBc)Vw`) zY9$qyA_aa7an82Z+3vi1NcSVX-r%0&wSimwCDRZZTVMi@Np6D1mi41z+7a6^8#vFS z41c#lglSn$`C;Sa#J1!8Q+(c~z6T?Rx(Efk#;5?^M1z|3mUz*7zstmvZrG|rekrco z3ID-Tc2Mj`kZI}xxmwEXDawzgG_Ck?mHED8ZYGiR*csp6p;ORel$AXO!^svTb&l|J z=WH32dvp~IIh0ik{a0_J_Z89KfZ;7XWENE%fVvwPbuBCbkFM_{=k+z0J0~T&9lLe3 z452MdlSf6>k)oZrvUqzx2<`pHv0 z7NeNl!wds)5FA|sLkZHu^l_TVt!73h)0GK==*Rsvh4_%MrB4jogALT(h&TUiC3ij2 z-ScH2XfuXpU&2kVcTxaTp-jl~z6F&|l++K0=ntG$zqm3WjrwV<0*jCLI&FJLf|i=cY9&og*{XGDPWC$JEMqu`tUU114*>2<)Z^Wg?!N#Fneo<*MDfV;n%Ag|&!Wtjf&F=F7^f=bDPL9>q1u&G6J956Sy+|ssyuK9k5OkodhV_~Wa7ZpFD!o23A9l3!e^a+JSE)ULX}hHg{8_(LzSC%gDhxu z>HOzIKD}Wv747f#nvUMB8VIQkiCg^$c6QJ3pHNRA5_EDO(9!+0FWbI3nKsSrA*oHv zAt*mK-RD^EL(?ZqI7cSJE&PuJk?Gju);~J&&+epr908#zLK{-;;9}%kck8ZR`m}5G zB^7`&&UEJecY76$@?xn}a}=k1zH~mFI#W%0EQv_Wt31QH1^V4W6!+ZIriBV%2%;*+ zWB;RAeu6&-$BC&zq0B+NyqqFMRQVigRYEI!KVSYIA04cJ`5>(_*f_<=Wf!w=_)N*n z^F3*Pu`eER=L?Bgf-74zT{H&53H)_%2+$1UY;8~`g`|@wS6XO?1uY4~_Ra&12&Mkb zKZQasr4vU(J2{LOcrica6>)x!=|i1BgykXABv2jZSSnTD;uHTKRkaP3A7C|SwCQ%G zvDq|2u}Z}%nh7)!7n3h^MNvsobTcO2b^3+Wk-j(gqUL|(O`Gtz`+?BZ>5R_I%zNJJ z-CABd)=N;Uzc!_X&@F0s%$2lpps0FJ&VF%SBMP4>&sIXbw#THNez|qrQ_TC4d*kAf z-I*80C-qhp0X*MC*TJ02_c#k1=w;XYrgtS_oAIu)*=$dR>%KjK(P)YLde~2RAXKKa z9A6Nr$gsVJ8+Rxv*eUq&Ac>__c$H&6VrwBvp=ET&5MJcegu1bW`G#CAXZ znK9df<3QT0Pess1*+!_(zofs{touMS=U#SvuG`E|B)x>HzMX~V5kMd!L9X3aHzgxq zCa@6(_(L_Hr#1?SJ6%t4CSmGb&l9JT|0!!W_r@72I-`0t1zX3<^p{x>YL=;R-mzyS zq=*N6=7!bf&m#Aq4PRX}#a(VC@$_3rb5Gx2yxzd^a~&JIE#~gbUu*oY5}SV^W9+jK zkaTLHeN34p*{Ykqp%OlBH$Y)`yQ!dE5D^84vPpEvFFiUph6C?o?t8ML|d* zN`RK}4sc=jQA-ZrpAUpamG5joeS3*N=sjV3aY*4W-78qaf^jS+Eh-Wte-sZYo1EvC zJg?}Bd%8FpI-+wo@cyB<$8&kzw7TybWQ;~u1*?>4Y!ptX(`VYF?TcqT@N&BD2KwQx zo)4~bgzvrha&Eh=bi7V~z8#+<<@3JJ0rI6-_Uj1KPfVg#7xcPzGXZ1F6~LXZ*k3w*t>T`OxaSwUl-Kj1lyG? zY*IGAKygGS3npSI>Z8R^Zd~MCSWYv(3$cC$Q@D;pD$bS9_F*lTrgOx3yUCW|a_0@6 zTLy7a(hUr!NCUSAP#{* ze%>urIFjl_-3LhC1s+~KIa6L{TKm2#AE*r$@Zf)|^*U?tieN3`R3DItsVB& z@|`f81wh z%H_+3k7goj>OcfG>KflN4gF}(7yQU|*S(1`eDE1fi7_$=Rh+-Bxw#x{`(WBRAY z77|ayI!nOqmd{Ve16EWsH!yL7cvvKS_Cx4p?f#8ZpFdxUc&R{!8)^ZD6zR_KV1(Rbo=98=^@kYi z;{Z#U?$?5F25`=YQ%HlXHB~Ju2-7cJF1lNv33s{Q%5&#$$ASgU1U|v_gg7xXL@ya5 z22!SHKv7*NY->19K0$*k#XwTyeFT3<@w>^~=gv=F@LFow>olmQkuL+ZKi0*3$lJhI7!akgrjuYpjxPD);khe@`V2 zbyB-cd8n18?$!C6)a%^Bf_~F|X}_6C_S;F1gO3mYVOUXQK0R>|5faj3?}W2o%X=Ij z;wJtE$8=2dWEsLpuWI9oH2I2=`qiW+fwxNh4)Udh?jLCDG}>+ISEiQlWkRNB1pBJpSKo#07& zW*LZ8at*mgLjq2|nUuk4nJ4bxM$M;Z2In@lLD2`{@W%%i62IXrfrMHCmW^i%&hI|u zML#^fgLbK!;ECPH6nhl)1^5*bRZuyEyc;A6O$)Xh)Kzz;Lf={t^;%5Vc9Vs|*G5Zb>8Km8X0##K!4T@E| zRRUwQPqiF8NZH^V;+16 z%!!FvVy3;)3%Le8K53YKF`|wxRE4onr#evFh0btc3|V1tIy`Gxk~2(5YCONG{d0jw z&1^Z;iKyauu0-QRu(Y0Gi2|2rO%1a~v3Sum^|5ohay;f0U?CJ174|ybs)B2za!mFE z%EouH(yGK7(>Pn_C?Z&}Ys>(OHy_8DQ5#(Fs7==3Oj_Wg-dg;giKjDcToRV=jn7*k zA^)jzzfhqeJ5+&c?|s?980zumT4Tu}07lBSBWrE!6^1leFiaCXps2GC=3E{o1x}O^ zo|{`=tgF&H0xMdt1k&~!bGRb5ElH&Ao3@xi=IeDJxN=l(i!My7%?~3|)Elfwo3>57 zAOp%m9R7`fI&JUinX_5aPgrO<{%^4H2paJW%B*q`-%BBbuRy0(?@%7 zzzd8g8irxP-nP$f&+T@fVHzIHHjo?q4L8j2HTJN5v0O52ZqC9;_4oW$H=&ugVc52F zKa_@$x-X&^%xAz^qpY%6a+_xWd^1o0ixPLOp9Qo|kOHZ~Xj=E=+Te^AB_*a-!7uG1 z6jRObG+J?59}yuY(a@gP>w2k|&;7#3KSy1LXT#tF@J8^@nV2yaI zL-gO9n3t;cT$wnsn=gi0EP=_J90QztB4(NpSirMFlHEaGJjkmMZD;q=Trv+5_vWM# zeAeu9pO0$=&g_piv-0mi#nH}U|_)}!dEissgRx-%R z;EJLm?i7JAa-I%yY;fNB)~v*RuMUzL7LQmwJl;6=DmzG9 zZmA8IWP-lx_h-B=e^g;eVG)Vd^;yM8&d$sbNiuOxu!>4J|AB!Ll!EG4MmV*z4CXi{ ze5htn>Yy*fH5p)HP?wopkI}I0*QR~qvuiVeb+Ec@=9mlX7fG%%hD!sUTtW3cm=PpM zjbPnBWEG==EEtu@(2enwUxBBwW`wR3Vx{cwtzx`n{8uz&=n(;}RKy^fF`^&e&%lV3>d&MtoKqeRrVjr!bb~ z+ix(^qvr#*xm+6lN#K7obprVTVLVU5e#ydhyOtYvs>$G-9q=~``HPJ1wKnr(`#S{0 zGk6DwfTkZ0+`xhu-{CgYiGMjySq814=Xy0yPq7w_9ph>FOmQa5B3q5}Z-I zgAF!)p9p&4y&BSMO_f)VIK!KGrNkH;Z>u|1Dx@g2%f>F*vs7U5=}DZMoC`X;k{sMcq^fC*P?4U`9P77sOAM}wAzqd(KCYNl9`3Yf&KH0RPA-Lk*ywl zJQIMU)FJ#4Tyt5GbhM<&plLCUPdPcK{(8`dd=mJrJG@jg4B6uodepkeB{@ABgRj5e!_B79l2HS9BiS1Kn!waC&+c}_F94U@XEer6q z`Q&VRO+u+9ZxzWg%)CNGGwri=0|h4uJ;yt=`gv%k%=t8Ej#~sn3S|pKl8tZ0r!+;^ z{*KmWLz@*q=G~e~LHG;^+4oH3t{0u8v4L2aC}3IPT1|vkjz9e6=dc=hQR02mbgx)M zsG%`w@oehLC()wYo|xKo$3zqy$h5lyE%P zIBM`h$5{X_1w0`!VsT9X1$j=x1z!Yh0*7)~tXc_xEb69dO+9`m>PN{VW6B(9BI`c~ zz8J{iYBP6ab@h$(y#(+20-dEXND1W7rQu1hB@Wts}qnVG7|$B z4iti&M#^jgY+~$q6oWF|mkV*q2|}Za%h1Cf+^?gJ?tvEiKOojaV?G{D2Iji%;eRWF z&7G0sxM+rXC(eOfgR_sTpHL0utKkyV>Dx-=W0j9;I;f>%M);$EdvPD>`l{Hh(IHmJUut-++r1L{7-=F?fXaXh7kPamj;N?xAF(UZR z8ljm-7R37oX2gnqF%Pj$DV=KY75499KyYx_gAPr}9!eo5W+8793SE_4v6axBU_<3! zYBP{%ZP3o10n|;Fqg=L*ZH(tyo8Qj`ih~qP4Oh(|9&JfU>WJpK&)mo+d~#g3t2LL( z1RHB!MTpw&G77}i!?SF02AlR|OJ@L4i1VsVun+QtQ`B9EIEg#WL9iH|GdNJfm5_c2 zYF;{z0l7X03X+;Y0`99Q@(MXDtev+V$&8znC}ZqU5#K$I?`N2>uV$n+U3f@Ccd;O~%cBCVP_E8p zr4R>|Z6kq9YhdMlf?+^Lj!;&sy&CFuSWpB8j5fkYG1!JbCY)AOk{S6K8zZ*j7f~?E zn?hJ;vtIItBMlzM=tGobJr=udzt$5HTO`ibiddZ)La|BaUv1I~y*NUeJt&&!>BI!o zi9;mN%vbkKpj7b44ML-(H0jrN_N?i`=#b^<5r+jcPt|F5e6d`B{5YhTIHf72()N8( zO%5*(f5*Pz8&8)Gaadr5uf|2og}fY|)TJ1fU<7%76RjC#6Rv2#q}OLNMpF}Lv5h>n zQk{4jT7|s>((UnwU-9et8FmqiXRPq2`%VY{j?dCg`v{*HCIifVGaybcy0L!5lio|P z^Xv(|1UbHKmME}6;SX|VB@!?0)}5dv96(u61gueoG?)|C>I=iG_W6c4x5ap@(B(6vP^ZO!PdkS8rcm z@-)|5%IjZouJo7<-Uy^P{t{0Wt}TTxrPJxJ{f(^_{$6z?%f;~c>$4Jj-v_H!1Rth| zq7|nLrS1&LOLn$JYdvqiYffB^rei~ECO8_;Qz#y2B>mySe$tGUeF~}@jthu19B^26 z3M|ZXn04KU9f-wRc02QtQxyrWV1PzNYs{T_o+A>YxPFQpm!mM(jfN`SHP9m{Qmo=Q z@hC9vV%gI3O|C3|`=z4To+t(#vy=muc@|qub!mF{ReOR6i<~i(aYL2_0$+P}pj86j z3i5JdSDGA$Ck3wiC-^V2yUOI7-b;h`XH@kAxDPN`U$U?F`ab?#@7+oUsw>47$1Jx; z?xTSx?_`qz7i-c$DC@i@rwm(xQ>@$d81Tltdex=%l^*8$z> z$pX6JI*qh(3IY8m;tNjEmsjMr{jnd4q~*)SU+8$kJx}H2SG-hc-%fxWBfdCB6PrXw zhq1%~Pd`^D@r$mT95eOX?4?}yT~H*3^trs8fV^9QLp>X43E=o40zCgKFSCdnX?u^O zY6FR}#zP13e--fb^0GW2*|J-shHjpL`qCmI@uD^sM)ylUdo629 z9$|{`g7m@{8O=*0o4JB;4g#(8z409|-22m6XCIs1@y^$>HfTc-qAPzhDr9L+B7JnnzVz8k zE=K}mus|}kk5u{2Id?0J`8ePL0g$Fy;C0*gx2LasmA0{Z#G<}Y%I8nY?G02=G!L8jd{Y<_|Fn&%%f{r4N4S?djx`8TDvY zOzS~iPQggz5p*>&4mcN}S!M`Jpek+&JXuM`3co>jgDJRd^|m|5)5kydW$H1{y*@gp z#fZ5j?PG(TUPikCMy(lU9NMiqaN3r(-@ga1xa-rwgKtSwI`Ob&pZO~)R}r%ns4YSJ z#3FgQ&xN|OOh^WC!wpZQFMj?;oVs?!9DNH-9hR$*(gF_b8r(Z3cj2Lc*GI zv!Gt4i3di>6Z;B#kyeeY&2TwLjx^>`fMW~`-;Oq*k3ZI!_cRd5CXRD2e3_F z``!D})mPt~>eY3Wu`V584b14+#x%*aWj`|>@KiLJ}jNQ;J=vl>jTkgU7{x)2}Oojlw@U(n2LH7&jeVgAzZ{YkFDH{^b`D`4HWzo5^<+ z>+}{juQ>=;Mql%7Q60MDj$P?#2>xko~F`Q-@$`M8f*a zXTFv0y6XvS6UXrl5(euQ^tMd+nJ8gI#A@JU6sbeFX5Vz<1L@`)wo{+=jI`U*Odwt( zPYt&xVO&f*68}?@T10W4$Eu}KZ3sfvPhlgXzYIa!i(t+S52nBm1#4|3N=#q<^4&-o z-=|C5BnXC2JJzp<7-q&%Bd{ib*sk&&z;khS9@|H2glJxk^o2{mOWnxJuIfT)2b;35 zlpfrKC>)RGdecY#@(Swdx)c~F<+Om6Q-_W_?uu@o>T%gbI?({wY7GTb{QB3fPM2M_ zJ@9D&dq-Y*sEvYlfmgkZ&lL#{k04+aWdw%e33 z&H9R4Z{C%@f9s>XKZfeFiFZ{S`Y~Q(WFB0Hy+wZ)Bo9==KmUs_rt7cy0r@fuD3c?) zI#@*gluooI!SuOynYj|?x^>%Nj1|<#iS+4D-v+aEG604e9J@gBRVVShOj6@>PA+7z zt8?erOX@8eZRj9=wi)U)z^QkQjt!toZAvE`zYRcP3{>U=d0GZ;<3^viF=P1UIx^RYHrx~LXRC44bxbt!VL zY_K5U5MVMZPEDtEL>vIA|3ugpc;%_5I_YB{H4+XR;WW0=fsTl7qN}GU7H?H5zN_+$ zbM_iO2auF>G?|`qaaw~=`Hw+3h`LZq4Pv&4K+l#*j)6=v6p<4m zLHu-`zWx;wh5G4tzHuvTc`F8J$r>A)bErZqmO%zYZw!VQpbzU5wY@qJN-%)#zeGwq?{Ln>rcD3=W@t?fYM-?eLs zYOuHpHOql)fUOJ{!NG>JYkK5@E0!}f;s(sv69TvEjJPxDo7g_?zGr_(Z@T$g7AO&T zuSBQe(&=HDo&!<`*lS=m1^#eP+>$}ah{Wy|b-`Ji8H3*Rr7vF}Hi{|sTXYI~X7*sv zjJ^)KSUZ6D-M7AVM@XHWvSC4Pd^bD zbua?$reRDs0>FCc*D?eeM}3V&AYv~K1v{nJrQW2{f^Emxc#-h%bof0PTj}^wj^vKUvlxG_y7D%5&zd2>4Qc$) zTpH|KPe+4TNG_GC20CLwY{t>*7^Da5Jde2e1ktXiVJ^%lu*W7tCUv29l%q{1rm^^5 zBbQy~Is;}aL-M-ey4wj-gN#|(NaI*xifv*5`@s0YJ&4;#3(QHMh@r_i0K*uW_Uzfm zj@}2;&Zi(Ari)t`e2fgG^}ioq1MNJ97q8>&qmRGc2VKH!u+mR3-8I1m!3+5NV`!Yj zCt)2Tt>wJuy{}0xe(?y>2^M~M!NCI<4OtEP@PiMf`|rIABVRqe7ngRnQ8;0hE3Fpv9WFGu_qo&SAP3@>CDqFhVf^nmm4PD*e-Av zAc|i~Nv3Y%$~SzMhf=s#s4h+HEH~Y7SDIsHq=O+?J4otGP`@UU60ZKtz>KX&B>;RH zPp|s!tqev=MR0!9q((oC4*Oaab-mVuk#_4)I^~3|Y3ngtV4@Rg|ABoWDNF;yUY03L zG0iQE8aT*hZ`7#DGyZvwjA3>NgR+%29)RG6sXz_{#qM zDP42*ZCok-GJ+0mps|Zg89kLyjbpFO4}Itt(&?w`(#@z1;mN2L7tT*VxSJie|MCmW zGgp(6GYUhrR~KV?7{yo6xk8LuY`@(_r zyTA9#=|BF5Po!B4Z~8%~aXXqT0mam%x&y`O2bcxF_B$Wo3r7zt5E8o=XXZUNr}U^z22!4!5MIP+BcoqztT>BTP} z3EHi*U#U`yYbnr9U?QFLo4@%sA~D^UF8#t)zyzBCjHX5()q#^U4p&}zb9(9dZv+0h z7)vuby}N`uGQY00Bsp|Ts&ERKZa+3S7gaT(i{nlhNWb!{?@DL9fR(3?N8o_Yf(WU! zo!!{B?*tDqTw>EWgvv3*I-#lAr+9HX{jb0M_n8UV2o6F&h@jiHsT8&h|Psq=JX%vJ=e#l;3Cz21*Sc?MA_kQIlIseOpncr`ZWn2KDN ze*HJz73#y>9AwI1v?n4osyJY`3Kgv-eeTiI!c|6YDOvw20ltT)CO$mjRoy90t4 zi8bwg44bl_@AG$j}@)?KB6YJMP$yZj0fM-Mv)>Vtqz!9!AklKmVRLrA-?u>6l}H6~wHq z#*k?V17RJ#A4xNvcw#O6`iK60%!BJ1-NDN5!X9B`ev3?9YGcs1MC8}03gdc=&@&5@ zFdf8XW)KpFva7EALHhGQxgve%^2gIYB$+vMUz&MB@OzF6;2v_D47;u_vp z;37<+cP^cD@@RU|`9ooofS1JflQl&9K@4OK-W`H4KJW|gqsW& zs-MAp@Q;$&w2}S?r{6u>9yIz~lJsX=1P49>4VeujU1s_4=bOCWkP;Fok zuYUEJ_%Fab=o?-875P(TFaoLWXE(G-41mQrL0jYyR5b9){<9Jsp6M!z;$;7NQ9O%x z^?Q){Bbni=aO|;z>G%Hk_oo-0*B7uDBfjb|L@vGf`o6twB*$sgH*8VV+_)1n(1lw$ zT=0_9(u>dE7gu=r zwEVnmJni8!+X~bH5tTtY7f|WhsH^BAqSLzdL+HlGf!G^CY&r^?L#Pr!L>)*;!O-$9 zY*}pMH96P=LjjRN`Valqd$28J31ehfB=>#veMF=MthoVy`z&<2?mBkYf4RQhcl}tA zTC|VpFRsi=LcRCiN9jbU4~l-~lLwBMF=z4pGM) zw}Fw+boM!eFc4-VFao(HXt`EG;?&@(v|!CNZ0#oUahvI{a3BLw7m-e2qY%`o>Fl#m zD|oLZfnp$N0OPura`n~_-Ptw=Fc0VH-J^?J*?Sl*H)HP3C zTr(1q0hv+^#KCV;DOQ6Ks4r9LO>cc|9vvkj4wq%ehA5~ubY~Fk78u|95jP=HQp)(@ zS$~hfF*z_v_-L2vg^_hoKNnbTxqts&04YOhv*PjG@W{1qoOYx*`U>}AI?1VLx;w;h zw@7&RyWfZrmMKrTl`h58jIOnw{&a90Q67L(R8B$c=G2W}1uX#EC265}T@@)(dg>WXuY{0gk4Ko1zz|egAAz(VA!bde?g;kODYVI>rz<7r3BqB%#}Z z4IGTTcA2rZMn_qvEA>V@o@vZ&TemSSHN@!3h{kB(oUlfu{{DUl5W^dD%Zn`6?WxYB zfA{bIQP>pJt9vjgIr|V(FpksIr>=jh^@_TQIRe5XH`7{X(u<2#f0jX^C>$GiL=Wft z66ylZM6U7I6LA62w+)v*`|Oj02%T@Xq#y;#SMQ~kbWxsPmjLCD#~-(m@9=*B20F6{ z8&h-|--#Q##X74Xk#!(8`?HNfO54E8UVcU(o+D2UstP{{-kAr1m@5g!HVCm=pLL8F z7rf;BKo|{|GcdGSn5ccE6Odq$8L?CW=8)3G?|5_S8>Y@ZQxL%v{x~d{(?vL>89fO% zV0i3j`t+9c@Bi;lr;q&kb?Kq))QqaB?gXSlVxvK{rHA@gFywh3win09=ukT0IQ%1Q ztC-7KZ_60LsY4B7R;yB77#>mR$0&%Gr2|GEE21I*EE)QakP~kHYaumRjy@S9*kpQ9 zmBzp^Jx(=bPY={T#DWT$k%Z=Sm<&M`0x+hNPpYS1`_=cP zEt{C}=+_%_FGx8V$SZ?#x3HetdJJH=8c+16Yp&a#{=6DwOGgDs>2Sx6VBkYsCR7c!nXkXH8HK2oirG@dcPaU897jRGZEKbRYMiAqj-BG=DYI6=7 zfa@okEQ+uz?4O*-kQ6GCb&obe;BifHoMZJcdUdS)EbhxB^0I&qQ}~zWiC7NDYu5Oel zj9Fk(hcoJpo^vB(eb^1QrQ?s^LcW;LMI0*L59h8fPNtKN8%png-|Nzg&VwnCt%MU% zgDKp4IISt*s*XC|u|*z%ndJ{hp6=v*xo45$p+F%|M*#FWuglTgx_2DqIUKpT-LriwZF0-4$zo3aq(vR&%VxeMu?3YgIqDh+1$rOA^od=`OE2~;}NkN`++&JH6cvhxEEaKK_6D}wgdfW(imak z+vywMxG{bBPre(o9B7Xj-zYze$G{QWMoeAeuTaDI7e-F9(oEJ7QJqb)>UJ<)V_k%~ z2<+5qg;lc}rfri`kG8cGOsu;`&pI4N|CyMwgveTvFAJsU3Ymutr-vgVAuA@poFje% z<++B%(G~uQ^rLf>&O@rcPWQ>Y=>ureY{YLiyI7x!NmDV)}o=KzGu^NtOp7M zC-fyb>C|J9%wU(i6Gm=<&+iBeCv3Ry6t*)(or)`L!96O_1}Emh6|^rtWDo{LB4IR5 zhR$0qNV>lzRgZN)g0pBtFh1+dA%#5aw;1 zngWGLk%}^6WX}Zzumo5f<$J~1+lQr9H$})SDP#ucV>Ogv7Tg#$$~8O^cj&!TWe>o!$2meM)lgcDP zNU&CWO$X1mr=Hv!?+mi4vC2qc-i~VO=3x_qa62#vi#N}mPd$k(fGFPU)}u4C(o~O3 z#ZC~}4R(>JF$!bU9K?=c*_3zU@wN1S{kvaDzx~_qPiNw4J}`*G%{(>_5OR@-;S#pr z>ta1Lw3+tzrfaXcJ^kR`$;d;PElE9)Q?#GPiGYFlydVLo0^}_X`JiNO1r7y)aeHZW zhDz8nC@tEn&ICxtH<+h~&8IwmA~i3n7?cb0$rP-%?$gGsq%^Lx3ZU_H1}7X5e3;dx zQ><-wuM0a;L);=GDiS)@dc`(ZO*)eT15mVu0F7$pYCD72wD7S{xZq;;feFW(iPvnDMq9H%>x3F*sUyc|1*5X+2V5s6U_6+2#o!NCN07=x{6J22Y7dsZNH zbiV=HeW?1v=&BDy%n|^HD%a)rzT<1Y6LBQCp3*RkeafZUlaoz+Ar#Gp3&80xeYv2t z1nk2#97{b+{SZ@@ZjEs3t&h39i&v_%tL|9{;_WZ$L)CQ?9GDMqD|Dp z=Hz2(NcS%HvJpO}TBW{dC$Ir`jCyYHT$9Xn>$Xj}ce@q{2RKwEnO^M9hI8G1_O^h} zhctklG;CgV4C1{U`p2k7$~>HHx);N-K1Jd|UcVwNfUz>rQiY?~rFuUn#$a2IoK|I1 za-`t?`B`WdWMBlIS*%rx;aYz~)Wy-M>U1Px=84CRFsHjA{qDc{&2;)1IOKq&W+R|f zK}-@%IjZ}+WE3Uy@!pY>r0~p1aZ2N3&PyamjHGYRJnPgDE$tk}RgliWADd#neJ99g z#2*GHEXd%L@aK0goifY3njGB`^qwCa!Z$(VAB%SAsJ#Dx%tzk{#YnOSM!LUm+B_C| zwvF!rVVq*@;7pO9`1G%^e-T7dKZq@URzxfqz(G9buD$+Aydfum8%|f) zdNigjAWrug?+<)7u7Zrr&}TCtLK7j15!3dLFcTy(^r53)^txlyZ+z&bAwj(S!c*xx zwkO2vZiqS3^~39#eHmnr1(211z~c~^?HAIqHzIY?09HXEXRMs_jvJ1@eIx`7h$c$7XmNB@p)o939UU@sKUuBlU8_PXRTT-3DGtzz; z8qs!B!K1a4F8kV*3+Z$V)CG((A7Pl`nCryPNVdfzr}B;R_p>-NlJb^~ z5FV>jj9{y8cKw#1^+^}#61vvm8tTM4);`S7?PBV$k^bSYzY{_<4xl2FK%^7V@tt$tX&@F0hY0#HI=F?=dyMt?Z5TvKAN}jg z5MPlH_|_?M0~1NGqC-!_JAf(NGtIh(%kb;S{t>(hp}S55mH?tCEr>*M=DYJ>at4Sf zgJP{e9ql@c#b%ujZlu5dtIM!4s0y%2E?%LocAcX$rm#vo*oi0y@Pc#kRV68%unPj7 zjE5%olb7C;2SEY!Pn?uO--k)N59veOpGF!mkV)=XgSD#47z9R<^^7y?>0kVdH>SV$ z?$=`ufXp#6PaQ&hg~9aqtz(7Yd`Jw!Fq=Ch3@QT?srbG#E9(Ab3MArpcu4Y51nbGq zV-OAm^FGHC0a7==GsXA$GCy}LZy~*5@39GZG2U|P{VY|V4koDY1MVD|cwq5e+htgel?4-YNX|IzZDb(?Rwb7=$BP0qKd#3D+{XYA#({fhbBX?W} zx5x$iSB4P84V!E*hc`1r1M!{L&G$90J(t-BpVI)4sD|-r9s`;qff7cU{C+iq=q|T> z@5tv82!}s4k6=DLVm=^%sMvQrl8k;68l(2@-yM4WAU^r2XCOVuipk&qcb`bN-!;y> zzfqd-afeYjVoe#)Rb z{6v=(UwFYO7`IfB5L+FA;DUoitj91kgP`)&FqDGLN(=3RxLvTMjnQ_hlEFHFi4-SM zdw9)XPBKL;@yH6m36%hXl2J#ZUV&Er2nIriq#Pp8d41y~)I&o1<3Ig$`ofp)C+-7V zvLVrgq(x4K;M=<|rT_NdE+gK>qrh6J1k)fD)aYlt2^Xim$&}ti!aK`;!4z0 z2Cy3c#9`Z2iCHX=BA5bgF&|q(Q(_?EJtYS7jzNNNnizZsP$|zj=Tsb*7=17zH2~Vk z$QX7Y+|}8N?;{`iLb~jm_hYv*AdmgU;0ph7w&Fpg%1?a!&UE?Zx6tqCfT&@!I5;t^ zMx9WUD9k!p7YmO{`6CkJz;jEHkDr*AsXQ+|C~osRKeE6KNS{<8EFCw7nQzf;ReuCk z+#W2}ue$JpbkfNTgOL}Nrt+GU`Vs5Q1s-b_q~-hse%T?b8AX2gS^PEIqWg^OOsg?uE1E;o zjDGHzJ)8d1|MO`UZEcJVP{u|#rzalY#Y)UQVQiY3z%GG5c7su37SntKm)aIa4o8-L z9A+AIB5-Mhq`gkNJ-B@$?c3#MF17UG|9W}aym?(Zm*`VxoN)pHMaGccD4X{UBX-qy z?m?VoIuOapNZmT!96Gd%H6ut<_yY(|4-IjGRb&k5gLB@8(x+vT35cX+KNcdo{b2tC zlxz**eJP3~df&W*Aru{Fb}&c{i$ey(CBuVkF$Vl09qGv86bEA(CF7y+lcCsB zTb6OPBsJb)SoR(36f;z?I%mG@?>u7j5d%YqLY#du!gvG2vIEQ;-|+Hu)Aei)Opuuc zY;nDaqw`RHFEJSw(QiI~$&Kl?*~#vBw3_Lr9K1x{6r3eD(~%jQH;J`NaP+Vl+%ljCGp9s&!8R{a!x$}}bu_{;}ZkP*rPWI!T$pkX(B6tXk z*t8`KV8a>Ti`wzoub~XD%Tc9(g_ToH3F=t zas~^aL4DWQ3F2ZDN1Me-+R0!eqiA4!)tSlJ5yDiYw_W_&bm=8mQFIeE zaU$YWxJ5t(L+RiU;S69HcifH|h_|qjx?M%t#xY8%Ngo#Ddg@NSh*3pDxG~LfE4WK)oclPNJ9}s|JEA~2P zu4-l6K(p(`o}i)2DbjVg1^?Fn@_t;%b=o-q;bWbaX)+7Y*E16N8-!%A?*zWHeAWVh z;Gw5tpIARuO|O0R+2l`5g<)bhFskbfHHTfo-I|PTA;J9M2gE_#zXya;bOY+xMP~72 z9LH#P-~g*zCvp0j--No+k7~rKzuv7JZ05=|r{0l?S)^*66^!qH1I!0&2wkQMBCOp| zR^p-c5pha~FBxAOyM)6l>;f2N-x2%T$WY!lNxXV@>Sd}eCL{wHo2}5YHFF@M;VV+{lp@ z-v5hl!m|~IugwUebfnc->vXdHXNY@)+|;PEUZ-_pB>1lAyP%PSv$&(tPzgX4(eGr| zAtlj9bBF4Ev_a=Tyn_!lV@7Ni z1A}cdAd7)s3|Xg5X=tdGUipf%g62x&eTjRpCzuMQBl#*d=^zz}dOt@hJ2D}enSB{# zLXL_p5%QXA8>}Ab1{Vg#aAS=o`de%95Xf4=#rMo~%%)yMZ%0;;ED|-dYKUxJnUpyE z_v5E$&LfZ9jAL|6wl%<<_yjn^+%Q6(-OC;t7vrso3N(n#prz}qy0>=T%P~7-*)qTznymzqWFX^#Vz$gHOOBaL~gqPu)7LCj7EG0p6z$w}!OhObmHZ@&@W0WWmkx|9bzX_2JFuT*i9%E3_cG{bM{^u`Br<`N}ncW~gA;ZSp z9|Dil5j|3w1_LQ{gn9Up2V>M}wFuKTyAPyh%8z;TQPd%)mKAAdAR1LDgS<>(+;a`f z`VBP#o{5wePbuK}_4V#L&Qag?L`VHajBvtZ6Y~!H5?9j(42H^eyX5SY+iE3st1BHaIywtMoxVfw$V6l4zNt+2xPtbSASSB@x@u zZbqch??A^SjZm4wAvkM*7(NJ7c>T}4IBjH98-ppxSYjrCh6PhNQszIgdq-mq889-3 zY-fNKDJq%-9?f@An0JOpf*6=0scAJsya-#SR&Af#D%;4xsT6N>bTh9cT)UVR)>xc@x; z=l}BYFbW#P#EnbTd99y&5NNCE;21_YP;aJx^{;;;opt75y8gPS)22-gW(-gV%nYQ^ z({iAXy%(63uxozdeeX!8p8P^03SGtgI8&Dk<1mv6@&aj*ZQaqxMMzGuEf9FesnTY1 zg1WcUX)hRL&&HRrPzTARV4gxubHKW>dO9#P2MqN6&}(!WDF~4koxh2CC7);92nNAe z5~HoY8Nyo8-Kj)Z8#>5T(ZQRjGgTxn;?1NH%FwINGMyFZ!9#NvZ_ssP#HDQSK|;gU zFnlPT|Ke);xBn+g(Esyavd&|i*pwSl!_=;2{*30RHcbHUI+l@jOb3p(Sq1w`c-pR) zUSmMWJ~tY_^Wab;{-rL-OYZX%i`Xzhm>No*bqjHy0cEh?5N_`3hWZISS}bw@$N%`v={w(fG=2WkE07w- ziHmV8b~@Bb;9`)VdHPqpZPG96*Y~2@ZAkyfD3(W8DL9Jtans z>#8tIk=bYyo}4Nh&o(V{l<3v2&&KS5F8mKqPOBJ7;6eKi+d2A z&LVE_Zawb0YcGy5_oYXPX!Q7FgwR6AcVnG?7~?1*&o6r2h3Ta)KOJ2##VWrCADqU} z_ZTBRhDe4K^}ikn`t&o8Wf9K?%2Q%Mh&80hUe}L)F`_P{c zp-(H8c3`eUj1I%;Wfz{6E_m5Fu{K{ng*{K-gz}sL@N5t9{sjaDro%W;khCXW(?&X~#q? zhK$e92h^_t(;dC-hgsrVxZ|7Z#WV}|hDMOa3aM%@Gf&^Y)u`5Y5E_0GKMk1T907bb ztYc6aqEF6A7hd?HboRNZV%V3&r|;eH2z1uK4rc60jM21Py!*M=odL7Ta12K1Y#Hfq zgfTq%G!7VFx&`hBG9o=xVaLJE0QCB?p7e4M_oR~ucTI%^g4?ytAv*QTK1&V|)w71h zMR~vcT|WPj&lvz3x*|osigG|d?#ZZR42-f?s$dMN2X52n?1EKN`%!du*I+jj(fTY- z%wm|!Y6(DxBYV$q;)8f_Dl&`Ec7*t@DCg*DS&FO@hqDmjl!P0ibJFmMC`%$P?Q$VG z@~$iN%um~d- zp*}_5@xJ+L7qBxe$7`2l=S^O14H3f#f-^L@A@WfAb&0dk3;R%MTlIAbA7D-p!OmQFfhD1dJRWC|Kz+&qS+aoFl3qzt z95oO?6Lu4_2?7a42nmT71PO>Y_o2~CutT6!mm+^TZJ!F)NvhN+FOJPQ2rHq)sKiXVVSQ9+oi_`++Mq1h*94wa ziq<3Zb8x5zi)9)%TSGqmdgXE!2aEvlHyldPslHvs@(EH zzIoOr&PPbB_yNZw>=zhyw*UwI7$MDFEEfAI4g*! zQ{6r3q^B*eXC*u{QQt*z$0{NsC&rE2sHmFo#AR#2Y3QIu>uoO!*oEr*CG#e1 zj7F!p3^zCrj#vstoeU7ufb-Z8AuW2GI@3Gt3Wqngu4SzK(pd3wy5P7n-M(S1!u7RaB5_=i@~~J zeSK&%5-UC8kYz2QA(fZ7!@yPx76zT-7r)S?|_*2WG-b!vd8y;mEK1Hf? z!9d=if)0nxjTlOS98(Pf1)#8m@lupc{iqtEv%w;3y#&o~V76&oaraMr<+c?sHaG!TzQi&%6*cZqAS^x}YfZq#(wzo~$}T(y9=5WH z9;;mP6+;q$K`ZW?#J{xLL^|qxbfu$vF4|gVDvdm~a=HrS(m5QXG!mG}czxc(aMQg} zFU{*oOPv$0R&b3?>a6LNr!>lI8v){wrMH@kA6deMvEa$lAQoA)hzPT6VDo3?w`ZVy z>@CS3mm1*)y+2m=sLY|g7%1zRJaMQdi7{luutb>*OB@z@%wHZlpOdv${gMlu8xfv| z?t~@2&7C>NP}%ft!DWiX$zU}G!+`$&%!JpEKm5dpJAUJ{^iNrXeRl8J*H2^2YbyU0 zPUK{hsQoh5cyE;k43sXqy#A~lG{*deiaEz+!hmo7;F4kD zqByg{WU7tdfV<{vbjeLhoO>yB>SFFb^-gZp;8I6;HAE$JS582xX~iL{6~wu^fb*{xRN~d?GRqBKy+Q~a>~4; z{4*|1N$!Re&!ju$=DSY(GCX^j!YW)UeWq*Bdi4VT6YUtoYk z3jt1~h~Lu55mp)fOmLmw!XY3_R1ubnhhd^cbu#Xkdrv?9h>xCr!L`^=W83qebeo?r z)>{x=%9EfH))F{96eFkLJAJ)Q8C_|z=wir#NGPRzG3`2D+VcXFOdl0`*5L(mRx4>&_txosl`oYm>%jSj!Tf=T018?H ziztFzr~dGxM=bq3V?)oUd32gcyE6WbWSFO1R+_!oO7(jEE(FNjQHaE#XfJ$HPzS=; zpmwBlEUzFP^N-_nm~)1IZvGKs!kX!BDH`D&e(A)zg7o+i@;T2oA{~br-YM-FE8TTV zoy)8D@(Tz33cD`s!*m)4T^R`a7^5C`(hsu|QsuAmtim(fl5XjluJ!$V!?5DKFDgI} zbpFZJhwr}smhGgUJCtIHi)*v#DL8BYE;*SuGk6RCOw)O=mFAqVtuhTOVV(o)AZ;nx zP`M7$>;#Cz7H%fbF7i&sGlEAN_sSZDb{L1rY{MLK0$2IhHMqEZ*XSznd zjOoVb5!Rgl7IO@O9b1EJAzY=2{p*Y;G!idZo^z}lC%l+2@_UVad^Mt$&ohFDDPC{L z%(xk!{rKd?9DfYk5%!pG3?K84X~yt#o@dxI%zB^GEoJOyXw@dqc5xs%rVgReHNG{3>hC<9n4q zr&+>Xdya(3$9x%k3mJZXkD(xizXooQGqw*~&)|1Hr{zq&n>6AZk4`=`y!H@Zfq%m< zGmdwO&J25g-zv*ACE%_2y|81jEAANFN+bN5zB(vtN3K0xnT{TEo2Q%dVyn!N_M)}? zF>cOVY3A_Tysyiv`qlmH@a-G7J)D;C>VXVME^%WRh%}K7p|^TWq@6{NQ(P{)p-yi2 z$R#+f>-LaBRJM@36*_mExmrZQZsS@)+%CA-y`6VE&pDw5-#j-d<5d1xSq`iFzS1Tg zr}=XZ-gluhr)XaD{}g@e)cbG8`LLI7#MLx2uPS~!ye2I7pc|fe-C!tDjA?|8nqr55 z9)rsyu@21=MJ|6iUSe&Qb#6Dpyvwc(!_4?j({X|C39jdVyPrmJi|Jh(hPRt~u`B(* zEvCoyKFYp{%=aqGahft`~Q5} mmc-1L|5|V6@(ar~9{&P1u%gy(LqQe*0000=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } - } - }, - "download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", - "requires": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - } - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "requires": { - "d": "1", - "es5-ext": "~0.10.46" - } - }, - "email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.2.tgz", - "integrity": "sha512-eO6vFm0JvqGzjWIQA6QVKjxpmELfhWbDUWHm1rPfIbn55mhKPiAa5xpLmQWJrNa629ZIeQ8ZvMAi13kvrjK6Mg==" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esniff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", - "integrity": "sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=", - "requires": { - "d": "1", - "es5-ext": "^0.10.12" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "essentials": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", - "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-loop-spinner": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/event-loop-spinner/-/event-loop-spinner-1.1.0.tgz", - "integrity": "sha512-YVFs6dPpZIgH665kKckDktEVvSBccSYJmoZUfhNUdv5d3Xv+Q+SKF4Xis1jolq9aBzuW1ZZhQh/m/zU/TPdDhw==", - "requires": { - "tslib": "^1.10.0" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "requires": { - "mime-db": "^1.28.0" - } - }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastq": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", - "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" - }, - "filenamify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-requires": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-requires/-/find-requires-1.0.0.tgz", - "integrity": "sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ==", - "requires": { - "es5-ext": "^0.10.49", - "esniff": "^1.1.0" - } - }, - "flat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.0.tgz", - "integrity": "sha512-6KSMM+cHHzXC/hpldXApL2S8Uz+QZv+tq5o/L0KQYleoG+GcwrnIJhTWC7tCOiKQp8D/fIvryINU1OZCCwevjA==", - "requires": { - "is-buffer": "~2.0.4" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fs2": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.7.tgz", - "integrity": "sha512-fwfd9MBI/fnXtR/ClVTyeuPXJ+oI5WNyXvBQPmc4btgqLYTKOuBRTRUVjmVpDUri0C88HLwMlc5ESg48fEAGjw==", - "requires": { - "d": "^1.0.1", - "deferred": "^0.7.11", - "es5-ext": "^0.10.51", - "event-emitter": "^0.3.5", - "ignore": "^5.1.4", - "memoizee": "^0.4.14", - "type": "^1.2.0" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "requires": { - "npm-conf": "^1.1.0" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-uri": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", - "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", - "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "git-up": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", - "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", - "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", - "requires": { - "git-up": "^4.0.0" - } - }, - "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-all": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", - "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "requires": { - "glob": "^7.0.5", - "yargs": "~1.2.6" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "requires": { - "lodash": "^4.17.15" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - } - } - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=" - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "iso8601-duration": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-1.2.0.tgz", - "integrity": "sha512-ErTBd++b17E8nmWII1K1uZtBgD1E8RjyvwmxlCjPHNqHMD7gmcMHOw0E8Ro/6+QT4PhHRSnnMo7bxa1vFPkwhg==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==" - }, - "json-refs": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-2.1.7.tgz", - "integrity": "sha1-uesB/in16j6Sh48VrqEK04taz4k=", - "requires": { - "commander": "^2.9.0", - "graphlib": "^2.1.1", - "js-yaml": "^3.8.3", - "native-promise-only": "^0.8.1", - "path-loader": "^1.0.2", - "slash": "^1.0.0", - "uri-js": "^3.0.2" - }, - "dependencies": { - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - } - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonata": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.1.tgz", - "integrity": "sha512-Lw1ApNtYH9i/lWBuRSm1I/xfhPyTvlVslVIaGLW/bxFimxQYzQx2y3+DNRmbx5mmCmRb+bCLdIJasEFyb+aUlQ==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "jwt-decode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", - "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "^4.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.last": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", - "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=" - }, - "lodash.values": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", - "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=" - }, - "log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log/-/log-6.0.0.tgz", - "integrity": "sha512-sxChESNYJ/EcQv8C7xpmxhtTOngoXuMEqGDAkhXBEmt3MAzM3SM/TmIBOqnMEVdrOv1+VgZoYbo6U2GemQiU4g==", - "requires": { - "d": "^1.0.0", - "duration": "^0.2.2", - "es5-ext": "^0.10.49", - "event-emitter": "^0.3.5", - "sprintf-kit": "^2.0.0", - "type": "^1.0.1" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "lsmod": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", - "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" - }, - "macos-release": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", - "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" - }, - "ncjsm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.0.1.tgz", - "integrity": "sha512-gxh5Sgait8HyclaulfhgetHQGyhFm00ZQqISIfqtwFVnyWJ20rk+55SUamo9n3KhM6Vk63gemKPxIDYiSV/xZw==", - "requires": { - "builtin-modules": "^3.1.0", - "deferred": "^0.7.11", - "es5-ext": "^0.10.51", - "es6-set": "^0.1.5", - "find-requires": "^1.0.0", - "fs2": "^0.3.6", - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "nconf": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", - "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", - "requires": { - "async": "^1.4.0", - "ini": "^1.3.0", - "secure-keys": "^1.0.0", - "yargs": "^3.19.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - } - } - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", - "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" - } - } - }, - "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-event": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", - "requires": { - "p-timeout": "^2.0.1" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pac-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", - "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", - "requires": { - "agent-base": "^4.2.0", - "debug": "^4.1.1", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - } - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" - } - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", - "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - } - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-loader": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz", - "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==", - "requires": { - "native-promise-only": "^0.8.1", - "superagent": "^3.8.3" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - }, - "prettyoutput": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prettyoutput/-/prettyoutput-1.2.0.tgz", - "integrity": "sha512-G2gJwLzLcYS+2m6bTAe+CcDpwak9YpcvpScI0tE4WYb2O3lEZD/YywkMNpGqsSx5wttGvh2UXaKROTKKCyM2dw==", - "requires": { - "colors": "1.3.x", - "commander": "2.19.x", - "lodash": "4.17.x" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "promise-queue": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", - "integrity": "sha1-L29ffA9tCBCelnZZx5uIqe1ek7Q=" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==" - }, - "proxy-agent": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", - "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", - "requires": { - "agent-base": "^4.2.0", - "debug": "4", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^3.0.1", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "qs": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", - "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" - }, - "raven": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz", - "integrity": "sha1-lJwTTbAooZC3u/j3kKrlQbfAIL0=", - "requires": { - "cookie": "0.3.1", - "json-stringify-safe": "5.0.1", - "lsmod": "1.0.0", - "stack-trace": "0.0.9", - "uuid": "3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" - } - } - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "requires": { - "picomatch": "^2.0.7" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "~2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "^5.0.3" - } - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" - }, - "serverless": { - "version": "1.65.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.65.0.tgz", - "integrity": "sha512-V5qhLMUdPXgJ5+lBoIAd21Nqj2IWoZLyK30pQn7UqfzDyKasAW9XnMQjJL0zvpbZk6kaV/V8OkGcreJ4kHij6g==", - "requires": { - "@serverless/cli": "^1.4.0", - "@serverless/components": "^2.22.3", - "@serverless/enterprise-plugin": "^3.4.1", - "archiver": "^1.3.0", - "async": "^1.5.2", - "aws-sdk": "^2.628.0", - "bluebird": "^3.7.2", - "boxen": "^3.2.0", - "cachedir": "^2.3.0", - "chalk": "^2.4.2", - "child-process-ext": "^2.1.0", - "ci-info": "^1.6.0", - "d": "^1.0.1", - "dayjs": "^1.8.21", - "decompress": "^4.2.0", - "download": "^7.1.0", - "essentials": "^1.1.1", - "fast-levenshtein": "^2.0.6", - "filesize": "^3.6.1", - "fs-extra": "^0.30.0", - "get-stdin": "^5.0.1", - "globby": "^6.1.0", - "graceful-fs": "^4.2.3", - "https-proxy-agent": "^4.0.0", - "inquirer": "^6.5.2", - "is-docker": "^1.1.0", - "is-wsl": "^2.1.1", - "js-yaml": "^3.13.1", - "json-cycle": "^1.3.0", - "json-refs": "^2.1.7", - "jszip": "^3.2.2", - "jwt-decode": "^2.2.0", - "lodash": "^4.17.15", - "memoizee": "^0.4.14", - "mkdirp": "^0.5.1", - "nanomatch": "^1.2.13", - "ncjsm": "^4.0.1", - "node-fetch": "^1.7.3", - "object-hash": "^2.0.3", - "p-limit": "^2.2.2", - "promise-queue": "^2.2.5", - "raven": "^1.2.1", - "rc": "^1.2.8", - "replaceall": "^0.1.6", - "semver": "^5.7.1", - "semver-regex": "^1.0.0", - "stream-promise": "^3.2.0", - "tabtab": "^3.0.2", - "untildify": "^3.0.3", - "update-notifier": "^2.5.0", - "uuid": "^2.0.3", - "write-file-atomic": "^2.4.3", - "yaml-ast-parser": "0.0.43", - "yargs-parser": "^16.1.0" - }, - "dependencies": { - "@serverless/cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.4.0.tgz", - "integrity": "sha512-YqlCiYmRFeGksw6XJaXbigIDlktc7OfRuVpyPB7IZgkCJ9mUlBmvyWdwqJEQdkUz0xPTGsd4Jd/XSrwyiw1Brg==", - "requires": { - "@serverless/core": "^1.0.0", - "@serverless/template": "^1.1.0", - "ansi-escapes": "^4.2.0", - "chalk": "^2.4.2", - "chokidar": "^3.0.2", - "dotenv": "^8.0.0", - "figures": "^3.0.0", - "minimist": "^1.2.0", - "prettyoutput": "^1.2.0", - "strip-ansi": "^5.2.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - } - } - }, - "serverless-plugin-thundra": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/serverless-plugin-thundra/-/serverless-plugin-thundra-2.4.2.tgz", - "integrity": "sha512-Kd73XjospYtnMRPmxqsnMCfWjJU3UgJr4u1h8vd1/i6gKx99vsA93/k7Koa86WL0gyLbOH3vE1M8PfnfxJsUuw==", - "requires": { - "axios": "^0.19.0", - "bluebird": "^3.5.5", - "lodash.get": "^4.4.2", - "lodash.isempty": "^4.4.0", - "lodash.isstring": "^4.0.1", - "lodash.last": "^3.0.0", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "serverless-plugin-tracing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-tracing/-/serverless-plugin-tracing-2.0.0.tgz", - "integrity": "sha1-32uLMWasm7cKN8f8h1AUsjaRWPY=" - }, - "serverless-python-requirements": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/serverless-python-requirements/-/serverless-python-requirements-5.1.0.tgz", - "integrity": "sha512-lJhikc6wJsOYFxYNGK763xtQITrtGPHD2KJvs8qaBkkOET4RVk8E0N3d8wAO22k+Tk7N6a6Jonnvsmo3W8vtCA==", - "requires": { - "@iarna/toml": "^2.2.3", - "appdirectory": "^0.1.0", - "bluebird": "^3.0.6", - "fs-extra": "^7.0.0", - "glob-all": "^3.1.0", - "is-wsl": "^2.0.0", - "jszip": "^3.1.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniqby": "^4.0.0", - "lodash.values": "^4.3.0", - "rimraf": "^3.0.2", - "sha256-file": "1.0.0", - "shell-quote": "^1.6.1" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha256-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sha256-file/-/sha256-file-1.0.0.tgz", - "integrity": "sha512-nqf+g0veqgQAkDx0U2y2Tn2KWyADuuludZTw9A7J3D+61rKlIIl9V5TS4mfnwKuXZOH9B7fQyjYJ9pKRHIsAyg==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "shortid": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.15.tgz", - "integrity": "sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==", - "requires": { - "nanoid": "^2.1.0" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-git": { - "version": "1.131.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.131.0.tgz", - "integrity": "sha512-z/art7YYtmPnnLItT/j+nKwJt6ap6nHZ4D8sYo9PdCKK/ug56SN6m/evfxJk7uDV3e9JuCa8qIyDU2P3cxmiNQ==", - "requires": { - "debug": "^4.0.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snyk": { - "version": "1.319.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.319.0.tgz", - "integrity": "sha512-tOFkZuJYPxzT50joiHd/bxdfsWd/cqFZcfEj6VxRJ28wYBC7imzodp4m8cC6Rcox4++2WEm6ZHNlPLyYjmfPOg==", - "requires": { - "@snyk/cli-interface": "2.6.0", - "@snyk/configstore": "^3.2.0-rc1", - "@snyk/dep-graph": "1.18.2", - "@snyk/gemfile": "1.2.0", - "@snyk/graphlib": "2.1.9-patch", - "@snyk/inquirer": "6.2.2-patch", - "@snyk/lodash": "^4.17.15-patch", - "@snyk/ruby-semver": "2.2.0", - "@snyk/snyk-cocoapods-plugin": "2.2.0", - "@snyk/update-notifier": "^2.5.1-rc2", - "@types/agent-base": "^4.2.0", - "abbrev": "^1.1.1", - "ansi-escapes": "3.2.0", - "chalk": "^2.4.2", - "cli-spinner": "0.2.10", - "debug": "^3.1.0", - "diff": "^4.0.1", - "git-url-parse": "11.1.2", - "glob": "^7.1.3", - "needle": "^2.2.4", - "open": "^7.0.3", - "os-name": "^3.0.0", - "proxy-agent": "^3.1.1", - "proxy-from-env": "^1.0.0", - "semver": "^6.0.0", - "snyk-config": "3.1.0", - "snyk-docker-plugin": "3.1.0", - "snyk-go-plugin": "1.14.0", - "snyk-gradle-plugin": "3.2.5", - "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.15.0", - "snyk-nodejs-lockfile-parser": "1.22.0", - "snyk-nuget-plugin": "1.17.0", - "snyk-php-plugin": "1.9.0", - "snyk-policy": "1.13.5", - "snyk-python-plugin": "1.17.0", - "snyk-resolve": "1.0.1", - "snyk-resolve-deps": "4.4.0", - "snyk-sbt-plugin": "2.11.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "1.3.1", - "source-map-support": "^0.5.11", - "strip-ansi": "^5.2.0", - "tempfile": "^2.0.0", - "then-fs": "^2.0.0", - "uuid": "^3.3.2", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "snyk-config": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-3.1.0.tgz", - "integrity": "sha512-3UlyogA67/9WOssJ7s4d7gqWQRWyO/LbgdBBNMhhmFDKa7eTUSW+A782CVHgyDSJZ2kNANcMWwMiOL+h3p6zQg==", - "requires": { - "@snyk/lodash": "4.17.15-patch", - "debug": "^4.1.1", - "nconf": "^0.10.0" - } - }, - "snyk-docker-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-3.1.0.tgz", - "integrity": "sha512-ggGTiiCuwLYGdlGW/UBuUXJ7omliH0EnbpLfdlTBoRKvmvgoUo1l4Menk18R1ZVXgcXTwwGK9jmuUpPH+X0VNw==", - "requires": { - "@snyk/rpm-parser": "^1.1.0", - "debug": "^4.1.1", - "dockerfile-ast": "0.0.19", - "event-loop-spinner": "^1.1.0", - "semver": "^6.1.0", - "tar-stream": "^2.1.0", - "tslib": "^1" - }, - "dependencies": { - "bl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", - "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", - "requires": { - "bl": "^4.0.1", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } - } - }, - "snyk-go-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.4.0.tgz", - "integrity": "sha512-zcLA8u/WreycCjFKBblYfxszg7Fmnemuu9Ug/CE/jqF0yBXsI5DCWMteUvFkoa8DRntfGTlgf98TRl2aTSc2MQ==", - "requires": { - "toml": "^3.0.0", - "tslib": "^1.10.0" - } - }, - "snyk-go-plugin": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.14.0.tgz", - "integrity": "sha512-9L+76De8F6yXWb+O3DA8QUi7+eDF2mOzCOveEPUJGkqWIDmurIiFcVxHJoj0EStjcxb3dX367KKlDlfFx+HiyA==", - "requires": { - "@snyk/graphlib": "2.1.9-patch", - "debug": "^4.1.1", - "snyk-go-parser": "1.4.0", - "tmp": "0.1.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "snyk-gradle-plugin": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.5.tgz", - "integrity": "sha512-XxPi/B16dGkV1USoyFbpn6LlSJ9SUC6Y6z/4lWuF4spLnKtWwpEb1bwTdBFsxnkUfqzIRtPr0+wcxxXvv9Rvcw==", - "requires": { - "@snyk/cli-interface": "2.3.0", - "@types/debug": "^4.1.4", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "tmp": "0.0.33", - "tslib": "^1.9.3" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.0.tgz", - "integrity": "sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ==", - "requires": { - "tslib": "^1.9.3" - } - } - } - }, - "snyk-module": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", - "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", - "requires": { - "debug": "^3.1.0", - "hosted-git-info": "^2.7.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-mvn-plugin": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.15.0.tgz", - "integrity": "sha512-24HWz27Hc5sw+iHtxtQFy0kltjyFZXJ3vfsPA0TTZAL0tOJXInIuZpWD6njC0Y3/sn9CH5kS2KM8GAM7FyKVig==", - "requires": { - "@snyk/cli-interface": "2.5.0", - "@snyk/java-call-graph-builder": "1.8.0", - "debug": "^4.1.1", - "needle": "^2.4.0", - "tmp": "^0.1.0", - "tslib": "1.11.1" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.5.0.tgz", - "integrity": "sha512-XMc2SCFH4RBSncZgoPb+BBlNq0NYpEpCzptKi69qyMpBy0VsRqIQqddedaazMCU1xEpXTytq6KMYpzUafZzp5Q==", - "requires": { - "tslib": "^1.9.3" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "snyk-nodejs-lockfile-parser": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.22.0.tgz", - "integrity": "sha512-l6jLoJxqcIIkQopSdQuAstXdMw5AIgLu+uGc5CYpHyw8fYqOwna8rawwofNeGuwJAAv4nEiNiexeYaR88OCq6Q==", - "requires": { - "@snyk/graphlib": "2.1.9-patch", - "@snyk/lodash": "^4.17.15-patch", - "@yarnpkg/lockfile": "^1.0.2", - "event-loop-spinner": "^1.1.0", - "p-map": "2.1.0", - "snyk-config": "^3.0.0", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "snyk-nuget-plugin": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.17.0.tgz", - "integrity": "sha512-t7iZ87LBhCK6P2/mJsQh7Dmk3J9zd+IHL4yoSK95Iyk/gP8r++DZijoRHEXy8BlS+eOtSAj1vgCYvv2eAmG28w==", - "requires": { - "@snyk/lodash": "4.17.15-patch", - "debug": "^3.1.0", - "dotnet-deps-parser": "4.10.0", - "jszip": "3.1.5", - "snyk-paket-parser": "1.6.0", - "tslib": "^1.9.3", - "xml2js": "^0.4.17" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" - }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", - "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", - "pako": "~1.0.2", - "readable-stream": "~2.0.6" - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "requires": { - "immediate": "~3.0.5" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "snyk-paket-parser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.6.0.tgz", - "integrity": "sha512-6htFynjBe/nakclEHUZ1A3j5Eu32/0pNve5Qm4MFn3YQmJgj7UcAO8hdyK3QfzEY29/kAv/rkJQg+SKshn+N9Q==", - "requires": { - "tslib": "^1.9.3" - } - }, - "snyk-php-plugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.9.0.tgz", - "integrity": "sha512-uORrEoC47dw0ITZYu5vKqQtmXnbbQs+ZkWeo5bRHGdf10W8e4rNr1S1R4bReiLrSbSisYhVHeFMkdOAiLIPJVQ==", - "requires": { - "@snyk/cli-interface": "2.3.2", - "@snyk/composer-lockfile-parser": "1.4.0", - "tslib": "1.11.1" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.2.tgz", - "integrity": "sha512-jmZyxVHqzYU1GfdnWCGdd68WY/lAzpPVyqalHazPj4tFJehrSfEFc82RMTYAMgXEJuvFRFIwhsvXh3sWUhIQmg==", - "requires": { - "tslib": "^1.9.3" - } - } - } - }, - "snyk-policy": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", - "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", - "requires": { - "debug": "^3.1.0", - "email-validator": "^2.0.4", - "js-yaml": "^3.13.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.0.0", - "snyk-module": "^1.9.1", - "snyk-resolve": "^1.0.1", - "snyk-try-require": "^1.3.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "snyk-python-plugin": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.17.0.tgz", - "integrity": "sha512-EKdVOUlvhiVpXA5TeW8vyxYVqbITAfT+2AbL2ZRiiUNLP5ae+WiNYaPy7aB5HAS9IKBKih+IH8Ag65Xu1IYSYA==", - "requires": { - "@snyk/cli-interface": "^2.0.3", - "tmp": "0.0.33" - } - }, - "snyk-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", - "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", - "requires": { - "debug": "^3.1.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-resolve-deps": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz", - "integrity": "sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==", - "requires": { - "@types/node": "^6.14.4", - "@types/semver": "^5.5.0", - "ansicolors": "^0.3.2", - "debug": "^3.2.5", - "lodash.assign": "^4.2.0", - "lodash.assignin": "^4.2.0", - "lodash.clone": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lru-cache": "^4.0.0", - "semver": "^5.5.1", - "snyk-module": "^1.6.0", - "snyk-resolve": "^1.0.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "^1.1.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "@types/node": { - "version": "6.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", - "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-sbt-plugin": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz", - "integrity": "sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA==", - "requires": { - "debug": "^4.1.1", - "semver": "^6.1.2", - "tmp": "^0.1.0", - "tree-kill": "^1.2.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "snyk-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", - "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", - "requires": { - "archy": "^1.0.0" - } - }, - "snyk-try-require": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", - "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", - "requires": { - "debug": "^3.1.0", - "lodash.clonedeep": "^4.3.0", - "lru-cache": "^4.0.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", - "requires": { - "sort-keys": "^1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", - "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sprintf-kit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.0.tgz", - "integrity": "sha512-/0d2YTn8ZFVpIPAU230S9ZLF8WDkSSRWvh/UOLM7zzvkCchum1TtouRgyV8OfgOaYilSGU4lSSqzwBXJVlAwUw==", - "requires": { - "es5-ext": "^0.10.46" - } - }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stream-promise": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", - "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", - "requires": { - "2-thenable": "^1.0.0", - "es5-ext": "^0.10.49", - "is-stream": "^1.1.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", - "requires": { - "debug": "^4.0.1", - "es6-promisify": "^6.0.0", - "inquirer": "^6.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "untildify": "^3.0.3" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, - "then-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", - "requires": { - "promise": ">=3.2 <8" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" - }, - "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - } - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - } - } - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - }, - "vscode-languageserver-types": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", - "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, - "windows-release": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", - "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", - "requires": { - "execa": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==" - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" - }, - "yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "requires": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - } - }, - "yargs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", - "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "requires": { - "minimist": "^0.1.0" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" - } - } - }, - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index bd89faf..0000000 --- a/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "modules.tf-lambda", - "version": "2.0.0", - "description": "From visual diagrams created with Cloudcraft to infrastructure as code using Terraform and Terragrunt", - "main": "index.js", - "private": true, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "postinstall": "opencollective-postinstall || true", - "snyk-protect": "snyk protect", - "prepare": "npm run snyk-protect" - }, - "keywords": [ - "Infrastructure as code", - "Terraform", - "Terragrunt", - "terraform-aws-modules", - "AWS" - ], - "author": "Anton Babenko ", - "license": "MIT", - "devDependencies": {}, - "dependencies": { - "opencollective-postinstall": "^2.0.2", - "serverless": "1.65.0", - "serverless-plugin-thundra": "^2.4.2", - "serverless-plugin-tracing": "^2.0.0", - "serverless-python-requirements": "^5.1.0", - "minimist": ">=1.2.3", - "snyk": "^1.319.0" - }, - "collective": { - "type": "opencollective", - "url": "https://opencollective.com/modulestf" - }, - "snyk": true -} diff --git a/requirements-lambda.txt b/requirements-lambda.txt deleted file mode 100644 index 482ca04..0000000 --- a/requirements-lambda.txt +++ /dev/null @@ -1,4 +0,0 @@ -cookiecutter==1.7.0 -networkx==2.4 -petname==2.6 -requests>=2.22.0 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index bed0bf2..0000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -aws-xray-sdk>=2.0 -boto3<1.13 -cookiecutter==1.7.0 -networkx==2.4 -petname==2.6 -python-lambda-local==0.1.12 -requests>=2.22.0 diff --git a/serverless.yml b/serverless.yml deleted file mode 100644 index 1a0177e..0000000 --- a/serverless.yml +++ /dev/null @@ -1,102 +0,0 @@ -service: modules-tf - -frameworkVersion: ">=1.65.0 <2.0.0" - -provider: - name: aws - runtime: python3.7 - stage: dev - region: eu-west-1 - tracing: true - timeout: 30 -# profile: modules-deploy - environment: - S3_BUCKET: ${ssm:/modulestf/${self:custom.stage}/dl_bucket_id} - S3_DIR: ${self:custom.stage} - thundra_apiKey: ${ssm:/modulestf/${self:custom.stage}/thundra_api_key~true} - alb: - targetGroupPrefix: modulestf- - iamRoleStatements: - - Effect: "Allow" - Action: - - "s3:*" # "s3:PutObject" plus something more plus stage name - Resource: - - "arn:aws:s3:::${self:provider.environment.S3_BUCKET}/${self:provider.environment.S3_DIR}/*" - - "arn:aws:s3:::${self:provider.environment.S3_BUCKET}/${self:provider.environment.S3_DIR}/" - - Effect: "Allow" # xray permissions (required) - Action: - - "xray:PutTraceSegments" - - "xray:PutTelemetryRecords" - Resource: - - "*" - -functions: - generate-cloudcraft: - name: ${self:service}-${self:custom.stage}-generate-cloudcraft - handler: handler.handler - description: Generate all from Cloudcraft URL (stage=${self:custom.stage}) - memorySize: 1536 - package: {} - events: - - alb: - listenerArn: ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} - priority: ${self:custom.alb_priority.${self:custom.stage}} - cors: true - conditions: - host: ${self:custom.domains.${self:custom.stage}} - path: "*" - method: - - GET - - POST - - OPTIONS - -# validate-cloudcraft: -# name: ${self:service}-${self:custom.stage}-validate-cloudcraft -# handler: handler.handler -# description: Validate inputs from Cloudcraft (stage=${self:custom.stage}) -# memorySize: 1536 -# package: {} -# events: -# - alb: -# # ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} -# listenerArn: ${ssm:/modulestf/${self:custom.stage}/alb_listener_arn} -# priority: 1 -# conditions: -# path: /validate -# method: -# - GET -# - POST -# - OPTIONS - -plugins: - - serverless-python-requirements - - serverless-plugin-tracing - - serverless-plugin-thundra - -custom: - stage: ${opt:stage, self:provider.stage} - - thundra: - apiKey: ${ssm:/modulestf/${self:custom.stage}/thundra_api_key~true} - - domains: - prod: ${ssm:/modulestf/prod/prod_route53_record_fqdn} # lambda.modules.tf - dev: ${ssm:/modulestf/dev/dev_route53_record_fqdn} # dev-lambda.modules.tf - - alb_priority: - prod: 20 - dev: 10 - - pythonRequirements: - fileName: requirements-lambda.txt # requirements-lambda.txt does not have heavy libraries like matplotlib, python-lambda-local which are required for debug locally - dockerizePip: true - useDownloadCache: true - useStaticCache: true - -package: - exclude: - - "input/**" - - "output/**" - - "test_fixtures/**" - - "node_modules/**" - - ".requirements-cache/**" diff --git a/src/handler.py b/src/handler.py new file mode 100755 index 0000000..464c4eb --- /dev/null +++ b/src/handler.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 + +import json +import os +import pathlib +import shutil +from pprint import pformat, pprint +from typing import Any, Dict + +import requests +from aws_lambda_powertools import Metrics, Tracer +from aws_lambda_powertools.logging.logger import Logger +from aws_lambda_powertools.metrics import MetricUnit +from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEventV2 +from aws_lambda_powertools.utilities.typing import LambdaContext +from modulestf.cloudcraft.graph import populate_graph +from modulestf.const import FINAL_DIR +from modulestf.convert import convert_graph_to_modulestf_config +from modulestf.logger import setup_logging +from modulestf.render import prepare_render_dirs, render_from_modulestf_config +from modulestf.upload import upload_file_to_s3 + +# logger = setup_logging() + +os.environ["POWERTOOLS_TRACE_DISABLED"] = "1" + +logger = Logger(service="modulestf-d2c") +tracer = Tracer(service="modulestf-d2c") +metrics = Metrics(namespace="modulestf-d2c", service="modulestf-d2c") + + +def load_data(event): + body = event.body + logger.info(f"body = {body}") + + qs = event.query_string_parameters + logger.info("queryStringParameters = %s" % qs) + + if body is None and qs is None: + raise ValueError("Some query string parameters should be defined or use HTTP POST method", 400) + + if qs is None: + blueprint_url = localfile = None + else: + blueprint_url = qs.get("cloudcraft") + localfile = qs.get("localfile") + + if body: + data = json.loads(body) + elif blueprint_url: + r = requests.get(blueprint_url) + data = r.json() + + logger.info("Blueprint url: %s, response code: %s" % (blueprint_url, r.status_code)) + + if 403 == r.status_code: + raise ValueError("Sharing has been disabled for this blueprint." + + " You have to enable it by clicking 'Export' -> 'Get shareable link'" + + " on https://app.cloudcraft.co", 403) + + elif r.status_code >= 500: + raise ValueError("Something went wrong on cloudcraft side. Can't fetch specified blueprint." + + " Check URL and try again later.", 404) + + elif localfile: + file = open(localfile, 'r') + data = json.load(file) + else: + raise ValueError("'cloudcraft' or 'localfile' query string parameter should be defined", 400) + + return data + + +@metrics.log_metrics +@logger.inject_lambda_context +@tracer.capture_lambda_handler +def handler(event: Dict[str, Any], context: LambdaContext) -> Dict[str, Any]: # noqa: WPS110 + + event: APIGatewayProxyEventV2 = APIGatewayProxyEventV2(event) + + logger.info("Processing event: {}".format(json.dumps(event.body))) + + link = "" + + try: + data = load_data(event) + except ValueError as error: + logger.error(error) + + return { + "body": str(error), + "isBase64Encoded": False, + "headers": { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": True + }, + "statusCode": 400, + } + + # logger.info(pformat(data, indent=2)) + + graph = populate_graph(data) + + config = convert_graph_to_modulestf_config(graph) + + prepare_render_dirs() + + render_from_modulestf_config(config, source=graph.source, regions=graph.regions) + + # Do not upload to S3 when working locally + if os.environ.get("UPLOAD_TO_S3", False): + shutil.make_archive("archive", "zip", FINAL_DIR) + + link = upload_file_to_s3(filename="archive.zip") + + metrics.add_metric(name="Request", unit=MetricUnit.Count, value=1) + + return { + "body": "", + "headers": { + "Location": link, + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": True + }, + "statusCode": 302, + } + + +if __name__ == "__main__": + api_gateway = pathlib.Path(__file__).parent.absolute() / "../test_fixtures/api_gateway_request.json" + event = json.loads(api_gateway.read_text()) + + # fixture = pathlib.Path(__file__).parent.absolute() / "../test_fixtures/input_cloudcraft.json" + fixture = pathlib.Path(__file__).parent.absolute() / "../test_fixtures/input_localfile.json" + # fixture = pathlib.Path(__file__).parent.absolute() / "../test_fixtures/input_data.json" + + fixture_json = json.loads(fixture.read_text()) + + event.update(fixture_json) + + context = LambdaContext() + context._function_name = "_function_name" + context._function_version = "_function_version" + context._invoked_function_arn = "_invoked_function_arn" + context._memory_limit_in_mb = "_memory_limit_in_mb" + context._aws_request_id = "_aws_request_id" + context._log_group_name = "_log_group_name" + context._log_stream_name = "_log_stream_name" + + handler(event, context) diff --git a/modulestf/__init__.py b/src/modulestf/__init__.py similarity index 100% rename from modulestf/__init__.py rename to src/modulestf/__init__.py diff --git a/modulestf/cloudcraft/__init__.py b/src/modulestf/cloudcraft/__init__.py similarity index 100% rename from modulestf/cloudcraft/__init__.py rename to src/modulestf/cloudcraft/__init__.py diff --git a/modulestf/cloudcraft/graph.py b/src/modulestf/cloudcraft/graph.py similarity index 100% rename from modulestf/cloudcraft/graph.py rename to src/modulestf/cloudcraft/graph.py diff --git a/modulestf/const.py b/src/modulestf/const.py similarity index 83% rename from modulestf/const.py rename to src/modulestf/const.py index 31d3171..ec737a2 100644 --- a/modulestf/const.py +++ b/src/modulestf/const.py @@ -14,9 +14,7 @@ S3_BUCKET = "dl.modules.tf" S3_BUCKET_REGION = "eu-west-1" -THUNDRA_API_KEY = os.environ.get('THUNDRA_API_KEY') - -if os.environ.get("IS_LOCAL"): - tmp_dir = os.getcwd() -else: +if os.environ.get("AWS_EXECUTION_ENV") is not None: tmp_dir = tempfile.gettempdir() # was /tmp +else: + tmp_dir = os.getcwd() diff --git a/modulestf/convert.py b/src/modulestf/convert.py similarity index 92% rename from modulestf/convert.py rename to src/modulestf/convert.py index f2174c8..252d5a6 100644 --- a/modulestf/convert.py +++ b/src/modulestf/convert.py @@ -93,7 +93,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 parsed_asg_id = set() warnings = set() - supported_node_types = ["rds", "ec2", "elb", "sns", "sqs", "sg", "vpc", "s3", "redshift", "dynamodb"] + supported_node_types = ["rds", "ec2", "elb", "sns", "sqs", "sg", "vpc", "s3", "redshift", "dynamodb", "cloudfront", "lambda", "vpngateway", "apigateway"] # supported_node_types = ["sg", "vpc"] for key, node_complete in G.nodes.items(): @@ -436,6 +436,44 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if node.get("type") == "cloudfront": r = Resource(key, "cloudfront", node_text) + r.update_params({ + "wait_for_deployment": False + }) + + resources.append(r.content()) + + if node.get("type") == "lambda": + r = Resource(key, "lambda", node_text) + + r.update_params({ + "memory_size": node.get("memory"), + "function_name": node_text if node_text else random_pet(), + "handler": "handler.lambda_handler", + "runtime": "python3.8", + "source_path": "\"handler.py\"" # @todo: create this file also + }) + + resources.append(r.content()) + + if node.get("type") == "apigateway": + r = Resource(key, "apigateway-v2", node_text) + + r.update_params({ + "name": node_text if node_text else random_pet(), + "protocol_type": "WEBSOCKET" if node.get("apiType") == "websocket" else "HTTP", + }) + + resources.append(r.content()) + + if node.get("type") == "vpngateway": + r = Resource(key, "vpn-gateway", node_text) + + if vpc_id: + r.append_dependency(vpc_id) + r.update_dynamic_params("vpc_id", "dependency." + vpc_id + ".outputs.vpc_id") + r.update_dynamic_params("vpn_gateway_id", "dependency." + vpc_id + ".outputs.vgw_id") + r.update_dynamic_params("customer_gateway_id", "dependency." + vpc_id + ".outputs.cgw_ids[0]") + resources.append(r.content()) if node.get("type") == "sns": diff --git a/modulestf/logger.py b/src/modulestf/logger.py similarity index 100% rename from modulestf/logger.py rename to src/modulestf/logger.py diff --git a/src/modulestf/modules.py b/src/modulestf/modules.py new file mode 100644 index 0000000..d260549 --- /dev/null +++ b/src/modulestf/modules.py @@ -0,0 +1,175 @@ +import json +import os +from pprint import pprint + +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) + + +def get_version(relative_path, remove_v=False): + path = os.path.join(BASE_PATH, relative_path) + with open(path) as file: + if remove_v: + return file.read().replace("v", "") + else: + return file.read() + + +def load_local_json(relative_path): + path = os.path.join(BASE_PATH, relative_path) + with open(path) as file: + return json.load(file) + + +# @todo: Verify support for tuple, object and any. +# Ref: https://www.terraform.io/docs/configuration/variables.html#type-constraints +def update_template_variables(var): + for key, value in var.items(): + + # Guess type from default value + if value.get("default", None) is not None: + if str(value.get("default")).lower() in ["true", "false"]: + value_type = value.get("type", "bool") + elif type(value.get("default")) is map: + value_type = value.get("type", "map") + elif type(value.get("default")) is str: + value_type = value.get("type", "string") + elif type(value.get("default")) is int: + value_type = value.get("type", "integer") + else: + value_type = value.get("type", "list") + else: + value_type = value.get("type", "string") + + variable_value_format_function = "" + + if value_type == "string": + variable_default = '' + variable_value_format = '"%s"' + elif value_type == "number": + variable_default = '' + variable_value_format = '%s' + elif value_type == "bool": + variable_default = '' + variable_value_format = '%s' + variable_value_format_function = "lower" + elif value_type.startswith("list") or value_type.startswith("set"): + variable_default = [] + variable_value_format = '%s' + elif value_type.startswith("map"): + variable_default = {} + variable_value_format = '"%s"' + else: + variable_default = '""' + variable_value_format = "%s" + + value.update({ + "value_type": value_type, + "variable_default": variable_default, + "variable_value_format": variable_value_format, + "variable_value_format_function": variable_value_format_function, + }) + + return var + + +MODULES = { + "alb": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-alb.git?ref=" + get_version("../terraform-aws-modules-metadata/alb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/alb/aws/" + get_version("../terraform-aws-modules-metadata/alb_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/alb.json")), + }, + "nlb": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-alb.git?ref=" + get_version("../terraform-aws-modules-metadata/alb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/alb/aws/" + get_version("../terraform-aws-modules-metadata/alb_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/alb.json")), + }, + "elb": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-elb.git?ref=" + get_version("../terraform-aws-modules-metadata/elb_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/elb/aws/" + get_version("../terraform-aws-modules-metadata/elb_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/elb.json")), + }, + "rds": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds.git?ref=" + get_version("../terraform-aws-modules-metadata/rds_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds/aws/" + get_version("../terraform-aws-modules-metadata/rds_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/rds.json")), + }, + "rds-aurora": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-rds-aurora.git?ref=" + get_version("../terraform-aws-modules-metadata/rds-aurora_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/rds-aurora/aws/" + get_version("../terraform-aws-modules-metadata/rds-aurora_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/rds-aurora.json")), + }, + "autoscaling": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-autoscaling.git?ref=" + get_version("../terraform-aws-modules-metadata/autoscaling_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/autoscaling/aws/" + get_version("../terraform-aws-modules-metadata/autoscaling_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/autoscaling.json")), + }, + "ec2-instance": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-ec2-instance.git?ref=" + get_version("../terraform-aws-modules-metadata/ec2-instance_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/" + get_version("../terraform-aws-modules-metadata/ec2-instance_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/ec2-instance.json")), + }, + "sns": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sns.git?ref=" + get_version("../terraform-aws-modules-metadata/sns_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sns/aws/" + get_version("../terraform-aws-modules-metadata/sns_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/sns.json")), + }, + "sqs": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-sqs.git?ref=" + get_version("../terraform-aws-modules-metadata/sqs_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/sqs/aws/" + get_version("../terraform-aws-modules-metadata/sqs_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/sqs.json")), + }, + "security-group": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-security-group.git?ref=" + get_version("../terraform-aws-modules-metadata/security-group_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/security-group/aws/" + get_version("../terraform-aws-modules-metadata/security-group_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/security-group.json")), + }, + "vpc": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-vpc.git?ref=" + get_version("../terraform-aws-modules-metadata/vpc_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/" + get_version("../terraform-aws-modules-metadata/vpc_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/vpc.json")), + }, + "s3-bucket": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=" + get_version("../terraform-aws-modules-metadata/s3-bucket_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/s3-bucket/aws/" + get_version("../terraform-aws-modules-metadata/s3-bucket_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/s3-bucket.json")), + }, + "redshift": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-redshift.git?ref=" + get_version("../terraform-aws-modules-metadata/redshift_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/redshift/aws/" + get_version("../terraform-aws-modules-metadata/redshift_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/redshift.json")), + }, + "dynamodb-table": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-dynamodb-table.git?ref=" + get_version("../terraform-aws-modules-metadata/dynamodb-table_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/dynamodb-table/aws/" + get_version("../terraform-aws-modules-metadata/dynamodb-table_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/dynamodb-table.json")), + }, + "cloudfront": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-cloudfront.git?ref=" + get_version("../terraform-aws-modules-metadata/cloudfront_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/cloudfront/aws/" + get_version("../terraform-aws-modules-metadata/cloudfront_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/cloudfront.json")), + }, + "lambda": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-lambda.git?ref=" + get_version("../terraform-aws-modules-metadata/lambda_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/lambda/aws/" + get_version("../terraform-aws-modules-metadata/lambda_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/lambda.json")), + }, + "apigateway-v2": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-apigateway-v2.git?ref=" + get_version("../terraform-aws-modules-metadata/apigateway-v2_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/apigateway-v2/aws/" + get_version("../terraform-aws-modules-metadata/apigateway-v2_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/apigateway-v2.json")), + }, + "vpn-gateway": { + "source": "git::git@github.com:terraform-aws-modules/terraform-aws-vpn-gateway.git?ref=" + get_version("../terraform-aws-modules-metadata/vpn-gateway_version.txt"), + "registry_url": "https://registry.terraform.io/modules/terraform-aws-modules/vpn-gateway/aws/" + get_version("../terraform-aws-modules-metadata/vpn-gateway_version.txt", True), + "variables": update_template_variables(load_local_json("../terraform-aws-modules-metadata/vpn-gateway.json")), + }, + + # Data sources for aws_region and aws_availability_zones + "aws-data": { + "source": "${get_parent_terragrunt_dir()}/../../../modules/aws-data", + "registry_url": "", + "variables": {}, + }, +} + +# pprint(MODULES["rds-aurora"]) diff --git a/modulestf/render.py b/src/modulestf/render.py similarity index 94% rename from modulestf/render.py rename to src/modulestf/render.py index c1220aa..e24f5dd 100644 --- a/modulestf/render.py +++ b/src/modulestf/render.py @@ -262,6 +262,13 @@ def render_from_modulestf_config(config, source, regions): logger.info("Rendering single layer resource id: %s" % resource.get("ref_id")) used_module_type = prepare_single_layer(resource, source_dir_name, region, templates_dir, templates_files) + # Put extra files into the layer (eg, handler.py for Lambda module) + extra_files_templates_dir = path.realpath(path.join(COOKIECUTTER_TEMPLATES_DIR, "extra-files-single-layer", resource["type"])) + if path.exists(extra_files_templates_dir): + full_dir_name = ("%s/%s/%s" % (source_dir_name, region, resource.get("dir_name"))).lower() + dst_dir = path.join(getcwd(), WORK_DIR_FOR_COOKIECUTTER, full_dir_name) + shutil.copytree(extra_files_templates_dir, dst_dir, dirs_exist_ok=True) + used_modules.add(used_module_type) extra_context = dict({"module_sources": {}, "module_registry_urls": {}, "module_variables": {}}) diff --git a/modulestf/upload.py b/src/modulestf/upload.py similarity index 100% rename from modulestf/upload.py rename to src/modulestf/upload.py diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 0000000..743828d --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1,6 @@ +aws-lambda-powertools>=1.15.0 +aws-xray-sdk>=2.8 +cookiecutter==1.7.0 +networkx==2.4 +petname==2.6 +requests>=2.24.0 diff --git a/templates/config_aws_lambda.yaml b/src/templates/config_aws_lambda.yaml similarity index 100% rename from templates/config_aws_lambda.yaml rename to src/templates/config_aws_lambda.yaml diff --git a/src/templates/extra-files-single-layer/lambda/handler.py b/src/templates/extra-files-single-layer/lambda/handler.py new file mode 100644 index 0000000..00add00 --- /dev/null +++ b/src/templates/extra-files-single-layer/lambda/handler.py @@ -0,0 +1,4 @@ +def lambda_handler(event, context): + print("Hello from Lambda!") + + return event diff --git a/templates/root/cookiecutter.json b/src/templates/root/cookiecutter.json similarity index 100% rename from templates/root/cookiecutter.json rename to src/templates/root/cookiecutter.json diff --git a/templates/root/template/.editorconfig b/src/templates/root/template/.editorconfig similarity index 100% rename from templates/root/template/.editorconfig rename to src/templates/root/template/.editorconfig diff --git a/src/templates/root/template/.gitignore b/src/templates/root/template/.gitignore new file mode 100644 index 0000000..d9c1f28 --- /dev/null +++ b/src/templates/root/template/.gitignore @@ -0,0 +1,42 @@ +# Local .terraform directories +**/.terraform/* + +# Terraform lockfile +.terraform.lock.hcl + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log + +# Exclude all .tfvars files, which are likely to contain sentitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +# OS X +.history +.DS_Store + +# IntelliJ +.idea_modules +*.iml +*.iws +*.ipr +.idea/ +build/ +*/build/ diff --git a/templates/root/template/.pre-commit-config.yaml b/src/templates/root/template/.pre-commit-config.yaml similarity index 50% rename from templates/root/template/.pre-commit-config.yaml rename to src/templates/root/template/.pre-commit-config.yaml index b59b613..e9bd3a8 100644 --- a/templates/root/template/.pre-commit-config.yaml +++ b/src/templates/root/template/.pre-commit-config.yaml @@ -1,10 +1,6 @@ repos: - repo: git://github.com/antonbabenko/pre-commit-terraform - rev: v1.25.0 + rev: v1.50.0 hooks: - id: terraform_fmt - id: terraform_docs - - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.5.0 - hooks: - - id: check-merge-conflict diff --git a/templates/root/template/LICENSE b/src/templates/root/template/LICENSE similarity index 96% rename from templates/root/template/LICENSE rename to src/templates/root/template/LICENSE index 85ff1f7..507b296 100644 --- a/templates/root/template/LICENSE +++ b/src/templates/root/template/LICENSE @@ -1,5 +1,5 @@ The MIT License (MIT) -Copyright (c) 2018-2020 Anton Babenko +Copyright (c) 2018-2021 Anton Babenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/templates/root/template/README.md b/src/templates/root/template/README.md similarity index 81% rename from templates/root/template/README.md rename to src/templates/root/template/README.md index 48fe47b..c4e4b6a 100644 --- a/templates/root/template/README.md +++ b/src/templates/root/template/README.md @@ -1,6 +1,6 @@ # Infrastructure code for "{{ cookiecutter.source_name }}" -This repository contains infrastructure as Terraform configurations which were automatically generated from blueprint created using [Cloudcraft](https://www.cloudcraft.co). +This repository contains Terraform configuration files which were automatically generated from blueprint created using [Cloudcraft](https://www.cloudcraft.co). [Terragrunt](https://terragrunt.gruntwork.io/) is used to work with Terraform configurations which allows to orchestrate dependent layers, update arguments dynamically and keep configurations [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). @@ -10,13 +10,13 @@ This repository contains infrastructure as Terraform configurations which were a 1. [Configure access to AWS account](#configure-access-to-aws-account) 1. [Create and manage your infrastructure](#create-and-manage-your-infrastructure) 1. [References](#references) -1. [About modules.tf](#about-modulestf) +1. [About d2c.modules.tf](#about-d2cmodulestf) ## Quick start -1. [Install Terraform 0.12 or newer](https://www.terraform.io/intro/getting-started/install.html) -1. [Install Terragrunt 0.22 or newer](https://terragrunt.gruntwork.io/docs/getting-started/install/) +1. [Install Terraform 0.15 or newer](https://learn.hashicorp.com/tutorials/terraform/install-cli) +1. [Install Terragrunt 0.29 or newer](https://terragrunt.gruntwork.io/docs/getting-started/install/) 1. Optionally, [install pre-commit hooks](https://pre-commit.com/#install) to keep Terraform formatting and documentation up-to-date. If you are using macOS you can install all dependencies using [Homebrew](https://brew.sh/): @@ -33,7 +33,7 @@ $ export AWS_ACCESS_KEY_ID=... $ export AWS_SECRET_ACCESS_KEY=... ``` -Alternatively, you can edit `terragrunt.hcl` and use another authentication mechanism as described in [AWS provider documentation](https://www.terraform.io/docs/providers/aws/index.html#authentication). +Alternatively, you can edit `terragrunt.hcl` and use another authentication mechanism as described in [AWS provider documentation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication). ## Create and manage your infrastructure @@ -52,7 +52,7 @@ There are two ways to manage infrastructure (slower&complete, or faster&granular ``` $ cd {{ cookiecutter.region }} -$ terragrunt apply-all +$ terragrunt run-all apply ``` - **As a single layer (faster&granular).** Run this command to create infrastructure in a single layer (eg, `{{ cookiecutter.dirs.values()|first|default("vpc") }}`): @@ -67,14 +67,15 @@ After the confirmation your infrastructure should be created. ## References -* [Terraform documentation](https://www.terraform.io/docs/) and [Terragrunt documentation](https://terragrunt.gruntwork.io/docs/) for all available commands and features. -* [Terraform AWS modules](https://github.com/terraform-aws-modules/). -* [Terraform modules registry](https://registry.terraform.io/). +* [Terraform documentation](https://www.terraform.io/docs/) and [Terragrunt documentation](https://terragrunt.gruntwork.io/docs/) for all available commands and features +* [Terraform AWS modules](https://github.com/terraform-aws-modules/) +* [Terraform modules registry](https://registry.terraform.io/) +* [Terraform best practices](https://www.terraform-best-practices.com/) -## About modules.tf +## About d2c.modules.tf -[modules.tf](https://github.com/antonbabenko/modules.tf-lambda) is an open-source project by [Anton Babenko](https://github.com/antonbabenko), and, yes, you can contribute, too: +[modules.tf](https://github.com/antonbabenko/modules.tf-lambda) is an open-source project created by [Anton Babenko](https://github.com/antonbabenko): 1. Questions, bugs and feature-requests - [open an issue](https://github.com/antonbabenko/modules.tf-lambda). 1. [Become a sponsor to @antonbabenko](https://github.com/sponsors/antonbabenko/). 1. You are always welcome to share, star, like, tweet, follow! @@ -83,4 +84,4 @@ After the confirmation your infrastructure should be created. [![@antonbabenko](https://img.shields.io/github/followers/antonbabenko?style=flat&label=Follow%20@antonbabenko%20on%20Github)](https://github.com/antonbabenko) [![modules.tf-lambda](https://img.shields.io/github/stars/antonbabenko/modules.tf-lambda?style=flat&label=Star%20modules.tf-lambda%20on%20Github)](https://github.com/antonbabenko/modules.tf-lambda) -All content, including [Terraform AWS modules](https://github.com/terraform-aws-modules/) used in these configurations, is released under the MIT License. +All content, including [Terraform AWS modules](https://github.com/terraform-aws-modules/) used in these configurations, is released under the MIT or Apache License. diff --git a/src/templates/root/template/modules/aws-data/README.md b/src/templates/root/template/modules/aws-data/README.md new file mode 100644 index 0000000..5f563eb --- /dev/null +++ b/src/templates/root/template/modules/aws-data/README.md @@ -0,0 +1,42 @@ +# aws-data + +This module contains data-sources which are used as arguments in other AWS modules (eg, list of AZ when creating VPC). + + +## Requirements + +No requirements. + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | n/a | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [aws_ami.amazon_linux2](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source | +| [aws_ami.ubuntu_1804](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source | +| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source | +| [aws_region.selected](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/region) | data source | + +## Inputs + +No inputs. + +## Outputs + +| Name | Description | +|------|-------------| +| [amazon\_linux2\_aws\_ami\_id](#output\_amazon\_linux2\_aws\_ami\_id) | AMI ID of Amazon Linux 2 | +| [available\_aws\_availability\_zones\_names](#output\_available\_aws\_availability\_zones\_names) | A list of the Availability Zone names available to the account | +| [available\_aws\_availability\_zones\_zone\_ids](#output\_available\_aws\_availability\_zones\_zone\_ids) | A list of the Availability Zone IDs available to the account | +| [aws\_region](#output\_aws\_region) | Details about selected AWS region | +| [ubuntu\_1804\_aws\_ami\_id](#output\_ubuntu\_1804\_aws\_ami\_id) | AMI ID of Ubuntu 18.04 | + diff --git a/templates/root/template/modules/aws-data/main.tf b/src/templates/root/template/modules/aws-data/main.tf similarity index 95% rename from templates/root/template/modules/aws-data/main.tf rename to src/templates/root/template/modules/aws-data/main.tf index a8532d6..3cabcde 100644 --- a/templates/root/template/modules/aws-data/main.tf +++ b/src/templates/root/template/modules/aws-data/main.tf @@ -29,7 +29,7 @@ data "aws_ami" "ubuntu_1804" { data "aws_ami" "amazon_linux2" { most_recent = true - owners = ["137112412989"] # Amazon + owners = ["137112412989"] # Amazon filter { name = "name" diff --git a/templates/root/template/modules/aws-data/outputs.tf b/src/templates/root/template/modules/aws-data/outputs.tf similarity index 100% rename from templates/root/template/modules/aws-data/outputs.tf rename to src/templates/root/template/modules/aws-data/outputs.tf diff --git a/templates/terragrunt-common-layer/region/terragrunt.hcl b/src/templates/terragrunt-common-layer/region/terragrunt.hcl similarity index 100% rename from templates/terragrunt-common-layer/region/terragrunt.hcl rename to src/templates/terragrunt-common-layer/region/terragrunt.hcl diff --git a/templates/terragrunt-single-layer/terragrunt.hcl b/src/templates/terragrunt-single-layer/terragrunt.hcl similarity index 100% rename from templates/terragrunt-single-layer/terragrunt.hcl rename to src/templates/terragrunt-single-layer/terragrunt.hcl diff --git a/modules-metadata/alb.json b/src/terraform-aws-modules-metadata/alb.json similarity index 84% rename from modules-metadata/alb.json rename to src/terraform-aws-modules-metadata/alb.json index 7d100d6..2c28a58 100644 --- a/modules-metadata/alb.json +++ b/src/terraform-aws-modules-metadata/alb.json @@ -9,6 +9,11 @@ "description": "Controls if the Load Balancer should be created", "type": "bool" }, + "drop_invalid_header_fields": { + "default": false, + "description": "Indicates whether invalid header fields are dropped in application load balancers. Defaults to false.", + "type": "bool" + }, "enable_cross_zone_load_balancing": { "default": false, "description": "Indicates whether cross zone load balancing should be enabled in application load balancers.", @@ -32,12 +37,17 @@ "http_tcp_listeners": { "default": [], "description": "A list of maps describing the HTTP listeners or TCP ports for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to http_tcp_listeners[count.index])", - "type": "list(map(string))" + "type": "any" + }, + "https_listener_rules": { + "default": [], + "description": "A list of maps describing the Listener Rules for this ALB. Required key/values: actions, conditions. Optional key/values: priority, https_listener_index (default to https_listeners[count.index])", + "type": "any" }, "https_listeners": { "default": [], "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to https_listeners[count.index])", - "type": "list(map(string))" + "type": "any" }, "idle_timeout": { "default": 60, @@ -54,6 +64,11 @@ "description": "The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack.", "type": "string" }, + "lb_tags": { + "default": {}, + "description": "A map of tags to add to load balancer", + "type": "map(string)" + }, "listener_ssl_policy_default": { "default": "ELBSecurityPolicy-2016-08", "description": "The security policy if using HTTPS externally on the load balancer. [See](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html).", @@ -86,7 +101,7 @@ }, "name_prefix": { "default": "null", - "description": "The resource name prefix and Name tag of the load balancer.", + "description": "The resource name prefix and Name tag of the load balancer. Cannot be longer than 6 characters", "type": "string" }, "security_groups": { @@ -109,9 +124,14 @@ "description": "A map of tags to add to all resources", "type": "map(string)" }, + "target_group_tags": { + "default": {}, + "description": "A map of tags to add to all target groups", + "type": "map(string)" + }, "target_groups": { "default": [], - "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port. Optional key/values are in the target_groups_defaults variable.", + "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port", "type": "any" }, "vpc_id": { diff --git a/modules-metadata/alb_cloudcraft.json b/src/terraform-aws-modules-metadata/alb_cloudcraft.json similarity index 100% rename from modules-metadata/alb_cloudcraft.json rename to src/terraform-aws-modules-metadata/alb_cloudcraft.json diff --git a/modules-metadata/alb_variables.json b/src/terraform-aws-modules-metadata/alb_variables.json similarity index 84% rename from modules-metadata/alb_variables.json rename to src/terraform-aws-modules-metadata/alb_variables.json index 7d100d6..2c28a58 100644 --- a/modules-metadata/alb_variables.json +++ b/src/terraform-aws-modules-metadata/alb_variables.json @@ -9,6 +9,11 @@ "description": "Controls if the Load Balancer should be created", "type": "bool" }, + "drop_invalid_header_fields": { + "default": false, + "description": "Indicates whether invalid header fields are dropped in application load balancers. Defaults to false.", + "type": "bool" + }, "enable_cross_zone_load_balancing": { "default": false, "description": "Indicates whether cross zone load balancing should be enabled in application load balancers.", @@ -32,12 +37,17 @@ "http_tcp_listeners": { "default": [], "description": "A list of maps describing the HTTP listeners or TCP ports for this ALB. Required key/values: port, protocol. Optional key/values: target_group_index (defaults to http_tcp_listeners[count.index])", - "type": "list(map(string))" + "type": "any" + }, + "https_listener_rules": { + "default": [], + "description": "A list of maps describing the Listener Rules for this ALB. Required key/values: actions, conditions. Optional key/values: priority, https_listener_index (default to https_listeners[count.index])", + "type": "any" }, "https_listeners": { "default": [], "description": "A list of maps describing the HTTPS listeners for this ALB. Required key/values: port, certificate_arn. Optional key/values: ssl_policy (defaults to ELBSecurityPolicy-2016-08), target_group_index (defaults to https_listeners[count.index])", - "type": "list(map(string))" + "type": "any" }, "idle_timeout": { "default": 60, @@ -54,6 +64,11 @@ "description": "The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack.", "type": "string" }, + "lb_tags": { + "default": {}, + "description": "A map of tags to add to load balancer", + "type": "map(string)" + }, "listener_ssl_policy_default": { "default": "ELBSecurityPolicy-2016-08", "description": "The security policy if using HTTPS externally on the load balancer. [See](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-policy-table.html).", @@ -86,7 +101,7 @@ }, "name_prefix": { "default": "null", - "description": "The resource name prefix and Name tag of the load balancer.", + "description": "The resource name prefix and Name tag of the load balancer. Cannot be longer than 6 characters", "type": "string" }, "security_groups": { @@ -109,9 +124,14 @@ "description": "A map of tags to add to all resources", "type": "map(string)" }, + "target_group_tags": { + "default": {}, + "description": "A map of tags to add to all target groups", + "type": "map(string)" + }, "target_groups": { "default": [], - "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port. Optional key/values are in the target_groups_defaults variable.", + "description": "A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend_protocol, backend_port", "type": "any" }, "vpc_id": { diff --git a/src/terraform-aws-modules-metadata/alb_version.txt b/src/terraform-aws-modules-metadata/alb_version.txt new file mode 100644 index 0000000..9773998 --- /dev/null +++ b/src/terraform-aws-modules-metadata/alb_version.txt @@ -0,0 +1 @@ +v6.0.0 diff --git a/src/terraform-aws-modules-metadata/apigateway-v2.json b/src/terraform-aws-modules-metadata/apigateway-v2.json new file mode 100644 index 0000000..acd90ce --- /dev/null +++ b/src/terraform-aws-modules-metadata/apigateway-v2.json @@ -0,0 +1,157 @@ +{ + "api_key_selection_expression": { + "default": "$request.header.x-api-key", + "description": "An API key selection expression. Valid values: $context.authorizer.usageIdentifierKey, $request.header.x-api-key.", + "type": "string" + }, + "api_version": { + "default": "null", + "description": "A version identifier for the API", + "type": "string" + }, + "body": { + "default": "null", + "description": "An OpenAPI specification that defines the set of routes and integrations to create as part of the HTTP APIs. Supported only for HTTP APIs.", + "type": "string" + }, + "cors_configuration": { + "default": {}, + "description": "The cross-origin resource sharing (CORS) configuration. Applicable for HTTP APIs.", + "type": "any" + }, + "create": { + "default": true, + "description": "Controls if API Gateway resources should be created", + "type": "bool" + }, + "create_api_domain_name": { + "default": true, + "description": "Whether to create API domain name resource", + "type": "bool" + }, + "create_api_gateway": { + "default": true, + "description": "Whether to create API Gateway", + "type": "bool" + }, + "create_default_stage": { + "default": true, + "description": "Whether to create default stage", + "type": "bool" + }, + "create_default_stage_api_mapping": { + "default": true, + "description": "Whether to create default stage API mapping", + "type": "bool" + }, + "create_routes_and_integrations": { + "default": true, + "description": "Whether to create routes and integrations resources", + "type": "bool" + }, + "create_vpc_link": { + "default": true, + "description": "Whether to create VPC links", + "type": "bool" + }, + "credentials_arn": { + "default": "null", + "description": "Part of quick create. Specifies any credentials required for the integration. Applicable for HTTP APIs.", + "type": "string" + }, + "default_route_settings": { + "default": {}, + "description": "Settings for default route", + "type": "map(string)" + }, + "default_stage_access_log_destination_arn": { + "default": "null", + "description": "Default stage's ARN of the CloudWatch Logs log group to receive access logs. Any trailing :* is trimmed from the ARN.", + "type": "string" + }, + "default_stage_access_log_format": { + "default": "null", + "description": "Default stage's single line format of the access logs of data, as specified by selected $context variables.", + "type": "string" + }, + "default_stage_tags": { + "default": {}, + "description": "A mapping of tags to assign to the default stage resource.", + "type": "map(string)" + }, + "description": { + "default": "null", + "description": "The description of the API.", + "type": "string" + }, + "disable_execute_api_endpoint": { + "default": false, + "description": "Whether clients can invoke the API by using the default execute-api endpoint. To require that clients use a custom domain name to invoke the API, disable the default endpoint", + "type": "string" + }, + "domain_name": { + "default": "null", + "description": "The domain name to use for API gateway", + "type": "string" + }, + "domain_name_certificate_arn": { + "default": "null", + "description": "The ARN of an AWS-managed certificate that will be used by the endpoint for the domain name", + "type": "string" + }, + "domain_name_tags": { + "default": {}, + "description": "A mapping of tags to assign to API domain name resource.", + "type": "map(string)" + }, + "integrations": { + "default": {}, + "description": "Map of API gateway routes with integrations", + "type": "map(any)" + }, + "mutual_tls_authentication": { + "default": {}, + "description": "An Amazon S3 URL that specifies the truststore for mutual TLS authentication as well as version, keyed at uri and version", + "type": "map(string)" + }, + "name": { + "default": "", + "description": "The name of the API", + "type": "string" + }, + "protocol_type": { + "default": "HTTP", + "description": "The API protocol. Valid values: HTTP, WEBSOCKET", + "type": "string" + }, + "route_key": { + "default": "null", + "description": "Part of quick create. Specifies any route key. Applicable for HTTP APIs.", + "type": "string" + }, + "route_selection_expression": { + "default": "$request.method $request.path", + "description": "The route selection expression for the API.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "A mapping of tags to assign to API gateway resources.", + "type": "map(string)" + }, + "target": { + "default": "null", + "description": "Part of quick create. Quick create produces an API with an integration, a default catch-all route, and a default stage which is configured to automatically deploy changes. For HTTP integrations, specify a fully qualified URL. For Lambda integrations, specify a function ARN. The type of the integration will be HTTP_PROXY or AWS_PROXY, respectively. Applicable for HTTP APIs.", + "type": "string" + }, + "vpc_link_tags": { + "default": {}, + "description": "A map of tags to add to the VPC Link", + "type": "map(string)" + }, + "vpc_links": { + "default": {}, + "description": "Map of VPC Links details to create", + "type": "map(any)" + } +} diff --git a/modules-metadata/dynamodb-table_cloudcraft.json b/src/terraform-aws-modules-metadata/apigateway-v2_cloudcraft.json similarity index 100% rename from modules-metadata/dynamodb-table_cloudcraft.json rename to src/terraform-aws-modules-metadata/apigateway-v2_cloudcraft.json diff --git a/src/terraform-aws-modules-metadata/apigateway-v2_variables.json b/src/terraform-aws-modules-metadata/apigateway-v2_variables.json new file mode 100644 index 0000000..acd90ce --- /dev/null +++ b/src/terraform-aws-modules-metadata/apigateway-v2_variables.json @@ -0,0 +1,157 @@ +{ + "api_key_selection_expression": { + "default": "$request.header.x-api-key", + "description": "An API key selection expression. Valid values: $context.authorizer.usageIdentifierKey, $request.header.x-api-key.", + "type": "string" + }, + "api_version": { + "default": "null", + "description": "A version identifier for the API", + "type": "string" + }, + "body": { + "default": "null", + "description": "An OpenAPI specification that defines the set of routes and integrations to create as part of the HTTP APIs. Supported only for HTTP APIs.", + "type": "string" + }, + "cors_configuration": { + "default": {}, + "description": "The cross-origin resource sharing (CORS) configuration. Applicable for HTTP APIs.", + "type": "any" + }, + "create": { + "default": true, + "description": "Controls if API Gateway resources should be created", + "type": "bool" + }, + "create_api_domain_name": { + "default": true, + "description": "Whether to create API domain name resource", + "type": "bool" + }, + "create_api_gateway": { + "default": true, + "description": "Whether to create API Gateway", + "type": "bool" + }, + "create_default_stage": { + "default": true, + "description": "Whether to create default stage", + "type": "bool" + }, + "create_default_stage_api_mapping": { + "default": true, + "description": "Whether to create default stage API mapping", + "type": "bool" + }, + "create_routes_and_integrations": { + "default": true, + "description": "Whether to create routes and integrations resources", + "type": "bool" + }, + "create_vpc_link": { + "default": true, + "description": "Whether to create VPC links", + "type": "bool" + }, + "credentials_arn": { + "default": "null", + "description": "Part of quick create. Specifies any credentials required for the integration. Applicable for HTTP APIs.", + "type": "string" + }, + "default_route_settings": { + "default": {}, + "description": "Settings for default route", + "type": "map(string)" + }, + "default_stage_access_log_destination_arn": { + "default": "null", + "description": "Default stage's ARN of the CloudWatch Logs log group to receive access logs. Any trailing :* is trimmed from the ARN.", + "type": "string" + }, + "default_stage_access_log_format": { + "default": "null", + "description": "Default stage's single line format of the access logs of data, as specified by selected $context variables.", + "type": "string" + }, + "default_stage_tags": { + "default": {}, + "description": "A mapping of tags to assign to the default stage resource.", + "type": "map(string)" + }, + "description": { + "default": "null", + "description": "The description of the API.", + "type": "string" + }, + "disable_execute_api_endpoint": { + "default": false, + "description": "Whether clients can invoke the API by using the default execute-api endpoint. To require that clients use a custom domain name to invoke the API, disable the default endpoint", + "type": "string" + }, + "domain_name": { + "default": "null", + "description": "The domain name to use for API gateway", + "type": "string" + }, + "domain_name_certificate_arn": { + "default": "null", + "description": "The ARN of an AWS-managed certificate that will be used by the endpoint for the domain name", + "type": "string" + }, + "domain_name_tags": { + "default": {}, + "description": "A mapping of tags to assign to API domain name resource.", + "type": "map(string)" + }, + "integrations": { + "default": {}, + "description": "Map of API gateway routes with integrations", + "type": "map(any)" + }, + "mutual_tls_authentication": { + "default": {}, + "description": "An Amazon S3 URL that specifies the truststore for mutual TLS authentication as well as version, keyed at uri and version", + "type": "map(string)" + }, + "name": { + "default": "", + "description": "The name of the API", + "type": "string" + }, + "protocol_type": { + "default": "HTTP", + "description": "The API protocol. Valid values: HTTP, WEBSOCKET", + "type": "string" + }, + "route_key": { + "default": "null", + "description": "Part of quick create. Specifies any route key. Applicable for HTTP APIs.", + "type": "string" + }, + "route_selection_expression": { + "default": "$request.method $request.path", + "description": "The route selection expression for the API.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "A mapping of tags to assign to API gateway resources.", + "type": "map(string)" + }, + "target": { + "default": "null", + "description": "Part of quick create. Quick create produces an API with an integration, a default catch-all route, and a default stage which is configured to automatically deploy changes. For HTTP integrations, specify a fully qualified URL. For Lambda integrations, specify a function ARN. The type of the integration will be HTTP_PROXY or AWS_PROXY, respectively. Applicable for HTTP APIs.", + "type": "string" + }, + "vpc_link_tags": { + "default": {}, + "description": "A map of tags to add to the VPC Link", + "type": "map(string)" + }, + "vpc_links": { + "default": {}, + "description": "Map of VPC Links details to create", + "type": "map(any)" + } +} diff --git a/src/terraform-aws-modules-metadata/apigateway-v2_version.txt b/src/terraform-aws-modules-metadata/apigateway-v2_version.txt new file mode 100644 index 0000000..0ec25f7 --- /dev/null +++ b/src/terraform-aws-modules-metadata/apigateway-v2_version.txt @@ -0,0 +1 @@ +v1.0.0 diff --git a/src/terraform-aws-modules-metadata/autoscaling.json b/src/terraform-aws-modules-metadata/autoscaling.json new file mode 100644 index 0000000..681ec8e --- /dev/null +++ b/src/terraform-aws-modules-metadata/autoscaling.json @@ -0,0 +1,408 @@ +{ + "associate_public_ip_address": { + "default": "null", + "description": "(LC) Associate a public ip address with an instance in a VPC", + "type": "bool" + }, + "availability_zone": { + "default": "null", + "description": "A list of one or more availability zones for the group. Used for EC2-Classic and default subnets when not specified with `vpc_zone_identifier` argument. Conflicts with `vpc_zone_identifier`", + "type": "list(string)" + }, + "block_device_mappings": { + "default": [], + "description": "(LT) Specify volumes to attach to the instance besides the volumes specified by the AMI", + "type": "list(any)" + }, + "capacity_rebalance": { + "default": "null", + "description": "Indicates whether capacity rebalance is enabled", + "type": "bool" + }, + "capacity_reservation_specification": { + "default": "null", + "description": "(LT) Targeting for EC2 capacity reservations", + "type": "any" + }, + "cpu_options": { + "default": "null", + "description": "(LT) The CPU options for the instance", + "type": "map(string)" + }, + "create_asg": { + "default": true, + "description": "Determines whether to create autoscaling group or not", + "type": "bool" + }, + "create_lc": { + "default": false, + "description": "Determines whether to create launch configuration or not", + "type": "bool" + }, + "create_lt": { + "default": false, + "description": "Determines whether to create launch template or not", + "type": "bool" + }, + "credit_specification": { + "default": "null", + "description": "(LT) Customize the credit specification of the instance", + "type": "map(string)" + }, + "default_cooldown": { + "default": "null", + "description": "The amount of time, in seconds, after a scaling activity completes before another scaling activity can start", + "type": "number" + }, + "default_version": { + "default": "null", + "description": "(LT) Default Version of the launch template", + "type": "string" + }, + "delete_timeout": { + "default": "null", + "description": "Delete timeout to wait for destroying autoscaling group", + "type": "string" + }, + "description": { + "default": "null", + "description": "(LT) Description of the launch template", + "type": "string" + }, + "desired_capacity": { + "default": "null", + "description": "The number of Amazon EC2 instances that should be running in the autoscaling group", + "type": "number" + }, + "disable_api_termination": { + "default": "null", + "description": "(LT) If true, enables EC2 instance termination protection", + "type": "bool" + }, + "ebs_block_device": { + "default": [], + "description": "(LC) Additional EBS block devices to attach to the instance", + "type": "list(map(string))" + }, + "ebs_optimized": { + "default": "null", + "description": "If true, the launched EC2 instance will be EBS-optimized", + "type": "bool" + }, + "elastic_gpu_specifications": { + "default": "null", + "description": "(LT) The elastic GPU to attach to the instance", + "type": "map(string)" + }, + "elastic_inference_accelerator": { + "default": "null", + "description": "(LT) Configuration block containing an Elastic Inference Accelerator to attach to the instance", + "type": "map(string)" + }, + "enable_monitoring": { + "default": "null", + "description": "Enables/disables detailed monitoring", + "type": "bool" + }, + "enabled_metrics": { + "default": "null", + "description": "A list of metrics to collect. The allowed values are `GroupDesiredCapacity`, `GroupInServiceCapacity`, `GroupPendingCapacity`, `GroupMinSize`, `GroupMaxSize`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupStandbyCapacity`, `GroupTerminatingCapacity`, `GroupTerminatingInstances`, `GroupTotalCapacity`, `GroupTotalInstances`", + "type": "list(string)" + }, + "enclave_options": { + "default": "null", + "description": "(LT) Enable Nitro Enclaves on launched instances", + "type": "map(string)" + }, + "ephemeral_block_device": { + "default": [], + "description": "(LC) Customize Ephemeral (also known as 'Instance Store') volumes on the instance", + "type": "list(map(string))" + }, + "force_delete": { + "default": "null", + "description": "Allows deleting the Auto Scaling Group without waiting for all instances in the pool to terminate. You can force an Auto Scaling Group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling", + "type": "bool" + }, + "health_check_grace_period": { + "default": "null", + "description": "Time (in seconds) after instance comes into service before checking health", + "type": "number" + }, + "health_check_type": { + "default": "null", + "description": "`EC2` or `ELB`. Controls how health checking is done", + "type": "string" + }, + "hibernation_options": { + "default": "null", + "description": "(LT) The hibernation options for the instance", + "type": "map(string)" + }, + "iam_instance_profile_arn": { + "default": "null", + "description": "(LT) The IAM Instance Profile ARN to launch the instance with", + "type": "string" + }, + "iam_instance_profile_name": { + "default": "null", + "description": "The name attribute of the IAM instance profile to associate with launched instances", + "type": "string" + }, + "image_id": { + "default": "", + "description": "The AMI from which to launch the instance", + "type": "string" + }, + "initial_lifecycle_hooks": { + "default": [], + "description": "One or more Lifecycle Hooks to attach to the Auto Scaling Group before instances are launched. The syntax is exactly the same as the separate `aws_autoscaling_lifecycle_hook` resource, without the `autoscaling_group_name` attribute. Please note that this will only work when creating a new Auto Scaling Group. For all other use-cases, please use `aws_autoscaling_lifecycle_hook` resource", + "type": "list(map(string))" + }, + "instance_initiated_shutdown_behavior": { + "default": "null", + "description": "(LT) Shutdown behavior for the instance. Can be `stop` or `terminate`. (Default: `stop`)", + "type": "string" + }, + "instance_market_options": { + "default": "null", + "description": "(LT) The market (purchasing) option for the instance", + "type": "any" + }, + "instance_refresh": { + "default": "null", + "description": "If this block is configured, start an Instance Refresh when this Auto Scaling Group is updated", + "type": "any" + }, + "instance_type": { + "default": "", + "description": "The type of the instance to launch", + "type": "string", + "cloudcraft_name": "instanceType" + }, + "kernel_id": { + "default": "null", + "description": "(LT) The kernel ID", + "type": "string" + }, + "key_name": { + "default": "null", + "description": "The key name that should be used for the instance", + "type": "string" + }, + "launch_configuration": { + "default": "null", + "description": "Name of an existing launch configuration to be used (created outside of this module)", + "type": "string" + }, + "launch_template": { + "default": "null", + "description": "Name of an existing launch template to be used (created outside of this module)", + "type": "string" + }, + "lc_name": { + "default": "", + "description": "Name of launch configuration to be created", + "type": "string" + }, + "lc_use_name_prefix": { + "default": true, + "description": "Determines whether to use `lc_name` as is or create a unique name beginning with the `lc_name` as the prefix", + "type": "bool" + }, + "license_specifications": { + "default": "null", + "description": "(LT) A list of license specifications to associate with", + "type": "map(string)" + }, + "load_balancers": { + "default": [], + "description": "A list of elastic load balancer names to add to the autoscaling group names. Only valid for classic load balancers. For ALBs, use `target_group_arns` instead", + "type": "list(string)" + }, + "lt_name": { + "default": "", + "description": "Name of launch template to be created", + "type": "string" + }, + "lt_use_name_prefix": { + "default": true, + "description": "Determines whether to use `lt_name` as is or create a unique name beginning with the `lt_name` as the prefix", + "type": "bool" + }, + "lt_version": { + "default": "null", + "description": "Launch template version. Can be version number, `$Latest`, or `$Default`", + "type": "string" + }, + "max_instance_lifetime": { + "default": "null", + "description": "The maximum amount of time, in seconds, that an instance can be in service, values must be either equal to 0 or between 604800 and 31536000 seconds", + "type": "number" + }, + "max_size": { + "default": "null", + "description": "The maximum size of the autoscaling group", + "type": "number" + }, + "metadata_options": { + "default": "null", + "description": "Customize the metadata options for the instance", + "type": "map(string)" + }, + "metrics_granularity": { + "default": "null", + "description": "The granularity to associate with the metrics to collect. The only valid value is `1Minute`", + "type": "string" + }, + "min_elb_capacity": { + "default": "null", + "description": "Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes", + "type": "number" + }, + "min_size": { + "default": "null", + "description": "The minimum size of the autoscaling group", + "type": "number" + }, + "mixed_instances_policy": { + "default": "null", + "description": "Configuration block containing settings to define launch targets for Auto Scaling groups", + "type": "any" + }, + "name": { + "description": "Name used across the resources created", + "type": "string" + }, + "network_interfaces": { + "default": [], + "description": "(LT) Customize network interfaces to be attached at instance boot time", + "type": "list(any)" + }, + "placement": { + "default": "null", + "description": "(LT) The placement of the instance", + "type": "map(string)" + }, + "placement_group": { + "default": "null", + "description": "The name of the placement group into which you'll launch your instances, if any", + "type": "string" + }, + "placement_tenancy": { + "default": "null", + "description": "(LC) The tenancy of the instance. Valid values are `default` or `dedicated`", + "type": "string" + }, + "protect_from_scale_in": { + "default": false, + "description": "Allows setting instance protection. The autoscaling group will not select instances with this setting for termination during scale in events.", + "type": "bool" + }, + "ram_disk_id": { + "default": "null", + "description": "(LT) The ID of the ram disk", + "type": "string" + }, + "root_block_device": { + "default": [], + "description": "(LC) Customize details about the root block device of the instance", + "type": "list(map(string))" + }, + "security_groups": { + "default": "null", + "description": "A list of security group IDs to associate", + "type": "list(string)" + }, + "service_linked_role_arn": { + "default": "null", + "description": "The ARN of the service-linked role that the ASG will use to call other AWS services", + "type": "string" + }, + "spot_price": { + "default": "null", + "description": "(LC) The maximum price to use for reserving spot instances (defaults to on-demand price)", + "type": "string" + }, + "suspended_processes": { + "default": "null", + "description": "A list of processes to suspend for the Auto Scaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your Auto Scaling Group from functioning properly", + "type": "list(string)" + }, + "tag_specifications": { + "default": [], + "description": "(LT) The tags to apply to the resources during launch", + "type": "list(any)" + }, + "tags": { + "default": [], + "description": "A list of tag blocks. Each element should have keys named key, value, and propagate_at_launch", + "type": "list(map(string))" + }, + "tags_as_map": { + "default": {}, + "description": "A map of tags and values in the same format as other resources accept. This will be converted into the non-standard format that the aws_autoscaling_group requires.", + "type": "map(string)" + }, + "target_group_arns": { + "default": [], + "description": "A set of `aws_alb_target_group` ARNs, for use with Application or Network Load Balancing", + "type": "list(string)", + "cloudcraft_name": "target_group_arns" + }, + "termination_policies": { + "default": "null", + "description": "A list of policies to decide how the instances in the Auto Scaling Group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `OldestLaunchTemplate`, `AllocationStrategy`, `Default`", + "type": "list(string)" + }, + "update_default_version": { + "default": "null", + "description": "(LT) Whether to update Default Version each update. Conflicts with `default_version`", + "type": "string" + }, + "use_lc": { + "default": false, + "description": "Determines whether to use a launch configuration in the autoscaling group or not", + "type": "bool" + }, + "use_lt": { + "default": false, + "description": "Determines whether to use a launch template in the autoscaling group or not", + "type": "bool" + }, + "use_mixed_instances_policy": { + "default": false, + "description": "Determines whether to use a mixed instances policy in the autoscaling group or not", + "type": "bool" + }, + "use_name_prefix": { + "default": true, + "description": "Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix", + "type": "bool" + }, + "user_data": { + "default": "null", + "description": "(LC) The user data to provide when launching the instance. Do not pass gzip-compressed data via this argument; see `user_data_base64` instead", + "type": "string" + }, + "user_data_base64": { + "default": "null", + "description": "The Base64-encoded user data to provide when launching the instance", + "type": "string" + }, + "vpc_zone_identifier": { + "default": "null", + "description": "A list of subnet IDs to launch resources in. Subnets automatically determine which availability zones the group will reside. Conflicts with `availability_zones`", + "type": "list(string)" + }, + "wait_for_capacity_timeout": { + "default": "null", + "description": "A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior.", + "type": "string" + }, + "wait_for_elb_capacity": { + "default": "null", + "description": "Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior.", + "type": "number" + } +} diff --git a/modules-metadata/autoscaling_cloudcraft.json b/src/terraform-aws-modules-metadata/autoscaling_cloudcraft.json similarity index 100% rename from modules-metadata/autoscaling_cloudcraft.json rename to src/terraform-aws-modules-metadata/autoscaling_cloudcraft.json diff --git a/src/terraform-aws-modules-metadata/autoscaling_variables.json b/src/terraform-aws-modules-metadata/autoscaling_variables.json new file mode 100644 index 0000000..d87f9fb --- /dev/null +++ b/src/terraform-aws-modules-metadata/autoscaling_variables.json @@ -0,0 +1,406 @@ +{ + "associate_public_ip_address": { + "default": "null", + "description": "(LC) Associate a public ip address with an instance in a VPC", + "type": "bool" + }, + "availability_zone": { + "default": "null", + "description": "A list of one or more availability zones for the group. Used for EC2-Classic and default subnets when not specified with `vpc_zone_identifier` argument. Conflicts with `vpc_zone_identifier`", + "type": "list(string)" + }, + "block_device_mappings": { + "default": [], + "description": "(LT) Specify volumes to attach to the instance besides the volumes specified by the AMI", + "type": "list(any)" + }, + "capacity_rebalance": { + "default": "null", + "description": "Indicates whether capacity rebalance is enabled", + "type": "bool" + }, + "capacity_reservation_specification": { + "default": "null", + "description": "(LT) Targeting for EC2 capacity reservations", + "type": "any" + }, + "cpu_options": { + "default": "null", + "description": "(LT) The CPU options for the instance", + "type": "map(string)" + }, + "create_asg": { + "default": true, + "description": "Determines whether to create autoscaling group or not", + "type": "bool" + }, + "create_lc": { + "default": false, + "description": "Determines whether to create launch configuration or not", + "type": "bool" + }, + "create_lt": { + "default": false, + "description": "Determines whether to create launch template or not", + "type": "bool" + }, + "credit_specification": { + "default": "null", + "description": "(LT) Customize the credit specification of the instance", + "type": "map(string)" + }, + "default_cooldown": { + "default": "null", + "description": "The amount of time, in seconds, after a scaling activity completes before another scaling activity can start", + "type": "number" + }, + "default_version": { + "default": "null", + "description": "(LT) Default Version of the launch template", + "type": "string" + }, + "delete_timeout": { + "default": "null", + "description": "Delete timeout to wait for destroying autoscaling group", + "type": "string" + }, + "description": { + "default": "null", + "description": "(LT) Description of the launch template", + "type": "string" + }, + "desired_capacity": { + "default": "null", + "description": "The number of Amazon EC2 instances that should be running in the autoscaling group", + "type": "number" + }, + "disable_api_termination": { + "default": "null", + "description": "(LT) If true, enables EC2 instance termination protection", + "type": "bool" + }, + "ebs_block_device": { + "default": [], + "description": "(LC) Additional EBS block devices to attach to the instance", + "type": "list(map(string))" + }, + "ebs_optimized": { + "default": "null", + "description": "If true, the launched EC2 instance will be EBS-optimized", + "type": "bool" + }, + "elastic_gpu_specifications": { + "default": "null", + "description": "(LT) The elastic GPU to attach to the instance", + "type": "map(string)" + }, + "elastic_inference_accelerator": { + "default": "null", + "description": "(LT) Configuration block containing an Elastic Inference Accelerator to attach to the instance", + "type": "map(string)" + }, + "enable_monitoring": { + "default": "null", + "description": "Enables/disables detailed monitoring", + "type": "bool" + }, + "enabled_metrics": { + "default": "null", + "description": "A list of metrics to collect. The allowed values are `GroupDesiredCapacity`, `GroupInServiceCapacity`, `GroupPendingCapacity`, `GroupMinSize`, `GroupMaxSize`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupStandbyCapacity`, `GroupTerminatingCapacity`, `GroupTerminatingInstances`, `GroupTotalCapacity`, `GroupTotalInstances`", + "type": "list(string)" + }, + "enclave_options": { + "default": "null", + "description": "(LT) Enable Nitro Enclaves on launched instances", + "type": "map(string)" + }, + "ephemeral_block_device": { + "default": [], + "description": "(LC) Customize Ephemeral (also known as 'Instance Store') volumes on the instance", + "type": "list(map(string))" + }, + "force_delete": { + "default": "null", + "description": "Allows deleting the Auto Scaling Group without waiting for all instances in the pool to terminate. You can force an Auto Scaling Group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling", + "type": "bool" + }, + "health_check_grace_period": { + "default": "null", + "description": "Time (in seconds) after instance comes into service before checking health", + "type": "number" + }, + "health_check_type": { + "default": "null", + "description": "`EC2` or `ELB`. Controls how health checking is done", + "type": "string" + }, + "hibernation_options": { + "default": "null", + "description": "(LT) The hibernation options for the instance", + "type": "map(string)" + }, + "iam_instance_profile_arn": { + "default": "null", + "description": "(LT) The IAM Instance Profile ARN to launch the instance with", + "type": "string" + }, + "iam_instance_profile_name": { + "default": "null", + "description": "The name attribute of the IAM instance profile to associate with launched instances", + "type": "string" + }, + "image_id": { + "default": "", + "description": "The AMI from which to launch the instance", + "type": "string" + }, + "initial_lifecycle_hooks": { + "default": [], + "description": "One or more Lifecycle Hooks to attach to the Auto Scaling Group before instances are launched. The syntax is exactly the same as the separate `aws_autoscaling_lifecycle_hook` resource, without the `autoscaling_group_name` attribute. Please note that this will only work when creating a new Auto Scaling Group. For all other use-cases, please use `aws_autoscaling_lifecycle_hook` resource", + "type": "list(map(string))" + }, + "instance_initiated_shutdown_behavior": { + "default": "null", + "description": "(LT) Shutdown behavior for the instance. Can be `stop` or `terminate`. (Default: `stop`)", + "type": "string" + }, + "instance_market_options": { + "default": "null", + "description": "(LT) The market (purchasing) option for the instance", + "type": "any" + }, + "instance_refresh": { + "default": "null", + "description": "If this block is configured, start an Instance Refresh when this Auto Scaling Group is updated", + "type": "any" + }, + "instance_type": { + "default": "", + "description": "The type of the instance to launch", + "type": "string" + }, + "kernel_id": { + "default": "null", + "description": "(LT) The kernel ID", + "type": "string" + }, + "key_name": { + "default": "null", + "description": "The key name that should be used for the instance", + "type": "string" + }, + "launch_configuration": { + "default": "null", + "description": "Name of an existing launch configuration to be used (created outside of this module)", + "type": "string" + }, + "launch_template": { + "default": "null", + "description": "Name of an existing launch template to be used (created outside of this module)", + "type": "string" + }, + "lc_name": { + "default": "", + "description": "Name of launch configuration to be created", + "type": "string" + }, + "lc_use_name_prefix": { + "default": true, + "description": "Determines whether to use `lc_name` as is or create a unique name beginning with the `lc_name` as the prefix", + "type": "bool" + }, + "license_specifications": { + "default": "null", + "description": "(LT) A list of license specifications to associate with", + "type": "map(string)" + }, + "load_balancers": { + "default": [], + "description": "A list of elastic load balancer names to add to the autoscaling group names. Only valid for classic load balancers. For ALBs, use `target_group_arns` instead", + "type": "list(string)" + }, + "lt_name": { + "default": "", + "description": "Name of launch template to be created", + "type": "string" + }, + "lt_use_name_prefix": { + "default": true, + "description": "Determines whether to use `lt_name` as is or create a unique name beginning with the `lt_name` as the prefix", + "type": "bool" + }, + "lt_version": { + "default": "null", + "description": "Launch template version. Can be version number, `$Latest`, or `$Default`", + "type": "string" + }, + "max_instance_lifetime": { + "default": "null", + "description": "The maximum amount of time, in seconds, that an instance can be in service, values must be either equal to 0 or between 604800 and 31536000 seconds", + "type": "number" + }, + "max_size": { + "default": "null", + "description": "The maximum size of the autoscaling group", + "type": "number" + }, + "metadata_options": { + "default": "null", + "description": "Customize the metadata options for the instance", + "type": "map(string)" + }, + "metrics_granularity": { + "default": "null", + "description": "The granularity to associate with the metrics to collect. The only valid value is `1Minute`", + "type": "string" + }, + "min_elb_capacity": { + "default": "null", + "description": "Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes", + "type": "number" + }, + "min_size": { + "default": "null", + "description": "The minimum size of the autoscaling group", + "type": "number" + }, + "mixed_instances_policy": { + "default": "null", + "description": "Configuration block containing settings to define launch targets for Auto Scaling groups", + "type": "any" + }, + "name": { + "description": "Name used across the resources created", + "type": "string" + }, + "network_interfaces": { + "default": [], + "description": "(LT) Customize network interfaces to be attached at instance boot time", + "type": "list(any)" + }, + "placement": { + "default": "null", + "description": "(LT) The placement of the instance", + "type": "map(string)" + }, + "placement_group": { + "default": "null", + "description": "The name of the placement group into which you'll launch your instances, if any", + "type": "string" + }, + "placement_tenancy": { + "default": "null", + "description": "(LC) The tenancy of the instance. Valid values are `default` or `dedicated`", + "type": "string" + }, + "protect_from_scale_in": { + "default": false, + "description": "Allows setting instance protection. The autoscaling group will not select instances with this setting for termination during scale in events.", + "type": "bool" + }, + "ram_disk_id": { + "default": "null", + "description": "(LT) The ID of the ram disk", + "type": "string" + }, + "root_block_device": { + "default": [], + "description": "(LC) Customize details about the root block device of the instance", + "type": "list(map(string))" + }, + "security_groups": { + "default": "null", + "description": "A list of security group IDs to associate", + "type": "list(string)" + }, + "service_linked_role_arn": { + "default": "null", + "description": "The ARN of the service-linked role that the ASG will use to call other AWS services", + "type": "string" + }, + "spot_price": { + "default": "null", + "description": "(LC) The maximum price to use for reserving spot instances (defaults to on-demand price)", + "type": "string" + }, + "suspended_processes": { + "default": "null", + "description": "A list of processes to suspend for the Auto Scaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your Auto Scaling Group from functioning properly", + "type": "list(string)" + }, + "tag_specifications": { + "default": [], + "description": "(LT) The tags to apply to the resources during launch", + "type": "list(any)" + }, + "tags": { + "default": [], + "description": "A list of tag blocks. Each element should have keys named key, value, and propagate_at_launch", + "type": "list(map(string))" + }, + "tags_as_map": { + "default": {}, + "description": "A map of tags and values in the same format as other resources accept. This will be converted into the non-standard format that the aws_autoscaling_group requires.", + "type": "map(string)" + }, + "target_group_arns": { + "default": [], + "description": "A set of `aws_alb_target_group` ARNs, for use with Application or Network Load Balancing", + "type": "list(string)" + }, + "termination_policies": { + "default": "null", + "description": "A list of policies to decide how the instances in the Auto Scaling Group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `OldestLaunchTemplate`, `AllocationStrategy`, `Default`", + "type": "list(string)" + }, + "update_default_version": { + "default": "null", + "description": "(LT) Whether to update Default Version each update. Conflicts with `default_version`", + "type": "string" + }, + "use_lc": { + "default": false, + "description": "Determines whether to use a launch configuration in the autoscaling group or not", + "type": "bool" + }, + "use_lt": { + "default": false, + "description": "Determines whether to use a launch template in the autoscaling group or not", + "type": "bool" + }, + "use_mixed_instances_policy": { + "default": false, + "description": "Determines whether to use a mixed instances policy in the autoscaling group or not", + "type": "bool" + }, + "use_name_prefix": { + "default": true, + "description": "Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix", + "type": "bool" + }, + "user_data": { + "default": "null", + "description": "(LC) The user data to provide when launching the instance. Do not pass gzip-compressed data via this argument; see `user_data_base64` instead", + "type": "string" + }, + "user_data_base64": { + "default": "null", + "description": "The Base64-encoded user data to provide when launching the instance", + "type": "string" + }, + "vpc_zone_identifier": { + "default": "null", + "description": "A list of subnet IDs to launch resources in. Subnets automatically determine which availability zones the group will reside. Conflicts with `availability_zones`", + "type": "list(string)" + }, + "wait_for_capacity_timeout": { + "default": "null", + "description": "A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior.", + "type": "string" + }, + "wait_for_elb_capacity": { + "default": "null", + "description": "Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior.", + "type": "number" + } +} diff --git a/src/terraform-aws-modules-metadata/autoscaling_version.txt b/src/terraform-aws-modules-metadata/autoscaling_version.txt new file mode 100644 index 0000000..b913b7c --- /dev/null +++ b/src/terraform-aws-modules-metadata/autoscaling_version.txt @@ -0,0 +1 @@ +v4.1.0 diff --git a/src/terraform-aws-modules-metadata/cloudfront.json b/src/terraform-aws-modules-metadata/cloudfront.json new file mode 100644 index 0000000..645b69f --- /dev/null +++ b/src/terraform-aws-modules-metadata/cloudfront.json @@ -0,0 +1,115 @@ +{ + "aliases": { + "default": "null", + "description": "Extra CNAMEs (alternate domain names), if any, for this distribution.", + "type": "list(string)" + }, + "comment": { + "default": "null", + "description": "Any comments you want to include about the distribution.", + "type": "string" + }, + "create_distribution": { + "default": true, + "description": "Controls if CloudFront distribution should be created", + "type": "bool" + }, + "create_origin_access_identity": { + "default": false, + "description": "Controls if CloudFront origin access identity should be created", + "type": "bool" + }, + "custom_error_response": { + "default": {}, + "description": "One or more custom error response elements", + "type": "any" + }, + "default_cache_behavior": { + "default": "null", + "description": "The default cache behavior for this distribution", + "type": "any" + }, + "default_root_object": { + "default": "null", + "description": "The object that you want CloudFront to return (for example, index.html) when an end user requests the root URL.", + "type": "string" + }, + "enabled": { + "default": true, + "description": "Whether the distribution is enabled to accept end user requests for content.", + "type": "bool" + }, + "geo_restriction": { + "default": {}, + "description": "The restriction configuration for this distribution (geo_restrictions)", + "type": "any" + }, + "http_version": { + "default": "http2", + "description": "The maximum HTTP version to support on the distribution. Allowed values are http1.1 and http2. The default is http2.", + "type": "string" + }, + "is_ipv6_enabled": { + "default": "null", + "description": "Whether the IPv6 is enabled for the distribution.", + "type": "bool" + }, + "logging_config": { + "default": {}, + "description": "The logging configuration that controls how logs are written to your distribution (maximum one).", + "type": "any" + }, + "ordered_cache_behavior": { + "default": [], + "description": "An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.", + "type": "any" + }, + "origin": { + "default": "null", + "description": "One or more origins for this distribution (multiples allowed).", + "type": "any" + }, + "origin_access_identities": { + "default": {}, + "description": "Map of CloudFront origin access identities (value as a comment)", + "type": "map(string)" + }, + "origin_group": { + "default": {}, + "description": "One or more origin_group for this distribution (multiples allowed).", + "type": "any" + }, + "price_class": { + "default": "null", + "description": "The price class for this distribution. One of PriceClass_All, PriceClass_200, PriceClass_100", + "type": "string" + }, + "retain_on_delete": { + "default": false, + "description": "Disables the distribution instead of deleting it when destroying the resource through Terraform. If this is set, the distribution needs to be deleted manually afterwards.", + "type": "bool" + }, + "tags": { + "default": "null", + "description": "A map of tags to assign to the resource.", + "type": "map(string)" + }, + "viewer_certificate": { + "default": { + "cloudfront_default_certificate": true, + "minimum_protocol_version": "TLSv1" + }, + "description": "The SSL configuration for this distribution", + "type": "any" + }, + "wait_for_deployment": { + "default": true, + "description": "If enabled, the resource will wait for the distribution status to change from InProgress to Deployed. Setting this tofalse will skip the process.", + "type": "bool" + }, + "web_acl_id": { + "default": "null", + "description": "If you're using AWS WAF to filter CloudFront requests, the Id of the AWS WAF web ACL that is associated with the distribution. The WAF Web ACL must exist in the WAF Global (CloudFront) region and the credentials configuring this argument must have waf:GetWebACL permissions assigned. If using WAFv2, provide the ARN of the web ACL.", + "type": "string" + } +} diff --git a/modules-metadata/elb_cloudcraft.json b/src/terraform-aws-modules-metadata/cloudfront_cloudcraft.json similarity index 100% rename from modules-metadata/elb_cloudcraft.json rename to src/terraform-aws-modules-metadata/cloudfront_cloudcraft.json diff --git a/src/terraform-aws-modules-metadata/cloudfront_variables.json b/src/terraform-aws-modules-metadata/cloudfront_variables.json new file mode 100644 index 0000000..645b69f --- /dev/null +++ b/src/terraform-aws-modules-metadata/cloudfront_variables.json @@ -0,0 +1,115 @@ +{ + "aliases": { + "default": "null", + "description": "Extra CNAMEs (alternate domain names), if any, for this distribution.", + "type": "list(string)" + }, + "comment": { + "default": "null", + "description": "Any comments you want to include about the distribution.", + "type": "string" + }, + "create_distribution": { + "default": true, + "description": "Controls if CloudFront distribution should be created", + "type": "bool" + }, + "create_origin_access_identity": { + "default": false, + "description": "Controls if CloudFront origin access identity should be created", + "type": "bool" + }, + "custom_error_response": { + "default": {}, + "description": "One or more custom error response elements", + "type": "any" + }, + "default_cache_behavior": { + "default": "null", + "description": "The default cache behavior for this distribution", + "type": "any" + }, + "default_root_object": { + "default": "null", + "description": "The object that you want CloudFront to return (for example, index.html) when an end user requests the root URL.", + "type": "string" + }, + "enabled": { + "default": true, + "description": "Whether the distribution is enabled to accept end user requests for content.", + "type": "bool" + }, + "geo_restriction": { + "default": {}, + "description": "The restriction configuration for this distribution (geo_restrictions)", + "type": "any" + }, + "http_version": { + "default": "http2", + "description": "The maximum HTTP version to support on the distribution. Allowed values are http1.1 and http2. The default is http2.", + "type": "string" + }, + "is_ipv6_enabled": { + "default": "null", + "description": "Whether the IPv6 is enabled for the distribution.", + "type": "bool" + }, + "logging_config": { + "default": {}, + "description": "The logging configuration that controls how logs are written to your distribution (maximum one).", + "type": "any" + }, + "ordered_cache_behavior": { + "default": [], + "description": "An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.", + "type": "any" + }, + "origin": { + "default": "null", + "description": "One or more origins for this distribution (multiples allowed).", + "type": "any" + }, + "origin_access_identities": { + "default": {}, + "description": "Map of CloudFront origin access identities (value as a comment)", + "type": "map(string)" + }, + "origin_group": { + "default": {}, + "description": "One or more origin_group for this distribution (multiples allowed).", + "type": "any" + }, + "price_class": { + "default": "null", + "description": "The price class for this distribution. One of PriceClass_All, PriceClass_200, PriceClass_100", + "type": "string" + }, + "retain_on_delete": { + "default": false, + "description": "Disables the distribution instead of deleting it when destroying the resource through Terraform. If this is set, the distribution needs to be deleted manually afterwards.", + "type": "bool" + }, + "tags": { + "default": "null", + "description": "A map of tags to assign to the resource.", + "type": "map(string)" + }, + "viewer_certificate": { + "default": { + "cloudfront_default_certificate": true, + "minimum_protocol_version": "TLSv1" + }, + "description": "The SSL configuration for this distribution", + "type": "any" + }, + "wait_for_deployment": { + "default": true, + "description": "If enabled, the resource will wait for the distribution status to change from InProgress to Deployed. Setting this tofalse will skip the process.", + "type": "bool" + }, + "web_acl_id": { + "default": "null", + "description": "If you're using AWS WAF to filter CloudFront requests, the Id of the AWS WAF web ACL that is associated with the distribution. The WAF Web ACL must exist in the WAF Global (CloudFront) region and the credentials configuring this argument must have waf:GetWebACL permissions assigned. If using WAFv2, provide the ARN of the web ACL.", + "type": "string" + } +} diff --git a/modules-metadata/redshift_version.txt b/src/terraform-aws-modules-metadata/cloudfront_version.txt similarity index 100% rename from modules-metadata/redshift_version.txt rename to src/terraform-aws-modules-metadata/cloudfront_version.txt diff --git a/modules-metadata/dynamodb-table.json b/src/terraform-aws-modules-metadata/dynamodb-table.json similarity index 78% rename from modules-metadata/dynamodb-table.json rename to src/terraform-aws-modules-metadata/dynamodb-table.json index 4b40d00..d3cde0b 100644 --- a/modules-metadata/dynamodb-table.json +++ b/src/terraform-aws-modules-metadata/dynamodb-table.json @@ -4,6 +4,30 @@ "description": "List of nested attribute definitions. Only required for hash_key and range_key attributes. Each attribute has two properties: name - (Required) The name of the attribute, type - (Required) Attribute type, which must be a scalar type: S, N, or B for (S)tring, (N)umber or (B)inary data", "type": "list(map(string))" }, + "autoscaling_defaults": { + "default": { + "scale_in_cooldown": 0, + "scale_out_cooldown": 0, + "target_value": 70 + }, + "description": "A map of default autoscaling settings", + "type": "map(string)" + }, + "autoscaling_indexes": { + "default": {}, + "description": "A map of index autoscaling configurations. See example in examples/autoscaling", + "type": "map(map(string))" + }, + "autoscaling_read": { + "default": {}, + "description": "A map of read autoscaling settings. `max_capacity` is the only required key. See example in examples/autoscaling", + "type": "map(string)" + }, + "autoscaling_write": { + "default": {}, + "description": "A map of write autoscaling settings. `max_capacity` is the only required key. See example in examples/autoscaling", + "type": "map(string)" + }, "billing_mode": { "default": "PAY_PER_REQUEST", "description": "Controls how you are billed for read/write throughput and how you manage capacity. The valid values are PROVISIONED or PAY_PER_REQUEST", @@ -17,7 +41,7 @@ "global_secondary_indexes": { "default": [], "description": "Describe a GSI for the table; subject to the normal limits on the number of GSIs, projected attributes, etc.", - "type": "list(any)" + "type": "any" }, "hash_key": { "default": "null", @@ -27,7 +51,7 @@ "local_secondary_indexes": { "default": [], "description": "Describe an LSI on the table; these can only be allocated at creation so you cannot change this definition after you have created the resource.", - "type": "list(any)" + "type": "any" }, "name": { "default": "null", @@ -49,6 +73,11 @@ "description": "The number of read units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", "type": "number" }, + "replica_regions": { + "default": [], + "description": "Region names for creating replicas for a global DynamoDB table.", + "type": "list(string)" + }, "server_side_encryption_enabled": { "default": false, "description": "Whether or not to enable encryption at rest using an AWS managed KMS customer master key (CMK)", diff --git a/modules-metadata/s3-bucket_cloudcraft.json b/src/terraform-aws-modules-metadata/dynamodb-table_cloudcraft.json similarity index 100% rename from modules-metadata/s3-bucket_cloudcraft.json rename to src/terraform-aws-modules-metadata/dynamodb-table_cloudcraft.json diff --git a/modules-metadata/dynamodb-table_variables.json b/src/terraform-aws-modules-metadata/dynamodb-table_variables.json similarity index 78% rename from modules-metadata/dynamodb-table_variables.json rename to src/terraform-aws-modules-metadata/dynamodb-table_variables.json index 4b40d00..d3cde0b 100644 --- a/modules-metadata/dynamodb-table_variables.json +++ b/src/terraform-aws-modules-metadata/dynamodb-table_variables.json @@ -4,6 +4,30 @@ "description": "List of nested attribute definitions. Only required for hash_key and range_key attributes. Each attribute has two properties: name - (Required) The name of the attribute, type - (Required) Attribute type, which must be a scalar type: S, N, or B for (S)tring, (N)umber or (B)inary data", "type": "list(map(string))" }, + "autoscaling_defaults": { + "default": { + "scale_in_cooldown": 0, + "scale_out_cooldown": 0, + "target_value": 70 + }, + "description": "A map of default autoscaling settings", + "type": "map(string)" + }, + "autoscaling_indexes": { + "default": {}, + "description": "A map of index autoscaling configurations. See example in examples/autoscaling", + "type": "map(map(string))" + }, + "autoscaling_read": { + "default": {}, + "description": "A map of read autoscaling settings. `max_capacity` is the only required key. See example in examples/autoscaling", + "type": "map(string)" + }, + "autoscaling_write": { + "default": {}, + "description": "A map of write autoscaling settings. `max_capacity` is the only required key. See example in examples/autoscaling", + "type": "map(string)" + }, "billing_mode": { "default": "PAY_PER_REQUEST", "description": "Controls how you are billed for read/write throughput and how you manage capacity. The valid values are PROVISIONED or PAY_PER_REQUEST", @@ -17,7 +41,7 @@ "global_secondary_indexes": { "default": [], "description": "Describe a GSI for the table; subject to the normal limits on the number of GSIs, projected attributes, etc.", - "type": "list(any)" + "type": "any" }, "hash_key": { "default": "null", @@ -27,7 +51,7 @@ "local_secondary_indexes": { "default": [], "description": "Describe an LSI on the table; these can only be allocated at creation so you cannot change this definition after you have created the resource.", - "type": "list(any)" + "type": "any" }, "name": { "default": "null", @@ -49,6 +73,11 @@ "description": "The number of read units for this table. If the billing_mode is PROVISIONED, this field should be greater than 0", "type": "number" }, + "replica_regions": { + "default": [], + "description": "Region names for creating replicas for a global DynamoDB table.", + "type": "list(string)" + }, "server_side_encryption_enabled": { "default": false, "description": "Whether or not to enable encryption at rest using an AWS managed KMS customer master key (CMK)", diff --git a/src/terraform-aws-modules-metadata/dynamodb-table_version.txt b/src/terraform-aws-modules-metadata/dynamodb-table_version.txt new file mode 100644 index 0000000..0ec25f7 --- /dev/null +++ b/src/terraform-aws-modules-metadata/dynamodb-table_version.txt @@ -0,0 +1 @@ +v1.0.0 diff --git a/modules-metadata/ec2-instance.json b/src/terraform-aws-modules-metadata/ec2-instance.json similarity index 94% rename from modules-metadata/ec2-instance.json rename to src/terraform-aws-modules-metadata/ec2-instance.json index 410c4ab..444beed 100644 --- a/modules-metadata/ec2-instance.json +++ b/src/terraform-aws-modules-metadata/ec2-instance.json @@ -73,6 +73,11 @@ "description": "The key name to use for the instance", "type": "string" }, + "metadata_options": { + "default": {}, + "description": "Customize the metadata options of the instance", + "type": "map(string)" + }, "monitoring": { "default": false, "description": "If true, the launched EC2 instance will have detailed monitoring enabled", @@ -87,6 +92,11 @@ "description": "Customize network interfaces to be attached at instance boot time", "type": "list(map(string))" }, + "num_suffix_format": { + "default": "-%d", + "description": "Numerical suffix format used as the volume and EC2 instance name suffix", + "type": "string" + }, "placement_group": { "default": "", "description": "The Placement Group to start the instance in", diff --git a/modules-metadata/ec2-instance_cloudcraft.json b/src/terraform-aws-modules-metadata/ec2-instance_cloudcraft.json similarity index 100% rename from modules-metadata/ec2-instance_cloudcraft.json rename to src/terraform-aws-modules-metadata/ec2-instance_cloudcraft.json diff --git a/modules-metadata/ec2-instance_variables.json b/src/terraform-aws-modules-metadata/ec2-instance_variables.json similarity index 94% rename from modules-metadata/ec2-instance_variables.json rename to src/terraform-aws-modules-metadata/ec2-instance_variables.json index 76e759d..e2e7664 100644 --- a/modules-metadata/ec2-instance_variables.json +++ b/src/terraform-aws-modules-metadata/ec2-instance_variables.json @@ -72,6 +72,11 @@ "description": "The key name to use for the instance", "type": "string" }, + "metadata_options": { + "default": {}, + "description": "Customize the metadata options of the instance", + "type": "map(string)" + }, "monitoring": { "default": false, "description": "If true, the launched EC2 instance will have detailed monitoring enabled", @@ -86,6 +91,11 @@ "description": "Customize network interfaces to be attached at instance boot time", "type": "list(map(string))" }, + "num_suffix_format": { + "default": "-%d", + "description": "Numerical suffix format used as the volume and EC2 instance name suffix", + "type": "string" + }, "placement_group": { "default": "", "description": "The Placement Group to start the instance in", diff --git a/src/terraform-aws-modules-metadata/ec2-instance_version.txt b/src/terraform-aws-modules-metadata/ec2-instance_version.txt new file mode 100644 index 0000000..c0436de --- /dev/null +++ b/src/terraform-aws-modules-metadata/ec2-instance_version.txt @@ -0,0 +1 @@ +v2.17.0 diff --git a/modules-metadata/elb.json b/src/terraform-aws-modules-metadata/elb.json similarity index 94% rename from modules-metadata/elb.json rename to src/terraform-aws-modules-metadata/elb.json index 8cbe7ac..0bab1ef 100644 --- a/modules-metadata/elb.json +++ b/src/terraform-aws-modules-metadata/elb.json @@ -14,6 +14,11 @@ "description": "The time in seconds to allow for connections to drain", "type": "number" }, + "create_elb": { + "default": true, + "description": "Create the elb or not", + "type": "bool" + }, "cross_zone_load_balancing": { "default": true, "description": "Enable cross-zone load balancing", diff --git a/modules-metadata/security-group_cloudcraft.json b/src/terraform-aws-modules-metadata/elb_cloudcraft.json similarity index 100% rename from modules-metadata/security-group_cloudcraft.json rename to src/terraform-aws-modules-metadata/elb_cloudcraft.json diff --git a/modules-metadata/elb_variables.json b/src/terraform-aws-modules-metadata/elb_variables.json similarity index 94% rename from modules-metadata/elb_variables.json rename to src/terraform-aws-modules-metadata/elb_variables.json index 8cbe7ac..0bab1ef 100644 --- a/modules-metadata/elb_variables.json +++ b/src/terraform-aws-modules-metadata/elb_variables.json @@ -14,6 +14,11 @@ "description": "The time in seconds to allow for connections to drain", "type": "number" }, + "create_elb": { + "default": true, + "description": "Create the elb or not", + "type": "bool" + }, "cross_zone_load_balancing": { "default": true, "description": "Enable cross-zone load balancing", diff --git a/src/terraform-aws-modules-metadata/elb_version.txt b/src/terraform-aws-modules-metadata/elb_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/elb_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/src/terraform-aws-modules-metadata/lambda.json b/src/terraform-aws-modules-metadata/lambda.json new file mode 100644 index 0000000..d9f3f7b --- /dev/null +++ b/src/terraform-aws-modules-metadata/lambda.json @@ -0,0 +1,452 @@ +{ + "allowed_triggers": { + "default": {}, + "description": "Map of allowed triggers to create Lambda permissions", + "type": "map(any)" + }, + "artifacts_dir": { + "default": "builds", + "description": "Directory name where artifacts should be stored", + "type": "string" + }, + "attach_async_event_policy": { + "default": false, + "description": "Controls whether async event policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_cloudwatch_logs_policy": { + "default": true, + "description": "Controls whether CloudWatch Logs policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_dead_letter_policy": { + "default": false, + "description": "Controls whether SNS/SQS dead letter notification policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_network_policy": { + "default": false, + "description": "Controls whether VPC/network policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policies": { + "default": false, + "description": "Controls whether list of policies should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy": { + "default": false, + "description": "Controls whether policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_json": { + "default": false, + "description": "Controls whether policy_json should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_jsons": { + "default": false, + "description": "Controls whether policy_jsons should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_statements": { + "default": false, + "description": "Controls whether policy_statements should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_tracing_policy": { + "default": false, + "description": "Controls whether X-Ray tracing policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "build_in_docker": { + "default": false, + "description": "Whether to build dependencies in Docker", + "type": "bool" + }, + "cloudwatch_logs_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data.", + "type": "string" + }, + "cloudwatch_logs_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653.", + "type": "number" + }, + "cloudwatch_logs_tags": { + "default": {}, + "description": "A map of tags to assign to the resource.", + "type": "map(string)" + }, + "compatible_runtimes": { + "default": [], + "description": "A list of Runtimes this layer is compatible with. Up to 5 runtimes can be specified.", + "type": "list(string)" + }, + "create": { + "default": true, + "description": "Controls whether resources should be created", + "type": "bool" + }, + "create_async_event_config": { + "default": false, + "description": "Controls whether async event configuration for Lambda Function/Alias should be created", + "type": "bool" + }, + "create_current_version_allowed_triggers": { + "default": true, + "description": "Whether to allow triggers on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources)", + "type": "bool" + }, + "create_current_version_async_event_config": { + "default": true, + "description": "Whether to allow async event configuration on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources)", + "type": "bool" + }, + "create_function": { + "default": true, + "description": "Controls whether Lambda Function resource should be created", + "type": "bool" + }, + "create_layer": { + "default": false, + "description": "Controls whether Lambda Layer resource should be created", + "type": "bool" + }, + "create_package": { + "default": true, + "description": "Controls whether Lambda package should be created", + "type": "bool" + }, + "create_role": { + "default": true, + "description": "Controls whether IAM role for Lambda Function should be created", + "type": "bool" + }, + "create_unqualified_alias_allowed_triggers": { + "default": true, + "description": "Whether to allow triggers on unqualified alias pointing to $LATEST version", + "type": "bool" + }, + "create_unqualified_alias_async_event_config": { + "default": true, + "description": "Whether to allow async event configuration on unqualified alias pointing to $LATEST version", + "type": "bool" + }, + "dead_letter_target_arn": { + "default": "null", + "description": "The ARN of an SNS topic or SQS queue to notify when an invocation fails.", + "type": "string" + }, + "description": { + "default": "", + "description": "Description of your Lambda Function (or Layer)", + "type": "string" + }, + "destination_on_failure": { + "default": "null", + "description": "Amazon Resource Name (ARN) of the destination resource for failed asynchronous invocations", + "type": "string" + }, + "destination_on_success": { + "default": "null", + "description": "Amazon Resource Name (ARN) of the destination resource for successful asynchronous invocations", + "type": "string" + }, + "docker_build_root": { + "default": "", + "description": "Root dir where to build in Docker", + "type": "string" + }, + "docker_file": { + "default": "", + "description": "Path to a Dockerfile when building in Docker", + "type": "string" + }, + "docker_image": { + "default": "", + "description": "Docker image to use for the build", + "type": "string" + }, + "docker_pip_cache": { + "default": "null", + "description": "Whether to mount a shared pip cache folder into docker environment or not", + "type": "any" + }, + "docker_with_ssh_agent": { + "default": false, + "description": "Whether to pass SSH_AUTH_SOCK into docker environment or not", + "type": "bool" + }, + "environment_variables": { + "default": {}, + "description": "A map that defines environment variables for the Lambda Function.", + "type": "map(string)" + }, + "event_source_mapping": { + "default": {}, + "description": "Map of event source mapping", + "type": "any" + }, + "file_system_arn": { + "default": "null", + "description": "The Amazon Resource Name (ARN) of the Amazon EFS Access Point that provides access to the file system.", + "type": "string" + }, + "file_system_local_mount_path": { + "default": "null", + "description": "The path where the function can access the file system, starting with /mnt/.", + "type": "string" + }, + "function_name": { + "default": "", + "description": "A unique name for your Lambda Function", + "type": "string" + }, + "handler": { + "default": "", + "description": "Lambda Function entrypoint in your code", + "type": "string" + }, + "hash_extra": { + "default": "", + "description": "The string to add into hashing function. Useful when building same source path for different functions.", + "type": "string" + }, + "image_config_command": { + "default": [], + "description": "The CMD for the docker image", + "type": "list(string)" + }, + "image_config_entry_point": { + "default": [], + "description": "The ENTRYPOINT for the docker image", + "type": "list(string)" + }, + "image_config_working_directory": { + "default": "null", + "description": "The working directory for the docker image", + "type": "string" + }, + "image_uri": { + "default": "null", + "description": "The ECR image URI containing the function's deployment package.", + "type": "string" + }, + "kms_key_arn": { + "default": "null", + "description": "The ARN of KMS key to use by your Lambda Function", + "type": "string" + }, + "lambda_at_edge": { + "default": false, + "description": "Set this to true if using Lambda@Edge, to enable publishing, limit the timeout, and allow edgelambda.amazonaws.com to invoke the function", + "type": "bool" + }, + "lambda_role": { + "default": "", + "description": " IAM role ARN attached to the Lambda Function. This governs both who / what can invoke your Lambda Function, as well as what resources our Lambda Function has access to. See Lambda Permission Model for more details.", + "type": "string" + }, + "layer_name": { + "default": "", + "description": "Name of Lambda Layer to create", + "type": "string" + }, + "layers": { + "default": "null", + "description": "List of Lambda Layer Version ARNs (maximum of 5) to attach to your Lambda Function.", + "type": "list(string)" + }, + "license_info": { + "default": "", + "description": "License info for your Lambda Layer. Eg, MIT or full url of a license.", + "type": "string" + }, + "local_existing_package": { + "default": "null", + "description": "The absolute path to an existing zip-file to use", + "type": "string" + }, + "maximum_event_age_in_seconds": { + "default": "null", + "description": "Maximum age of a request that Lambda sends to a function for processing in seconds. Valid values between 60 and 21600.", + "type": "number" + }, + "maximum_retry_attempts": { + "default": "null", + "description": "Maximum number of times to retry when the function returns an error. Valid values between 0 and 2. Defaults to 2.", + "type": "number" + }, + "memory_size": { + "default": 128, + "description": "Amount of memory in MB your Lambda Function can use at runtime. Valid value between 128 MB to 10,240 MB (10 GB), in 64 MB increments.", + "type": "number" + }, + "number_of_policies": { + "default": 0, + "description": "Number of policies to attach to IAM role for Lambda Function", + "type": "number" + }, + "number_of_policy_jsons": { + "default": 0, + "description": "Number of policies JSON to attach to IAM role for Lambda Function", + "type": "number" + }, + "package_type": { + "default": "Zip", + "description": "The Lambda deployment package type. Valid options: Zip or Image", + "type": "string" + }, + "policies": { + "default": [], + "description": "List of policy statements ARN to attach to Lambda Function role", + "type": "list(string)" + }, + "policy": { + "default": "null", + "description": "An additional policy document ARN to attach to the Lambda Function role", + "type": "string" + }, + "policy_json": { + "default": "null", + "description": "An additional policy document as JSON to attach to the Lambda Function role", + "type": "string" + }, + "policy_jsons": { + "default": [], + "description": "List of additional policy documents as JSON to attach to Lambda Function role", + "type": "list(string)" + }, + "policy_statements": { + "default": {}, + "description": "Map of dynamic policy statements to attach to Lambda Function role", + "type": "any" + }, + "provisioned_concurrent_executions": { + "default": -1, + "description": "Amount of capacity to allocate. Set to 1 or greater to enable, or set to 0 to disable provisioned concurrency.", + "type": "number" + }, + "publish": { + "default": false, + "description": "Whether to publish creation/change as new Lambda Function Version.", + "type": "bool" + }, + "reserved_concurrent_executions": { + "default": -1, + "description": "The amount of reserved concurrent executions for this Lambda Function. A value of 0 disables Lambda Function from being triggered and -1 removes any concurrency limitations. Defaults to Unreserved Concurrency Limits -1.", + "type": "number" + }, + "role_description": { + "default": "null", + "description": "Description of IAM role to use for Lambda Function", + "type": "string" + }, + "role_force_detach_policies": { + "default": true, + "description": "Specifies to force detaching any policies the IAM role has before destroying it.", + "type": "bool" + }, + "role_name": { + "default": "null", + "description": "Name of IAM role to use for Lambda Function", + "type": "string" + }, + "role_path": { + "default": "null", + "description": "Path of IAM role to use for Lambda Function", + "type": "string" + }, + "role_permissions_boundary": { + "default": "null", + "description": "The ARN of the policy that is used to set the permissions boundary for the IAM role used by Lambda Function", + "type": "string" + }, + "role_tags": { + "default": {}, + "description": "A map of tags to assign to IAM role", + "type": "map(string)" + }, + "runtime": { + "default": "", + "description": "Lambda Function runtime", + "type": "string" + }, + "s3_acl": { + "default": "private", + "description": "The canned ACL to apply. Valid values are private, public-read, public-read-write, aws-exec-read, authenticated-read, bucket-owner-read, and bucket-owner-full-control. Defaults to private.", + "type": "string" + }, + "s3_bucket": { + "default": "null", + "description": "S3 bucket to store artifacts", + "type": "string" + }, + "s3_existing_package": { + "default": "null", + "description": "The S3 bucket object with keys bucket, key, version pointing to an existing zip-file to use", + "type": "map(string)" + }, + "s3_object_storage_class": { + "default": "ONEZONE_IA", + "description": "Specifies the desired Storage Class for the artifact uploaded to S3. Can be either STANDARD, REDUCED_REDUNDANCY, ONEZONE_IA, INTELLIGENT_TIERING, or STANDARD_IA.", + "type": "string" + }, + "s3_object_tags": { + "default": {}, + "description": "A map of tags to assign to S3 bucket object.", + "type": "map(string)" + }, + "s3_server_side_encryption": { + "default": "null", + "description": "Specifies server-side encryption of the object in S3. Valid values are \"AES256\" and \"aws:kms\".", + "type": "string" + }, + "source_path": { + "default": "null", + "description": "The absolute path to a local file or directory containing your Lambda source code", + "type": "any" + }, + "store_on_s3": { + "default": false, + "description": "Whether to store produced artifacts on S3 or locally.", + "type": "bool" + }, + "tags": { + "default": {}, + "description": "A map of tags to assign to resources.", + "type": "map(string)" + }, + "timeout": { + "default": 3, + "description": "The amount of time your Lambda Function has to run in seconds.", + "type": "number" + }, + "tracing_mode": { + "default": "null", + "description": "Tracing mode of the Lambda Function. Valid value can be either PassThrough or Active.", + "type": "string" + }, + "trusted_entities": { + "default": [], + "description": "List of additional trusted entities for assuming Lambda Function role (trust relationship)", + "type": "any" + }, + "use_existing_cloudwatch_log_group": { + "default": false, + "description": "Whether to use an existing CloudWatch log group or create new", + "type": "bool" + }, + "vpc_security_group_ids": { + "default": "null", + "description": "List of security group ids when Lambda Function should run in the VPC.", + "type": "list(string)" + }, + "vpc_subnet_ids": { + "default": "null", + "description": "List of subnet ids when Lambda Function should run in the VPC. Usually private or intra subnets.", + "type": "list(string)" + } +} diff --git a/modules-metadata/sns_cloudcraft.json b/src/terraform-aws-modules-metadata/lambda_cloudcraft.json similarity index 100% rename from modules-metadata/sns_cloudcraft.json rename to src/terraform-aws-modules-metadata/lambda_cloudcraft.json diff --git a/src/terraform-aws-modules-metadata/lambda_variables.json b/src/terraform-aws-modules-metadata/lambda_variables.json new file mode 100644 index 0000000..d9f3f7b --- /dev/null +++ b/src/terraform-aws-modules-metadata/lambda_variables.json @@ -0,0 +1,452 @@ +{ + "allowed_triggers": { + "default": {}, + "description": "Map of allowed triggers to create Lambda permissions", + "type": "map(any)" + }, + "artifacts_dir": { + "default": "builds", + "description": "Directory name where artifacts should be stored", + "type": "string" + }, + "attach_async_event_policy": { + "default": false, + "description": "Controls whether async event policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_cloudwatch_logs_policy": { + "default": true, + "description": "Controls whether CloudWatch Logs policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_dead_letter_policy": { + "default": false, + "description": "Controls whether SNS/SQS dead letter notification policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_network_policy": { + "default": false, + "description": "Controls whether VPC/network policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policies": { + "default": false, + "description": "Controls whether list of policies should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy": { + "default": false, + "description": "Controls whether policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_json": { + "default": false, + "description": "Controls whether policy_json should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_jsons": { + "default": false, + "description": "Controls whether policy_jsons should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_policy_statements": { + "default": false, + "description": "Controls whether policy_statements should be added to IAM role for Lambda Function", + "type": "bool" + }, + "attach_tracing_policy": { + "default": false, + "description": "Controls whether X-Ray tracing policy should be added to IAM role for Lambda Function", + "type": "bool" + }, + "build_in_docker": { + "default": false, + "description": "Whether to build dependencies in Docker", + "type": "bool" + }, + "cloudwatch_logs_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data.", + "type": "string" + }, + "cloudwatch_logs_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653.", + "type": "number" + }, + "cloudwatch_logs_tags": { + "default": {}, + "description": "A map of tags to assign to the resource.", + "type": "map(string)" + }, + "compatible_runtimes": { + "default": [], + "description": "A list of Runtimes this layer is compatible with. Up to 5 runtimes can be specified.", + "type": "list(string)" + }, + "create": { + "default": true, + "description": "Controls whether resources should be created", + "type": "bool" + }, + "create_async_event_config": { + "default": false, + "description": "Controls whether async event configuration for Lambda Function/Alias should be created", + "type": "bool" + }, + "create_current_version_allowed_triggers": { + "default": true, + "description": "Whether to allow triggers on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources)", + "type": "bool" + }, + "create_current_version_async_event_config": { + "default": true, + "description": "Whether to allow async event configuration on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources)", + "type": "bool" + }, + "create_function": { + "default": true, + "description": "Controls whether Lambda Function resource should be created", + "type": "bool" + }, + "create_layer": { + "default": false, + "description": "Controls whether Lambda Layer resource should be created", + "type": "bool" + }, + "create_package": { + "default": true, + "description": "Controls whether Lambda package should be created", + "type": "bool" + }, + "create_role": { + "default": true, + "description": "Controls whether IAM role for Lambda Function should be created", + "type": "bool" + }, + "create_unqualified_alias_allowed_triggers": { + "default": true, + "description": "Whether to allow triggers on unqualified alias pointing to $LATEST version", + "type": "bool" + }, + "create_unqualified_alias_async_event_config": { + "default": true, + "description": "Whether to allow async event configuration on unqualified alias pointing to $LATEST version", + "type": "bool" + }, + "dead_letter_target_arn": { + "default": "null", + "description": "The ARN of an SNS topic or SQS queue to notify when an invocation fails.", + "type": "string" + }, + "description": { + "default": "", + "description": "Description of your Lambda Function (or Layer)", + "type": "string" + }, + "destination_on_failure": { + "default": "null", + "description": "Amazon Resource Name (ARN) of the destination resource for failed asynchronous invocations", + "type": "string" + }, + "destination_on_success": { + "default": "null", + "description": "Amazon Resource Name (ARN) of the destination resource for successful asynchronous invocations", + "type": "string" + }, + "docker_build_root": { + "default": "", + "description": "Root dir where to build in Docker", + "type": "string" + }, + "docker_file": { + "default": "", + "description": "Path to a Dockerfile when building in Docker", + "type": "string" + }, + "docker_image": { + "default": "", + "description": "Docker image to use for the build", + "type": "string" + }, + "docker_pip_cache": { + "default": "null", + "description": "Whether to mount a shared pip cache folder into docker environment or not", + "type": "any" + }, + "docker_with_ssh_agent": { + "default": false, + "description": "Whether to pass SSH_AUTH_SOCK into docker environment or not", + "type": "bool" + }, + "environment_variables": { + "default": {}, + "description": "A map that defines environment variables for the Lambda Function.", + "type": "map(string)" + }, + "event_source_mapping": { + "default": {}, + "description": "Map of event source mapping", + "type": "any" + }, + "file_system_arn": { + "default": "null", + "description": "The Amazon Resource Name (ARN) of the Amazon EFS Access Point that provides access to the file system.", + "type": "string" + }, + "file_system_local_mount_path": { + "default": "null", + "description": "The path where the function can access the file system, starting with /mnt/.", + "type": "string" + }, + "function_name": { + "default": "", + "description": "A unique name for your Lambda Function", + "type": "string" + }, + "handler": { + "default": "", + "description": "Lambda Function entrypoint in your code", + "type": "string" + }, + "hash_extra": { + "default": "", + "description": "The string to add into hashing function. Useful when building same source path for different functions.", + "type": "string" + }, + "image_config_command": { + "default": [], + "description": "The CMD for the docker image", + "type": "list(string)" + }, + "image_config_entry_point": { + "default": [], + "description": "The ENTRYPOINT for the docker image", + "type": "list(string)" + }, + "image_config_working_directory": { + "default": "null", + "description": "The working directory for the docker image", + "type": "string" + }, + "image_uri": { + "default": "null", + "description": "The ECR image URI containing the function's deployment package.", + "type": "string" + }, + "kms_key_arn": { + "default": "null", + "description": "The ARN of KMS key to use by your Lambda Function", + "type": "string" + }, + "lambda_at_edge": { + "default": false, + "description": "Set this to true if using Lambda@Edge, to enable publishing, limit the timeout, and allow edgelambda.amazonaws.com to invoke the function", + "type": "bool" + }, + "lambda_role": { + "default": "", + "description": " IAM role ARN attached to the Lambda Function. This governs both who / what can invoke your Lambda Function, as well as what resources our Lambda Function has access to. See Lambda Permission Model for more details.", + "type": "string" + }, + "layer_name": { + "default": "", + "description": "Name of Lambda Layer to create", + "type": "string" + }, + "layers": { + "default": "null", + "description": "List of Lambda Layer Version ARNs (maximum of 5) to attach to your Lambda Function.", + "type": "list(string)" + }, + "license_info": { + "default": "", + "description": "License info for your Lambda Layer. Eg, MIT or full url of a license.", + "type": "string" + }, + "local_existing_package": { + "default": "null", + "description": "The absolute path to an existing zip-file to use", + "type": "string" + }, + "maximum_event_age_in_seconds": { + "default": "null", + "description": "Maximum age of a request that Lambda sends to a function for processing in seconds. Valid values between 60 and 21600.", + "type": "number" + }, + "maximum_retry_attempts": { + "default": "null", + "description": "Maximum number of times to retry when the function returns an error. Valid values between 0 and 2. Defaults to 2.", + "type": "number" + }, + "memory_size": { + "default": 128, + "description": "Amount of memory in MB your Lambda Function can use at runtime. Valid value between 128 MB to 10,240 MB (10 GB), in 64 MB increments.", + "type": "number" + }, + "number_of_policies": { + "default": 0, + "description": "Number of policies to attach to IAM role for Lambda Function", + "type": "number" + }, + "number_of_policy_jsons": { + "default": 0, + "description": "Number of policies JSON to attach to IAM role for Lambda Function", + "type": "number" + }, + "package_type": { + "default": "Zip", + "description": "The Lambda deployment package type. Valid options: Zip or Image", + "type": "string" + }, + "policies": { + "default": [], + "description": "List of policy statements ARN to attach to Lambda Function role", + "type": "list(string)" + }, + "policy": { + "default": "null", + "description": "An additional policy document ARN to attach to the Lambda Function role", + "type": "string" + }, + "policy_json": { + "default": "null", + "description": "An additional policy document as JSON to attach to the Lambda Function role", + "type": "string" + }, + "policy_jsons": { + "default": [], + "description": "List of additional policy documents as JSON to attach to Lambda Function role", + "type": "list(string)" + }, + "policy_statements": { + "default": {}, + "description": "Map of dynamic policy statements to attach to Lambda Function role", + "type": "any" + }, + "provisioned_concurrent_executions": { + "default": -1, + "description": "Amount of capacity to allocate. Set to 1 or greater to enable, or set to 0 to disable provisioned concurrency.", + "type": "number" + }, + "publish": { + "default": false, + "description": "Whether to publish creation/change as new Lambda Function Version.", + "type": "bool" + }, + "reserved_concurrent_executions": { + "default": -1, + "description": "The amount of reserved concurrent executions for this Lambda Function. A value of 0 disables Lambda Function from being triggered and -1 removes any concurrency limitations. Defaults to Unreserved Concurrency Limits -1.", + "type": "number" + }, + "role_description": { + "default": "null", + "description": "Description of IAM role to use for Lambda Function", + "type": "string" + }, + "role_force_detach_policies": { + "default": true, + "description": "Specifies to force detaching any policies the IAM role has before destroying it.", + "type": "bool" + }, + "role_name": { + "default": "null", + "description": "Name of IAM role to use for Lambda Function", + "type": "string" + }, + "role_path": { + "default": "null", + "description": "Path of IAM role to use for Lambda Function", + "type": "string" + }, + "role_permissions_boundary": { + "default": "null", + "description": "The ARN of the policy that is used to set the permissions boundary for the IAM role used by Lambda Function", + "type": "string" + }, + "role_tags": { + "default": {}, + "description": "A map of tags to assign to IAM role", + "type": "map(string)" + }, + "runtime": { + "default": "", + "description": "Lambda Function runtime", + "type": "string" + }, + "s3_acl": { + "default": "private", + "description": "The canned ACL to apply. Valid values are private, public-read, public-read-write, aws-exec-read, authenticated-read, bucket-owner-read, and bucket-owner-full-control. Defaults to private.", + "type": "string" + }, + "s3_bucket": { + "default": "null", + "description": "S3 bucket to store artifacts", + "type": "string" + }, + "s3_existing_package": { + "default": "null", + "description": "The S3 bucket object with keys bucket, key, version pointing to an existing zip-file to use", + "type": "map(string)" + }, + "s3_object_storage_class": { + "default": "ONEZONE_IA", + "description": "Specifies the desired Storage Class for the artifact uploaded to S3. Can be either STANDARD, REDUCED_REDUNDANCY, ONEZONE_IA, INTELLIGENT_TIERING, or STANDARD_IA.", + "type": "string" + }, + "s3_object_tags": { + "default": {}, + "description": "A map of tags to assign to S3 bucket object.", + "type": "map(string)" + }, + "s3_server_side_encryption": { + "default": "null", + "description": "Specifies server-side encryption of the object in S3. Valid values are \"AES256\" and \"aws:kms\".", + "type": "string" + }, + "source_path": { + "default": "null", + "description": "The absolute path to a local file or directory containing your Lambda source code", + "type": "any" + }, + "store_on_s3": { + "default": false, + "description": "Whether to store produced artifacts on S3 or locally.", + "type": "bool" + }, + "tags": { + "default": {}, + "description": "A map of tags to assign to resources.", + "type": "map(string)" + }, + "timeout": { + "default": 3, + "description": "The amount of time your Lambda Function has to run in seconds.", + "type": "number" + }, + "tracing_mode": { + "default": "null", + "description": "Tracing mode of the Lambda Function. Valid value can be either PassThrough or Active.", + "type": "string" + }, + "trusted_entities": { + "default": [], + "description": "List of additional trusted entities for assuming Lambda Function role (trust relationship)", + "type": "any" + }, + "use_existing_cloudwatch_log_group": { + "default": false, + "description": "Whether to use an existing CloudWatch log group or create new", + "type": "bool" + }, + "vpc_security_group_ids": { + "default": "null", + "description": "List of security group ids when Lambda Function should run in the VPC.", + "type": "list(string)" + }, + "vpc_subnet_ids": { + "default": "null", + "description": "List of subnet ids when Lambda Function should run in the VPC. Usually private or intra subnets.", + "type": "list(string)" + } +} diff --git a/modules-metadata/sqs_version.txt b/src/terraform-aws-modules-metadata/lambda_version.txt similarity index 100% rename from modules-metadata/sqs_version.txt rename to src/terraform-aws-modules-metadata/lambda_version.txt diff --git a/modules-metadata/rds-aurora.json b/src/terraform-aws-modules-metadata/rds-aurora.json similarity index 60% rename from modules-metadata/rds-aurora.json rename to src/terraform-aws-modules-metadata/rds-aurora.json index e0e8a1c..3dd1de9 100644 --- a/modules-metadata/rds-aurora.json +++ b/src/terraform-aws-modules-metadata/rds-aurora.json @@ -1,4 +1,9 @@ { + "allow_major_version_upgrade": { + "default": false, + "description": "Determines whether major engine upgrades are allowed when changing engine version", + "type": "bool" + }, "allowed_cidr_blocks": { "default": [], "description": "A list of CIDR blocks which are allowed to access the database", @@ -6,7 +11,7 @@ }, "allowed_security_groups": { "default": [], - "description": "A list of Security Group ID's to allow access to.", + "description": "A list of Security Group ID's to allow access to", "type": "list(string)" }, "apply_immediately": { @@ -21,7 +26,7 @@ }, "backtrack_window": { "default": 0, - "description": "The target backtrack window, in seconds. Only available for aurora engine currently. To disable backtracking, set this value to 0. Defaults to 0. Must be between 0 and 259200 (72 hours)", + "description": "The target backtrack window, in seconds. Only available for aurora engine currently. To disable backtracking, set this value to 0. Must be between 0 and 259200 (72 hours)", "type": "number" }, "backup_retention_period": { @@ -34,9 +39,29 @@ "description": "The identifier of the CA certificate for the DB instance", "type": "string" }, + "cluster_tags": { + "default": {}, + "description": "A map of tags to add to only the RDS cluster. Used for AWS Instance Scheduler tagging", + "type": "map(string)" + }, "copy_tags_to_snapshot": { "default": false, - "description": "Copy all Cluster tags to snapshots.", + "description": "Copy all Cluster tags to snapshots", + "type": "bool" + }, + "create_cluster": { + "default": true, + "description": "Whether cluster should be created (it affects almost all resources)", + "type": "bool" + }, + "create_monitoring_role": { + "default": true, + "description": "Whether to create the IAM role for RDS enhanced monitoring", + "type": "bool" + }, + "create_random_password": { + "default": true, + "description": "Whether to create random password for RDS primary cluster", "type": "bool" }, "create_security_group": { @@ -69,9 +94,14 @@ "description": "If the DB instance should have deletion protection enabled", "type": "bool" }, + "enable_http_endpoint": { + "default": false, + "description": "Whether or not to enable the Data API for a serverless Aurora database engine", + "type": "bool" + }, "enabled_cloudwatch_logs_exports": { "default": [], - "description": "List of log types to export to cloudwatch", + "description": "List of log types to export to cloudwatch - `audit`, `error`, `general`, `slowquery`, `postgresql`", "type": "list(string)" }, "engine": { @@ -81,12 +111,12 @@ }, "engine_mode": { "default": "provisioned", - "description": "The database engine mode. Valid values: global, parallelquery, provisioned, serverless.", + "description": "The database engine mode. Valid values: global, parallelquery, provisioned, serverless, multimaster", "type": "string" }, "engine_version": { "default": "5.6.10a", - "description": "Aurora database engine version.", + "description": "Aurora database engine version", "type": "string" }, "final_snapshot_identifier_prefix": { @@ -101,22 +131,78 @@ }, "iam_database_authentication_enabled": { "default": false, - "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported.", + "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported", + "type": "bool" + }, + "iam_role_description": { + "default": "null", + "description": "Description of the role", + "type": "string" + }, + "iam_role_force_detach_policies": { + "default": "null", + "description": "Whether to force detaching any policies the role has before destroying it", + "type": "bool" + }, + "iam_role_managed_policy_arns": { + "default": "null", + "description": "Set of exclusive IAM managed policy ARNs to attach to the IAM role", + "type": "list(string)" + }, + "iam_role_max_session_duration": { + "default": "null", + "description": "Maximum session duration (in seconds) that you want to set for the role", + "type": "number" + }, + "iam_role_name": { + "default": "null", + "description": "Friendly name of the role", + "type": "string" + }, + "iam_role_path": { + "default": "null", + "description": "Path to the role", + "type": "string" + }, + "iam_role_permissions_boundary": { + "default": "null", + "description": "The ARN of the policy that is used to set the permissions boundary for the role", + "type": "string" + }, + "iam_role_use_name_prefix": { + "default": false, + "description": "Whether to use `iam_role_name` as is or create a unique name beginning with the `iam_role_name` as the prefix", "type": "bool" }, "iam_roles": { "default": [], - "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster.", + "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster", "type": "list(string)" }, "instance_type": { - "description": "Instance type to use", + "default": "", + "description": "Instance type to use at master instance. If instance_type_replica is not set it will use the same type for replica instances", "type": "string", "cloudcraft_name": "instanceType" }, + "instance_type_replica": { + "default": "null", + "description": "Instance type to use at replica instance", + "type": "string" + }, + "instances_parameters": { + "default": [], + "description": "Customized instance settings. Supported keys: `instance_name`, `instance_type`, `instance_promotion_tier`, `publicly_accessible`", + "type": "list(map(string))" + }, + "is_primary_cluster": { + "default": true, + "description": "Whether to create a primary cluster (set to false to be a part of a Global database)", + "type": "bool" + }, "kms_key_id": { "default": "", - "description": "The ARN for the KMS encryption key if one is set to the cluster.", + "description": "The ARN for the KMS encryption key if one is set to the cluster", "type": "string" }, "monitoring_interval": { @@ -124,23 +210,29 @@ "description": "The interval (seconds) between points when Enhanced Monitoring metrics are collected", "type": "number" }, + "monitoring_role_arn": { + "default": "", + "description": "IAM role used by RDS to send enhanced monitoring metrics to CloudWatch", + "type": "string" + }, "name": { - "description": "Name given resources", + "default": "", + "description": "Name used across resources created", "type": "string" }, "password": { "default": "", - "description": "Master DB password", + "description": "Master DB password. Note - when specifying a value here, 'create_random_password' should be set to `false`", "type": "string" }, "performance_insights_enabled": { "default": false, - "description": "Specifies whether Performance Insights is enabled or not.", + "description": "Specifies whether Performance Insights is enabled or not", "type": "bool" }, "performance_insights_kms_key_id": { "default": "", - "description": "The ARN for the KMS key to encrypt Performance Insights data.", + "description": "The ARN for the KMS key to encrypt Performance Insights data", "type": "string" }, "port": { @@ -150,7 +242,8 @@ }, "predefined_metric_type": { "default": "RDSReaderAverageCPUUtilization", - "description": "The metric type to scale on. Valid values are RDSReaderAverageCPUUtilization and RDSReaderAverageDatabaseConnections." + "description": "The metric type to scale on. Valid values are RDSReaderAverageCPUUtilization and RDSReaderAverageDatabaseConnections", + "type": "string" }, "preferred_backup_window": { "default": "02:00-03:00", @@ -169,16 +262,17 @@ }, "replica_count": { "default": 1, - "description": "Number of reader nodes to create. If `replica_scale_enable` is `true`, the value of `replica_scale_min` is used instead." + "description": "Number of reader nodes to create. If `replica_scale_enable` is `true`, the value of `replica_scale_min` is used instead.", + "type": "number" }, "replica_scale_connections": { "default": 700, - "description": "Average number of connections to trigger autoscaling at. Default value is 70% of db.r4.large's default max_connections", + "description": "Average number of connections threshold which will initiate autoscaling. Default value is 70% of db.r4.large's default max_connections", "type": "number" }, "replica_scale_cpu": { "default": 70, - "description": "CPU usage to trigger autoscaling at", + "description": "CPU threshold which will initiate autoscaling", "type": "number" }, "replica_scale_enabled": { @@ -193,12 +287,12 @@ }, "replica_scale_max": { "default": 0, - "description": "Maximum number of replicas to allow scaling for", + "description": "Maximum number of read replicas permitted when autoscaling is enabled", "type": "number" }, "replica_scale_min": { "default": 2, - "description": "Minimum number of replicas to allow scaling for", + "description": "Minimum number of read replicas permitted when autoscaling is enabled", "type": "number" }, "replica_scale_out_cooldown": { @@ -208,7 +302,13 @@ }, "replication_source_identifier": { "default": "", - "description": "ARN of a source DB cluster or DB instance if this DB cluster is to be created as a Read Replica." + "description": "ARN of a source DB cluster or DB instance if this DB cluster is to be created as a Read Replica", + "type": "string" + }, + "s3_import": { + "default": "null", + "description": "Configuration map used to restore from a Percona Xtrabackup in S3 (only MySQL is supported)", + "type": "map(string)" }, "scaling_configuration": { "default": {}, @@ -217,22 +317,28 @@ }, "security_group_description": { "default": "Managed by Terraform", - "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description.", + "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description", "type": "string" }, + "security_group_tags": { + "default": {}, + "description": "Additional tags for the security group", + "type": "map(string)" + }, "skip_final_snapshot": { "default": false, - "description": "Should a final snapshot be created on cluster destroy", + "description": "Determines whether a final DB snapshot is created before the DB cluster is deleted. If true is specified, no DB snapshot is created.", "type": "bool" }, "snapshot_identifier": { - "default": "", + "default": "null", "description": "DB snapshot to create this database from", "type": "string" }, "source_region": { "default": "", - "description": "The source region for an encrypted replica DB cluster." + "description": "The source region for an encrypted replica DB cluster", + "type": "string" }, "storage_encrypted": { "default": true, @@ -241,7 +347,7 @@ }, "subnets": { "default": [], - "description": "List of subnet IDs to use", + "description": "List of subnet IDs used by database subnet group created", "type": "list(string)" }, "tags": { @@ -255,6 +361,7 @@ "type": "string" }, "vpc_id": { + "default": "", "description": "VPC ID", "type": "string" }, diff --git a/modules-metadata/rds-aurora_cloudcraft.json b/src/terraform-aws-modules-metadata/rds-aurora_cloudcraft.json similarity index 100% rename from modules-metadata/rds-aurora_cloudcraft.json rename to src/terraform-aws-modules-metadata/rds-aurora_cloudcraft.json diff --git a/modules-metadata/rds-aurora_variables.json b/src/terraform-aws-modules-metadata/rds-aurora_variables.json similarity index 60% rename from modules-metadata/rds-aurora_variables.json rename to src/terraform-aws-modules-metadata/rds-aurora_variables.json index a1921ce..8e8aaec 100644 --- a/modules-metadata/rds-aurora_variables.json +++ b/src/terraform-aws-modules-metadata/rds-aurora_variables.json @@ -1,4 +1,9 @@ { + "allow_major_version_upgrade": { + "default": false, + "description": "Determines whether major engine upgrades are allowed when changing engine version", + "type": "bool" + }, "allowed_cidr_blocks": { "default": [], "description": "A list of CIDR blocks which are allowed to access the database", @@ -6,7 +11,7 @@ }, "allowed_security_groups": { "default": [], - "description": "A list of Security Group ID's to allow access to.", + "description": "A list of Security Group ID's to allow access to", "type": "list(string)" }, "apply_immediately": { @@ -21,7 +26,7 @@ }, "backtrack_window": { "default": 0, - "description": "The target backtrack window, in seconds. Only available for aurora engine currently. To disable backtracking, set this value to 0. Defaults to 0. Must be between 0 and 259200 (72 hours)", + "description": "The target backtrack window, in seconds. Only available for aurora engine currently. To disable backtracking, set this value to 0. Must be between 0 and 259200 (72 hours)", "type": "number" }, "backup_retention_period": { @@ -34,9 +39,29 @@ "description": "The identifier of the CA certificate for the DB instance", "type": "string" }, + "cluster_tags": { + "default": {}, + "description": "A map of tags to add to only the RDS cluster. Used for AWS Instance Scheduler tagging", + "type": "map(string)" + }, "copy_tags_to_snapshot": { "default": false, - "description": "Copy all Cluster tags to snapshots.", + "description": "Copy all Cluster tags to snapshots", + "type": "bool" + }, + "create_cluster": { + "default": true, + "description": "Whether cluster should be created (it affects almost all resources)", + "type": "bool" + }, + "create_monitoring_role": { + "default": true, + "description": "Whether to create the IAM role for RDS enhanced monitoring", + "type": "bool" + }, + "create_random_password": { + "default": true, + "description": "Whether to create random password for RDS primary cluster", "type": "bool" }, "create_security_group": { @@ -69,9 +94,14 @@ "description": "If the DB instance should have deletion protection enabled", "type": "bool" }, + "enable_http_endpoint": { + "default": false, + "description": "Whether or not to enable the Data API for a serverless Aurora database engine", + "type": "bool" + }, "enabled_cloudwatch_logs_exports": { "default": [], - "description": "List of log types to export to cloudwatch", + "description": "List of log types to export to cloudwatch - `audit`, `error`, `general`, `slowquery`, `postgresql`", "type": "list(string)" }, "engine": { @@ -81,12 +111,12 @@ }, "engine_mode": { "default": "provisioned", - "description": "The database engine mode. Valid values: global, parallelquery, provisioned, serverless.", + "description": "The database engine mode. Valid values: global, parallelquery, provisioned, serverless, multimaster", "type": "string" }, "engine_version": { "default": "5.6.10a", - "description": "Aurora database engine version.", + "description": "Aurora database engine version", "type": "string" }, "final_snapshot_identifier_prefix": { @@ -101,21 +131,77 @@ }, "iam_database_authentication_enabled": { "default": false, - "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported.", + "description": "Specifies whether IAM Database authentication should be enabled or not. Not all versions and instances are supported. Refer to the AWS documentation to see which versions are supported", + "type": "bool" + }, + "iam_role_description": { + "default": "null", + "description": "Description of the role", + "type": "string" + }, + "iam_role_force_detach_policies": { + "default": "null", + "description": "Whether to force detaching any policies the role has before destroying it", + "type": "bool" + }, + "iam_role_managed_policy_arns": { + "default": "null", + "description": "Set of exclusive IAM managed policy ARNs to attach to the IAM role", + "type": "list(string)" + }, + "iam_role_max_session_duration": { + "default": "null", + "description": "Maximum session duration (in seconds) that you want to set for the role", + "type": "number" + }, + "iam_role_name": { + "default": "null", + "description": "Friendly name of the role", + "type": "string" + }, + "iam_role_path": { + "default": "null", + "description": "Path to the role", + "type": "string" + }, + "iam_role_permissions_boundary": { + "default": "null", + "description": "The ARN of the policy that is used to set the permissions boundary for the role", + "type": "string" + }, + "iam_role_use_name_prefix": { + "default": false, + "description": "Whether to use `iam_role_name` as is or create a unique name beginning with the `iam_role_name` as the prefix", "type": "bool" }, "iam_roles": { "default": [], - "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster.", + "description": "A List of ARNs for the IAM roles to associate to the RDS Cluster", "type": "list(string)" }, "instance_type": { - "description": "Instance type to use", + "default": "", + "description": "Instance type to use at master instance. If instance_type_replica is not set it will use the same type for replica instances", "type": "string" }, + "instance_type_replica": { + "default": "null", + "description": "Instance type to use at replica instance", + "type": "string" + }, + "instances_parameters": { + "default": [], + "description": "Customized instance settings. Supported keys: `instance_name`, `instance_type`, `instance_promotion_tier`, `publicly_accessible`", + "type": "list(map(string))" + }, + "is_primary_cluster": { + "default": true, + "description": "Whether to create a primary cluster (set to false to be a part of a Global database)", + "type": "bool" + }, "kms_key_id": { "default": "", - "description": "The ARN for the KMS encryption key if one is set to the cluster.", + "description": "The ARN for the KMS encryption key if one is set to the cluster", "type": "string" }, "monitoring_interval": { @@ -123,23 +209,29 @@ "description": "The interval (seconds) between points when Enhanced Monitoring metrics are collected", "type": "number" }, + "monitoring_role_arn": { + "default": "", + "description": "IAM role used by RDS to send enhanced monitoring metrics to CloudWatch", + "type": "string" + }, "name": { - "description": "Name given resources", + "default": "", + "description": "Name used across resources created", "type": "string" }, "password": { "default": "", - "description": "Master DB password", + "description": "Master DB password. Note - when specifying a value here, 'create_random_password' should be set to `false`", "type": "string" }, "performance_insights_enabled": { "default": false, - "description": "Specifies whether Performance Insights is enabled or not.", + "description": "Specifies whether Performance Insights is enabled or not", "type": "bool" }, "performance_insights_kms_key_id": { "default": "", - "description": "The ARN for the KMS key to encrypt Performance Insights data.", + "description": "The ARN for the KMS key to encrypt Performance Insights data", "type": "string" }, "port": { @@ -149,7 +241,8 @@ }, "predefined_metric_type": { "default": "RDSReaderAverageCPUUtilization", - "description": "The metric type to scale on. Valid values are RDSReaderAverageCPUUtilization and RDSReaderAverageDatabaseConnections." + "description": "The metric type to scale on. Valid values are RDSReaderAverageCPUUtilization and RDSReaderAverageDatabaseConnections", + "type": "string" }, "preferred_backup_window": { "default": "02:00-03:00", @@ -168,16 +261,17 @@ }, "replica_count": { "default": 1, - "description": "Number of reader nodes to create. If `replica_scale_enable` is `true`, the value of `replica_scale_min` is used instead." + "description": "Number of reader nodes to create. If `replica_scale_enable` is `true`, the value of `replica_scale_min` is used instead.", + "type": "number" }, "replica_scale_connections": { "default": 700, - "description": "Average number of connections to trigger autoscaling at. Default value is 70% of db.r4.large's default max_connections", + "description": "Average number of connections threshold which will initiate autoscaling. Default value is 70% of db.r4.large's default max_connections", "type": "number" }, "replica_scale_cpu": { "default": 70, - "description": "CPU usage to trigger autoscaling at", + "description": "CPU threshold which will initiate autoscaling", "type": "number" }, "replica_scale_enabled": { @@ -192,12 +286,12 @@ }, "replica_scale_max": { "default": 0, - "description": "Maximum number of replicas to allow scaling for", + "description": "Maximum number of read replicas permitted when autoscaling is enabled", "type": "number" }, "replica_scale_min": { "default": 2, - "description": "Minimum number of replicas to allow scaling for", + "description": "Minimum number of read replicas permitted when autoscaling is enabled", "type": "number" }, "replica_scale_out_cooldown": { @@ -207,7 +301,13 @@ }, "replication_source_identifier": { "default": "", - "description": "ARN of a source DB cluster or DB instance if this DB cluster is to be created as a Read Replica." + "description": "ARN of a source DB cluster or DB instance if this DB cluster is to be created as a Read Replica", + "type": "string" + }, + "s3_import": { + "default": "null", + "description": "Configuration map used to restore from a Percona Xtrabackup in S3 (only MySQL is supported)", + "type": "map(string)" }, "scaling_configuration": { "default": {}, @@ -216,22 +316,28 @@ }, "security_group_description": { "default": "Managed by Terraform", - "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description.", + "description": "The description of the security group. If value is set to empty string it will contain cluster name in the description", "type": "string" }, + "security_group_tags": { + "default": {}, + "description": "Additional tags for the security group", + "type": "map(string)" + }, "skip_final_snapshot": { "default": false, - "description": "Should a final snapshot be created on cluster destroy", + "description": "Determines whether a final DB snapshot is created before the DB cluster is deleted. If true is specified, no DB snapshot is created.", "type": "bool" }, "snapshot_identifier": { - "default": "", + "default": "null", "description": "DB snapshot to create this database from", "type": "string" }, "source_region": { "default": "", - "description": "The source region for an encrypted replica DB cluster." + "description": "The source region for an encrypted replica DB cluster", + "type": "string" }, "storage_encrypted": { "default": true, @@ -240,7 +346,7 @@ }, "subnets": { "default": [], - "description": "List of subnet IDs to use", + "description": "List of subnet IDs used by database subnet group created", "type": "list(string)" }, "tags": { @@ -254,6 +360,7 @@ "type": "string" }, "vpc_id": { + "default": "", "description": "VPC ID", "type": "string" }, diff --git a/src/terraform-aws-modules-metadata/rds-aurora_version.txt b/src/terraform-aws-modules-metadata/rds-aurora_version.txt new file mode 100644 index 0000000..ee80415 --- /dev/null +++ b/src/terraform-aws-modules-metadata/rds-aurora_version.txt @@ -0,0 +1 @@ +v5.2.0 diff --git a/modules-metadata/rds.json b/src/terraform-aws-modules-metadata/rds.json similarity index 74% rename from modules-metadata/rds.json rename to src/terraform-aws-modules-metadata/rds.json index 5291598..256f162 100644 --- a/modules-metadata/rds.json +++ b/src/terraform-aws-modules-metadata/rds.json @@ -19,12 +19,12 @@ "type": "bool" }, "availability_zone": { - "default": "", + "default": "null", "description": "The Availability Zone of the RDS instance", "type": "string" }, "backup_retention_period": { - "default": 1, + "default": "null", "description": "The days to retain backups for", "type": "number" }, @@ -33,13 +33,13 @@ "type": "string" }, "ca_cert_identifier": { - "default": "rds-ca-2019", + "default": "null", "description": "Specifies the identifier of the CA certificate for the DB instance", "type": "string" }, "character_set_name": { - "default": "", - "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS for more information", + "default": "null", + "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS and Collations and Character Sets for Microsoft SQL Server for more information. This can only be set on creation.", "type": "string" }, "copy_tags_to_snapshot": { @@ -72,16 +72,66 @@ "description": "Create IAM role with a defined name that permits RDS to send enhanced monitoring metrics to CloudWatch Logs.", "type": "bool" }, - "db_subnet_group_name": { + "create_random_password": { + "default": false, + "description": "Whether to create random password for RDS primary cluster", + "type": "bool" + }, + "db_instance_tags": { + "default": {}, + "description": "Additional tags for the DB instance", + "type": "map(string)" + }, + "db_option_group_tags": { + "default": {}, + "description": "Additional tags for the DB option group", + "type": "map(string)" + }, + "db_parameter_group_tags": { + "default": {}, + "description": "Additional tags for the DB parameter group", + "type": "map(string)" + }, + "db_subnet_group_description": { "default": "", + "description": "Description of the DB subnet group to create", + "type": "string" + }, + "db_subnet_group_name": { + "default": "null", "description": "Name of DB subnet group. DB instance will be created in the VPC associated with the DB subnet group. If unspecified, will be created in the default VPC", "type": "string" }, + "db_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the DB subnet group", + "type": "map(string)" + }, + "db_subnet_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `subnet_group_name` as is or create a unique name beginning with the `subnet_group_name` as the prefix", + "type": "bool" + }, + "delete_automated_backups": { + "default": true, + "description": "Specifies whether to remove automated backups immediately after the DB instance is deleted", + "type": "bool" + }, "deletion_protection": { "default": false, "description": "The database can't be deleted when this value is set to true.", "type": "bool" }, + "domain": { + "default": "null", + "description": "The ID of the Directory Service Active Directory domain to create the instance in", + "type": "string" + }, + "domain_iam_role_name": { + "default": "null", + "description": "(Required if domain is provided) The name of the IAM role to be used when making API calls to the Directory Service", + "type": "string" + }, "enabled_cloudwatch_logs_exports": { "default": [], "description": "List of log types to enable for exporting to CloudWatch logs. If omitted, no logs will be exported. Valid values (depending on engine): alert, audit, error, general, listener, slowquery, trace, postgresql (PostgreSQL), upgrade (PostgreSQL).", @@ -106,9 +156,14 @@ "description": "The name of your final DB snapshot when this DB instance is deleted.", "type": "string" }, + "final_snapshot_identifier_prefix": { + "default": "final", + "description": "The name which is prefixed to the final snapshot on cluster destroy", + "type": "string" + }, "iam_database_authentication_enabled": { "default": false, - "description": "Specifies whether or mappings of AWS Identity and Access Management (IAM) accounts to database accounts is enabled", + "description": "Specifies whether or not the mappings of AWS Identity and Access Management (IAM) accounts to database accounts are enabled", "type": "bool" }, "identifier": { @@ -126,12 +181,12 @@ "type": "number" }, "kms_key_id": { - "default": "", + "default": "null", "description": "The ARN for the KMS encryption key. If creating an encrypted replica, set this to the destination KMS ARN. If storage_encrypted is set to true and kms_key_id is not specified the default KMS key created in your account will be used", "type": "string" }, "license_model": { - "default": "", + "default": "null", "description": "License model information for this DB instance. Optional, but required for some DB engines, i.e. Oracle SE1", "type": "string" }, @@ -155,7 +210,7 @@ "type": "number" }, "monitoring_role_arn": { - "default": "", + "default": "null", "description": "The ARN for the IAM role that permits RDS to send enhanced monitoring metrics to CloudWatch Logs. Must be specified if monitoring_interval is non-zero.", "type": "string" }, @@ -171,7 +226,7 @@ "cloudcraft_name": "isMultiAZ" }, "name": { - "default": "", + "default": "null", "description": "The DB name to create. If omitted, no database is created initially", "type": "string" }, @@ -181,8 +236,8 @@ "type": "string" }, "option_group_name": { - "default": "", - "description": "Name of the DB option group to associate", + "default": "null", + "description": "Name of the option group", "type": "string" }, "option_group_timeouts": { @@ -192,6 +247,11 @@ "description": "Define maximum timeout for deletion of `aws_db_option_group` resource", "type": "map(string)" }, + "option_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `option_group_name` as is or create a unique name beginning with the `option_group_name` as the prefix", + "type": "bool" + }, "options": { "default": [], "description": "A list of Options to apply.", @@ -203,16 +263,22 @@ "type": "string" }, "parameter_group_name": { - "default": "", + "default": "null", "description": "Name of the DB parameter group to associate or create", "type": "string" }, + "parameter_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `parameter_group_name` as is or create a unique name beginning with the `parameter_group_name` as the prefix", + "type": "bool" + }, "parameters": { "default": [], "description": "A list of DB parameters (map) to apply", "type": "list(map(string))" }, "password": { + "default": "", "description": "Password for the master DB user. Note that this may show up in logs, and it will be stored in the state file", "type": "string" }, @@ -221,6 +287,11 @@ "description": "Specifies whether Performance Insights are enabled", "type": "bool" }, + "performance_insights_kms_key_id": { + "default": "null", + "description": "The ARN for the KMS key to encrypt Performance Insights data.", + "type": "string" + }, "performance_insights_retention_period": { "default": 7, "description": "The amount of time in days to retain Performance Insights data. Either 7 (7 days) or 731 (2 years).", @@ -235,18 +306,28 @@ "description": "Bool to control if instance is publicly accessible", "type": "bool" }, + "random_password_length": { + "default": 10, + "description": "(Optional) Length of random password to create. (default: 10)", + "type": "number" + }, "replicate_source_db": { - "default": "", + "default": "null", "description": "Specifies that this resource is a Replicate database, and to use this value as the source database. This correlates to the identifier of another Amazon RDS Database to replicate.", "type": "string" }, + "s3_import": { + "default": "null", + "description": "Restore from a Percona Xtrabackup in S3 (only MySQL is supported)", + "type": "map(string)" + }, "skip_final_snapshot": { - "default": true, + "default": false, "description": "Determines whether a final DB snapshot is created before the DB instance is deleted. If true is specified, no DBSnapshot is created. If false is specified, a DB snapshot is created before the DB instance is deleted, using the value from final_snapshot_identifier", "type": "bool" }, "snapshot_identifier": { - "default": "", + "default": "null", "description": "Specifies whether or not to create this database from a snapshot. This correlates to the snapshot ID you'd find in the RDS console, e.g: rds:production-2015-06-26-06-05.", "type": "string" }, @@ -256,8 +337,8 @@ "type": "bool" }, "storage_type": { - "default": "gp2", - "description": "One of 'standard' (magnetic), 'gp2' (general purpose SSD), or 'io1' (provisioned IOPS SSD). The default is 'io1' if iops is specified, 'standard' if not. Note that this behaviour is different from the AWS web console, where the default is 'gp2'.", + "default": "null", + "description": "One of 'standard' (magnetic), 'gp2' (general purpose SSD), or 'io1' (provisioned IOPS SSD). The default is 'io1' if iops is specified, 'gp2' if not.", "type": "string" }, "subnet_ids": { @@ -280,15 +361,10 @@ "type": "map(string)" }, "timezone": { - "default": "", + "default": "null", "description": "(Optional) Time zone of the DB instance. timezone is currently only supported by Microsoft SQL Server. The timezone can only be set on creation. See MSSQL User Guide for more information.", "type": "string" }, - "use_parameter_group_name_prefix": { - "default": true, - "description": "Whether to use the parameter group name prefix or not", - "type": "bool" - }, "username": { "description": "Username for the master DB user", "type": "string" diff --git a/modules-metadata/rds_cloudcraft.json b/src/terraform-aws-modules-metadata/rds_cloudcraft.json similarity index 100% rename from modules-metadata/rds_cloudcraft.json rename to src/terraform-aws-modules-metadata/rds_cloudcraft.json diff --git a/modules-metadata/rds_variables.json b/src/terraform-aws-modules-metadata/rds_variables.json similarity index 74% rename from modules-metadata/rds_variables.json rename to src/terraform-aws-modules-metadata/rds_variables.json index 100be6d..f573813 100644 --- a/modules-metadata/rds_variables.json +++ b/src/terraform-aws-modules-metadata/rds_variables.json @@ -19,12 +19,12 @@ "type": "bool" }, "availability_zone": { - "default": "", + "default": "null", "description": "The Availability Zone of the RDS instance", "type": "string" }, "backup_retention_period": { - "default": 1, + "default": "null", "description": "The days to retain backups for", "type": "number" }, @@ -33,13 +33,13 @@ "type": "string" }, "ca_cert_identifier": { - "default": "rds-ca-2019", + "default": "null", "description": "Specifies the identifier of the CA certificate for the DB instance", "type": "string" }, "character_set_name": { - "default": "", - "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS for more information", + "default": "null", + "description": "(Optional) The character set name to use for DB encoding in Oracle instances. This can't be changed. See Oracle Character Sets Supported in Amazon RDS and Collations and Character Sets for Microsoft SQL Server for more information. This can only be set on creation.", "type": "string" }, "copy_tags_to_snapshot": { @@ -72,16 +72,66 @@ "description": "Create IAM role with a defined name that permits RDS to send enhanced monitoring metrics to CloudWatch Logs.", "type": "bool" }, - "db_subnet_group_name": { + "create_random_password": { + "default": false, + "description": "Whether to create random password for RDS primary cluster", + "type": "bool" + }, + "db_instance_tags": { + "default": {}, + "description": "Additional tags for the DB instance", + "type": "map(string)" + }, + "db_option_group_tags": { + "default": {}, + "description": "Additional tags for the DB option group", + "type": "map(string)" + }, + "db_parameter_group_tags": { + "default": {}, + "description": "Additional tags for the DB parameter group", + "type": "map(string)" + }, + "db_subnet_group_description": { "default": "", + "description": "Description of the DB subnet group to create", + "type": "string" + }, + "db_subnet_group_name": { + "default": "null", "description": "Name of DB subnet group. DB instance will be created in the VPC associated with the DB subnet group. If unspecified, will be created in the default VPC", "type": "string" }, + "db_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the DB subnet group", + "type": "map(string)" + }, + "db_subnet_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `subnet_group_name` as is or create a unique name beginning with the `subnet_group_name` as the prefix", + "type": "bool" + }, + "delete_automated_backups": { + "default": true, + "description": "Specifies whether to remove automated backups immediately after the DB instance is deleted", + "type": "bool" + }, "deletion_protection": { "default": false, "description": "The database can't be deleted when this value is set to true.", "type": "bool" }, + "domain": { + "default": "null", + "description": "The ID of the Directory Service Active Directory domain to create the instance in", + "type": "string" + }, + "domain_iam_role_name": { + "default": "null", + "description": "(Required if domain is provided) The name of the IAM role to be used when making API calls to the Directory Service", + "type": "string" + }, "enabled_cloudwatch_logs_exports": { "default": [], "description": "List of log types to enable for exporting to CloudWatch logs. If omitted, no logs will be exported. Valid values (depending on engine): alert, audit, error, general, listener, slowquery, trace, postgresql (PostgreSQL), upgrade (PostgreSQL).", @@ -105,9 +155,14 @@ "description": "The name of your final DB snapshot when this DB instance is deleted.", "type": "string" }, + "final_snapshot_identifier_prefix": { + "default": "final", + "description": "The name which is prefixed to the final snapshot on cluster destroy", + "type": "string" + }, "iam_database_authentication_enabled": { "default": false, - "description": "Specifies whether or mappings of AWS Identity and Access Management (IAM) accounts to database accounts is enabled", + "description": "Specifies whether or not the mappings of AWS Identity and Access Management (IAM) accounts to database accounts are enabled", "type": "bool" }, "identifier": { @@ -124,12 +179,12 @@ "type": "number" }, "kms_key_id": { - "default": "", + "default": "null", "description": "The ARN for the KMS encryption key. If creating an encrypted replica, set this to the destination KMS ARN. If storage_encrypted is set to true and kms_key_id is not specified the default KMS key created in your account will be used", "type": "string" }, "license_model": { - "default": "", + "default": "null", "description": "License model information for this DB instance. Optional, but required for some DB engines, i.e. Oracle SE1", "type": "string" }, @@ -153,7 +208,7 @@ "type": "number" }, "monitoring_role_arn": { - "default": "", + "default": "null", "description": "The ARN for the IAM role that permits RDS to send enhanced monitoring metrics to CloudWatch Logs. Must be specified if monitoring_interval is non-zero.", "type": "string" }, @@ -168,7 +223,7 @@ "type": "bool" }, "name": { - "default": "", + "default": "null", "description": "The DB name to create. If omitted, no database is created initially", "type": "string" }, @@ -178,8 +233,8 @@ "type": "string" }, "option_group_name": { - "default": "", - "description": "Name of the DB option group to associate", + "default": "null", + "description": "Name of the option group", "type": "string" }, "option_group_timeouts": { @@ -189,6 +244,11 @@ "description": "Define maximum timeout for deletion of `aws_db_option_group` resource", "type": "map(string)" }, + "option_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `option_group_name` as is or create a unique name beginning with the `option_group_name` as the prefix", + "type": "bool" + }, "options": { "default": [], "description": "A list of Options to apply.", @@ -200,16 +260,22 @@ "type": "string" }, "parameter_group_name": { - "default": "", + "default": "null", "description": "Name of the DB parameter group to associate or create", "type": "string" }, + "parameter_group_use_name_prefix": { + "default": true, + "description": "Determines whether to use `parameter_group_name` as is or create a unique name beginning with the `parameter_group_name` as the prefix", + "type": "bool" + }, "parameters": { "default": [], "description": "A list of DB parameters (map) to apply", "type": "list(map(string))" }, "password": { + "default": "", "description": "Password for the master DB user. Note that this may show up in logs, and it will be stored in the state file", "type": "string" }, @@ -218,6 +284,11 @@ "description": "Specifies whether Performance Insights are enabled", "type": "bool" }, + "performance_insights_kms_key_id": { + "default": "null", + "description": "The ARN for the KMS key to encrypt Performance Insights data.", + "type": "string" + }, "performance_insights_retention_period": { "default": 7, "description": "The amount of time in days to retain Performance Insights data. Either 7 (7 days) or 731 (2 years).", @@ -232,18 +303,28 @@ "description": "Bool to control if instance is publicly accessible", "type": "bool" }, + "random_password_length": { + "default": 10, + "description": "(Optional) Length of random password to create. (default: 10)", + "type": "number" + }, "replicate_source_db": { - "default": "", + "default": "null", "description": "Specifies that this resource is a Replicate database, and to use this value as the source database. This correlates to the identifier of another Amazon RDS Database to replicate.", "type": "string" }, + "s3_import": { + "default": "null", + "description": "Restore from a Percona Xtrabackup in S3 (only MySQL is supported)", + "type": "map(string)" + }, "skip_final_snapshot": { - "default": true, + "default": false, "description": "Determines whether a final DB snapshot is created before the DB instance is deleted. If true is specified, no DBSnapshot is created. If false is specified, a DB snapshot is created before the DB instance is deleted, using the value from final_snapshot_identifier", "type": "bool" }, "snapshot_identifier": { - "default": "", + "default": "null", "description": "Specifies whether or not to create this database from a snapshot. This correlates to the snapshot ID you'd find in the RDS console, e.g: rds:production-2015-06-26-06-05.", "type": "string" }, @@ -253,8 +334,8 @@ "type": "bool" }, "storage_type": { - "default": "gp2", - "description": "One of 'standard' (magnetic), 'gp2' (general purpose SSD), or 'io1' (provisioned IOPS SSD). The default is 'io1' if iops is specified, 'standard' if not. Note that this behaviour is different from the AWS web console, where the default is 'gp2'.", + "default": "null", + "description": "One of 'standard' (magnetic), 'gp2' (general purpose SSD), or 'io1' (provisioned IOPS SSD). The default is 'io1' if iops is specified, 'gp2' if not.", "type": "string" }, "subnet_ids": { @@ -277,15 +358,10 @@ "type": "map(string)" }, "timezone": { - "default": "", + "default": "null", "description": "(Optional) Time zone of the DB instance. timezone is currently only supported by Microsoft SQL Server. The timezone can only be set on creation. See MSSQL User Guide for more information.", "type": "string" }, - "use_parameter_group_name_prefix": { - "default": true, - "description": "Whether to use the parameter group name prefix or not", - "type": "bool" - }, "username": { "description": "Username for the master DB user", "type": "string" diff --git a/src/terraform-aws-modules-metadata/rds_version.txt b/src/terraform-aws-modules-metadata/rds_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/rds_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/modules-metadata/redshift.json b/src/terraform-aws-modules-metadata/redshift.json similarity index 93% rename from modules-metadata/redshift.json rename to src/terraform-aws-modules-metadata/redshift.json index 02923e7..77443fb 100644 --- a/modules-metadata/redshift.json +++ b/src/terraform-aws-modules-metadata/redshift.json @@ -48,6 +48,7 @@ }, "cluster_port": { "default": 5439, + "description": "Cluster port", "type": "number" }, "cluster_version": { @@ -55,6 +56,11 @@ "description": "Version of Redshift engine cluster", "type": "string" }, + "enable_case_sensitive_identifier": { + "default": false, + "description": "(Optional) A configuration value that determines whether name identifiers of databases, tables, and columns are case sensitive.", + "type": "bool" + }, "enable_logging": { "default": false, "description": "Enables logging information such as queries and connection attempts, for the specified Amazon Redshift cluster.", @@ -76,9 +82,9 @@ "type": "bool" }, "final_snapshot_identifier": { - "default": false, + "default": "", "description": "(Optional) The identifier of the final snapshot that is to be created immediately before deleting the cluster. If this parameter is provided, 'skip_final_snapshot' must be false.", - "type": "bool" + "type": "string" }, "kms_key_id": { "default": "", @@ -95,6 +101,11 @@ "description": "(Optional) The prefix applied to the log file names.", "type": "string" }, + "max_concurrency_scaling_clusters": { + "default": "1", + "description": "(Optional) Max concurrency scaling clusters parameter (0 to 10)", + "type": "string" + }, "owner_account": { "default": "null", "description": "(Optional) The AWS customer account used to create or copy the snapshot. Required if you are restoring a snapshot you do not own, optional if you own the snapshot.", diff --git a/modules-metadata/redshift_cloudcraft.json b/src/terraform-aws-modules-metadata/redshift_cloudcraft.json similarity index 100% rename from modules-metadata/redshift_cloudcraft.json rename to src/terraform-aws-modules-metadata/redshift_cloudcraft.json diff --git a/modules-metadata/redshift_variables.json b/src/terraform-aws-modules-metadata/redshift_variables.json similarity index 93% rename from modules-metadata/redshift_variables.json rename to src/terraform-aws-modules-metadata/redshift_variables.json index 0fd732e..9510ca6 100644 --- a/modules-metadata/redshift_variables.json +++ b/src/terraform-aws-modules-metadata/redshift_variables.json @@ -46,6 +46,7 @@ }, "cluster_port": { "default": 5439, + "description": "Cluster port", "type": "number" }, "cluster_version": { @@ -53,6 +54,11 @@ "description": "Version of Redshift engine cluster", "type": "string" }, + "enable_case_sensitive_identifier": { + "default": false, + "description": "(Optional) A configuration value that determines whether name identifiers of databases, tables, and columns are case sensitive.", + "type": "bool" + }, "enable_logging": { "default": false, "description": "Enables logging information such as queries and connection attempts, for the specified Amazon Redshift cluster.", @@ -74,9 +80,9 @@ "type": "bool" }, "final_snapshot_identifier": { - "default": false, + "default": "", "description": "(Optional) The identifier of the final snapshot that is to be created immediately before deleting the cluster. If this parameter is provided, 'skip_final_snapshot' must be false.", - "type": "bool" + "type": "string" }, "kms_key_id": { "default": "", @@ -93,6 +99,11 @@ "description": "(Optional) The prefix applied to the log file names.", "type": "string" }, + "max_concurrency_scaling_clusters": { + "default": "1", + "description": "(Optional) Max concurrency scaling clusters parameter (0 to 10)", + "type": "string" + }, "owner_account": { "default": "null", "description": "(Optional) The AWS customer account used to create or copy the snapshot. Required if you are restoring a snapshot you do not own, optional if you own the snapshot.", diff --git a/src/terraform-aws-modules-metadata/redshift_version.txt b/src/terraform-aws-modules-metadata/redshift_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/redshift_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/src/terraform-aws-modules-metadata/route53.json b/src/terraform-aws-modules-metadata/route53.json new file mode 100644 index 0000000..e69de29 diff --git a/modules-metadata/vpc_cloudcraft.json b/src/terraform-aws-modules-metadata/route53_cloudcraft.json similarity index 100% rename from modules-metadata/vpc_cloudcraft.json rename to src/terraform-aws-modules-metadata/route53_cloudcraft.json diff --git a/src/terraform-aws-modules-metadata/route53_variables.json b/src/terraform-aws-modules-metadata/route53_variables.json new file mode 100644 index 0000000..19765bd --- /dev/null +++ b/src/terraform-aws-modules-metadata/route53_variables.json @@ -0,0 +1 @@ +null diff --git a/src/terraform-aws-modules-metadata/route53_version.txt b/src/terraform-aws-modules-metadata/route53_version.txt new file mode 100644 index 0000000..46b105a --- /dev/null +++ b/src/terraform-aws-modules-metadata/route53_version.txt @@ -0,0 +1 @@ +v2.0.0 diff --git a/modules-metadata/s3-bucket.json b/src/terraform-aws-modules-metadata/s3-bucket.json similarity index 86% rename from modules-metadata/s3-bucket.json rename to src/terraform-aws-modules-metadata/s3-bucket.json index fe54516..c9683d4 100644 --- a/modules-metadata/s3-bucket.json +++ b/src/terraform-aws-modules-metadata/s3-bucket.json @@ -6,9 +6,14 @@ }, "acl": { "default": "private", - "description": "(Optional) The canned ACL to apply. Defaults to 'private'.", + "description": "(Optional) The canned ACL to apply. Defaults to 'private'. Conflicts with `grant`", "type": "string" }, + "attach_deny_insecure_transport_policy": { + "default": false, + "description": "Controls if S3 bucket should have deny non-SSL transport policy attached", + "type": "bool" + }, "attach_elb_log_delivery_policy": { "default": false, "description": "Controls if S3 bucket should have ELB log delivery policy attached", @@ -19,6 +24,11 @@ "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", "type": "bool" }, + "attach_public_policy": { + "default": true, + "description": "Controls if a user defined public bucket policy will be attached (set to `false` to allow upstream to apply defaults to the bucket)", + "type": "bool" + }, "block_public_acls": { "default": false, "description": "Whether Amazon S3 should block public ACLs for this bucket.", @@ -40,8 +50,8 @@ "type": "string" }, "cors_rule": { - "default": {}, - "description": "Map containing a rule of Cross-Origin Resource Sharing.", + "default": [], + "description": "List of maps containing rules for Cross-Origin Resource Sharing.", "type": "any" }, "create_bucket": { @@ -54,6 +64,11 @@ "description": "(Optional, Default:false ) A boolean that indicates all objects should be deleted from the bucket so that the bucket can be destroyed without error. These objects are not recoverable.", "type": "bool" }, + "grant": { + "default": [], + "description": "An ACL policy grant. Conflicts with `acl`", + "type": "any" + }, "ignore_public_acls": { "default": false, "description": "Whether Amazon S3 should ignore public ACLs for this bucket.", @@ -79,11 +94,6 @@ "description": "(Optional) A valid bucket policy JSON document. Note that if the policy document is not specific enough (but still valid), Terraform may view the policy as constantly changing in a terraform plan. In this case, please make sure you use the verbose/specific version of the policy. For more information about building AWS IAM policy documents with Terraform, see the AWS IAM Policy Document Guide.", "type": "string" }, - "region": { - "default": "null", - "description": "(Optional) If specified, the AWS region this bucket should reside in. Otherwise, the region used by the callee.", - "type": "string" - }, "replication_configuration": { "default": {}, "description": "Map containing cross-region replication configuration.", diff --git a/src/terraform-aws-modules-metadata/s3-bucket_cloudcraft.json b/src/terraform-aws-modules-metadata/s3-bucket_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/terraform-aws-modules-metadata/s3-bucket_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/modules-metadata/s3-bucket_variables.json b/src/terraform-aws-modules-metadata/s3-bucket_variables.json similarity index 86% rename from modules-metadata/s3-bucket_variables.json rename to src/terraform-aws-modules-metadata/s3-bucket_variables.json index fe54516..c9683d4 100644 --- a/modules-metadata/s3-bucket_variables.json +++ b/src/terraform-aws-modules-metadata/s3-bucket_variables.json @@ -6,9 +6,14 @@ }, "acl": { "default": "private", - "description": "(Optional) The canned ACL to apply. Defaults to 'private'.", + "description": "(Optional) The canned ACL to apply. Defaults to 'private'. Conflicts with `grant`", "type": "string" }, + "attach_deny_insecure_transport_policy": { + "default": false, + "description": "Controls if S3 bucket should have deny non-SSL transport policy attached", + "type": "bool" + }, "attach_elb_log_delivery_policy": { "default": false, "description": "Controls if S3 bucket should have ELB log delivery policy attached", @@ -19,6 +24,11 @@ "description": "Controls if S3 bucket should have bucket policy attached (set to `true` to use value of `policy` as bucket policy)", "type": "bool" }, + "attach_public_policy": { + "default": true, + "description": "Controls if a user defined public bucket policy will be attached (set to `false` to allow upstream to apply defaults to the bucket)", + "type": "bool" + }, "block_public_acls": { "default": false, "description": "Whether Amazon S3 should block public ACLs for this bucket.", @@ -40,8 +50,8 @@ "type": "string" }, "cors_rule": { - "default": {}, - "description": "Map containing a rule of Cross-Origin Resource Sharing.", + "default": [], + "description": "List of maps containing rules for Cross-Origin Resource Sharing.", "type": "any" }, "create_bucket": { @@ -54,6 +64,11 @@ "description": "(Optional, Default:false ) A boolean that indicates all objects should be deleted from the bucket so that the bucket can be destroyed without error. These objects are not recoverable.", "type": "bool" }, + "grant": { + "default": [], + "description": "An ACL policy grant. Conflicts with `acl`", + "type": "any" + }, "ignore_public_acls": { "default": false, "description": "Whether Amazon S3 should ignore public ACLs for this bucket.", @@ -79,11 +94,6 @@ "description": "(Optional) A valid bucket policy JSON document. Note that if the policy document is not specific enough (but still valid), Terraform may view the policy as constantly changing in a terraform plan. In this case, please make sure you use the verbose/specific version of the policy. For more information about building AWS IAM policy documents with Terraform, see the AWS IAM Policy Document Guide.", "type": "string" }, - "region": { - "default": "null", - "description": "(Optional) If specified, the AWS region this bucket should reside in. Otherwise, the region used by the callee.", - "type": "string" - }, "replication_configuration": { "default": {}, "description": "Map containing cross-region replication configuration.", diff --git a/modules-metadata/sns_version.txt b/src/terraform-aws-modules-metadata/s3-bucket_version.txt similarity index 100% rename from modules-metadata/sns_version.txt rename to src/terraform-aws-modules-metadata/s3-bucket_version.txt diff --git a/modules-metadata/security-group.json b/src/terraform-aws-modules-metadata/security-group.json similarity index 83% rename from modules-metadata/security-group.json rename to src/terraform-aws-modules-metadata/security-group.json index 32b6ff3..f709803 100644 --- a/modules-metadata/security-group.json +++ b/src/terraform-aws-modules-metadata/security-group.json @@ -16,6 +16,18 @@ "all-all" ] }, + "alertmanager": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "alertmanager-9093-tcp", + "alertmanager-9094-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "carbon-relay-ng": { "egress_rules": [ "all-all" @@ -89,6 +101,36 @@ "all-all" ] }, + "grafana": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "grafana-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "graphite-statsd": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "graphite-webui", + "graphite-2003-tcp", + "graphite-2004-tcp", + "graphite-2023-tcp", + "graphite-2024-tcp", + "graphite-8080-tcp", + "graphite-8125-tcp", + "graphite-8125-udp", + "graphite-8126-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "http-80": { "egress_rules": [ "all-all" @@ -160,7 +202,43 @@ "all-all" ], "ingress_rules": [ - "kafka-broker-tcp" + "kafka-broker-tcp", + "kafka-broker-tls-tcp", + "kafka-jmx-exporter-tcp", + "kafka-node-exporter-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "kibana": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "kibana-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "kubernetes-api": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "kubernetes-api-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "ldap": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "ldap-tcp" ], "ingress_with_self": [ "all-all" @@ -177,6 +255,17 @@ "all-all" ] }, + "logstash": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "logstash-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "memcached": { "egress_rules": [ "all-all" @@ -188,6 +277,17 @@ "all-all" ] }, + "minio": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "minio-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "mongodb": { "egress_rules": [ "all-all" @@ -297,6 +397,18 @@ "all-all" ] }, + "prometheus": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "prometheus-http-tcp", + "prometheus-pushgateway-http-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "puppet": { "egress_rules": [ "all-all" @@ -358,6 +470,17 @@ "all-all" ] }, + "solr": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "solr-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "splunk": { "egress_rules": [ "all-all" @@ -664,6 +787,11 @@ "description": "Number of computed ingress rules to create where 'source_security_group_id' is used", "type": "number" }, + "revoke_rules_on_delete": { + "default": false, + "description": "Instruct Terraform to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself. Enable for EMR.", + "type": "bool" + }, "rules": { "default": { "_": [ @@ -701,6 +829,18 @@ "tcp", "ActiveMQ MQTT" ], + "alertmanager-9093-tcp": [ + 9093, + 9093, + "tcp", + "Alert Manager" + ], + "alertmanager-9094-tcp": [ + 9094, + 9094, + "tcp", + "Alert Manager Cluster" + ], "all-all": [ -1, -1, @@ -887,6 +1027,66 @@ "tcp", "Elasticsearch REST interface" ], + "grafana-tcp": [ + 3000, + 3000, + "tcp", + "Grafana Dashboard" + ], + "graphite-2003-tcp": [ + 2003, + 2003, + "tcp", + "Carbon receiver plain text" + ], + "graphite-2004-tcp": [ + 2004, + 2004, + "tcp", + "Carbon receiver pickle" + ], + "graphite-2023-tcp": [ + 2023, + 2023, + "tcp", + "Carbon aggregator plaintext" + ], + "graphite-2024-tcp": [ + 2024, + 2024, + "tcp", + "Carbon aggregator pickle" + ], + "graphite-8080-tcp": [ + 8080, + 8080, + "tcp", + "Graphite gunicorn port" + ], + "graphite-8125-tcp": [ + 8125, + 8125, + "tcp", + "Statsd TCP" + ], + "graphite-8125-udp": [ + 8125, + 8125, + "udp", + "Statsd UDP default" + ], + "graphite-8126-tcp": [ + 8126, + 8126, + "tcp", + "Statsd admin" + ], + "graphite-webui": [ + 80, + 80, + "tcp", + "Graphite admin interface" + ], "http-80-tcp": [ 80, 80, @@ -929,18 +1129,66 @@ "tcp", "Kafka broker 0.8.2+" ], + "kafka-broker-tls-tcp": [ + 9094, + 9094, + "tcp", + "Kafka TLS enabled broker 0.8.2+" + ], + "kafka-jmx-exporter-tcp": [ + 11001, + 11001, + "tcp", + "Kafka JMX Exporter" + ], + "kafka-node-exporter-tcp": [ + 11002, + 11002, + "tcp", + "Kafka Node Exporter" + ], + "kibana-tcp": [ + 5601, + 5601, + "tcp", + "Kibana Web Interface" + ], + "kubernetes-api-tcp": [ + 6443, + 6443, + "tcp", + "Kubernetes API Server" + ], + "ldap-tcp": [ + 389, + 389, + "tcp", + "LDAP" + ], "ldaps-tcp": [ 636, 636, "tcp", "LDAPS" ], + "logstash-tcp": [ + 5044, + 5044, + "tcp", + "Logstash" + ], "memcached-tcp": [ 11211, 11211, "tcp", "Memcached" ], + "minio-tcp": [ + 9000, + 9000, + "tcp", + "MinIO" + ], "mongodb-27017-tcp": [ 27017, 27017, @@ -1055,6 +1303,18 @@ "tcp", "PostgreSQL" ], + "prometheus-http-tcp": [ + 9090, + 9090, + "tcp", + "Prometheus" + ], + "prometheus-pushgateway-http-tcp": [ + 9091, + 9091, + "tcp", + "Prometheus Pushgateway" + ], "puppet-tcp": [ 8140, 8140, @@ -1121,6 +1381,12 @@ "tcp", "Redshift" ], + "solr-tcp": [ + 8983, + 8987, + "tcp", + "Solr" + ], "splunk-hec-tcp": [ 8088, 8088, diff --git a/src/terraform-aws-modules-metadata/security-group_cloudcraft.json b/src/terraform-aws-modules-metadata/security-group_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/terraform-aws-modules-metadata/security-group_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/modules-metadata/security-group_variables.json b/src/terraform-aws-modules-metadata/security-group_variables.json similarity index 83% rename from modules-metadata/security-group_variables.json rename to src/terraform-aws-modules-metadata/security-group_variables.json index 32b6ff3..f709803 100644 --- a/modules-metadata/security-group_variables.json +++ b/src/terraform-aws-modules-metadata/security-group_variables.json @@ -16,6 +16,18 @@ "all-all" ] }, + "alertmanager": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "alertmanager-9093-tcp", + "alertmanager-9094-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "carbon-relay-ng": { "egress_rules": [ "all-all" @@ -89,6 +101,36 @@ "all-all" ] }, + "grafana": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "grafana-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "graphite-statsd": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "graphite-webui", + "graphite-2003-tcp", + "graphite-2004-tcp", + "graphite-2023-tcp", + "graphite-2024-tcp", + "graphite-8080-tcp", + "graphite-8125-tcp", + "graphite-8125-udp", + "graphite-8126-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "http-80": { "egress_rules": [ "all-all" @@ -160,7 +202,43 @@ "all-all" ], "ingress_rules": [ - "kafka-broker-tcp" + "kafka-broker-tcp", + "kafka-broker-tls-tcp", + "kafka-jmx-exporter-tcp", + "kafka-node-exporter-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "kibana": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "kibana-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "kubernetes-api": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "kubernetes-api-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, + "ldap": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "ldap-tcp" ], "ingress_with_self": [ "all-all" @@ -177,6 +255,17 @@ "all-all" ] }, + "logstash": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "logstash-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "memcached": { "egress_rules": [ "all-all" @@ -188,6 +277,17 @@ "all-all" ] }, + "minio": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "minio-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "mongodb": { "egress_rules": [ "all-all" @@ -297,6 +397,18 @@ "all-all" ] }, + "prometheus": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "prometheus-http-tcp", + "prometheus-pushgateway-http-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "puppet": { "egress_rules": [ "all-all" @@ -358,6 +470,17 @@ "all-all" ] }, + "solr": { + "egress_rules": [ + "all-all" + ], + "ingress_rules": [ + "solr-tcp" + ], + "ingress_with_self": [ + "all-all" + ] + }, "splunk": { "egress_rules": [ "all-all" @@ -664,6 +787,11 @@ "description": "Number of computed ingress rules to create where 'source_security_group_id' is used", "type": "number" }, + "revoke_rules_on_delete": { + "default": false, + "description": "Instruct Terraform to revoke all of the Security Groups attached ingress and egress rules before deleting the rule itself. Enable for EMR.", + "type": "bool" + }, "rules": { "default": { "_": [ @@ -701,6 +829,18 @@ "tcp", "ActiveMQ MQTT" ], + "alertmanager-9093-tcp": [ + 9093, + 9093, + "tcp", + "Alert Manager" + ], + "alertmanager-9094-tcp": [ + 9094, + 9094, + "tcp", + "Alert Manager Cluster" + ], "all-all": [ -1, -1, @@ -887,6 +1027,66 @@ "tcp", "Elasticsearch REST interface" ], + "grafana-tcp": [ + 3000, + 3000, + "tcp", + "Grafana Dashboard" + ], + "graphite-2003-tcp": [ + 2003, + 2003, + "tcp", + "Carbon receiver plain text" + ], + "graphite-2004-tcp": [ + 2004, + 2004, + "tcp", + "Carbon receiver pickle" + ], + "graphite-2023-tcp": [ + 2023, + 2023, + "tcp", + "Carbon aggregator plaintext" + ], + "graphite-2024-tcp": [ + 2024, + 2024, + "tcp", + "Carbon aggregator pickle" + ], + "graphite-8080-tcp": [ + 8080, + 8080, + "tcp", + "Graphite gunicorn port" + ], + "graphite-8125-tcp": [ + 8125, + 8125, + "tcp", + "Statsd TCP" + ], + "graphite-8125-udp": [ + 8125, + 8125, + "udp", + "Statsd UDP default" + ], + "graphite-8126-tcp": [ + 8126, + 8126, + "tcp", + "Statsd admin" + ], + "graphite-webui": [ + 80, + 80, + "tcp", + "Graphite admin interface" + ], "http-80-tcp": [ 80, 80, @@ -929,18 +1129,66 @@ "tcp", "Kafka broker 0.8.2+" ], + "kafka-broker-tls-tcp": [ + 9094, + 9094, + "tcp", + "Kafka TLS enabled broker 0.8.2+" + ], + "kafka-jmx-exporter-tcp": [ + 11001, + 11001, + "tcp", + "Kafka JMX Exporter" + ], + "kafka-node-exporter-tcp": [ + 11002, + 11002, + "tcp", + "Kafka Node Exporter" + ], + "kibana-tcp": [ + 5601, + 5601, + "tcp", + "Kibana Web Interface" + ], + "kubernetes-api-tcp": [ + 6443, + 6443, + "tcp", + "Kubernetes API Server" + ], + "ldap-tcp": [ + 389, + 389, + "tcp", + "LDAP" + ], "ldaps-tcp": [ 636, 636, "tcp", "LDAPS" ], + "logstash-tcp": [ + 5044, + 5044, + "tcp", + "Logstash" + ], "memcached-tcp": [ 11211, 11211, "tcp", "Memcached" ], + "minio-tcp": [ + 9000, + 9000, + "tcp", + "MinIO" + ], "mongodb-27017-tcp": [ 27017, 27017, @@ -1055,6 +1303,18 @@ "tcp", "PostgreSQL" ], + "prometheus-http-tcp": [ + 9090, + 9090, + "tcp", + "Prometheus" + ], + "prometheus-pushgateway-http-tcp": [ + 9091, + 9091, + "tcp", + "Prometheus Pushgateway" + ], "puppet-tcp": [ 8140, 8140, @@ -1121,6 +1381,12 @@ "tcp", "Redshift" ], + "solr-tcp": [ + 8983, + 8987, + "tcp", + "Solr" + ], "splunk-hec-tcp": [ 8088, 8088, diff --git a/src/terraform-aws-modules-metadata/security-group_version.txt b/src/terraform-aws-modules-metadata/security-group_version.txt new file mode 100644 index 0000000..857572f --- /dev/null +++ b/src/terraform-aws-modules-metadata/security-group_version.txt @@ -0,0 +1 @@ +v4.0.0 diff --git a/modules-metadata/sns.json b/src/terraform-aws-modules-metadata/sns.json similarity index 100% rename from modules-metadata/sns.json rename to src/terraform-aws-modules-metadata/sns.json diff --git a/src/terraform-aws-modules-metadata/sns_cloudcraft.json b/src/terraform-aws-modules-metadata/sns_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/terraform-aws-modules-metadata/sns_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/modules-metadata/sns_variables.json b/src/terraform-aws-modules-metadata/sns_variables.json similarity index 100% rename from modules-metadata/sns_variables.json rename to src/terraform-aws-modules-metadata/sns_variables.json diff --git a/src/terraform-aws-modules-metadata/sns_version.txt b/src/terraform-aws-modules-metadata/sns_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/sns_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/modules-metadata/sqs.json b/src/terraform-aws-modules-metadata/sqs.json similarity index 100% rename from modules-metadata/sqs.json rename to src/terraform-aws-modules-metadata/sqs.json diff --git a/modules-metadata/sqs_cloudcraft.json b/src/terraform-aws-modules-metadata/sqs_cloudcraft.json similarity index 100% rename from modules-metadata/sqs_cloudcraft.json rename to src/terraform-aws-modules-metadata/sqs_cloudcraft.json diff --git a/modules-metadata/sqs_variables.json b/src/terraform-aws-modules-metadata/sqs_variables.json similarity index 100% rename from modules-metadata/sqs_variables.json rename to src/terraform-aws-modules-metadata/sqs_variables.json diff --git a/src/terraform-aws-modules-metadata/sqs_version.txt b/src/terraform-aws-modules-metadata/sqs_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/sqs_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/modules-metadata/terraform_hcl2.awk b/src/terraform-aws-modules-metadata/terraform_hcl2.awk similarity index 100% rename from modules-metadata/terraform_hcl2.awk rename to src/terraform-aws-modules-metadata/terraform_hcl2.awk diff --git a/modules-metadata/update_modules_metadata.sh b/src/terraform-aws-modules-metadata/update_modules_metadata.sh similarity index 59% rename from modules-metadata/update_modules_metadata.sh rename to src/terraform-aws-modules-metadata/update_modules_metadata.sh index 7856c94..96fef76 100755 --- a/modules-metadata/update_modules_metadata.sh +++ b/src/terraform-aws-modules-metadata/update_modules_metadata.sh @@ -6,19 +6,24 @@ readonly script_path="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd $script_path declare -a MODULES=(rds -rds-aurora -ec2-instance -elb -alb -autoscaling -security-group -sns -sqs -vpc -redshift -s3-bucket -dynamodb-table) -#cloudfront + rds-aurora + ec2-instance + elb + alb + autoscaling + security-group + sns + sqs + vpc + redshift + s3-bucket + dynamodb-table + cloudfront + lambda + apigateway-v2 + vpn-gateway +) +# route53 - contains only submodules MODULES_DIR=~/Sites/terraform-aws-modules @@ -30,23 +35,23 @@ for module in "${MODULES[@]}"; do tmp_file_tf="$tmp_file.tf" # GNU AWK is required - awk -f "terraform_hcl2.awk" ${MODULES_DIR}/terraform-aws-${module}/*.tf > "$tmp_file_tf" + awk -f "terraform_hcl2.awk" ${MODULES_DIR}/terraform-aws-${module}/*.tf >"$tmp_file_tf" # hcltool comes from https://github.com/virtuald/pyhcl/blob/master/scripts/hcltool - hcltool "$tmp_file_tf" | jq -r '.variable' > ${module}_variables.json + hcltool "$tmp_file_tf" | jq -r '.variable' >${module}_variables.json - test -f ${module}_cloudcraft.json || echo "{}" > ${module}_cloudcraft.json - jq -s '.[0] * .[1]' ${module}_variables.json ${module}_cloudcraft.json > ${module}.json + test -f ${module}_cloudcraft.json || echo "{}" >${module}_cloudcraft.json + jq -s '.[0] * .[1]' ${module}_variables.json ${module}_cloudcraft.json >${module}.json rm -f "$tmp_file_tf" # Write module version - pushd ${MODULES_DIR}/terraform-aws-${module} > /dev/null + pushd ${MODULES_DIR}/terraform-aws-${module} >/dev/null latest_tag=$(git describe --tags --abbrev=0) echo "$module => $latest_tag" - popd > /dev/null + popd >/dev/null - echo -n $latest_tag > ${module}_version.txt + echo -n $latest_tag >${module}_version.txt echo "*********" done diff --git a/src/terraform-aws-modules-metadata/vpc.json b/src/terraform-aws-modules-metadata/vpc.json new file mode 100644 index 0000000..7806242 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpc.json @@ -0,0 +1,959 @@ +{ + "amazon_side_asn": { + "default": "64512", + "description": "The Autonomous System Number (ASN) for the Amazon side of the gateway. By default the virtual private gateway is created with the current default Amazon ASN.", + "type": "string" + }, + "assign_ipv6_address_on_creation": { + "default": false, + "description": "Assign IPv6 address on subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "azs": { + "default": [], + "description": "A list of availability zones names or ids in the region", + "type": "list(string)" + }, + "cidr": { + "default": "0.0.0.0/0", + "description": "The CIDR block for the VPC. Default value is a valid CIDR, but not acceptable by AWS and should be overridden", + "type": "string" + }, + "create_database_internet_gateway_route": { + "default": false, + "description": "Controls if an internet gateway route for public database access should be created", + "type": "bool" + }, + "create_database_nat_gateway_route": { + "default": false, + "description": "Controls if a nat gateway route should be created to give internet access to the database subnets", + "type": "bool" + }, + "create_database_subnet_group": { + "default": true, + "description": "Controls if database subnet group should be created (n.b. database_subnets must also be set)", + "type": "bool" + }, + "create_database_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for database should be created", + "type": "bool" + }, + "create_egress_only_igw": { + "default": true, + "description": "Controls if an Egress Only Internet Gateway is created and its related routes.", + "type": "bool" + }, + "create_elasticache_subnet_group": { + "default": true, + "description": "Controls if elasticache subnet group should be created", + "type": "bool" + }, + "create_elasticache_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for elasticache should be created", + "type": "bool" + }, + "create_flow_log_cloudwatch_iam_role": { + "default": false, + "description": "Whether to create IAM role for VPC Flow Logs", + "type": "bool" + }, + "create_flow_log_cloudwatch_log_group": { + "default": false, + "description": "Whether to create CloudWatch log group for VPC Flow Logs", + "type": "bool" + }, + "create_igw": { + "default": true, + "description": "Controls if an Internet Gateway is created for public subnets and the related routes that connect them.", + "type": "bool" + }, + "create_redshift_subnet_group": { + "default": true, + "description": "Controls if redshift subnet group should be created", + "type": "bool" + }, + "create_redshift_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for redshift should be created", + "type": "bool" + }, + "create_vpc": { + "default": true, + "description": "Controls if VPC should be created (it affects almost all resources)", + "type": "bool" + }, + "customer_gateway_tags": { + "default": {}, + "description": "Additional tags for the Customer Gateway", + "type": "map(string)" + }, + "customer_gateways": { + "default": {}, + "description": "Maps of Customer Gateway's attributes (BGP ASN and Gateway's Internet-routable external IP address)", + "type": "map(map(any))" + }, + "database_acl_tags": { + "default": {}, + "description": "Additional tags for the database subnets network ACL", + "type": "map(string)" + }, + "database_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for database subnets", + "type": "bool" + }, + "database_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Database subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "database_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Database subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "database_route_table_tags": { + "default": {}, + "description": "Additional tags for the database route tables", + "type": "map(string)" + }, + "database_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on database subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "database_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the database subnet group", + "type": "map(string)" + }, + "database_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 database subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "database_subnet_suffix": { + "default": "db", + "description": "Suffix to append to database subnets name", + "type": "string" + }, + "database_subnet_tags": { + "default": {}, + "description": "Additional tags for the database subnets", + "type": "map(string)" + }, + "database_subnets": { + "default": [], + "description": "A list of database subnets", + "type": "list(string)" + }, + "default_network_acl_egress": { + "default": [ + { + "action": "allow", + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_no": 100, + "to_port": 0 + }, + { + "action": "allow", + "from_port": 0, + "ipv6_cidr_block": "::/0", + "protocol": "-1", + "rule_no": 101, + "to_port": 0 + } + ], + "description": "List of maps of egress rules to set on the Default Network ACL", + "type": "list(map(string))" + }, + "default_network_acl_ingress": { + "default": [ + { + "action": "allow", + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_no": 100, + "to_port": 0 + }, + { + "action": "allow", + "from_port": 0, + "ipv6_cidr_block": "::/0", + "protocol": "-1", + "rule_no": 101, + "to_port": 0 + } + ], + "description": "List of maps of ingress rules to set on the Default Network ACL", + "type": "list(map(string))" + }, + "default_network_acl_name": { + "default": "", + "description": "Name to be used on the Default Network ACL", + "type": "string" + }, + "default_network_acl_tags": { + "default": {}, + "description": "Additional tags for the Default Network ACL", + "type": "map(string)" + }, + "default_route_table_propagating_vgws": { + "default": [], + "description": "List of virtual gateways for propagation", + "type": "list(string)" + }, + "default_route_table_routes": { + "default": [], + "description": "Configuration block of routes. See https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/default_route_table#route", + "type": "list(map(string))" + }, + "default_route_table_tags": { + "default": {}, + "description": "Additional tags for the default route table", + "type": "map(string)" + }, + "default_security_group_egress": { + "default": "null", + "description": "List of maps of egress rules to set on the default security group", + "type": "list(map(string))" + }, + "default_security_group_ingress": { + "default": "null", + "description": "List of maps of ingress rules to set on the default security group", + "type": "list(map(string))" + }, + "default_security_group_name": { + "default": "default", + "description": "Name to be used on the default security group", + "type": "string" + }, + "default_security_group_tags": { + "default": {}, + "description": "Additional tags for the default security group", + "type": "map(string)" + }, + "default_vpc_enable_classiclink": { + "default": false, + "description": "Should be true to enable ClassicLink in the Default VPC", + "type": "bool" + }, + "default_vpc_enable_dns_hostnames": { + "default": false, + "description": "Should be true to enable DNS hostnames in the Default VPC", + "type": "bool" + }, + "default_vpc_enable_dns_support": { + "default": true, + "description": "Should be true to enable DNS support in the Default VPC", + "type": "bool" + }, + "default_vpc_name": { + "default": "", + "description": "Name to be used on the Default VPC", + "type": "string" + }, + "default_vpc_tags": { + "default": {}, + "description": "Additional tags for the Default VPC", + "type": "map(string)" + }, + "dhcp_options_domain_name": { + "default": "", + "description": "Specifies DNS name for DHCP options set (requires enable_dhcp_options set to true)", + "type": "string" + }, + "dhcp_options_domain_name_servers": { + "default": [ + "AmazonProvidedDNS" + ], + "description": "Specify a list of DNS server addresses for DHCP options set, default to AWS provided (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_netbios_name_servers": { + "default": [], + "description": "Specify a list of netbios servers for DHCP options set (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_netbios_node_type": { + "default": "", + "description": "Specify netbios node_type for DHCP options set (requires enable_dhcp_options set to true)", + "type": "string" + }, + "dhcp_options_ntp_servers": { + "default": [], + "description": "Specify a list of NTP servers for DHCP options set (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_tags": { + "default": {}, + "description": "Additional tags for the DHCP option set (requires enable_dhcp_options set to true)", + "type": "map(string)" + }, + "elasticache_acl_tags": { + "default": {}, + "description": "Additional tags for the elasticache subnets network ACL", + "type": "map(string)" + }, + "elasticache_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for elasticache subnets", + "type": "bool" + }, + "elasticache_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Elasticache subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "elasticache_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Elasticache subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "elasticache_route_table_tags": { + "default": {}, + "description": "Additional tags for the elasticache route tables", + "type": "map(string)" + }, + "elasticache_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on elasticache subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "elasticache_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 elasticache subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "elasticache_subnet_suffix": { + "default": "elasticache", + "description": "Suffix to append to elasticache subnets name", + "type": "string" + }, + "elasticache_subnet_tags": { + "default": {}, + "description": "Additional tags for the elasticache subnets", + "type": "map(string)" + }, + "elasticache_subnets": { + "default": [], + "description": "A list of elasticache subnets", + "type": "list(string)" + }, + "enable_classiclink": { + "default": "null", + "description": "Should be true to enable ClassicLink for the VPC. Only valid in regions and accounts that support EC2 Classic.", + "type": "bool" + }, + "enable_classiclink_dns_support": { + "default": "null", + "description": "Should be true to enable ClassicLink DNS Support for the VPC. Only valid in regions and accounts that support EC2 Classic.", + "type": "bool" + }, + "enable_dhcp_options": { + "default": false, + "description": "Should be true if you want to specify a DHCP options set with a custom domain name, DNS servers, NTP servers, netbios servers, and/or netbios server type", + "type": "bool" + }, + "enable_dns_hostnames": { + "default": false, + "description": "Should be true to enable DNS hostnames in the VPC", + "type": "bool" + }, + "enable_dns_support": { + "default": true, + "description": "Should be true to enable DNS support in the VPC", + "type": "bool" + }, + "enable_flow_log": { + "default": false, + "description": "Whether or not to enable VPC Flow Logs", + "type": "bool" + }, + "enable_ipv6": { + "default": false, + "description": "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IP addresses, or the size of the CIDR block.", + "type": "bool" + }, + "enable_nat_gateway": { + "default": false, + "description": "Should be true if you want to provision NAT Gateways for each of your private networks", + "type": "bool" + }, + "enable_public_redshift": { + "default": false, + "description": "Controls if redshift should have public routing table", + "type": "bool" + }, + "enable_vpn_gateway": { + "default": false, + "description": "Should be true if you want to create a new VPN Gateway resource and attach it to the VPC", + "type": "bool" + }, + "external_nat_ip_ids": { + "default": [], + "description": "List of EIP IDs to be assigned to the NAT Gateways (used in combination with reuse_nat_ips)", + "type": "list(string)" + }, + "external_nat_ips": { + "default": [], + "description": "List of EIPs to be used for `nat_public_ips` output (used in combination with reuse_nat_ips and external_nat_ip_ids)", + "type": "list(string)" + }, + "flow_log_cloudwatch_iam_role_arn": { + "default": "", + "description": "The ARN for the IAM role that's used to post flow logs to a CloudWatch Logs log group. When flow_log_destination_arn is set to ARN of Cloudwatch Logs, this argument needs to be provided.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_name_prefix": { + "default": "/aws/vpc-flow-log/", + "description": "Specifies the name prefix of CloudWatch Log Group for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group for VPC flow logs.", + "type": "number" + }, + "flow_log_destination_arn": { + "default": "", + "description": "The ARN of the CloudWatch log group or S3 bucket where VPC Flow Logs will be pushed. If this ARN is a S3 bucket the appropriate permissions need to be set on that bucket's policy. When create_flow_log_cloudwatch_log_group is set to false this argument must be provided.", + "type": "string" + }, + "flow_log_destination_type": { + "default": "cloud-watch-logs", + "description": "Type of flow log destination. Can be s3 or cloud-watch-logs.", + "type": "string" + }, + "flow_log_log_format": { + "default": "null", + "description": "The fields to include in the flow log record, in the order in which they should appear.", + "type": "string" + }, + "flow_log_max_aggregation_interval": { + "default": 600, + "description": "The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. Valid Values: `60` seconds or `600` seconds.", + "type": "number" + }, + "flow_log_traffic_type": { + "default": "ALL", + "description": "The type of traffic to capture. Valid values: ACCEPT, REJECT, ALL.", + "type": "string" + }, + "igw_tags": { + "default": {}, + "description": "Additional tags for the internet gateway", + "type": "map(string)" + }, + "instance_tenancy": { + "default": "default", + "description": "A tenancy option for instances launched into the VPC", + "type": "string" + }, + "intra_acl_tags": { + "default": {}, + "description": "Additional tags for the intra subnets network ACL", + "type": "map(string)" + }, + "intra_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for intra subnets", + "type": "bool" + }, + "intra_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Intra subnets inbound network ACLs", + "type": "list(map(string))" + }, + "intra_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Intra subnets outbound network ACLs", + "type": "list(map(string))" + }, + "intra_route_table_tags": { + "default": {}, + "description": "Additional tags for the intra route tables", + "type": "map(string)" + }, + "intra_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on intra subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "intra_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 intra subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "intra_subnet_suffix": { + "default": "intra", + "description": "Suffix to append to intra subnets name", + "type": "string" + }, + "intra_subnet_tags": { + "default": {}, + "description": "Additional tags for the intra subnets", + "type": "map(string)" + }, + "intra_subnets": { + "default": [], + "description": "A list of intra subnets", + "type": "list(string)" + }, + "manage_default_network_acl": { + "default": false, + "description": "Should be true to adopt and manage Default Network ACL", + "type": "bool" + }, + "manage_default_route_table": { + "default": false, + "description": "Should be true to manage default route table", + "type": "bool" + }, + "manage_default_security_group": { + "default": false, + "description": "Should be true to adopt and manage default security group", + "type": "bool" + }, + "manage_default_vpc": { + "default": false, + "description": "Should be true to adopt and manage Default VPC", + "type": "bool" + }, + "map_public_ip_on_launch": { + "default": true, + "description": "Should be false if you do not want to auto-assign public IP on launch", + "type": "bool" + }, + "name": { + "default": "", + "description": "Name to be used on all the resources as identifier", + "type": "string" + }, + "nat_eip_tags": { + "default": {}, + "description": "Additional tags for the NAT EIP", + "type": "map(string)" + }, + "nat_gateway_tags": { + "default": {}, + "description": "Additional tags for the NAT gateways", + "type": "map(string)" + }, + "one_nat_gateway_per_az": { + "default": false, + "description": "Should be true if you want only one NAT Gateway per availability zone. Requires `var.azs` to be set, and the number of `public_subnets` created to be greater than or equal to the number of availability zones specified in `var.azs`.", + "type": "bool" + }, + "outpost_acl_tags": { + "default": {}, + "description": "Additional tags for the outpost subnets network ACL", + "type": "map(string)" + }, + "outpost_arn": { + "default": "null", + "description": "ARN of Outpost you want to create a subnet in.", + "type": "string" + }, + "outpost_az": { + "default": "null", + "description": "AZ where Outpost is anchored.", + "type": "string" + }, + "outpost_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for outpost subnets", + "type": "bool" + }, + "outpost_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Outpost subnets inbound network ACLs", + "type": "list(map(string))" + }, + "outpost_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Outpost subnets outbound network ACLs", + "type": "list(map(string))" + }, + "outpost_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on outpost subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "outpost_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 outpost subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "outpost_subnet_suffix": { + "default": "outpost", + "description": "Suffix to append to outpost subnets name", + "type": "string" + }, + "outpost_subnet_tags": { + "default": {}, + "description": "Additional tags for the outpost subnets", + "type": "map(string)" + }, + "outpost_subnets": { + "default": [], + "description": "A list of outpost subnets inside the VPC", + "type": "list(string)" + }, + "private_acl_tags": { + "default": {}, + "description": "Additional tags for the private subnets network ACL", + "type": "map(string)" + }, + "private_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for private subnets", + "type": "bool" + }, + "private_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Private subnets inbound network ACLs", + "type": "list(map(string))" + }, + "private_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Private subnets outbound network ACLs", + "type": "list(map(string))" + }, + "private_route_table_tags": { + "default": {}, + "description": "Additional tags for the private route tables", + "type": "map(string)" + }, + "private_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on private subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "private_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 private subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "private_subnet_suffix": { + "default": "private", + "description": "Suffix to append to private subnets name", + "type": "string" + }, + "private_subnet_tags": { + "default": {}, + "description": "Additional tags for the private subnets", + "type": "map(string)" + }, + "private_subnets": { + "default": [], + "description": "A list of private subnets inside the VPC", + "type": "list(string)" + }, + "propagate_intra_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "propagate_private_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "propagate_public_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "public_acl_tags": { + "default": {}, + "description": "Additional tags for the public subnets network ACL", + "type": "map(string)" + }, + "public_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for public subnets", + "type": "bool" + }, + "public_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Public subnets inbound network ACLs", + "type": "list(map(string))" + }, + "public_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Public subnets outbound network ACLs", + "type": "list(map(string))" + }, + "public_route_table_tags": { + "default": {}, + "description": "Additional tags for the public route tables", + "type": "map(string)" + }, + "public_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on public subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "public_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 public subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "public_subnet_suffix": { + "default": "public", + "description": "Suffix to append to public subnets name", + "type": "string" + }, + "public_subnet_tags": { + "default": {}, + "description": "Additional tags for the public subnets", + "type": "map(string)" + }, + "public_subnets": { + "default": [], + "description": "A list of public subnets inside the VPC", + "type": "list(string)" + }, + "redshift_acl_tags": { + "default": {}, + "description": "Additional tags for the redshift subnets network ACL", + "type": "map(string)" + }, + "redshift_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for redshift subnets", + "type": "bool" + }, + "redshift_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Redshift subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "redshift_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Redshift subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "redshift_route_table_tags": { + "default": {}, + "description": "Additional tags for the redshift route tables", + "type": "map(string)" + }, + "redshift_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on redshift subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "redshift_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the redshift subnet group", + "type": "map(string)" + }, + "redshift_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 redshift subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "redshift_subnet_suffix": { + "default": "redshift", + "description": "Suffix to append to redshift subnets name", + "type": "string" + }, + "redshift_subnet_tags": { + "default": {}, + "description": "Additional tags for the redshift subnets", + "type": "map(string)" + }, + "redshift_subnets": { + "default": [], + "description": "A list of redshift subnets", + "type": "list(string)" + }, + "reuse_nat_ips": { + "default": false, + "description": "Should be true if you don't want EIPs to be created for your NAT Gateways and will instead pass them in via the 'external_nat_ip_ids' variable", + "type": "bool" + }, + "secondary_cidr_blocks": { + "default": [], + "description": "List of secondary CIDR blocks to associate with the VPC to extend the IP Address pool", + "type": "list(string)" + }, + "single_nat_gateway": { + "default": false, + "description": "Should be true if you want to provision a single shared NAT Gateway across all of your private networks", + "type": "bool" + }, + "tags": { + "default": {}, + "description": "A map of tags to add to all resources", + "type": "map(string)" + }, + "vpc_flow_log_permissions_boundary": { + "default": "null", + "description": "The ARN of the Permissions Boundary for the VPC Flow Log IAM Role", + "type": "string" + }, + "vpc_flow_log_tags": { + "default": {}, + "description": "Additional tags for the VPC Flow Logs", + "type": "map(string)" + }, + "vpc_tags": { + "default": {}, + "description": "Additional tags for the VPC", + "type": "map(string)" + }, + "vpn_gateway_az": { + "default": "null", + "description": "The Availability Zone for the VPN Gateway", + "type": "string" + }, + "vpn_gateway_id": { + "default": "", + "description": "ID of VPN Gateway to attach to the VPC", + "type": "string" + }, + "vpn_gateway_tags": { + "default": {}, + "description": "Additional tags for the VPN gateway", + "type": "map(string)" + } +} diff --git a/src/terraform-aws-modules-metadata/vpc_cloudcraft.json b/src/terraform-aws-modules-metadata/vpc_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpc_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/src/terraform-aws-modules-metadata/vpc_variables.json b/src/terraform-aws-modules-metadata/vpc_variables.json new file mode 100644 index 0000000..7806242 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpc_variables.json @@ -0,0 +1,959 @@ +{ + "amazon_side_asn": { + "default": "64512", + "description": "The Autonomous System Number (ASN) for the Amazon side of the gateway. By default the virtual private gateway is created with the current default Amazon ASN.", + "type": "string" + }, + "assign_ipv6_address_on_creation": { + "default": false, + "description": "Assign IPv6 address on subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "azs": { + "default": [], + "description": "A list of availability zones names or ids in the region", + "type": "list(string)" + }, + "cidr": { + "default": "0.0.0.0/0", + "description": "The CIDR block for the VPC. Default value is a valid CIDR, but not acceptable by AWS and should be overridden", + "type": "string" + }, + "create_database_internet_gateway_route": { + "default": false, + "description": "Controls if an internet gateway route for public database access should be created", + "type": "bool" + }, + "create_database_nat_gateway_route": { + "default": false, + "description": "Controls if a nat gateway route should be created to give internet access to the database subnets", + "type": "bool" + }, + "create_database_subnet_group": { + "default": true, + "description": "Controls if database subnet group should be created (n.b. database_subnets must also be set)", + "type": "bool" + }, + "create_database_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for database should be created", + "type": "bool" + }, + "create_egress_only_igw": { + "default": true, + "description": "Controls if an Egress Only Internet Gateway is created and its related routes.", + "type": "bool" + }, + "create_elasticache_subnet_group": { + "default": true, + "description": "Controls if elasticache subnet group should be created", + "type": "bool" + }, + "create_elasticache_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for elasticache should be created", + "type": "bool" + }, + "create_flow_log_cloudwatch_iam_role": { + "default": false, + "description": "Whether to create IAM role for VPC Flow Logs", + "type": "bool" + }, + "create_flow_log_cloudwatch_log_group": { + "default": false, + "description": "Whether to create CloudWatch log group for VPC Flow Logs", + "type": "bool" + }, + "create_igw": { + "default": true, + "description": "Controls if an Internet Gateway is created for public subnets and the related routes that connect them.", + "type": "bool" + }, + "create_redshift_subnet_group": { + "default": true, + "description": "Controls if redshift subnet group should be created", + "type": "bool" + }, + "create_redshift_subnet_route_table": { + "default": false, + "description": "Controls if separate route table for redshift should be created", + "type": "bool" + }, + "create_vpc": { + "default": true, + "description": "Controls if VPC should be created (it affects almost all resources)", + "type": "bool" + }, + "customer_gateway_tags": { + "default": {}, + "description": "Additional tags for the Customer Gateway", + "type": "map(string)" + }, + "customer_gateways": { + "default": {}, + "description": "Maps of Customer Gateway's attributes (BGP ASN and Gateway's Internet-routable external IP address)", + "type": "map(map(any))" + }, + "database_acl_tags": { + "default": {}, + "description": "Additional tags for the database subnets network ACL", + "type": "map(string)" + }, + "database_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for database subnets", + "type": "bool" + }, + "database_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Database subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "database_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Database subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "database_route_table_tags": { + "default": {}, + "description": "Additional tags for the database route tables", + "type": "map(string)" + }, + "database_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on database subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "database_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the database subnet group", + "type": "map(string)" + }, + "database_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 database subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "database_subnet_suffix": { + "default": "db", + "description": "Suffix to append to database subnets name", + "type": "string" + }, + "database_subnet_tags": { + "default": {}, + "description": "Additional tags for the database subnets", + "type": "map(string)" + }, + "database_subnets": { + "default": [], + "description": "A list of database subnets", + "type": "list(string)" + }, + "default_network_acl_egress": { + "default": [ + { + "action": "allow", + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_no": 100, + "to_port": 0 + }, + { + "action": "allow", + "from_port": 0, + "ipv6_cidr_block": "::/0", + "protocol": "-1", + "rule_no": 101, + "to_port": 0 + } + ], + "description": "List of maps of egress rules to set on the Default Network ACL", + "type": "list(map(string))" + }, + "default_network_acl_ingress": { + "default": [ + { + "action": "allow", + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_no": 100, + "to_port": 0 + }, + { + "action": "allow", + "from_port": 0, + "ipv6_cidr_block": "::/0", + "protocol": "-1", + "rule_no": 101, + "to_port": 0 + } + ], + "description": "List of maps of ingress rules to set on the Default Network ACL", + "type": "list(map(string))" + }, + "default_network_acl_name": { + "default": "", + "description": "Name to be used on the Default Network ACL", + "type": "string" + }, + "default_network_acl_tags": { + "default": {}, + "description": "Additional tags for the Default Network ACL", + "type": "map(string)" + }, + "default_route_table_propagating_vgws": { + "default": [], + "description": "List of virtual gateways for propagation", + "type": "list(string)" + }, + "default_route_table_routes": { + "default": [], + "description": "Configuration block of routes. See https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/default_route_table#route", + "type": "list(map(string))" + }, + "default_route_table_tags": { + "default": {}, + "description": "Additional tags for the default route table", + "type": "map(string)" + }, + "default_security_group_egress": { + "default": "null", + "description": "List of maps of egress rules to set on the default security group", + "type": "list(map(string))" + }, + "default_security_group_ingress": { + "default": "null", + "description": "List of maps of ingress rules to set on the default security group", + "type": "list(map(string))" + }, + "default_security_group_name": { + "default": "default", + "description": "Name to be used on the default security group", + "type": "string" + }, + "default_security_group_tags": { + "default": {}, + "description": "Additional tags for the default security group", + "type": "map(string)" + }, + "default_vpc_enable_classiclink": { + "default": false, + "description": "Should be true to enable ClassicLink in the Default VPC", + "type": "bool" + }, + "default_vpc_enable_dns_hostnames": { + "default": false, + "description": "Should be true to enable DNS hostnames in the Default VPC", + "type": "bool" + }, + "default_vpc_enable_dns_support": { + "default": true, + "description": "Should be true to enable DNS support in the Default VPC", + "type": "bool" + }, + "default_vpc_name": { + "default": "", + "description": "Name to be used on the Default VPC", + "type": "string" + }, + "default_vpc_tags": { + "default": {}, + "description": "Additional tags for the Default VPC", + "type": "map(string)" + }, + "dhcp_options_domain_name": { + "default": "", + "description": "Specifies DNS name for DHCP options set (requires enable_dhcp_options set to true)", + "type": "string" + }, + "dhcp_options_domain_name_servers": { + "default": [ + "AmazonProvidedDNS" + ], + "description": "Specify a list of DNS server addresses for DHCP options set, default to AWS provided (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_netbios_name_servers": { + "default": [], + "description": "Specify a list of netbios servers for DHCP options set (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_netbios_node_type": { + "default": "", + "description": "Specify netbios node_type for DHCP options set (requires enable_dhcp_options set to true)", + "type": "string" + }, + "dhcp_options_ntp_servers": { + "default": [], + "description": "Specify a list of NTP servers for DHCP options set (requires enable_dhcp_options set to true)", + "type": "list(string)" + }, + "dhcp_options_tags": { + "default": {}, + "description": "Additional tags for the DHCP option set (requires enable_dhcp_options set to true)", + "type": "map(string)" + }, + "elasticache_acl_tags": { + "default": {}, + "description": "Additional tags for the elasticache subnets network ACL", + "type": "map(string)" + }, + "elasticache_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for elasticache subnets", + "type": "bool" + }, + "elasticache_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Elasticache subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "elasticache_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Elasticache subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "elasticache_route_table_tags": { + "default": {}, + "description": "Additional tags for the elasticache route tables", + "type": "map(string)" + }, + "elasticache_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on elasticache subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "elasticache_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 elasticache subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "elasticache_subnet_suffix": { + "default": "elasticache", + "description": "Suffix to append to elasticache subnets name", + "type": "string" + }, + "elasticache_subnet_tags": { + "default": {}, + "description": "Additional tags for the elasticache subnets", + "type": "map(string)" + }, + "elasticache_subnets": { + "default": [], + "description": "A list of elasticache subnets", + "type": "list(string)" + }, + "enable_classiclink": { + "default": "null", + "description": "Should be true to enable ClassicLink for the VPC. Only valid in regions and accounts that support EC2 Classic.", + "type": "bool" + }, + "enable_classiclink_dns_support": { + "default": "null", + "description": "Should be true to enable ClassicLink DNS Support for the VPC. Only valid in regions and accounts that support EC2 Classic.", + "type": "bool" + }, + "enable_dhcp_options": { + "default": false, + "description": "Should be true if you want to specify a DHCP options set with a custom domain name, DNS servers, NTP servers, netbios servers, and/or netbios server type", + "type": "bool" + }, + "enable_dns_hostnames": { + "default": false, + "description": "Should be true to enable DNS hostnames in the VPC", + "type": "bool" + }, + "enable_dns_support": { + "default": true, + "description": "Should be true to enable DNS support in the VPC", + "type": "bool" + }, + "enable_flow_log": { + "default": false, + "description": "Whether or not to enable VPC Flow Logs", + "type": "bool" + }, + "enable_ipv6": { + "default": false, + "description": "Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IP addresses, or the size of the CIDR block.", + "type": "bool" + }, + "enable_nat_gateway": { + "default": false, + "description": "Should be true if you want to provision NAT Gateways for each of your private networks", + "type": "bool" + }, + "enable_public_redshift": { + "default": false, + "description": "Controls if redshift should have public routing table", + "type": "bool" + }, + "enable_vpn_gateway": { + "default": false, + "description": "Should be true if you want to create a new VPN Gateway resource and attach it to the VPC", + "type": "bool" + }, + "external_nat_ip_ids": { + "default": [], + "description": "List of EIP IDs to be assigned to the NAT Gateways (used in combination with reuse_nat_ips)", + "type": "list(string)" + }, + "external_nat_ips": { + "default": [], + "description": "List of EIPs to be used for `nat_public_ips` output (used in combination with reuse_nat_ips and external_nat_ip_ids)", + "type": "list(string)" + }, + "flow_log_cloudwatch_iam_role_arn": { + "default": "", + "description": "The ARN for the IAM role that's used to post flow logs to a CloudWatch Logs log group. When flow_log_destination_arn is set to ARN of Cloudwatch Logs, this argument needs to be provided.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_kms_key_id": { + "default": "null", + "description": "The ARN of the KMS Key to use when encrypting log data for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_name_prefix": { + "default": "/aws/vpc-flow-log/", + "description": "Specifies the name prefix of CloudWatch Log Group for VPC flow logs.", + "type": "string" + }, + "flow_log_cloudwatch_log_group_retention_in_days": { + "default": "null", + "description": "Specifies the number of days you want to retain log events in the specified log group for VPC flow logs.", + "type": "number" + }, + "flow_log_destination_arn": { + "default": "", + "description": "The ARN of the CloudWatch log group or S3 bucket where VPC Flow Logs will be pushed. If this ARN is a S3 bucket the appropriate permissions need to be set on that bucket's policy. When create_flow_log_cloudwatch_log_group is set to false this argument must be provided.", + "type": "string" + }, + "flow_log_destination_type": { + "default": "cloud-watch-logs", + "description": "Type of flow log destination. Can be s3 or cloud-watch-logs.", + "type": "string" + }, + "flow_log_log_format": { + "default": "null", + "description": "The fields to include in the flow log record, in the order in which they should appear.", + "type": "string" + }, + "flow_log_max_aggregation_interval": { + "default": 600, + "description": "The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. Valid Values: `60` seconds or `600` seconds.", + "type": "number" + }, + "flow_log_traffic_type": { + "default": "ALL", + "description": "The type of traffic to capture. Valid values: ACCEPT, REJECT, ALL.", + "type": "string" + }, + "igw_tags": { + "default": {}, + "description": "Additional tags for the internet gateway", + "type": "map(string)" + }, + "instance_tenancy": { + "default": "default", + "description": "A tenancy option for instances launched into the VPC", + "type": "string" + }, + "intra_acl_tags": { + "default": {}, + "description": "Additional tags for the intra subnets network ACL", + "type": "map(string)" + }, + "intra_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for intra subnets", + "type": "bool" + }, + "intra_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Intra subnets inbound network ACLs", + "type": "list(map(string))" + }, + "intra_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Intra subnets outbound network ACLs", + "type": "list(map(string))" + }, + "intra_route_table_tags": { + "default": {}, + "description": "Additional tags for the intra route tables", + "type": "map(string)" + }, + "intra_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on intra subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "intra_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 intra subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "intra_subnet_suffix": { + "default": "intra", + "description": "Suffix to append to intra subnets name", + "type": "string" + }, + "intra_subnet_tags": { + "default": {}, + "description": "Additional tags for the intra subnets", + "type": "map(string)" + }, + "intra_subnets": { + "default": [], + "description": "A list of intra subnets", + "type": "list(string)" + }, + "manage_default_network_acl": { + "default": false, + "description": "Should be true to adopt and manage Default Network ACL", + "type": "bool" + }, + "manage_default_route_table": { + "default": false, + "description": "Should be true to manage default route table", + "type": "bool" + }, + "manage_default_security_group": { + "default": false, + "description": "Should be true to adopt and manage default security group", + "type": "bool" + }, + "manage_default_vpc": { + "default": false, + "description": "Should be true to adopt and manage Default VPC", + "type": "bool" + }, + "map_public_ip_on_launch": { + "default": true, + "description": "Should be false if you do not want to auto-assign public IP on launch", + "type": "bool" + }, + "name": { + "default": "", + "description": "Name to be used on all the resources as identifier", + "type": "string" + }, + "nat_eip_tags": { + "default": {}, + "description": "Additional tags for the NAT EIP", + "type": "map(string)" + }, + "nat_gateway_tags": { + "default": {}, + "description": "Additional tags for the NAT gateways", + "type": "map(string)" + }, + "one_nat_gateway_per_az": { + "default": false, + "description": "Should be true if you want only one NAT Gateway per availability zone. Requires `var.azs` to be set, and the number of `public_subnets` created to be greater than or equal to the number of availability zones specified in `var.azs`.", + "type": "bool" + }, + "outpost_acl_tags": { + "default": {}, + "description": "Additional tags for the outpost subnets network ACL", + "type": "map(string)" + }, + "outpost_arn": { + "default": "null", + "description": "ARN of Outpost you want to create a subnet in.", + "type": "string" + }, + "outpost_az": { + "default": "null", + "description": "AZ where Outpost is anchored.", + "type": "string" + }, + "outpost_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for outpost subnets", + "type": "bool" + }, + "outpost_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Outpost subnets inbound network ACLs", + "type": "list(map(string))" + }, + "outpost_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Outpost subnets outbound network ACLs", + "type": "list(map(string))" + }, + "outpost_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on outpost subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "outpost_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 outpost subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "outpost_subnet_suffix": { + "default": "outpost", + "description": "Suffix to append to outpost subnets name", + "type": "string" + }, + "outpost_subnet_tags": { + "default": {}, + "description": "Additional tags for the outpost subnets", + "type": "map(string)" + }, + "outpost_subnets": { + "default": [], + "description": "A list of outpost subnets inside the VPC", + "type": "list(string)" + }, + "private_acl_tags": { + "default": {}, + "description": "Additional tags for the private subnets network ACL", + "type": "map(string)" + }, + "private_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for private subnets", + "type": "bool" + }, + "private_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Private subnets inbound network ACLs", + "type": "list(map(string))" + }, + "private_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Private subnets outbound network ACLs", + "type": "list(map(string))" + }, + "private_route_table_tags": { + "default": {}, + "description": "Additional tags for the private route tables", + "type": "map(string)" + }, + "private_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on private subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "private_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 private subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "private_subnet_suffix": { + "default": "private", + "description": "Suffix to append to private subnets name", + "type": "string" + }, + "private_subnet_tags": { + "default": {}, + "description": "Additional tags for the private subnets", + "type": "map(string)" + }, + "private_subnets": { + "default": [], + "description": "A list of private subnets inside the VPC", + "type": "list(string)" + }, + "propagate_intra_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "propagate_private_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "propagate_public_route_tables_vgw": { + "default": false, + "description": "Should be true if you want route table propagation", + "type": "bool" + }, + "public_acl_tags": { + "default": {}, + "description": "Additional tags for the public subnets network ACL", + "type": "map(string)" + }, + "public_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for public subnets", + "type": "bool" + }, + "public_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Public subnets inbound network ACLs", + "type": "list(map(string))" + }, + "public_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Public subnets outbound network ACLs", + "type": "list(map(string))" + }, + "public_route_table_tags": { + "default": {}, + "description": "Additional tags for the public route tables", + "type": "map(string)" + }, + "public_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on public subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "public_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 public subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "public_subnet_suffix": { + "default": "public", + "description": "Suffix to append to public subnets name", + "type": "string" + }, + "public_subnet_tags": { + "default": {}, + "description": "Additional tags for the public subnets", + "type": "map(string)" + }, + "public_subnets": { + "default": [], + "description": "A list of public subnets inside the VPC", + "type": "list(string)" + }, + "redshift_acl_tags": { + "default": {}, + "description": "Additional tags for the redshift subnets network ACL", + "type": "map(string)" + }, + "redshift_dedicated_network_acl": { + "default": false, + "description": "Whether to use dedicated network ACL (not default) and custom rules for redshift subnets", + "type": "bool" + }, + "redshift_inbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Redshift subnets inbound network ACL rules", + "type": "list(map(string))" + }, + "redshift_outbound_acl_rules": { + "default": [ + { + "cidr_block": "0.0.0.0/0", + "from_port": 0, + "protocol": "-1", + "rule_action": "allow", + "rule_number": 100, + "to_port": 0 + } + ], + "description": "Redshift subnets outbound network ACL rules", + "type": "list(map(string))" + }, + "redshift_route_table_tags": { + "default": {}, + "description": "Additional tags for the redshift route tables", + "type": "map(string)" + }, + "redshift_subnet_assign_ipv6_address_on_creation": { + "default": "null", + "description": "Assign IPv6 address on redshift subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map_public_ip_on_launch", + "type": "bool" + }, + "redshift_subnet_group_tags": { + "default": {}, + "description": "Additional tags for the redshift subnet group", + "type": "map(string)" + }, + "redshift_subnet_ipv6_prefixes": { + "default": [], + "description": "Assigns IPv6 redshift subnet id based on the Amazon provided /56 prefix base 10 integer (0-256). Must be of equal length to the corresponding IPv4 subnet list", + "type": "list(string)" + }, + "redshift_subnet_suffix": { + "default": "redshift", + "description": "Suffix to append to redshift subnets name", + "type": "string" + }, + "redshift_subnet_tags": { + "default": {}, + "description": "Additional tags for the redshift subnets", + "type": "map(string)" + }, + "redshift_subnets": { + "default": [], + "description": "A list of redshift subnets", + "type": "list(string)" + }, + "reuse_nat_ips": { + "default": false, + "description": "Should be true if you don't want EIPs to be created for your NAT Gateways and will instead pass them in via the 'external_nat_ip_ids' variable", + "type": "bool" + }, + "secondary_cidr_blocks": { + "default": [], + "description": "List of secondary CIDR blocks to associate with the VPC to extend the IP Address pool", + "type": "list(string)" + }, + "single_nat_gateway": { + "default": false, + "description": "Should be true if you want to provision a single shared NAT Gateway across all of your private networks", + "type": "bool" + }, + "tags": { + "default": {}, + "description": "A map of tags to add to all resources", + "type": "map(string)" + }, + "vpc_flow_log_permissions_boundary": { + "default": "null", + "description": "The ARN of the Permissions Boundary for the VPC Flow Log IAM Role", + "type": "string" + }, + "vpc_flow_log_tags": { + "default": {}, + "description": "Additional tags for the VPC Flow Logs", + "type": "map(string)" + }, + "vpc_tags": { + "default": {}, + "description": "Additional tags for the VPC", + "type": "map(string)" + }, + "vpn_gateway_az": { + "default": "null", + "description": "The Availability Zone for the VPN Gateway", + "type": "string" + }, + "vpn_gateway_id": { + "default": "", + "description": "ID of VPN Gateway to attach to the VPC", + "type": "string" + }, + "vpn_gateway_tags": { + "default": {}, + "description": "Additional tags for the VPN gateway", + "type": "map(string)" + } +} diff --git a/src/terraform-aws-modules-metadata/vpc_version.txt b/src/terraform-aws-modules-metadata/vpc_version.txt new file mode 100644 index 0000000..ad55eb8 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpc_version.txt @@ -0,0 +1 @@ +v3.0.0 diff --git a/src/terraform-aws-modules-metadata/vpn-gateway.json b/src/terraform-aws-modules-metadata/vpn-gateway.json new file mode 100644 index 0000000..f77f436 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpn-gateway.json @@ -0,0 +1,231 @@ +{ + "connect_to_transit_gateway": { + "default": false, + "description": "Set to false to disable attachment of the VPN connection route to the VPN connection (TGW uses another resource for that)", + "type": "bool" + }, + "create_vpn_connection": { + "default": true, + "description": "Set to false to prevent the creation of a VPN Connection.", + "type": "bool" + }, + "create_vpn_gateway_attachment": { + "default": true, + "description": "Set to false to prevent attachment of the VGW to the VPC", + "type": "bool" + }, + "customer_gateway_id": { + "description": "The id of the Customer Gateway.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "Set of tags to be added to the VPN Connection resource (only if `create_vpn_connection = true`).", + "type": "map(string)" + }, + "transit_gateway_id": { + "default": "null", + "description": "The ID of the Transit Gateway.", + "type": "string" + }, + "tunnel1_dpd_timeout_action": { + "default": "null", + "description": "(Optional, Default clear) The action to take after DPD timeout occurs for the first VPN tunnel. Specify restart to restart the IKE initiation. Specify clear to end the IKE session. Valid values are clear | none | restart", + "type": "string" + }, + "tunnel1_dpd_timeout_seconds": { + "default": "null", + "description": "(Optional, Default 30) The number of seconds after which a DPD timeout occurs for the first VPN tunnel. Valid value is equal or higher than 30", + "type": "number" + }, + "tunnel1_ike_versions": { + "default": "null", + "description": "(Optional) The IKE versions that are permitted for the first VPN tunnel. Valid values are ikev1 | ikev2", + "type": "list(string)" + }, + "tunnel1_inside_cidr": { + "default": "", + "description": "The CIDR block of the inside IP addresses for the first VPN tunnel.", + "type": "string" + }, + "tunnel1_phase1_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel1_phase1_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel1_phase1_integrity_algorithms": { + "default": "null", + "description": "(Optional) One or more integrity algorithms that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel1_phase1_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 28800) The lifetime for phase 1 of the IKE negotiation for the first VPN tunnel, in seconds. Valid value is between 900 and 28800", + "type": "number" + }, + "tunnel1_phase2_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are 2 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel1_phase2_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel1_phase2_integrity_algorithms": { + "default": "null", + "description": "(Optional) List of one or more integrity algorithms that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel1_phase2_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 3600) The lifetime for phase 2 of the IKE negotiation for the first VPN tunnel, in seconds. Valid value is between 900 and 3600", + "type": "number" + }, + "tunnel1_preshared_key": { + "default": "", + "description": "The preshared key of the first VPN tunnel.", + "type": "string" + }, + "tunnel1_rekey_fuzz_percentage": { + "default": "null", + "description": "(Optional, Default 100) The percentage of the rekey window for the first VPN tunnel (determined by tunnel1_rekey_margin_time_seconds) during which the rekey time is randomly selected. Valid value is between 0 and 100", + "type": "number" + }, + "tunnel1_rekey_margin_time_seconds": { + "default": "null", + "description": "(Optional, Default 540) The margin time, in seconds, before the phase 2 lifetime expires, during which the AWS side of the first VPN connection performs an IKE rekey. The exact time of the rekey is randomly selected based on the value for tunnel1_rekey_fuzz_percentage. Valid value is between 60 and half of tunnel1_phase2_lifetime_seconds", + "type": "number" + }, + "tunnel1_replay_window_size": { + "default": "null", + "description": "(Optional, Default 1024) The number of packets in an IKE replay window for the first VPN tunnel. Valid value is between 64 and 2048.", + "type": "number" + }, + "tunnel1_startup_action": { + "default": "null", + "description": "(Optional, Default add) The action to take when the establishing the tunnel for the first VPN connection. By default, your customer gateway device must initiate the IKE negotiation and bring up the tunnel. Specify start for AWS to initiate the IKE negotiation. Valid values are add | start", + "type": "string" + }, + "tunnel2_dpd_timeout_action": { + "default": "null", + "description": "(Optional, Default clear) The action to take after DPD timeout occurs for the second VPN tunnel. Specify restart to restart the IKE initiation. Specify clear to end the IKE session. Valid values are clear | none | restart", + "type": "string" + }, + "tunnel2_dpd_timeout_seconds": { + "default": "null", + "description": "(Optional, Default 30) The number of seconds after which a DPD timeout occurs for the second VPN tunnel. Valid value is equal or higher than 30", + "type": "number" + }, + "tunnel2_ike_versions": { + "default": "null", + "description": "(Optional) The IKE versions that are permitted for the first VPN tunnel. Valid values are ikev1 | ikev2", + "type": "list(string)" + }, + "tunnel2_inside_cidr": { + "default": "", + "description": "The CIDR block of the inside IP addresses for the second VPN tunnel.", + "type": "string" + }, + "tunnel2_phase1_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel2_phase1_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel2_phase1_integrity_algorithms": { + "default": "null", + "description": "(Optional) One or more integrity algorithms that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel2_phase1_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 28800) The lifetime for phase 1 of the IKE negotiation for the second VPN tunnel, in seconds. Valid value is between 900 and 28800", + "type": "number" + }, + "tunnel2_phase2_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are 2 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel2_phase2_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel2_phase2_integrity_algorithms": { + "default": "null", + "description": "(Optional) List of one or more integrity algorithms that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel2_phase2_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 3600) The lifetime for phase 2 of the IKE negotiation for the second VPN tunnel, in seconds. Valid value is between 900 and 3600", + "type": "number" + }, + "tunnel2_preshared_key": { + "default": "", + "description": "The preshared key of the second VPN tunnel.", + "type": "string" + }, + "tunnel2_rekey_fuzz_percentage": { + "default": "null", + "description": "(Optional, Default 100) The percentage of the rekey window for the second VPN tunnel (determined by tunnel1_rekey_margin_time_seconds) during which the rekey time is randomly selected. Valid value is between 0 and 100", + "type": "number" + }, + "tunnel2_rekey_margin_time_seconds": { + "default": "null", + "description": "(Optional, Default 540) The margin time, in seconds, before the phase 2 lifetime expires, during which the AWS side of the second VPN connection performs an IKE rekey. The exact time of the rekey is randomly selected based on the value for tunnel2_rekey_fuzz_percentage. Valid value is between 60 and half of tunnel2_phase2_lifetime_seconds", + "type": "number" + }, + "tunnel2_replay_window_size": { + "default": "null", + "description": "(Optional, Default 1024) The number of packets in an IKE replay window for the second VPN tunnel. Valid value is between 64 and 2048.", + "type": "number" + }, + "tunnel2_startup_action": { + "default": "null", + "description": "(Optional, Default add) The action to take when the establishing the tunnel for the second VPN connection. By default, your customer gateway device must initiate the IKE negotiation and bring up the tunnel. Specify start for AWS to initiate the IKE negotiation. Valid values are add | start", + "type": "string" + }, + "vpc_id": { + "default": "null", + "description": "The id of the VPC where the VPN Gateway lives.", + "type": "string" + }, + "vpc_subnet_route_table_count": { + "default": 0, + "description": "The number of subnet route table ids being passed in via `vpc_subnet_route_table_ids`.", + "type": "number" + }, + "vpc_subnet_route_table_ids": { + "default": [], + "description": "The ids of the VPC subnets for which routes from the VPN Gateway will be propagated.", + "type": "list(string)" + }, + "vpn_connection_static_routes_destinations": { + "default": [], + "description": "List of CIDRs to be used as destination for static routes (used with `vpn_connection_static_routes_only = true`). Routes to destinations set here will be propagated to the routing tables of the subnets defined in `vpc_subnet_route_table_ids`.", + "type": "list(string)" + }, + "vpn_connection_static_routes_only": { + "default": false, + "description": "Set to true for the created VPN connection to use static routes exclusively (only if `create_vpn_connection = true`). Static routes must be used for devices that don't support BGP.", + "type": "bool" + }, + "vpn_gateway_id": { + "default": "null", + "description": "The id of the VPN Gateway.", + "type": "string" + } +} diff --git a/src/terraform-aws-modules-metadata/vpn-gateway_cloudcraft.json b/src/terraform-aws-modules-metadata/vpn-gateway_cloudcraft.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpn-gateway_cloudcraft.json @@ -0,0 +1 @@ +{} diff --git a/src/terraform-aws-modules-metadata/vpn-gateway_variables.json b/src/terraform-aws-modules-metadata/vpn-gateway_variables.json new file mode 100644 index 0000000..f77f436 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpn-gateway_variables.json @@ -0,0 +1,231 @@ +{ + "connect_to_transit_gateway": { + "default": false, + "description": "Set to false to disable attachment of the VPN connection route to the VPN connection (TGW uses another resource for that)", + "type": "bool" + }, + "create_vpn_connection": { + "default": true, + "description": "Set to false to prevent the creation of a VPN Connection.", + "type": "bool" + }, + "create_vpn_gateway_attachment": { + "default": true, + "description": "Set to false to prevent attachment of the VGW to the VPC", + "type": "bool" + }, + "customer_gateway_id": { + "description": "The id of the Customer Gateway.", + "type": "string" + }, + "tags": { + "default": {}, + "description": "Set of tags to be added to the VPN Connection resource (only if `create_vpn_connection = true`).", + "type": "map(string)" + }, + "transit_gateway_id": { + "default": "null", + "description": "The ID of the Transit Gateway.", + "type": "string" + }, + "tunnel1_dpd_timeout_action": { + "default": "null", + "description": "(Optional, Default clear) The action to take after DPD timeout occurs for the first VPN tunnel. Specify restart to restart the IKE initiation. Specify clear to end the IKE session. Valid values are clear | none | restart", + "type": "string" + }, + "tunnel1_dpd_timeout_seconds": { + "default": "null", + "description": "(Optional, Default 30) The number of seconds after which a DPD timeout occurs for the first VPN tunnel. Valid value is equal or higher than 30", + "type": "number" + }, + "tunnel1_ike_versions": { + "default": "null", + "description": "(Optional) The IKE versions that are permitted for the first VPN tunnel. Valid values are ikev1 | ikev2", + "type": "list(string)" + }, + "tunnel1_inside_cidr": { + "default": "", + "description": "The CIDR block of the inside IP addresses for the first VPN tunnel.", + "type": "string" + }, + "tunnel1_phase1_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel1_phase1_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel1_phase1_integrity_algorithms": { + "default": "null", + "description": "(Optional) One or more integrity algorithms that are permitted for the first VPN tunnel for phase 1 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel1_phase1_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 28800) The lifetime for phase 1 of the IKE negotiation for the first VPN tunnel, in seconds. Valid value is between 900 and 28800", + "type": "number" + }, + "tunnel1_phase2_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are 2 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel1_phase2_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel1_phase2_integrity_algorithms": { + "default": "null", + "description": "(Optional) List of one or more integrity algorithms that are permitted for the first VPN tunnel for phase 2 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel1_phase2_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 3600) The lifetime for phase 2 of the IKE negotiation for the first VPN tunnel, in seconds. Valid value is between 900 and 3600", + "type": "number" + }, + "tunnel1_preshared_key": { + "default": "", + "description": "The preshared key of the first VPN tunnel.", + "type": "string" + }, + "tunnel1_rekey_fuzz_percentage": { + "default": "null", + "description": "(Optional, Default 100) The percentage of the rekey window for the first VPN tunnel (determined by tunnel1_rekey_margin_time_seconds) during which the rekey time is randomly selected. Valid value is between 0 and 100", + "type": "number" + }, + "tunnel1_rekey_margin_time_seconds": { + "default": "null", + "description": "(Optional, Default 540) The margin time, in seconds, before the phase 2 lifetime expires, during which the AWS side of the first VPN connection performs an IKE rekey. The exact time of the rekey is randomly selected based on the value for tunnel1_rekey_fuzz_percentage. Valid value is between 60 and half of tunnel1_phase2_lifetime_seconds", + "type": "number" + }, + "tunnel1_replay_window_size": { + "default": "null", + "description": "(Optional, Default 1024) The number of packets in an IKE replay window for the first VPN tunnel. Valid value is between 64 and 2048.", + "type": "number" + }, + "tunnel1_startup_action": { + "default": "null", + "description": "(Optional, Default add) The action to take when the establishing the tunnel for the first VPN connection. By default, your customer gateway device must initiate the IKE negotiation and bring up the tunnel. Specify start for AWS to initiate the IKE negotiation. Valid values are add | start", + "type": "string" + }, + "tunnel2_dpd_timeout_action": { + "default": "null", + "description": "(Optional, Default clear) The action to take after DPD timeout occurs for the second VPN tunnel. Specify restart to restart the IKE initiation. Specify clear to end the IKE session. Valid values are clear | none | restart", + "type": "string" + }, + "tunnel2_dpd_timeout_seconds": { + "default": "null", + "description": "(Optional, Default 30) The number of seconds after which a DPD timeout occurs for the second VPN tunnel. Valid value is equal or higher than 30", + "type": "number" + }, + "tunnel2_ike_versions": { + "default": "null", + "description": "(Optional) The IKE versions that are permitted for the first VPN tunnel. Valid values are ikev1 | ikev2", + "type": "list(string)" + }, + "tunnel2_inside_cidr": { + "default": "", + "description": "The CIDR block of the inside IP addresses for the second VPN tunnel.", + "type": "string" + }, + "tunnel2_phase1_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are 2 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel2_phase1_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel2_phase1_integrity_algorithms": { + "default": "null", + "description": "(Optional) One or more integrity algorithms that are permitted for the second VPN tunnel for phase 1 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel2_phase1_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 28800) The lifetime for phase 1 of the IKE negotiation for the second VPN tunnel, in seconds. Valid value is between 900 and 28800", + "type": "number" + }, + "tunnel2_phase2_dh_group_numbers": { + "default": "null", + "description": "(Optional) List of one or more Diffie-Hellman group numbers that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are 2 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24", + "type": "list(number)" + }, + "tunnel2_phase2_encryption_algorithms": { + "default": "null", + "description": "(Optional) List of one or more encryption algorithms that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are AES128 | AES256 | AES128-GCM-16 | AES256-GCM-16", + "type": "list(string)" + }, + "tunnel2_phase2_integrity_algorithms": { + "default": "null", + "description": "(Optional) List of one or more integrity algorithms that are permitted for the second VPN tunnel for phase 2 IKE negotiations. Valid values are SHA1 | SHA2-256 | SHA2-384 | SHA2-512", + "type": "list(string)" + }, + "tunnel2_phase2_lifetime_seconds": { + "default": "null", + "description": "(Optional, Default 3600) The lifetime for phase 2 of the IKE negotiation for the second VPN tunnel, in seconds. Valid value is between 900 and 3600", + "type": "number" + }, + "tunnel2_preshared_key": { + "default": "", + "description": "The preshared key of the second VPN tunnel.", + "type": "string" + }, + "tunnel2_rekey_fuzz_percentage": { + "default": "null", + "description": "(Optional, Default 100) The percentage of the rekey window for the second VPN tunnel (determined by tunnel1_rekey_margin_time_seconds) during which the rekey time is randomly selected. Valid value is between 0 and 100", + "type": "number" + }, + "tunnel2_rekey_margin_time_seconds": { + "default": "null", + "description": "(Optional, Default 540) The margin time, in seconds, before the phase 2 lifetime expires, during which the AWS side of the second VPN connection performs an IKE rekey. The exact time of the rekey is randomly selected based on the value for tunnel2_rekey_fuzz_percentage. Valid value is between 60 and half of tunnel2_phase2_lifetime_seconds", + "type": "number" + }, + "tunnel2_replay_window_size": { + "default": "null", + "description": "(Optional, Default 1024) The number of packets in an IKE replay window for the second VPN tunnel. Valid value is between 64 and 2048.", + "type": "number" + }, + "tunnel2_startup_action": { + "default": "null", + "description": "(Optional, Default add) The action to take when the establishing the tunnel for the second VPN connection. By default, your customer gateway device must initiate the IKE negotiation and bring up the tunnel. Specify start for AWS to initiate the IKE negotiation. Valid values are add | start", + "type": "string" + }, + "vpc_id": { + "default": "null", + "description": "The id of the VPC where the VPN Gateway lives.", + "type": "string" + }, + "vpc_subnet_route_table_count": { + "default": 0, + "description": "The number of subnet route table ids being passed in via `vpc_subnet_route_table_ids`.", + "type": "number" + }, + "vpc_subnet_route_table_ids": { + "default": [], + "description": "The ids of the VPC subnets for which routes from the VPN Gateway will be propagated.", + "type": "list(string)" + }, + "vpn_connection_static_routes_destinations": { + "default": [], + "description": "List of CIDRs to be used as destination for static routes (used with `vpn_connection_static_routes_only = true`). Routes to destinations set here will be propagated to the routing tables of the subnets defined in `vpc_subnet_route_table_ids`.", + "type": "list(string)" + }, + "vpn_connection_static_routes_only": { + "default": false, + "description": "Set to true for the created VPN connection to use static routes exclusively (only if `create_vpn_connection = true`). Static routes must be used for devices that don't support BGP.", + "type": "bool" + }, + "vpn_gateway_id": { + "default": "null", + "description": "The id of the VPN Gateway.", + "type": "string" + } +} diff --git a/src/terraform-aws-modules-metadata/vpn-gateway_version.txt b/src/terraform-aws-modules-metadata/vpn-gateway_version.txt new file mode 100644 index 0000000..f367ae3 --- /dev/null +++ b/src/terraform-aws-modules-metadata/vpn-gateway_version.txt @@ -0,0 +1 @@ +v2.9.0 diff --git a/templates/root/template/.gitignore b/templates/root/template/.gitignore deleted file mode 100644 index 0e18c53..0000000 --- a/templates/root/template/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# Terraform -.terraform -.terragrunt-cache -*.tfstate* -crash.log - -# Secrets are not allowed in general -*.key -*.pem - -# Secrets are encrypted using git-crypt -!secrets/* - -# OS X -.history -.DS_Store - -# IntelliJ -.idea_modules -*.iml -*.iws -*.ipr -.idea/ -build/ -*/build/ diff --git a/templates/root/template/modules/aws-data/README.md b/templates/root/template/modules/aws-data/README.md deleted file mode 100644 index 00f5bed..0000000 --- a/templates/root/template/modules/aws-data/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# aws-data - -This module contains data-sources which are used as arguments in other AWS modules (eg, list of AZ when creating VPC). - - -## Outputs - -| Name | Description | -|------|-------------| -| amazon\_linux2\_aws\_ami\_id | AMI ID of Amazon Linux 2 | -| available\_aws\_availability\_zones\_names | A list of the Availability Zone names available to the account | -| available\_aws\_availability\_zones\_zone\_ids | A list of the Availability Zone IDs available to the account | -| aws\_region | Details about selected AWS region | -| ubuntu\_1804\_aws\_ami\_id | AMI ID of Ubuntu 18.04 | - - diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 0000000..c45cf41 --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1 @@ +*.tfvars diff --git a/terraform/.terraform-version b/terraform/.terraform-version new file mode 100644 index 0000000..1985d91 --- /dev/null +++ b/terraform/.terraform-version @@ -0,0 +1 @@ +0.15.3 diff --git a/terraform/Makefile b/terraform/Makefile new file mode 100644 index 0000000..98b23af --- /dev/null +++ b/terraform/Makefile @@ -0,0 +1,7 @@ +.PHONY: cloudcraft betajob + +cloudcraft: + terraform init -backend-config=cloudcraft/backend.hcl -reconfigure && terraform apply -var-file=cloudcraft/cloudcraft.tfvars + +betajob: + terraform init -backend-config=betajob/backend.hcl -reconfigure && terraform apply -var-file=betajob/betajob.tfvars diff --git a/terraform/README.md b/terraform/README.md new file mode 100644 index 0000000..6304cb9 --- /dev/null +++ b/terraform/README.md @@ -0,0 +1,79 @@ +# Terraform configurations required to provision AWS infrastructure for d2c.modules.tf + +- HTTP API Gateway +- ACM +- Lambda Function +- S3 bucket for downloads +- Route53 records + +## Deployments + +### cloudcraft - prod + +``` +$ awsp modules-deploy # Assume IAM role in correct account +$ make cloudcraft +``` + +### betajob - dev + +``` +$ awsp private-anton # Assume IAM role in correct account +$ make betajob +``` + + +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | >= 0.15, <1.0.0 | +| [aws](#requirement\_aws) | ~> 3.0 | + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | ~> 3.0 | + +## Modules + +| Name | Source | Version | +|------|--------|---------| +| [acm](#module\_acm) | terraform-aws-modules/acm/aws | ~> 3.0 | +| [alarm\_lambda\_is\_popular](#module\_alarm\_lambda\_is\_popular) | terraform-aws-modules/cloudwatch/aws//modules/metric-alarm | | +| [alarm\_lambda\_is\_slow](#module\_alarm\_lambda\_is\_slow) | terraform-aws-modules/cloudwatch/aws//modules/metric-alarm | | +| [alarm\_lambda\_with\_errors](#module\_alarm\_lambda\_with\_errors) | terraform-aws-modules/cloudwatch/aws//modules/metric-alarm | ~> 2.0 | +| [api\_gateway](#module\_api\_gateway) | terraform-aws-modules/apigateway-v2/aws | ~> 1.0 | +| [dl\_bucket](#module\_dl\_bucket) | terraform-aws-modules/s3-bucket/aws | ~> 2.0 | +| [lambda](#module\_lambda) | terraform-aws-modules/lambda/aws | ~> 2.0 | +| [records](#module\_records) | terraform-aws-modules/route53/aws//modules/records | ~> 2.0 | +| [sns\_topic](#module\_sns\_topic) | terraform-aws-modules/sns/aws | ~> 3.0 | + +## Resources + +| Name | Type | +|------|------| +| [aws_sns_topic_subscription.sns_to_email](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic_subscription) | resource | +| [aws_route53_zone.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/route53_zone) | data source | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [allowed\_account\_ids](#input\_allowed\_account\_ids) | List of allowed AWS acount ids where infrastructure will be created | `list(string)` | n/a | yes | +| [aws\_region](#input\_aws\_region) | AWS region where infrastructure will be created | `string` | `"eu-west-1"` | no | +| [create\_dl\_bucket](#input\_create\_dl\_bucket) | Whether to create S3 bucket for downloads | `bool` | `false` | no | +| [dl\_bucket\_name](#input\_dl\_bucket\_name) | Name of S3 bucket for downloads (should not include route53\_zone\_name) | `string` | `null` | no | +| [dl\_dir](#input\_dl\_dir) | Name of directory in S3 bucket | `string` | `""` | no | +| [email](#input\_email) | Email address to receive CloudWatch alerts | `string` | n/a | yes | +| [name](#input\_name) | Name or prefix for many related resources | `string` | `"modulestf-d2c"` | no | +| [subdomain](#input\_subdomain) | Route53 subdomain | `string` | `""` | no | +| [zone\_name](#input\_zone\_name) | Zone name for ALB and ACM | `string` | n/a | yes | + +## Outputs + +| Name | Description | +|------|-------------| +| [fqdn](#output\_fqdn) | FQDN of API Endpoint | + diff --git a/terraform/betajob/backend.hcl b/terraform/betajob/backend.hcl new file mode 100644 index 0000000..87626aa --- /dev/null +++ b/terraform/betajob/backend.hcl @@ -0,0 +1,3 @@ +hostname = "app.terraform.io" +organization = "betajob" +workspaces { name = "modulestf-infra-betajob" } diff --git a/terraform/cloudcraft/backend.hcl b/terraform/cloudcraft/backend.hcl new file mode 100644 index 0000000..7ad2b44 --- /dev/null +++ b/terraform/cloudcraft/backend.hcl @@ -0,0 +1,3 @@ +hostname = "app.terraform.io" +organization = "betajob" +workspaces { name = "modulestf-infra-cloudcraft" } diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..168d444 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,262 @@ +terraform { + required_version = ">= 0.15, <1.0.0" + + required_providers { + aws = "~> 3.0" + } + + backend "remote" {} +} + +provider "aws" { + region = var.aws_region + allowed_account_ids = var.allowed_account_ids +} + +locals { + zone_name = trimsuffix(data.aws_route53_zone.this.name, ".") + domain_name = join(".", compact([var.subdomain, local.zone_name])) + + dl_bucket_name = var.create_dl_bucket ? module.dl_bucket.s3_bucket_id : var.dl_bucket_name + dl_dir = trimsuffix(var.dl_dir, "/") + + tags = { + Name = var.name + } +} + +data "aws_route53_zone" "this" { + name = var.zone_name + private_zone = false +} + +module "api_gateway" { + source = "terraform-aws-modules/apigateway-v2/aws" + version = "~> 1.0" + + name = var.name + description = "HTTP API Gateway" + protocol_type = "HTTP" + + cors_configuration = { + allow_headers = ["content-type", "x-amz-date", "authorization", "x-api-key", "x-amz-security-token", "x-amz-user-agent"] + allow_methods = ["*"] + allow_origins = ["*"] + } + + domain_name = local.domain_name + domain_name_certificate_arn = module.acm.acm_certificate_arn + disable_execute_api_endpoint = true + + integrations = { + "GET /" = { + lambda_arn = module.lambda.lambda_function_arn + payload_format_version = "2.0" + } + + "POST /" = { + lambda_arn = module.lambda.lambda_function_arn + payload_format_version = "2.0" + } + } + + tags = local.tags +} + +module "lambda" { + source = "terraform-aws-modules/lambda/aws" + version = "~> 2.0" + + function_name = "${var.name}-lambda" + description = "Lambda function which converts blueprint into Terraform code" + handler = "handler.handler" + runtime = "python3.8" + memory_size = 3072 + timeout = 30 + publish = true + + source_path = "../src" + + environment_variables = { + S3_BUCKET = local.dl_bucket_name + S3_DIR = local.dl_dir + UPLOAD_TO_S3 = true + } + + cloudwatch_logs_retention_in_days = 30 + + attach_tracing_policy = true + tracing_mode = "Active" + + attach_policy_statements = true + policy_statements = { + s3 = { + effect = "Allow", + actions = ["s3:PutObject*"], + resources = [ + "arn:aws:s3:::${local.dl_bucket_name}/${local.dl_dir}", + "arn:aws:s3:::${local.dl_bucket_name}/${local.dl_dir}/*", + ] + } + } + + allowed_triggers = { + AllowExecutionFromAPIGateway = { + service = "apigateway" + source_arn = "${module.api_gateway.apigatewayv2_api_execution_arn}/*/*/" + } + } + + tags = local.tags +} + +module "acm" { + source = "terraform-aws-modules/acm/aws" + version = "~> 3.0" + + domain_name = local.zone_name + subject_alternative_names = setsubtract([local.domain_name], [local.zone_name]) + zone_id = data.aws_route53_zone.this.id + + tags = local.tags +} + +module "dl_bucket" { + source = "terraform-aws-modules/s3-bucket/aws" + version = "~> 2.0" + + create_bucket = var.create_dl_bucket + + bucket = var.dl_bucket_name + acl = "private" + force_destroy = true + block_public_policy = true + + cors_rule = [{ + allowed_methods = ["GET"] + allowed_origins = ["*"] + allowed_headers = ["*"] + max_age_seconds = 3000 + }] + + lifecycle_rule = [ + { + id = "delete-pretty-quick" + enabled = true + + expiration = { + days = 1 + } + } + ] + + tags = local.tags +} + +module "records" { + source = "terraform-aws-modules/route53/aws//modules/records" + version = "~> 2.0" + + zone_id = data.aws_route53_zone.this.zone_id + + records = [ + { + name = var.subdomain + type = "A" + alias = { + name = module.api_gateway.apigatewayv2_domain_name_configuration[0].target_domain_name + zone_id = module.api_gateway.apigatewayv2_domain_name_configuration[0].hosted_zone_id + } + }, + ] +} + +module "sns_topic" { + source = "terraform-aws-modules/sns/aws" + version = "~> 3.0" + + name_prefix = var.name +} + +resource "aws_sns_topic_subscription" "sns_to_email" { + topic_arn = module.sns_topic.sns_topic_arn + protocol = "email" + endpoint = var.email +} + +# Alarm when there is at least one error in a minute in AWS Lambda functions +module "alarm_lambda_with_errors" { + source = "terraform-aws-modules/cloudwatch/aws//modules/metric-alarm" + version = "~> 2.0" + + alarm_name = "lambda-errors-${module.lambda.lambda_function_name}" + alarm_description = "Lambda with errors" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = 1 + threshold = 1 + period = 60 + unit = "Count" + treat_missing_data = "notBreaching" + + namespace = "AWS/Lambda" + metric_name = "Errors" + statistic = "Maximum" + + dimensions = { + FunctionName = module.lambda.lambda_function_name + } + + alarm_actions = [module.sns_topic.sns_topic_arn] + + depends_on = [module.sns_topic] +} + +module "alarm_lambda_is_slow" { + source = "terraform-aws-modules/cloudwatch/aws//modules/metric-alarm" + + alarm_name = "lambda-slow-${module.lambda.lambda_function_name}" + alarm_description = "Lambda is too high" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = 1 + threshold = 20000 + period = 60 + unit = "Milliseconds" + treat_missing_data = "notBreaching" + + namespace = "AWS/Lambda" + metric_name = "Duration" + statistic = "Maximum" + + dimensions = { + FunctionName = module.lambda.lambda_function_name + } + + alarm_actions = [module.sns_topic.sns_topic_arn] + + depends_on = [module.sns_topic] +} + +module "alarm_lambda_is_popular" { + source = "terraform-aws-modules/cloudwatch/aws//modules/metric-alarm" + + alarm_name = "lambda-popular-${module.lambda.lambda_function_name}" + alarm_description = "Lambda is too popular" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = 1 + threshold = 100 + period = 60 + unit = "Count" + treat_missing_data = "notBreaching" + + namespace = "AWS/Lambda" + metric_name = "Invocations" + statistic = "Maximum" + + dimensions = { + FunctionName = module.lambda.lambda_function_name + } + + alarm_actions = [module.sns_topic.sns_topic_arn] + + depends_on = [module.sns_topic] +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..53421d8 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,4 @@ +output "fqdn" { + description = "FQDN of API Endpoint" + value = "https://${module.records.route53_record_fqdn["${var.subdomain} A"]}" +} diff --git a/terraform/terraform.tfvars.sample b/terraform/terraform.tfvars.sample new file mode 100644 index 0000000..b3442de --- /dev/null +++ b/terraform/terraform.tfvars.sample @@ -0,0 +1,10 @@ +allowed_account_ids = ["111111111111"] + +zone_name = "modules.tf" +subdomain = "dev-d2c" + +create_dl_bucket = false +dl_bucket_name = "dl.modules.tf" +dl_dir = "dev" + +email = "alerts@domain.com" diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..77115e9 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,50 @@ +variable "allowed_account_ids" { + description = "List of allowed AWS acount ids where infrastructure will be created" + type = list(string) +} + +variable "aws_region" { + description = "AWS region where infrastructure will be created" + type = string + default = "eu-west-1" +} + +variable "name" { + description = "Name or prefix for many related resources" + type = string + default = "modulestf-d2c" +} + +variable "zone_name" { + description = "Zone name for ALB and ACM" + type = string +} + +variable "subdomain" { + description = "Route53 subdomain" + type = string + default = "" +} + +variable "create_dl_bucket" { + description = "Whether to create S3 bucket for downloads" + type = bool + default = false +} + +variable "dl_bucket_name" { + description = "Name of S3 bucket for downloads (should not include route53_zone_name)" + type = string + default = null +} + +variable "dl_dir" { + description = "Name of directory in S3 bucket" + type = string + default = "" +} + +variable "email" { + description = "Email address to receive CloudWatch alerts" + type = string +} diff --git a/test_fixtures/api_gateway_request.json b/test_fixtures/api_gateway_request.json new file mode 100644 index 0000000..f75f3ef --- /dev/null +++ b/test_fixtures/api_gateway_request.json @@ -0,0 +1,69 @@ +{ + "version": "2.0", + "routeKey": "$default", + "rawPath": "/my/path", + "rawQueryString": "parameter1=value1¶meter1=value2¶meter2=value", + "cookies": [ + "cookie1", + "cookie2" + ], + "headers": { + "header1": "value1", + "header2": "value1,value2" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "authorizer": { + "jwt": { + "claims": { + "claim1": "value1", + "claim2": "value2" + }, + "scopes": [ + "scope1", + "scope2" + ] + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/my/path", + "protocol": "HTTP/1.1", + "sourceIp": "IP", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "body": "Hello from Lambda", + "pathParameters": { + "parameter1": "value1" + }, + "isBase64Encoded": false, + "stageVariables": { + "stageVariable1": "value1", + "stageVariable2": "value2" + } +} diff --git a/test_fixtures/input/blueprint_cloudfront_lambda_apigw.json b/test_fixtures/input/blueprint_cloudfront_lambda_apigw.json new file mode 100644 index 0000000..d426b3a --- /dev/null +++ b/test_fixtures/input/blueprint_cloudfront_lambda_apigw.json @@ -0,0 +1,190 @@ +{ + "id": "5b27afb9-1cce-4bbc-a0aa-6bc5febc7ba0", + "data": { + "grid": "standard", + "name": "sdfhdsfh", + "text": [{ + "id": "616cb32d-8c11-4697-a6fb-486407ef8a9b", + "text": "S3-files", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "ae00b6e2-ed7c-47c8-8b1c-c9d9a03ed2f9", + "offset": [0.245, 0.6999999999999993] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }, { + "id": "aac87f03-d7aa-4aea-9227-cb04db679ad2", + "text": "Infra-service-1", + "type": "isotext", + "color": "#4286c5", + "mapPos": { + "relTo": "dc672366-eced-42b9-bb73-6177e0a7d7a0", + "offset": [-0.25, 0.75] + }, + "outline": true, + "standing": false, + "textSize": 25, + "direction": "down", + "isometric": true + }], + "edges": [{ + "to": "d9dda8de-0d35-4231-962e-79a95b33759d", + "from": "1dc43817-99b6-4ebb-aa91-76737a9792d0", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, + "width": 2, + "dashed": false, + "endCap": "arrow" + }, { + "to": "ae00b6e2-ed7c-47c8-8b1c-c9d9a03ed2f9", + "from": "d9dda8de-0d35-4231-962e-79a95b33759d", + "type": "edge", + "color": { + "2d": "#000000", + "isometric": "#000000" + }, + "width": 2, + "dashed": false, + "endCap": "arrow" + }], + "icons": [{ + "id": "dc672366-eced-42b9-bb73-6177e0a7d7a0", + "name": "AR & VR/AR-VR", + "type": "icon", + "color": {}, + "mapPos": [3, 12.25], + "iconSet": "aws2", + "iconSize": 3, + "standing": false, + "direction": "down", + "isometric": true, + "background": { + "2d": "rgba(0, 0, 0, 0)", + "isometric": "rgba(0, 0, 0, 0)" + } + }], + "nodes": [{ + "id": "b0fe9c7e-df37-4f75-aca4-d59e7b1bd6b6", + "type": "vpngateway", + "color": { + "2d": "#693cc5", + "isometric": "#ececed" + }, + "mapPos": [9.25, 6], + "region": "eu-west-1", + "direction": "down", + "accentColor": { + "2d": "#693cc5", + "isometric": "#4286c5" + } + }, { + "id": "ae00b6e2-ed7c-47c8-8b1c-c9d9a03ed2f9", + "type": "s3", + "color": { + "2d": "#3f8624", + "isometric": "#4286c5" + }, + "dataGb": 10, + "mapPos": [6.75, 10.5], + "region": "eu-west-1", + "volumeType": "Standard", + "accentColor": { + "2d": "#ffffff", + "isometric": "#4286c5" + }, + "getAndOtherRequests": 0, + "putCopyPostRequests": 0, + "lifecycleTransitions": 0 + }, { + "id": "1dc43817-99b6-4ebb-aa91-76737a9792d0", + "type": "lambda", + "color": { + "2d": "#d86613", + "isometric": "#3c3c3c" + }, + "mapPos": [11, 10.5], + "memory": 384, + "region": "eu-west-1", + "mRequests": 10, + "accentColor": { + "2d": "#ffffff", + "isometric": "#f4b934" + }, + "computeDuration": 0.5 + }, { + "id": "a4867d70-fbe4-49f4-ab68-9f4b3caf7d4f", + "type": "apigateway", + "cache": 1.6, + "color": { + "2d": "#693cc5", + "isometric": "#3c3c3c" + }, + "mapPos": [8.75, 10.75], + "region": "eu-west-1", + "apiType": "http", + "apiCalls": 5, + "direction": "down", + "accentColor": { + "2d": "#ffffff", + "isometric": "#f4b934" + }, + "connectionMinutes": 0 + }, { + "id": "d9dda8de-0d35-4231-962e-79a95b33759d", + "type": "cloudfront", + "color": { + "2d": "#693cc5", + "isometric": "#ececed" + }, + "mapPos": [8.75, 13.5], + "accentColor": { + "2d": "#ffffff", + "isometric": "#4286c5" + } + }], + "groups": [{ + "id": "532fbc90-fe0d-457d-9e45-2f36c0d5a85d", + "name": "my-awesome-vpc", + "type": "vpc", + "color": { + "2d": "#2196f3", + "isometric": "#2196f3" + }, + "nodes": ["b0fe9c7e-df37-4f75-aca4-d59e7b1bd6b6"], + "shape": "rectangular", + "region": "eu-west-1", + "padding": 1.5, + "peeringConnections": [] + }], + "images": [], + "linkKey": "lUUXCSmDFPggJ8ws7y3iD_LQ", + "version": 1, + "surfaces": [], + "shareDocs": false, + "connectors": [], + "projection": "isometric", + "liveOptions": { + "autoLabel": true, + "autoConnect": true, + "updatesEnabled": true, + "updateAllOnScan": true, + "updateGroupsOnScan": true, + "updateNodeOnSelect": true + }, + "disabledLayers": [] + }, + "readAccess": null, + "writeAccess": null, + "createdAt": "2021-04-15T17:22:56.027Z", + "updatedAt": "2021-05-09T12:22:37.875Z", + "CreatorId": "354474ae-8248-45a8-a1ef-34de7c2a4d47", + "LastUserId": "354474ae-8248-45a8-a1ef-34de7c2a4d47" +} diff --git a/test_fixtures/input_cloudcraft.json b/test_fixtures/input_cloudcraft.json index 40f5f7d..c567501 100644 --- a/test_fixtures/input_cloudcraft.json +++ b/test_fixtures/input_cloudcraft.json @@ -1,6 +1,6 @@ { - "queryStringParameters": - { - "cloudcraft": "https://app.cloudcraft.co/api/blueprint/b2eda0eb-21b2-45d8-93d5-c0b4906eb69e?key=XlAaasYL4pOa5f-Wzkt5CQ" + "body": "", + "queryStringParameters": { + "cloudcraft": "https://app.cloudcraft.co/api/blueprint/5b27afb9-1cce-4bbc-a0aa-6bc5febc7ba0?key=ip02sXL2cYlsqSqjvm9zaQ" } } diff --git a/test_fixtures/input_localfile.json b/test_fixtures/input_localfile.json index b2cc62d..71e9fc2 100644 --- a/test_fixtures/input_localfile.json +++ b/test_fixtures/input_localfile.json @@ -1,6 +1,6 @@ { - "queryStringParameters": - { - "localfile": "test_fixtures/input/blueprint_sg_rules.json" + "body": "", + "queryStringParameters": { + "localfile": "test_fixtures/input/blueprint_cloudfront_lambda_apigw.json" } } From fb1cbe26dbe88eaa48a90d3503ce6bb6d6bc3dbe Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 9 May 2021 22:05:59 +0200 Subject: [PATCH 24/29] Drop GH Actions and Serverless Framework --- .github/workflows/main.yml | 51 -------------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index ab07d7a..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,51 +0,0 @@ -# [ci skip] workaround from https://github.com/srz-zumix/ci-skip/blob/master/docs/github/WORKAROUND.md - - -name: Autodeploy to dev environment - -on: - push: - branches: - - master - -jobs: - prepare: - runs-on: ubuntu-latest - if: "! contains(github.event.head_commit.message, '[ci skip]')" - steps: - - run: echo "${{ github.event.head_commit.message }}" - - deploy: - runs-on: ubuntu-latest - needs: prepare - - steps: - - uses: actions/checkout@v2 - - - name: Set up Python 3.7 - uses: actions/setup-python@v1.1.1 - with: - python-version: 3.7 - - - name: Install Python dependencies - run: | - python -m pip install --upgrade pip - pip install --user pipenv - - - uses: actions/setup-node@v1.4.0 - with: - node-version: 13 - - - name: Install Serverless Framework and other project dependencies - run: | - npm install -g serverless - npm install - pip install -r requirements.txt - - - name: Deploy Lambda function to dev - run: | - PATH="$PATH:/home/runner/.local/bin" - serverless deploy --stage dev --force --verbose - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} From 73ce9ae69605c0eb5c9c61fdff204728ef9352df Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Sun, 9 May 2021 22:08:02 +0200 Subject: [PATCH 25/29] Updated CHANGELOG --- CHANGELOG.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e451ff..8e9bebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,24 @@ All notable changes to this project will be documented in this file. + +## [v1.7.0] - 2021-05-09 +BUG FIXES: +- Fixed version of minimist package ([#35](https://github.com/antonbabenko/modules.tf-lambda/issues/35)) +- resolved conflict for dependent botocore library ([#34](https://github.com/antonbabenko/modules.tf-lambda/issues/34)) +- Skip edges without from/to values (eg, VPN) +- Fixed case of dependencies to be always lowercase + +DOCS: +- Fix a few more links ([#52](https://github.com/antonbabenko/modules.tf-lambda/issues/52)) +- Updated links in README +- Updated link to modules.tf-lambda-infra repo + +FEATURES: +- Added Lambda, API Gateway, CloudFront modules, and some refactoring ([#60](https://github.com/antonbabenko/modules.tf-lambda/issues/60)) +- Adding security group rules ([#27](https://github.com/antonbabenko/modules.tf-lambda/issues/27)) + + ## [v1.6.0] - 2020-03-22 FEATURES: @@ -47,7 +65,8 @@ FEATURES: -[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.6.0...HEAD +[Unreleased]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.7.0...HEAD +[v1.7.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.6.0...v1.7.0 [v1.6.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.5.0...v1.6.0 [v1.5.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.4.0...v1.5.0 [v1.4.0]: https://github.com/antonbabenko/modules.tf-lambda/compare/v1.3.0...v1.4.0 From ebf0ccd9e3e7a02f9c0877968e00cb23691afde5 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 10 May 2021 12:41:58 +0200 Subject: [PATCH 26/29] chore: Set alarm lower --- terraform/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/main.tf b/terraform/main.tf index 168d444..6f407b9 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -243,7 +243,7 @@ module "alarm_lambda_is_popular" { alarm_description = "Lambda is too popular" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = 1 - threshold = 100 + threshold = 20 period = 60 unit = "Count" treat_missing_data = "notBreaching" From e9788a076195e8d617e64cd790cfe9d5fab6e699 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 10 May 2021 14:08:24 +0200 Subject: [PATCH 27/29] Fixes in arguments --- src/modulestf/convert.py | 32 ++++++++++++++------------ src/modulestf/modules.py | 2 +- src/modulestf/render.py | 2 +- src/templates/root/template/.gitignore | 2 ++ tests/test_dynamic_params.py | 6 ++--- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/modulestf/convert.py b/src/modulestf/convert.py index 252d5a6..6c3abd3 100644 --- a/src/modulestf/convert.py +++ b/src/modulestf/convert.py @@ -152,7 +152,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) r.update_dynamic_params("vpc_security_group_ids", - "[dependency." + sg_id + ".outputs.this_security_group_id]") + "[dependency." + sg_id + ".outputs.security_group_id]") r.update_params({"create_security_group": False}) if node.get("engine") == "aurora-mysql": @@ -195,6 +195,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "family": "", "backup_retention_period": "0", # Disable backups to create DB faster "vpc_security_group_ids": [], + "create_db_subnet_group": False, }) if vpc_id: @@ -205,15 +206,15 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) r.update_dynamic_params("vpc_security_group_ids", - "[dependency." + sg_id + ".outputs.this_security_group_id]") + "[dependency." + sg_id + ".outputs.security_group_id]") if node.get("engine") == "mysql": r.update_params({ "engine": "mysql", "port": "3306", - "engine_version": "5.7.19", - "major_engine_version": "5.7", - "family": "mysql5.7", + "engine_version": "8.0.20", + "major_engine_version": "8.0", + "family": "mysql8.0", }) elif node.get("engine") == "mariadb": r.update_params({ @@ -225,11 +226,11 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 }) elif node.get("engine") == "postgres": r.update_params({ - "engine": "mariadb", + "engine": "postgres", "port": "5432", - "engine_version": "9.6.9", - "major_engine_version": "9.6", - "family": "postgres9.6", + "engine_version": "11.10", + "major_engine_version": "11", + "family": "postgres11", }) else: r.update_params({ @@ -272,6 +273,8 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "max_size": 1, "desired_capacity": 1, "health_check_type": "EC2", + "use_lt": True, + "create_lt": True, "image_id": "HCL:dependency.aws-data.outputs.amazon_linux2_aws_ami_id", "vpc_zone_identifier": [], "security_groups": [], @@ -285,7 +288,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) - r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.this_security_group_id]") + r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.security_group_id]") if elb_id and elb_type == "application": r.update_params({ @@ -340,7 +343,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) - r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.this_security_group_id]") + r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.security_group_id]") elif node.get("elbType") == "network": r = Resource(key, "nlb", node_text) @@ -380,7 +383,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) - r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.this_security_group_id]") + r.update_dynamic_params("security_groups", "[dependency." + sg_id + ".outputs.security_group_id]") resources.append(r.content()) @@ -407,7 +410,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 if sg_id: r.append_dependency(sg_id) - r.update_dynamic_params("vpc_security_group_ids", "[dependency." + sg_id + ".outputs.this_security_group_id]") + r.update_dynamic_params("vpc_security_group_ids", "[dependency." + sg_id + ".outputs.security_group_id]") resources.append(r.content()) @@ -525,7 +528,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 rules_with_cidr_blocks.append(tmp_rule) else: dependency_sg_id = rule.get("target") - tmp_rule.update({"source_security_group_id": "HCL:dependency." + dependency_sg_id + ".outputs.this_security_group_id"}) + tmp_rule.update({"source_security_group_id": "HCL:dependency." + dependency_sg_id + ".outputs.security_group_id"}) rules_with_source_security_group_id.append(tmp_rule) r.append_dependency(dependency_sg_id) @@ -570,7 +573,6 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "database_subnets": "HCL:[for k,v in dependency.aws-data.outputs.available_aws_availability_zones_names: cidrsubnet(\"" + selected_vpc_cidr + "\", 8, k+20)]", - # "redshift_subnets": [], }) r.append_dependency("aws-data") diff --git a/src/modulestf/modules.py b/src/modulestf/modules.py index d260549..10abac6 100644 --- a/src/modulestf/modules.py +++ b/src/modulestf/modules.py @@ -166,7 +166,7 @@ def update_template_variables(var): # Data sources for aws_region and aws_availability_zones "aws-data": { - "source": "${get_parent_terragrunt_dir()}/../../../modules/aws-data", + "source": "${get_parent_terragrunt_dir()}/../../modules/aws-data", "registry_url": "", "variables": {}, }, diff --git a/src/modulestf/render.py b/src/modulestf/render.py index e24f5dd..99e2654 100644 --- a/src/modulestf/render.py +++ b/src/modulestf/render.py @@ -159,7 +159,7 @@ def make_dir_name(type, text, appendix=""): # Should start with "dependency." # # Examples: -# dependency.a3bfbba6-ff09-4efc-a56b-39b647f203f6.outputs.this_security_group_id => dependency.sg_2.outputs.this_security_group_id +# dependency.a3bfbba6-ff09-4efc-a56b-39b647f203f6.outputs.security_group_id => dependency.sg_2.outputs.security_group_id # Source: https://stackoverflow.com/a/38970181/550451 def recursive_replace_dependency(input, dirs): if isinstance(input, dict): diff --git a/src/templates/root/template/.gitignore b/src/templates/root/template/.gitignore index d9c1f28..3b21f37 100644 --- a/src/templates/root/template/.gitignore +++ b/src/templates/root/template/.gitignore @@ -1,5 +1,7 @@ # Local .terraform directories **/.terraform/* +.terraform +.terragrunt-cache # Terraform lockfile .terraform.lock.hcl diff --git a/tests/test_dynamic_params.py b/tests/test_dynamic_params.py index 1e49e30..9652d8c 100644 --- a/tests/test_dynamic_params.py +++ b/tests/test_dynamic_params.py @@ -2,21 +2,21 @@ from pprint import pprint dynamic_params = { - 'key': 'dependency.a3bfbbf.outputs.this_security_group_id', + 'key': 'dependency.a3bfbbf.outputs.security_group_id', 'egress_with_source_security_group_id': [], 'ingress_with_source_security_group_id': [ { 'description': 'All TCP from sg2', 'from_port': '0', 'protocol': 6, - 'source_security_group_id': 'dependency.a3bfbb.outputs.this_security_group_id', + 'source_security_group_id': 'dependency.a3bfbb.outputs.security_group_id', 'to_port': '65535' }, { 'description': 'All TCP from sg3', 'from_port': '0', 'protocol': 6, - 'source_security_group_id': '[dependency.a3bfbb.outputs.this_security_group_id] + dependency.abcdef.outputs.this_security_group_id', + 'source_security_group_id': '[dependency.a3bfbb.outputs.security_group_id] + dependency.abcdef.outputs.security_group_id', 'to_port': '65535' } ] From ceb9ef6d63fc9b145ae3b328318fe25dbd6953f3 Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Mon, 10 May 2021 15:17:03 +0200 Subject: [PATCH 28/29] fix: RDS module input --- src/modulestf/convert.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modulestf/convert.py b/src/modulestf/convert.py index 6c3abd3..7480c1f 100644 --- a/src/modulestf/convert.py +++ b/src/modulestf/convert.py @@ -196,6 +196,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "backup_retention_period": "0", # Disable backups to create DB faster "vpc_security_group_ids": [], "create_db_subnet_group": False, + "skip_final_snapshot": True, }) if vpc_id: From 2f45db76ca3cc5c7296e153efe223bd0e9fdb37d Mon Sep 17 00:00:00 2001 From: Anton Babenko Date: Thu, 27 May 2021 14:34:35 +0200 Subject: [PATCH 29/29] Minor fixes in rendered output --- src/modulestf/convert.py | 27 ++++++++++++++++++++++++--- terraform/main.tf | 8 ++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/modulestf/convert.py b/src/modulestf/convert.py index 7480c1f..efaace1 100644 --- a/src/modulestf/convert.py +++ b/src/modulestf/convert.py @@ -423,6 +423,11 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "read_capacity": node.get("readUnits"), "write_capacity": node.get("writeUnits"), "billing_mode": "PROVISIONED" if node.get("capacityMode") == "provisioned" else "PAY_PER_REQUEST", + "hash_key": "id", + "attributes": [{ + "name": "id", + "type": "N" + }] }) resources.append(r.content()) @@ -431,7 +436,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r = Resource(key, "s3-bucket", node_text) r.update_params({ - "bucket": node_text if node_text else random_pet(), + "bucket": node_text.lower() if node_text else random_pet(), "region": node.get("region", ""), }) @@ -441,7 +446,22 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r = Resource(key, "cloudfront", node_text) r.update_params({ - "wait_for_deployment": False + "wait_for_deployment": False, + "origin": "{ \ + \"default\": { \ + \"domain_name\": \"website.example.com\", \ + \"custom_origin_config\": { \ + \"http_port\": 80, \ + \"https_port\": 443, \ + \"origin_protocol_policy\": \"match-viewer\", \ + \"origin_ssl_protocols\": [\"TLSv1\"], \ + } \ + } \ + }", + "default_cache_behavior": "{ \ + \"target_origin_id\": \"default\", \ + \"viewer_protocol_policy\": \"allow-all\", \ + }" }) resources.append(r.content()) @@ -454,7 +474,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 "function_name": node_text if node_text else random_pet(), "handler": "handler.lambda_handler", "runtime": "python3.8", - "source_path": "\"handler.py\"" # @todo: create this file also + "source_path": "jsonencode(\"handler.py\")" }) resources.append(r.content()) @@ -465,6 +485,7 @@ def convert_graph_to_modulestf_config(graph): # noqa: C901 r.update_params({ "name": node_text if node_text else random_pet(), "protocol_type": "WEBSOCKET" if node.get("apiType") == "websocket" else "HTTP", + "create_api_domain_name": False }) resources.append(r.content()) diff --git a/terraform/main.tf b/terraform/main.tf index 6f407b9..69dcab9 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -193,7 +193,7 @@ module "alarm_lambda_with_errors" { alarm_description = "Lambda with errors" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = 1 - threshold = 1 + threshold = 5 period = 60 unit = "Count" treat_missing_data = "notBreaching" @@ -217,8 +217,8 @@ module "alarm_lambda_is_slow" { alarm_name = "lambda-slow-${module.lambda.lambda_function_name}" alarm_description = "Lambda is too high" comparison_operator = "GreaterThanOrEqualToThreshold" - evaluation_periods = 1 - threshold = 20000 + evaluation_periods = 2 + threshold = 29000 period = 60 unit = "Milliseconds" treat_missing_data = "notBreaching" @@ -243,7 +243,7 @@ module "alarm_lambda_is_popular" { alarm_description = "Lambda is too popular" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = 1 - threshold = 20 + threshold = 50 period = 60 unit = "Count" treat_missing_data = "notBreaching"