From cb9188395f07bb314343bc26cc36236b010437ba Mon Sep 17 00:00:00 2001 From: Lucho Mayta Date: Sun, 7 Jul 2024 00:01:28 -0300 Subject: [PATCH] Initial commit --- .chglog/CHANGELOG.tpl.md | 38 + .chglog/config.yml | 29 + .ci/config/.terraform-docs.yml | 48 + .ci/linters/.ansible-lint | 7 + .ci/linters/.commitlintrc.json | 3 + .ci/linters/.eslintignore | 9 + .ci/linters/.eslintrc.js | 28 + .ci/linters/.gitleaks.toml | 278 ++ .ci/linters/.golangci.yml | 164 + .ci/linters/.goreleaser.yml | 73 + .ci/linters/.hadolint.yaml | 12 + .ci/linters/.lintstagedrc.js | 10 + .ci/linters/.prettierignore | 27 + .ci/linters/.pylintrc | 366 ++ .ci/linters/.stylintrc | 15 + .ci/linters/.tflint.hcl | 39 + .ci/linters/.yamllint | 7 + .ci/linters/checkov.yml | 11 + .ci/linters/markdown-link-config.json | 21 + .ci/linters/prettier.config.js | 65 + .ci/linters/yamllint.config.yaml | 31 + .codespell-ignores | 1 + .dockerignore | 1 + .editorconfig | 68 + .env.example | 4 + .gitattributes | 152 + .github/FUNDING.yml | 15 + .github/ISSUE_TEMPLATE.md | 21 + .github/ISSUE_TEMPLATE/bug_report.md | 32 + .github/ISSUE_TEMPLATE/feature_request.md | 19 + .github/ISSUE_TEMPLATE/general_issue.md | 15 + .github/ISSUE_TEMPLATE/support_question.md | 23 + .github/PULL_REQUEST_TEMPLATE.md | 25 + .github/renovate.json | 9 + .github/semantic.yml | 17 + .github/stale.yml | 56 + .github/workflows/confluence.yml | 45 + .github/workflows/lint.yml | 34 + .github/workflows/release.yml | 63 + .github/workflows/sonarqube.yml | 40 + .github/workflows/test.yml | 46 + .gitignore | 558 +++ .nvmrc | 1 + .pre-commit-config.yaml | 105 + LICENSE | 165 + Pipfile | 28 + README.md | 138 + SECURITY.md | 15 + Taskfile.yml | 139 + config/app.go | 6 + config/app_test.go | 12 + config/config.go | 61 + config/config_test.go | 16 + config/interface.go | 6 + config/log.go | 5 + data.tf | 0 docs/authors.md | 7 + docs/code_of_conduct.md | 43 + docs/commands.md | 139 + docs/components.md | 10 + docs/contribute/github-flow.md | 81 + docs/contributing.md | 96 + docs/diagrams/example.png | Bin 0 -> 14731 bytes docs/diagrams/logo.png | Bin 0 -> 14731 bytes docs/disclaimer.md | 1 + docs/env-vars.md | 12 + docs/examples/common.md | 15 + docs/faq.md | 1 + docs/include/targets.md | 0 docs/include/terraform.md | 29 + docs/index.md | 1 + docs/releasing.md | 52 + docs/roadmap.md | 57 + docs/support.md | 1 + docs/testing.md | 11 + docs/troubleshooting.md | 11 + docs/usage.md | 10 + examples/basic/docs/include/terraform.md | 29 + examples/basic/main.tf | 3 + examples/basic/outputs.tf | 0 examples/basic/variables.tf | 0 examples/basic/versions.tf | 6 + go.mod | 16 + go.sum | 108 + internal/app/external/faker/main.go | 13 + internal/app/external/faker/user.go | 55 + internal/app/external/faker/user_test.go | 23 + internal/common/log/interface.go | 56 + internal/common/log/log.go | 23 + internal/common/log/log_test.go | 22 + internal/common/log/mocking/zap.env | 1 + internal/common/log/provider/mocking/zap.env | 1 + internal/common/log/provider/zap.go | 50 + internal/common/log/provider/zap_test.go | 21 + internal/errors/errors.go | 143 + internal/errors/errors_test.go | 45 + internal/errors/string.go | 11 + internal/testutil/config/config.go | 23 + internal/testutil/config/config_test.go | 27 + internal/testutil/config/mocking/config.env | 1 + internal/testutil/testutil.go | 1 + internal/version/version.go | 48 + internal/version/version_test.go | 7 + main.tf | 1 + mkdocs.yml | 24 + outputs.tf | 0 package.json | 69 + provision/diagrams/Taskfile.yml | 46 + .../diagrams/docs/diagrams/example.plantuml | 2 + .../diagrams/docs/diagrams/logo.plantuml | 2 + provision/generators/README.yaml | 84 + provision/generators/plop/generators/index.ts | 2 + provision/generators/plop/generators/test.ts | 88 + provision/generators/plop/index.ts | 6 + .../generators/plop/templates/test.add.hbs | 36 + .../plop/templates/test/data.add.hbs | 0 .../templates/test/docs/include/terraform.md | 1 + .../plop/templates/test/main.add.hbs | 3 + .../plop/templates/test/outputs.add.hbs | 0 .../plop/templates/test/variables.add.hbs | 0 .../plop/templates/test/versions.add.hbs | 6 + .../generators/plop/ts-node.tsconfig.json | 9 + provision/generators/plop/utils/helpers.ts | 21 + provision/generators/plop/utils/index.ts | 9 + provision/task/changelog.yml | 58 + provision/task/confluence.yml | 150 + provision/task/docker.yml | 63 + provision/task/docs.yml | 63 + provision/task/git.yml | 46 + provision/task/gitflow.yml | 45 + provision/task/go.yml | 103 + provision/task/mark.yml | 65 + provision/task/plantuml.yml | 29 + provision/task/prettier.yml | 58 + provision/task/python.yml | 74 + provision/task/sonar.yml | 50 + provision/task/ssh.yml | 45 + provision/task/terraform.yml | 32 + provision/task/version.yml | 26 + provision/task/yarn.yml | 39 + provision/templates/README.tpl.md | 218 ++ setup.cfg | 29 + sonar-project.properties | 9 + test/.keep | 0 variables.tf | 0 versions.tf | 6 + yarn.lock | 3374 +++++++++++++++++ 147 files changed, 9523 insertions(+) create mode 100644 .chglog/CHANGELOG.tpl.md create mode 100644 .chglog/config.yml create mode 100644 .ci/config/.terraform-docs.yml create mode 100644 .ci/linters/.ansible-lint create mode 100644 .ci/linters/.commitlintrc.json create mode 100644 .ci/linters/.eslintignore create mode 100644 .ci/linters/.eslintrc.js create mode 100644 .ci/linters/.gitleaks.toml create mode 100644 .ci/linters/.golangci.yml create mode 100644 .ci/linters/.goreleaser.yml create mode 100644 .ci/linters/.hadolint.yaml create mode 100644 .ci/linters/.lintstagedrc.js create mode 100644 .ci/linters/.prettierignore create mode 100644 .ci/linters/.pylintrc create mode 100644 .ci/linters/.stylintrc create mode 100644 .ci/linters/.tflint.hcl create mode 100644 .ci/linters/.yamllint create mode 100644 .ci/linters/checkov.yml create mode 100644 .ci/linters/markdown-link-config.json create mode 100644 .ci/linters/prettier.config.js create mode 100644 .ci/linters/yamllint.config.yaml create mode 100644 .codespell-ignores create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/general_issue.md create mode 100644 .github/ISSUE_TEMPLATE/support_question.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/renovate.json create mode 100644 .github/semantic.yml create mode 100644 .github/stale.yml create mode 100644 .github/workflows/confluence.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/sonarqube.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .pre-commit-config.yaml create mode 100644 LICENSE create mode 100644 Pipfile create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 Taskfile.yml create mode 100644 config/app.go create mode 100644 config/app_test.go create mode 100644 config/config.go create mode 100644 config/config_test.go create mode 100644 config/interface.go create mode 100644 config/log.go create mode 100644 data.tf create mode 100644 docs/authors.md create mode 100644 docs/code_of_conduct.md create mode 100644 docs/commands.md create mode 100755 docs/components.md create mode 100644 docs/contribute/github-flow.md create mode 100644 docs/contributing.md create mode 100644 docs/diagrams/example.png create mode 100644 docs/diagrams/logo.png create mode 100644 docs/disclaimer.md create mode 100644 docs/env-vars.md create mode 100644 docs/examples/common.md create mode 100644 docs/faq.md create mode 100644 docs/include/targets.md create mode 100644 docs/include/terraform.md create mode 100644 docs/index.md create mode 100644 docs/releasing.md create mode 100644 docs/roadmap.md create mode 100644 docs/support.md create mode 100644 docs/testing.md create mode 100644 docs/troubleshooting.md create mode 100644 docs/usage.md create mode 100644 examples/basic/docs/include/terraform.md create mode 100644 examples/basic/main.tf create mode 100644 examples/basic/outputs.tf create mode 100644 examples/basic/variables.tf create mode 100644 examples/basic/versions.tf create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/app/external/faker/main.go create mode 100644 internal/app/external/faker/user.go create mode 100644 internal/app/external/faker/user_test.go create mode 100644 internal/common/log/interface.go create mode 100644 internal/common/log/log.go create mode 100644 internal/common/log/log_test.go create mode 100644 internal/common/log/mocking/zap.env create mode 100644 internal/common/log/provider/mocking/zap.env create mode 100644 internal/common/log/provider/zap.go create mode 100644 internal/common/log/provider/zap_test.go create mode 100644 internal/errors/errors.go create mode 100644 internal/errors/errors_test.go create mode 100644 internal/errors/string.go create mode 100644 internal/testutil/config/config.go create mode 100644 internal/testutil/config/config_test.go create mode 100644 internal/testutil/config/mocking/config.env create mode 100644 internal/testutil/testutil.go create mode 100644 internal/version/version.go create mode 100644 internal/version/version_test.go create mode 100644 main.tf create mode 100644 mkdocs.yml create mode 100644 outputs.tf create mode 100644 package.json create mode 100644 provision/diagrams/Taskfile.yml create mode 100644 provision/diagrams/docs/diagrams/example.plantuml create mode 100644 provision/diagrams/docs/diagrams/logo.plantuml create mode 100644 provision/generators/README.yaml create mode 100644 provision/generators/plop/generators/index.ts create mode 100644 provision/generators/plop/generators/test.ts create mode 100644 provision/generators/plop/index.ts create mode 100644 provision/generators/plop/templates/test.add.hbs create mode 100644 provision/generators/plop/templates/test/data.add.hbs create mode 100644 provision/generators/plop/templates/test/docs/include/terraform.md create mode 100644 provision/generators/plop/templates/test/main.add.hbs create mode 100644 provision/generators/plop/templates/test/outputs.add.hbs create mode 100644 provision/generators/plop/templates/test/variables.add.hbs create mode 100644 provision/generators/plop/templates/test/versions.add.hbs create mode 100644 provision/generators/plop/ts-node.tsconfig.json create mode 100644 provision/generators/plop/utils/helpers.ts create mode 100644 provision/generators/plop/utils/index.ts create mode 100644 provision/task/changelog.yml create mode 100644 provision/task/confluence.yml create mode 100644 provision/task/docker.yml create mode 100644 provision/task/docs.yml create mode 100644 provision/task/git.yml create mode 100644 provision/task/gitflow.yml create mode 100644 provision/task/go.yml create mode 100644 provision/task/mark.yml create mode 100644 provision/task/plantuml.yml create mode 100644 provision/task/prettier.yml create mode 100644 provision/task/python.yml create mode 100644 provision/task/sonar.yml create mode 100644 provision/task/ssh.yml create mode 100644 provision/task/terraform.yml create mode 100644 provision/task/version.yml create mode 100644 provision/task/yarn.yml create mode 100644 provision/templates/README.tpl.md create mode 100644 setup.cfg create mode 100644 sonar-project.properties create mode 100644 test/.keep create mode 100644 variables.tf create mode 100644 versions.tf create mode 100644 yarn.lock diff --git a/.chglog/CHANGELOG.tpl.md b/.chglog/CHANGELOG.tpl.md new file mode 100644 index 0000000..86a0e22 --- /dev/null +++ b/.chglog/CHANGELOG.tpl.md @@ -0,0 +1,38 @@ +# Changelog + +All notable changes to this project will be documented in this file. This file uses change log convention from [keep a CHANGELOG](http://keepachangelog.com/en/0.3.0/). + +{{ range .Versions }} + +## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} + +> {{ datetime "2006-01-02" .Tag.Date }} + +{{ range .CommitGroups -}} + +### {{ .Title }} + +{{ range .Commits -}} +* {{ .Subject }} +{{ end }} +{{ end -}} + +{{- if .RevertCommits -}} + +### Reverts + +{{ range .RevertCommits -}} +* {{ .Revert.Header }} +{{ end }} +{{ end -}} + +{{- if .NoteGroups -}} +{{ range .NoteGroups -}} +### {{ .Title }} + +{{ range .Notes }} +{{ .Body }} +{{ end }} +{{ end -}} +{{ end -}} +{{ end -}} diff --git a/.chglog/config.yml b/.chglog/config.yml new file mode 100644 index 0000000..b81b240 --- /dev/null +++ b/.chglog/config.yml @@ -0,0 +1,29 @@ +style: github +template: CHANGELOG.tpl.md +info: + title: CHANGELOG + repository_url: https://github.com/hadenlabs/terraform-module-template +options: + commits: + filters: + Type: + - chore + - feat + - fix + - perf + - refactor + commit_groups: + title_maps: + chore: Features + feat: Features + fix: Bug Fixes + perf: Performance Improvements + refactor: Code Refactoring + header: + pattern: "^(\\w*)\\:\\s(.*)$" + pattern_maps: + - Type + - Subject + notes: + keywords: + - BREAKING CHANGE diff --git a/.ci/config/.terraform-docs.yml b/.ci/config/.terraform-docs.yml new file mode 100644 index 0000000..c42d613 --- /dev/null +++ b/.ci/config/.terraform-docs.yml @@ -0,0 +1,48 @@ +formatter: 'markdown' # this is required +version: '' + +header-from: main.tf +footer-from: '' + +recursive: + enabled: false + path: modules + +sections: + hide: [] + show: [] + +content: '' + +output: + file: 'docs/include/terraform.md' + mode: replace + template: |- + + + {{ .Content }} + + + +output-values: + enabled: false + from: '' + +sort: + enabled: true + by: name + +settings: + anchor: false + color: true + default: true + description: false + escape: true + hide-empty: false + html: true + indent: 2 + lockfile: true + read-comments: true + required: true + sensitive: true + type: true diff --git a/.ci/linters/.ansible-lint b/.ci/linters/.ansible-lint new file mode 100644 index 0000000..03cccf8 --- /dev/null +++ b/.ci/linters/.ansible-lint @@ -0,0 +1,7 @@ +warn_list: + - '204' # Lines should be less than 160 characters + - '701' # meta/main.yml should contain relevant info +skip_list: + - '106' # Role name must match ^[a-z][a-z0-9_]+$ pattern + - 'yaml' + - 'role-name' diff --git a/.ci/linters/.commitlintrc.json b/.ci/linters/.commitlintrc.json new file mode 100644 index 0000000..8081b61 --- /dev/null +++ b/.ci/linters/.commitlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@hadenlabs/commitlint-config"] +} diff --git a/.ci/linters/.eslintignore b/.ci/linters/.eslintignore new file mode 100644 index 0000000..e8920b7 --- /dev/null +++ b/.ci/linters/.eslintignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +build/ +out/ +.serverless/ +.serverless_nextjs/ +.next/ +storybook-static/ +__snapshots__/ diff --git a/.ci/linters/.eslintrc.js b/.ci/linters/.eslintrc.js new file mode 100644 index 0000000..ce35ce3 --- /dev/null +++ b/.ci/linters/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + parser: '@typescript-eslint/parser', + env: { + node: true, + es2021: true + }, + parserOptions: { + ecmaVersion: 6, + sourceType: 'module' // Allows for the use of imports + }, + extends: [ + 'plugin:prettier/recommended', + 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin + 'plugin:import/warnings' + ], + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/semicolon': 'off', + '@typescript-eslint/member-delimiter-style': 'off', + '@typescript-eslint/naming-convention': 'warn', + '@typescript-eslint/semi': 'off', + 'no-throw-literal': 'warn', + curly: 'warn', + eqeqeq: 'warn', + semi: 'off' + }, + ignorePatterns: ['**/*.d.ts'] +} diff --git a/.ci/linters/.gitleaks.toml b/.ci/linters/.gitleaks.toml new file mode 100644 index 0000000..a9f53a8 --- /dev/null +++ b/.ci/linters/.gitleaks.toml @@ -0,0 +1,278 @@ +title = "gitleaks config" + +[[rules]] + description = "AWS Access Key" + regex = '''(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}''' + tags = ["key", "AWS"] + [rules.allowlist] + description = "ignore value fake" + regexes = [ + '''AIDAQEAAAAAAAAAAAAAA''', + ] + +[[rules]] + description = "AWS cred file info" + regex = '''(?i)(aws_access_key_id|aws_secret_access_key)(.{0,20})?=.[0-9a-zA-Z\/+]{20,40}''' + tags = ["AWS"] + +[[rules]] + description = "AWS Secret Key" + regex = '''(?i)aws(.{0,20})?(?-i)['\"][0-9a-zA-Z\/+]{40}['\"]''' + tags = ["key", "AWS"] + +[[rules]] + description = "AWS MWS key" + regex = '''amzn\.mws\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}''' + tags = ["key", "AWS", "MWS"] + +[[rules]] + description = "Facebook Secret Key" + regex = '''(?i)(facebook|fb)(.{0,20})?(?-i)['\"][0-9a-f]{32}['\"]''' + tags = ["key", "Facebook"] + +[[rules]] + description = "Facebook Client ID" + regex = '''(?i)(facebook|fb)(.{0,20})?['\"][0-9]{13,17}['\"]''' + tags = ["key", "Facebook"] + +[[rules]] + description = "Facebook access token" + regex = '''EAACEdEose0cBA[0-9A-Za-z]+''' + tags = ["key", "Facebook"] + +[[rules]] + description = "Twitter Secret Key" + regex = '''(?i)twitter(.{0,20})?['\"][0-9a-z]{35,44}['\"]''' + tags = ["key", "Twitter"] + +[[rules]] + description = "Twitter Client ID" + + regex = '''(?i)twitter(.{0,20})?['\"][0-9a-z]{18,25}['\"]''' + tags = ["client", "Twitter"] + +[[rules]] + description = "Github" + regex = '''(?i)github(.{0,20})?(?-i)['\"][0-9a-zA-Z]{35,40}['\"]''' + tags = ["key", "Github"] + +[[rules]] + description = "LinkedIn Client ID" + regex = '''(?i)linkedin(.{0,20})?(?-i)['\"][0-9a-z]{12}['\"]''' + tags = ["client", "LinkedIn"] + +[[rules]] + description = "LinkedIn Secret Key" + regex = '''(?i)linkedin(.{0,20})?['\"][0-9a-z]{16}['\"]''' + tags = ["secret", "LinkedIn"] + +[[rules]] + description = "Slack" + regex = '''xox[baprs]-([0-9a-zA-Z]{10,48})?''' + tags = ["key", "Slack"] + +[[rules]] + description = "EC" + regex = '''-----BEGIN EC PRIVATE KEY-----''' + tags = ["key", "EC"] + +[[rules]] + description = "Google API key" + regex = '''AIza[0-9A-Za-z\\-_]{35}''' + tags = ["key", "Google"] + +[[rules]] + description = "Google Cloud Platform API key" + regex = '''(?i)(google|gcp|youtube|drive|yt)(.{0,20})?['\"][AIza[0-9a-z\\-_]{35}]['\"]''' + tags = ["key", "Google", "GCP"] + +[[rules]] + description = "Google OAuth" + regex = '''(?i)(google|gcp|auth)(.{0,20})?['"][0-9]+-[0-9a-z_]{32}\.apps\.googleusercontent\.com['"]''' + tags = ["key", "Google", "OAuth"] + +[[rules]] + description = "Google OAuth access token" + regex = '''ya29\.[0-9A-Za-z\-_]+''' + tags = ["key", "Google", "OAuth"] + +[[rules]] + description = "Heroku API key" + regex = '''(?i)heroku(.{0,20})?['"][0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}['"]''' + tags = ["key", "Heroku"] + +[[rules]] + description = "MailChimp API key" + regex = '''(?i)(mailchimp|mc)(.{0,20})?['"][0-9a-f]{32}-us[0-9]{1,2}['"]''' + tags = ["key", "Mailchimp"] + +[[rules]] + description = "Mailgun API key" + regex = '''(?i)(mailgun|mg)(.{0,20})?['"][0-9a-z]{32}['"]''' + tags = ["key", "Mailgun"] + +[[rules]] + description = "PayPal Braintree access token" + regex = '''access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}''' + tags = ["key", "Paypal"] + +[[rules]] + description = "Picatic API key" + regex = '''sk_live_[0-9a-z]{32}''' + tags = ["key", "Picatic"] + +[[rules]] + description = "Slack Webhook" + regex = '''https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24}''' + tags = ["key", "slack"] + +[[rules]] + description = "Stripe API key" + regex = '''(?i)stripe(.{0,20})?['\"'][sk|rk]_live_[0-9a-zA-Z]{24}''' + tags = ["key", "Stripe"] + +[[rules]] + description = "Square access token" + regex = '''sq0atp-[0-9A-Za-z\-_]{22}''' + tags = ["key", "square"] + +[[rules]] + description = "Square OAuth secret" + regex = '''sq0csp-[0-9A-Za-z\\-_]{43}''' + tags = ["key", "square"] + +[[rules]] + description = "Twilio API key" + regex = '''(?i)twilio(.{0,20})?['\"][0-9a-f]{32}['\"]''' + tags = ["key", "twilio"] + +[[rules]] + description = "Password in URL" + regex = '''[a-zA-Z]{3,10}:\/\/[^\/\s:@]{3,20}:[^\/\s:@]{3,20}@.{1,100}\/?.?''' + tags = ["key", "URL", "generic"] + + +[[rules]] + description = "Env Var" + regex = '''(?i)(apikey|secret|key|api|password|pass)=[0-9a-zA-Z-_.{}]{4,120}''' + tags = ["env"] + [rules.allowlist] + description = "ignore value fake" + regexes = [ + '''host=HOST''', + '''--private-key={{.PRIVATE_KEY_FILE}}''', + ] + +[[rules]] + description = "Email" + regex = '''[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}''' + tags = ["email"] + [rules.allowlist] + description = "ignore emails" + regexes = [ + '''[a-zA-Z0-9._%+-]+@users.noreply.github.com''', + '''[a-zA-Z0-9._%+-]+@yopmail.com''', + '''git@github.com''', + '''git@gitlab.com''', + '''slovacus@gmail.com''', + '''luis@hadenlabs.com''', + '''security@hadenlabs.com''', + '''hola@hadenlabs.com''', + '''hello@hadenlabs.com''', + '''support@hadenlbas.com''', + '''support@hadenlabs.com''', + '''dum-u@hadenlabs.com''', + ] + +[[rules]] + description = "High Entropy" + regex = '''[0-9a-zA-Z-_!{}/=]{4,120}''' + file = '''(?i)(dump.sql|high-entropy-misc.txt)$''' + tags = ["entropy"] + [[rules.Entropies]] + Min = "4.3" + Max = "7.0" + [rules.allowlist] + description = "ignore some" + files = ['''(.*pub|env)$'''] + paths = ['''(security.*)'''] + +[[rules]] + description = "Potential bash var" + regex='''(?i)(=)([0-9a-zA-Z-_!{}=]{4,120})''' + tags = ["key", "bash", "API", "generic"] + [[rules.Entropies]] + Min = "3.5" + Max = "4.5" + Group = "1" + +[[rules]] + description = "WP-Config" + regex='''define(.{0,20})?(DB_CHARSET|NONCE_SALT|LOGGED_IN_SALT|AUTH_SALT|NONCE_KEY|DB_HOST|DB_PASSWORD|AUTH_KEY|SECURE_AUTH_KEY|LOGGED_IN_KEY|DB_NAME|DB_USER)(.{0,20})?['|"'].{10,120}['|"']''' + tags = ["key", "API", "generic"] + +[[rules]] + description = "Generic API Key" + regex = '''[a|A][p|P][i|I][_]?[k|K][e|E][y|Y].*['|\"][0-9a-zA-Z]{32,45}['|\"]''' + +[[rules]] + description = "Generic Secret" + regex = '''[s|S][e|E][c|C][r|R][e|E][t|T].*['|\"][0-9a-zA-Z]{32,45}['|\"]''' + + +[[rules]] + description = "Files with keys and credentials" + file = '''(?i)(id_rsa|passwd|id_rsa.pub|pgpass)$''' + tags = ["key", "files"] + [rules.allowlist] + description = "ignore some" + files = ['''(.*pub|env)$'''] + +[[rules]] + description = "Extension Files with keys and credentials" + file = '''(.*?)(pub|pem|ppk|key)$''' + tags = ["key", "files"] + [rules.allowlist] + description = "ignore file test" + files = [ + '''.*-test.*$''', + ] + +# Global allowlist +[allowlist] + description = "Whitelisted files" + paths = [ + '''^vendor/''', + '''^bower_components/''', + '''^public/''', + '''^node_modules/''', + '''^theme/''', + ] + files = [ + '''(.*?)(jpg|gif|png|doc|pdf|bin|mp3|mp4|mov|ttf|woff|woff2|eot|lock)$''', + '''^\.gitignore$''', + '''^\.gitleaks.toml$''', + '''^yarn.lock$''', + '''^vendor/(.*?)$''', + '''^sonar-project.properties$''', + '''^node_modules/(.*?)$''', + ] + commits = [] + +[whitelist] + description = "image and html allowlists" + paths = [ + '''^vendor/(.*?)$''', + '''^node_modules/(.*?)$''', + '''^test/fixtures/keys/(.*?)$''', + ] + + files = [ + '''(.*?)(jpg|gif|png|doc|pdf|bin|mp3|mp4|mov|ttf|woff|woff2|eot|lock)$''', + '''^\.gitignore$''', + '''^\.gitleaks.toml$''', + '''^\.gitignore$''', + '''^yarn.lock$''', + '''^sonar-project.properties$''', + '''^test/fixtures/keys/.*-test.*$''', + ] diff --git a/.ci/linters/.golangci.yml b/.ci/linters/.golangci.yml new file mode 100644 index 0000000..fec8305 --- /dev/null +++ b/.ci/linters/.golangci.yml @@ -0,0 +1,164 @@ +run: + timeout: 10m + deadline: 5m + + tests: true + +output: + format: tab + +linters-settings: + govet: + # report about shadowed variables + check-shadowing: true + + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + + goimports: + # put imports beginning with prefix after 3rd-party packages; + # it's a comma-separated list of prefixes + local-prefixes: github.com/hadenlabs/ + + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 5 + + lll: + # tab width in spaces. Default to 1. + tab-width: 1 + + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + + unparam: + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + + gocritic: + # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint` run to see all tags and checks. + # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". + enabled-tags: + - performance + + settings: # settings passed to gocritic + captLocal: # must be valid enabled check name + paramsOnly: true + rangeValCopy: + sizeThreshold: 32 + + misspell: + locale: US + +linters: + enable: + - megacheck + - govet + - gocyclo + - gocritic + - goconst + - goimports + - gofmt # We enable this as well as goimports for its simplify mode. + - prealloc + - unconvert + - misspell + - nakedret + + presets: + - bugs + - unused + fast: false + disable: + - gomnd + - funlen + - maligned + - wsl + - testpackage + - goerr113 + - scopelint + - golint + - bodyclose + - contextcheck + - nilerr + - noctx + - rowserrcheck + - sqlclosecheck + - structcheck + - unparam + + # Drives todos nuts + - godox + +issues: + # Excluding configuration per-path and per-linter + exclude-rules: + # Exclude some linters from running on tests files. + - path: _test(ing)?\.go + linters: + - gocyclo + - errcheck + - dupl + - gosec + - scopelint + - unparam + - golint + + # - text: "should have a package comment" + # linters: + # - golint + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same-issues: 0 diff --git a/.ci/linters/.goreleaser.yml b/.ci/linters/.goreleaser.yml new file mode 100644 index 0000000..ebde353 --- /dev/null +++ b/.ci/linters/.goreleaser.yml @@ -0,0 +1,73 @@ +# This is an example goreleaser.yaml file with some sane defaults. +# Make sure to check the documentation at http://goreleaser.com +project_name: terraform-module-template +env: + - GO111MODULE=on + - REPO=github.com/hadenlabs/terraform-module-template +before: + hooks: + - go mod download + - go mod tidy + - go mod vendor + - go generate ./... + +# https://goreleaser.com/build/ +builds: + # Defaults to the project name. + - id: default + # ID of the build. + env: + - CGO_ENABLED=0 + ldflags: + - -s -w + - -X "{{.Env.REPO}}/cmd.Version={{.Version}}" + - -X "{{.Env.REPO}}/cmd.Commit={{.FullCommit}}" + - -X "{{.Env.REPO}}/cmd.RepoURL={{.GitURL}}" + - -X "{{.Env.REPO}}/cmd.BuildDate={{.Date}}" + - -X "{{.Env.REPO}}/cmd.BuiltWithGoVersion={{.Env.GO_VERSION}}" + - -X "{{.Env.REPO}}/cmd.BuiltBy={{.Env.BUILT_BY}}" + goos: + - darwin + - linux + goarch: + - amd64 +archives: + - replacements: + darwin: Darwin + linux: Linux + amd64: x86_64 + builds: + - default + wrap_in_directory: true + name_template: '{{.ProjectName}}-{{.Os}}-{{.Arch}}' + format: tar.gz + format_overrides: + - goos: windows + format: zip + files: + - LICENSE + - README.md + - CHANGELOG.md + - config/**/* + - systemd/* +# https://goreleaser.com/snapshots/ +snapshot: + name_template: 'dev@{{.ShortCommit}}' + +# https://goreleaser.com/checksum/ +checksum: + name_template: '{{ .ProjectName }}_{{ .Version }}_checksums.txt' + algorithm: sha256 +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' +release: + github: + owner: hadenlabs + name: terraform-module-template + draft: true + prerelease: auto + name_template: '{{.ProjectName}}-v{{.Version}}-{{.ShortCommit}}-{{.Date}}' diff --git a/.ci/linters/.hadolint.yaml b/.ci/linters/.hadolint.yaml new file mode 100644 index 0000000..2dc085f --- /dev/null +++ b/.ci/linters/.hadolint.yaml @@ -0,0 +1,12 @@ +ignored: + - DL3008 # Pin versions in apt get install. Instead of `apt-get install ` use `apt-get install =` + - DL3013 # Pin versions in pip. Instead of `pip install ` use `pip install ==` + - DL3016 # Pin versions in npm. Instead of `npm install ` use `npm install @ + - DL3018 # Pin versions in apk add. Instead of `apk add ` use `apk add = + - DL3028 # Pin versions in gem install. Instead of `gem install ` use `gem install :` + + - SC2086 # info: Double quote to prevent globbing and word splitting. + + # temp + + - DL4006 # Set the SHELL option -o pipefail before RUN with a pipe in it diff --git a/.ci/linters/.lintstagedrc.js b/.ci/linters/.lintstagedrc.js new file mode 100644 index 0000000..426f4d7 --- /dev/null +++ b/.ci/linters/.lintstagedrc.js @@ -0,0 +1,10 @@ +const escape = require('shell-quote').quote + +module.exports = { + '*.{ts,tsx,js,json,css}': (filenames) => [ + ...filenames.map((filename) => `prettier --check "${escape([filename])}"`), + ...filenames.map((filename) => `git add "${filename}"`) + ], + '*.{ts,tsx,js,jsx}': ['eslint'], + '*.{ts,tsx,css}': ['stylelint'] +} diff --git a/.ci/linters/.prettierignore b/.ci/linters/.prettierignore new file mode 100644 index 0000000..2b990ab --- /dev/null +++ b/.ci/linters/.prettierignore @@ -0,0 +1,27 @@ +.next +.serverless +.serverless_nextjs +node_modules +dist +package.json +package-lock.json +coverage +.mypy_cache/ +.build +.terraform +.ci/linters/.cache/* +.cache/* +terraform.md +*.tpl.md +*.enc.yaml +vendor +public +staticfiles +out +.vscode-test +.cache +.venv +contrib/ +site/ +.external_modules +CHANGELOG.md diff --git a/.ci/linters/.pylintrc b/.ci/linters/.pylintrc new file mode 100644 index 0000000..9e766c7 --- /dev/null +++ b/.ci/linters/.pylintrc @@ -0,0 +1,366 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +# profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=migrations,settings.py,settings_openshift.py,settings_test.py,settings_test_mysql.py,settings_test_postgresql.py,settings_test_sqlite.py,.git,test-repos,repos,settings_test_nose.py + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# C0111 Missing docstring +# I0011 Warning locally suppressed using disable-msg +# W0142 Used * or * magic* Used when a function or method is called using *args or **kwargs to dispatch arguments. +# W0613 Unused argument %r Used when a function or method argument is not used. +# R0201 Method could be a function +# E1101 does not work well on metaclasses like Django models or Mechanize browser +# E1103 does not work with WSGIRequest or file objects +# W0703 Catching too general exception Exception +# R0921,R0922 Is raised when abstract classes are used in different module +# E1002 Produces lot of false positives with Django 1.5 +# R0401(cyclic-import) we have too many of them +# C0411(wrong-import-order) should be probably fixed +# E1102: _ is not callable +# C0103: Invalid name +# C0301: Line too long +# C0302: Too many lines in module +# R0903: Too few public method +# R0904: Too many public methods +# R0912: Too many branches +# R0913: Too many arguments +# R0914: Too many local variables +# R0915: Too many statements +# R0201: Method could be a function +# W0142: Used * or ** magic +# W0231: __init__ method from base class is not called +# W0232: Class has no __init__ method +# W0212: Access to a protected member _meta of a client class + +disable=import-error,missing-super-argument,too-few-public-methods, + no-member,no-init,old-style-class,C0111,I0011,W0142,W0613, + E1103,E1101,E1102,R0401,R0921,R0922,E1002,C0411,W0703,R0201, + C0301,W0231,W0232,W0212,C0330 + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +# comment=no + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus extisting member attributes cannot be deduced by static analysis +ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +# zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=objects,DoesNotExist,id,pk,_meta,base_fields,context + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +# dummy-variables-rgx=dummy,_ + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1600 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[BASIC] + +# Required attributes for module, separated by a comma +# required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input,file + +# Good variable names which should always be accepted, separated by a comma +good-names=_,i,j,k,e,qs,pk,setUp,tearDown,id + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Regular expression matching correct function names +function-rgx=[a-zA_][a-zA-Z0-9_]{2,70}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|([a-z_][a-z0-9_]*)|(__.*__)|register|urlpatterns)$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9_]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-zA-Z0-9_]{2,70}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=__.*__|_.* + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=10 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=20 + +# Maximum number of return / yield for function / method body +max-returns=8 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=12 + +# Maximum number of attributes for a class (see R0902). +max-attributes=25 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=110 + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +# ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception + +[Design] +max-public-methods=100 +min-public-methods=0 +max-args=6 diff --git a/.ci/linters/.stylintrc b/.ci/linters/.stylintrc new file mode 100644 index 0000000..f80dbdd --- /dev/null +++ b/.ci/linters/.stylintrc @@ -0,0 +1,15 @@ +{ + "extends": "stylelint-config-standard", + "rules": { + "color-hex-length": "long", + "declaration-colon-newline-after": null, + "function-calc-no-invalid": null, + "indentation": "tab", + "no-descending-specificity": null, + "no-empty-source": null, + "no-eol-whitespace": null, + "number-leading-zero": "always", + "selector-list-comma-newline-after": null, + "selector-pseudo-element-colon-notation": "double" + } +} diff --git a/.ci/linters/.tflint.hcl b/.ci/linters/.tflint.hcl new file mode 100644 index 0000000..435d530 --- /dev/null +++ b/.ci/linters/.tflint.hcl @@ -0,0 +1,39 @@ +plugin "aws" { + enabled = true + version = "0.8.0" + source = "github.com/terraform-linters/tflint-ruleset-aws" +} +rule "terraform_deprecated_index" { + enabled = true +} +rule "terraform_unused_declarations" { + enabled = true +} +rule "terraform_comment_syntax" { + enabled = true +} +rule "terraform_documented_outputs" { + enabled = true +} +rule "terraform_documented_variables" { + enabled = true +} +rule "terraform_typed_variables" { + enabled = true +} +rule "terraform_naming_convention" { + enabled = true +} +rule "terraform_required_version" { + enabled = true +} +rule "terraform_standard_module_structure" { + enabled = true +} +rule "terraform_required_providers" { + enabled = false +} +rule "terraform_module_pinned_source" { + enabled = true + style = "semver" +} diff --git a/.ci/linters/.yamllint b/.ci/linters/.yamllint new file mode 100644 index 0000000..6d56f1b --- /dev/null +++ b/.ci/linters/.yamllint @@ -0,0 +1,7 @@ +--- +extends: default + +rules: + line-length: + max: 200 + level: warning diff --git a/.ci/linters/checkov.yml b/.ci/linters/checkov.yml new file mode 100644 index 0000000..6d8d0d5 --- /dev/null +++ b/.ci/linters/checkov.yml @@ -0,0 +1,11 @@ +download-external-modules: true +evaluate-variables: true +external-modules-download-path: .external_modules +framework: + - all +no-guide: true +output: cli +quiet: true +skip-fixes: true +skip-suppressions: true +soft-fail: true diff --git a/.ci/linters/markdown-link-config.json b/.ci/linters/markdown-link-config.json new file mode 100644 index 0000000..ddcd295 --- /dev/null +++ b/.ci/linters/markdown-link-config.json @@ -0,0 +1,21 @@ +{ + "baseUrl": "https://github.com/hadenlabs/terraform-module-template", + "ignorePatterns": [ + { + "pattern": "^https://hadenlabs.com" + }, + { + "pattern": "^https://github.com/hadenlabs/terraform-module-template/compare" + } + ], + "replacementPatterns": [ + { + "pattern": "^/docs", + "replacement": "{{BASEURL}}/docs" + } + ], + "timeout": "20s", + "retryCount": 3, + "fallbackRetryDelay": "30s", + "aliveStatusCodes": [200, 206] +} diff --git a/.ci/linters/prettier.config.js b/.ci/linters/prettier.config.js new file mode 100644 index 0000000..db2b6d3 --- /dev/null +++ b/.ci/linters/prettier.config.js @@ -0,0 +1,65 @@ +module.exports = { + arrowParens: 'always', + printWidth: 120, + proseWrap: 'preserve', + semi: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + overrides: [ + { + files: '{*.js?(x),*.ts?(x),*.y?(a)ml,.*.y?(a)ml,*.md,.prettierrc,.stylelintrc,.babelrc}', + options: { + arrowParens: 'always', + printWidth: 100, + semi: false, + singleQuote: true, + quoteProps: 'as-needed', + tabWidth: 2, + trailingComma: 'none' + } + }, + { + files: '{*.json,.*.json,**/.vscode/*.json,**/tsconfig.json,**/tsconfig.*.json}', + options: { + parser: 'json', + tabWidth: 2, + quoteProps: 'preserve', + singleQuote: false + } + }, + { + files: '*.md', + options: { + parser: 'markdown', + printWidth: 120, + proseWrap: 'never', + semi: false, + trailingComma: 'none' + } + }, + { + files: '*.mdx', + options: { + printWidth: 120, + proseWrap: 'never', + semi: false, + trailingComma: 'none' + } + }, + { + files: '*.{sass,scss}', + options: { + parser: 'scss' + } + }, + { + files: '*.less', + options: { + tabWidth: 4, + printWidth: 80, + parser: 'less' + } + } + ] +} diff --git a/.ci/linters/yamllint.config.yaml b/.ci/linters/yamllint.config.yaml new file mode 100644 index 0000000..7274672 --- /dev/null +++ b/.ci/linters/yamllint.config.yaml @@ -0,0 +1,31 @@ +ignore: | + .gitlab/ + +extends: default + +rules: + braces: + level: warning + max-spaces-inside: 1 + brackets: + level: warning + max-spaces-inside: 1 + colons: + level: warning + commas: + level: warning + comments: disable + comments-indentation: disable + document-start: disable + empty-lines: + level: warning + hyphens: + level: warning + indentation: + level: warning + indent-sequences: consistent + line-length: + max: 180 + level: warning + allow-non-breakable-inline-mappings: true + truthy: disable diff --git a/.codespell-ignores b/.codespell-ignores new file mode 100644 index 0000000..af6724f --- /dev/null +++ b/.codespell-ignores @@ -0,0 +1 @@ +cas diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1d17dae --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.venv diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c2bd381 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,68 @@ + +# EditorConfig is awesome: http://EditorConfig.org + + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = false +indent_style = space +# Set default charset +charset = utf-8 +trim_trailing_whitespace = true +indent_size = 2 + +# Custom Coding Styles for Java files +[*.java] + +# The other allowed value you can use is space +indent_style = tab + +# You can play with this value and set it to how +# many characters you want your indentation to be +indent_size = 2 + +# Character set to be used in java files. +charset = utf-8 +trim_trailing_whitespace = true + +[*.{el}] +insert_final_newline = false + +[*.{el,md,mdx,yml,yaml,js,json,toml,ts,tsx,hcl,tf,graphql,hbs,sh}] +indent_style = space +indent_size = 2 + +# 4 space indentation +[*.{py}] +indent_style = space +indent_size = 4 + +[*.go] +indent_size = 2 +indent_style = tab + +# Minified JavaScript files shouldn't be changed +[**.min.js] +indent_style = ignore +insert_final_newline = ignore + +# Tab indentation (no size specified) +[Makefile] +indent_style = tab + +# Indentation override for all JS under lib directory +[*.{el,js,json,md,yml,yaml,tf}] +indent_style = space +indent_size = 2 + +[*.{make,mk}] +indent_style = tab +indent_size = 4 + +# Batch files use tabs for indentation +[*.bat] +indent_style = tab diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..501f48d --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +# **NOTE**: please check the following document docs/env-vars.md +APP_NAME=terraform-module-template +SONAR_URL= +SONAR_TOKEN= diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..989c092 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,152 @@ +# Path-based git attributes + +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +## Test/documentation + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.githooks export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/.travis.yaml export-ignore +/phpunit.xml.dist export-ignore +/.scrutinizer.yml export-ignore +/.scrutinizer.yaml export-ignore +/tests export-ignore + +## Merging +CHANGELOG.md merge=union + +## Line endings + +### Automatic + +# Handle line endings automatically for files detected as text +# and leave all files detected as binary untouched. +* text=auto eol=lf + +### Text (should be normalized, convert crlf => lf) + +# Source +*.php text eol=lf +*.css text eol=lf +*.sass text eol=lf +*.scss text eol=lf +*.less text eol=lf +*.styl text eol=lf +*.js text eol=lf +*.coffee text eol=lf +*.json text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.xml text eol=lf +*.svg text eol=lf +*.txt text eol=lf +*.ini text eol=lf +*.inc text eol=lf +*.pl text eol=lf +*.rb text eol=lf +*.py text eol=lf +*.scm text eol=lf +*.sql text eol=lf +*.sh text eol=lf +*.bat text eol=lf + +# Templates +*.ejs text eol=lf +*.hbt text eol=lf +*.jade text eol=lf +*.haml text eol=lf +*.hbs text eol=lf +*.dot text eol=lf +*.tmpl text eol=lf +*.phtml text eol=lf + +*.wadl text eol=lf +*.wsdl text eol=lf + +# App config +.env text eol=lf +.env.example text eol=lf +.env.sample text eol=lf + +# Server config +.htaccess text eol=lf + +# Git config +.gitattributes text eol=lf +.gitignore text eol=lf + +# Code analysis config +.jshintrc text eol=lf +.jscsrc text eol=lf +.jshintignore text eol=lf +.csslintrc text eol=lf + +# Misc config +*.yaml text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +.editorconfig text eol=lf + +# Build config +composer.lock text eol=lf +*.npmignore text eol=lf +*.bowerrc text eol=lf + +# Heroku +Procfile text eol=lf +.slugignore text eol=lf + +# Documentation +*.md text eol=lf +LICENSE text eol=lf +AUTHORS text eol=lf + +# Vagrant +Vagrantfile eol=lf + +# Scripts +bin/* text eol=lf + +### Binary (left untouched) + +# (binary is a macro for -text -diff) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mov binary +*.mp4 binary +*.mp3 binary +*.mwb binary +*.flv binary +*.fla binary +*.swf binary +*.gz binary +*.zip binary +*.7z binary +*.rar binary +*.ttf binary +*.eot binary +*.woff binary +*.woff2 binary +*.otf binary +*.pyc binary +*.pdf binary +*.bz2 binary +*.sh linguist-language=go +*.webm binary +*.class binary +*.dll binary +*.ear binary +*.jar binary +*.so binary +*.war binary +*.xls binary +*.xlsx binary +*.pem binary +*.pub binary +*.crt binary diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..69404a3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: [hadenlabs] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: luismayta # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: luismayta # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: + - https://www.paypal.me/luismayta + - https://www.buymeacoffee.com/luismayta + - https://amzn.com/w/1VJ9F3BEK0S8B diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..b8e8d85 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,21 @@ +## The problem + +Briefly describe the issue you are experiencing (or the feature you want to see added). Tell us what you were trying to do and what happened instead. Remember, this is _not_ a place to ask questions. + +## Environment + +- OS: {Please write here} +- Python version: {Please write here} +- Python Facebook Chatbot version : {Please write here} + +## Details + +If necessary, describe the problem you have been experiencing in more detail. + +## Link to logs + +Create a [GIST](https://gist.github.com) which is a paste of your _full_ logs, and link them here. Do _NOT_ paste your full logs here, as it will make this issue very long and hard to read! If you are reporting a bug, _always_ include logs! + +## Tasks + +- [ ] Task number 1 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..d69a42f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug report +about: Create a report to help us improve +labels: type/bug +--- + +## The problem + +Briefly describe the issue you are experiencing (or the feature you want to see added). Tell us what you were trying to do and what happened instead. Remember, this is _not_ a place to ask questions. + +## Environment + +- OS: {Please write here} +- Version : {Please write here} + +## Details + +If necessary, describe the problem you have been experiencing in more detail. + +## Link to logs + +Create a [GIST](https://gist.github.com) which is a paste of your _full_ logs, and link them here. Do _NOT_ paste your full logs here, as it will make this issue very long and hard to read! If you are reporting a bug, _always_ include logs! + +## Tasks + +- [ ] Task number 1 + +## Checklist (after created issue) + +- [ ] Added label(s) +- [ ] Added to project +- [ ] Added to milestone diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..a3ffa50 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +labels: type/enhancement +--- + +## Feature description + +## Why is it needed? + +## Suggestion(s)/solution(s) [Optional] + +## Definition of done + +## Checklist (after created issue) + +- [ ] Added label(s) +- [ ] Added to project +- [ ] Added to milestone diff --git a/.github/ISSUE_TEMPLATE/general_issue.md b/.github/ISSUE_TEMPLATE/general_issue.md new file mode 100644 index 0000000..e8542b1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/general_issue.md @@ -0,0 +1,15 @@ +--- +name: 📋 General issue +about: Good for questions, clarifications etc +labels: type/general-report +--- + +## What is the issue? + +## Suggestion(s)/solution(s) [Optional] + +## Checklist (after created issue) + +- [ ] Added label(s) +- [ ] Added to project +- [ ] Added to milestone diff --git a/.github/ISSUE_TEMPLATE/support_question.md b/.github/ISSUE_TEMPLATE/support_question.md new file mode 100644 index 0000000..ef8d82b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support_question.md @@ -0,0 +1,23 @@ +--- +name: Support Question +about: I have a question and require assistance +labels: question +--- + + + +## What are you trying to achieve + + + +## Minimal example (if applicable) + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f8f668c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,25 @@ +## Proposed changes + +Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. + +## Types of changes + +What types of changes does your code introduce to Project? _Put an `x` in the boxes that apply_ + +- [ ] Bugfix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## Checklist + +_Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code._ + +- [ ] I have read the [CONTRIBUTING](/docs/contributing.md) doc +- [ ] Lint and unit tests pass locally with my changes +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] I have added necessary documentation (if appropriate) +- [ ] Any dependent changes have been merged and published in downstream modules + +## Further comments + +If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..b492e93 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,9 @@ +{ + "extends": ["github>hadenlabs/renovate-config"], + "packageRules": [ + { + "matchDepTypes": ["devDependencies"], + "automerge": true + } + ] +} diff --git a/.github/semantic.yml b/.github/semantic.yml new file mode 100644 index 0000000..3d3de84 --- /dev/null +++ b/.github/semantic.yml @@ -0,0 +1,17 @@ +# Configuration for Semantic Pull Requests +titleOnly: true + +types: + - feat + - fix + - docs + - style + - refactor + - perf + - test + - build + - ci + - chore + - revert + - release + - hotfix diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..0a1bbef --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,56 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 20 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 7 + +# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) +onlyLabels: [] + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: + - bug + - kind/bug + - status/backlog + - enhancement + - help wanted + - priority/low + - priority/medium + - priority/high + - priority/critical + - good first issue + - pinned + - security + - planned + +# Set to true to ignore issues in a project (defaults to false) +exemptProjects: false + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: false + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: false + +# Label to use when marking as stale +staleLabel: closing/stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + any recent activity. It will be closed if no further activity occurs. + +# Comment to post when removing the stale label. +# unmarkComment: > +# Your comment here. + +# Comment to post when closing a stale Issue or Pull Request. +closeComment: > + This issue has been automatically closed due to a lack of activity + for an extended period of time. + +# Limit to only `issues` or `pulls` +only: issues diff --git a/.github/workflows/confluence.yml b/.github/workflows/confluence.yml new file mode 100644 index 0000000..8299a2c --- /dev/null +++ b/.github/workflows/confluence.yml @@ -0,0 +1,45 @@ +name: confluence + +on: + workflow_run: + workflows: + - lint-code + types: + - completed + branches: + - develop + - main + + tags: + - '[0-9]+.[0-9]+.[0-9]+' + # https://semver.org/ proper release tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+' + # prerelease tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+-*' + +jobs: + confluence: + runs-on: ubuntu-20.04 + steps: + - name: Check out a copy of the repo + if: ${{ !env.ACT }} + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v26 + with: + files: | + *.md + files_ignore: | + *.tpl.md + + - name: Sync confluence + uses: hadenlabs/action-confluence-sync@0.1.0 + with: + files: '${{ steps.changed-files.outputs.all_changed_files }}' + confluence_url: ${{ secrets.CONFLUENCE_BASE_URL }} + confluence_username: ${{ secrets.CONFLUENCE_USER }} + confluence_token: ${{ secrets.CONFLUENCE_ACCESS_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..c14c04a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,34 @@ +name: lint-code + +on: + pull_request: + branches: + - develop + - main + + push: + branches: + - develop + - main + + tags: + - '[0-9]+.[0-9]+.[0-9]+' + # https://semver.org/ proper release tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+' + # prerelease tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+-*' + +permissions: + contents: read + pull-requests: read + +jobs: + pre-commit: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + if: ${{ !env.ACT }} + uses: actions/checkout@v3 + - uses: hadenlabs/action-pre-commit@0.2.0 + with: + args: run --all-files diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..6b8f63c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,63 @@ +name: create-release + +on: + workflow_run: + workflows: + - sonar-scan + types: + - completed + + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + # https://semver.org/ proper release tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+' + # prerelease tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+-*' + +env: + TMP_CHANGELOG_FILENAME: TMP_CHANGELOG.md + +jobs: + release: + runs-on: ubuntu-20.04 + if: startsWith(github.ref, 'refs/tags/') + container: + image: golang:1.19 + steps: + - name: Check out a copy of the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Install Task + uses: arduino/setup-task@v1 + + - name: Install changelog + run: task changelog:install + + - name: Check dependences + run: task changelog:check + + - id: get_version + uses: battila7/get-version-action@v2 + + - name: set vars to github + run: | + echo "APP_TAG=${{ steps.get_version.outputs.version-without-v }}" >> $GITHUB_ENV + + - name: Generate changelog + run: task changelog:tag + + - name: Create Release + if: ${{ !env.ACT }} + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + with: + tag_name: ${{ env.APP_TAG }} + release_name: ${{ env.APP_TAG }} + draft: false + prerelease: false + body_path: ${{ env.TMP_CHANGELOG_FILENAME }} diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml new file mode 100644 index 0000000..4d8e422 --- /dev/null +++ b/.github/workflows/sonarqube.yml @@ -0,0 +1,40 @@ +name: sonarqube + +on: + workflow_run: + workflows: + - lint-code + types: + - completed + branches: + - develop + - main + + tags: + - '[0-9]+.[0-9]+.[0-9]+' + # https://semver.org/ proper release tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+' + # prerelease tags, more or less + - 'v[0-9]+.[0-9]+.[0-9]+-*' + +env: + SONAR_HOST_URL: '${{ secrets.SONAR_HOST_URL }}' + SONAR_LOGIN: '${{ secrets.SONAR_LOGIN }}' + +jobs: + sonar-scan: + runs-on: ubuntu-20.04 + + steps: + - name: Check out a copy of the repo + if: ${{ !env.ACT }} + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Install Task + uses: arduino/setup-task@v1 + + - name: Scan Sonar + if: ${{ !env.ACT }} + run: task sonar:scan diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..03784df --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,46 @@ +name: test + +on: + push: + branches: + - develop + - main + + pull_request: + branches: + - develop + - main + +env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + GITHUB_OWNER: ${{ secrets.GH_OWNER }} + GITHUB_ORGANIZATION: ${{ secrets.GH_OWNER }} + +jobs: + test: + name: test + strategy: + matrix: + go-version: [1.16.x] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: check out a copy of the repo + uses: actions/checkout@v2 + + - name: Install Task + uses: arduino/setup-task@v1 + + - name: install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + - name: install terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.4 + + - name: test + run: task go:test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c42a58 --- /dev/null +++ b/.gitignore @@ -0,0 +1,558 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python,node,go,zsh,sonar,java,maven,intellij+all,terraform,linux +# Edit at https://www.toptal.com/developers/gitignore?templates=python,node,go,zsh,sonar,java,maven,intellij+all,terraform,linux + +### Go ### +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### Node ### +# Logs +logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + + +### Sonar ### +#Sonar generated dir +/.sonar/ + +### Terraform ### +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive 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 +*.tfvars.json + +# 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 + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +### Zsh ### +# Zsh compiled script + zrecompile backup +*.zwc +*.zwc.old + +# Zsh completion-optimization dumpfile +*zcompdump* + +# Zsh zcalc history +.zcalc_history + +# A popular plugin manager's files +._zinit +.zinit_lstupd + +# zdharma/zshelldoc tool's files +zsdoc/data + +# robbyrussell/oh-my-zsh/plugins/per-directory-history plugin's files +# (when set-up to store the history in the local directory) +.directory_history + +# MichaelAquilina/zsh-autoswitch-virtualenv plugin's files +# (for Zsh plugins using Python) + +# Zunit tests' output +/tests/_output/* +!/tests/_output/.gitkeep + +# End of https://www.toptal.com/developers/gitignore/api/python,node,go,zsh,sonar,java,maven,intellij+all,terraform,linux +# custom git ignore files +bin +.scannerwork +.secrets +public +TMP_CHANGELOG.md +.task +.terraform.lock.hcl +*.lock.hcl +*.zip +.external_modules +vendor + diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..d9216d9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16.6.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..790bbe0 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,105 @@ +default_stages: + - commit +exclude: > + (?x)^( + ^(\/|)vendor\/(.*?)$| + .+\.node_modules\/.*$| + .+\.external_modules.*$| + .+\.terraform.*$| + .+\.venv.*$| + .+\.lock$| + )$ + +repos: + - repo: https://github.com/codespell-project/codespell + rev: v2.2.2 + hooks: + - id: codespell + args: [--ignore-words=.codespell-ignores] + exclude: > + (?x)^( + .+\.vendor\/.*$| + .+\.node_modules\/.*$| + .+\.lock$| + go.mod| + go.sum| + )$ + - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook + rev: v9.3.0 + hooks: + - id: commitlint + stages: [commit-msg] + additional_dependencies: ['@hadenlabs/commitlint-config'] + args: + - --config=.ci/linters/.commitlintrc.json + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: detect-private-key + files: ^(?!\.?git-crypt) + exclude: > + (?x)^( + .+\.gitleaks.toml$| + test/fixtures/keys/.*-test.*$ + )$ + - id: check-merge-conflict + - id: check-added-large-files + files: ^tf|-|\.(py|env|yml|yaml)$ + - id: check-case-conflict + - id: check-json + - id: check-xml + - id: check-yaml + args: + - --allow-multiple-documents + - id: check-byte-order-marker + - id: check-ast + - id: debug-statements + - id: check-docstring-first + - id: requirements-txt-fixer + - id: check-symlinks + - id: file-contents-sorter + - id: fix-encoding-pragma + - id: sort-simple-yaml + - repo: https://github.com/hadenlabs/pre-commit-hooks + rev: e50751c9323b0a03f27271c57513f5c389f6591b + hooks: + - id: do-not-commit + - id: markdown-link-check + args: + - --config=.ci/linters/markdown-link-config.json + exclude: > + (?x)^( + docs\/include\/terraform.md$| + .+\.tpl.md$| + )$ + + - id: shellcheck + exclude: > + (?x)^( + .+\.provision/git/hooks/prepare-commit-msg$| + .+\.tpl.sh$| + )$ + args: + - --exclude=SC1071,SC1073,SC2068 + - id: validate-toml + - id: no-go-testing + - id: golangci-lint + args: + - --fix + - --config=.ci/linters/.golangci.yml + + - id: terraform-tflint + args: + - '--config=.ci/linters/.tflint.hcl' + - id: terragrunt-fmt + - id: terraform-fmt + - id: terraform-tfsec + + - id: gitleaks + args: + - --path=. + - --repo-config-path=.ci/linters/.gitleaks.toml + - --verbose + - id: hadolint + args: + - --config=.ci/linters/.hadolint.yaml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6600f1c --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..37f0a02 --- /dev/null +++ b/Pipfile @@ -0,0 +1,28 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] +bridgecrew = "*" +bumpversion = "*" +doc8 = "*" +grip = "*" +isort = "*" +mkdocs = "*" +mkdocs-material = "*" +mypy = "*" +parso = "*" +pre-commit = "*" +pycodestyle = "*" +pydocstyle = "*" +pygments = "*" +pylint = "*" +pymdown-extensions = "*" +black = "*" + +[packages] + +[scripts] +test = "pytest" +update = "pre-commit autoupdate" diff --git a/README.md b/README.md new file mode 100644 index 0000000..b39c9a9 --- /dev/null +++ b/README.md @@ -0,0 +1,138 @@ + + +[![Latest Release](https://img.shields.io/github/release/hadenlabs/terraform-module-template)](https://github.com/hadenlabs/terraform-module-template/releases) [![Lint](https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/lint-code)](https://github.com/hadenlabs/terraform-module-template/actions?workflow=lint-code) [![CI](https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/ci)](https://github.com/hadenlabs/terraform-module-template/actions?workflow=ci) [![Test](https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/test)](https://github.com/hadenlabs/terraform-module-template/actions?workflow=test) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow)](https://conventionalcommits.org) [![KeepAChangelog](https://img.shields.io/badge/changelog-Keep%20a%20Changelog%20v1.0.0-orange)](https://keepachangelog.com) [![Terraform Version](https://img.shields.io/badge/terraform-1.x%20|%200.15%20|%200.14%20|%200.13%20|%200.12.20+-623CE4.svg?logo=terraform)](https://github.com/hashicorp/terraform/releases) + +# terraform-module-template + +terraform-module-template for project + +### Replace name project to New Project + +```bash + agr 'terraform-module-template' 'new-project' +``` + +## Requirements + +This is a list of plugins that need to be installed previously to enjoy all the goodies of this configuration: + +- [gomplate](https://github.com/hairyhenderson/gomplate) +- [terraform](https://github.com/hashicorp/terraform) +- [python](https://www.python.org) +- [taskfile](https://github.com/go-task/task) + +## Usage + +# How to use this project + +```hcl + module "main" { + source = "hadenlabs/terraform-module-template/aws" + version = "0.0.0" + } +``` + +Full working examples can be found in [examples](./examples) folder. + +## Examples + + + + + + + + +### common + +```hcl + module "main" { + source = "hadenlabs/terraform-module-template/aws" + version = "0.0.0" + } +``` + + + + +## Requirements + +| Name | Version | +| --------- | ----------------- | +| terraform | >= 0.12.20, < 2.0 | + +## Providers + +No providers. + +## Modules + +No modules. + +## Resources + +No resources. + +## Inputs + +No inputs. + +## Outputs + +No outputs. + + + + +## Help + +**Got a question?** + +File a GitHub [issue](https://github.com/hadenlabs/terraform-module-template/issues). + +## Contributing + +See [Contributing](./docs/contributing.md). + +## Module Versioning + +This Module follows the principles of [Semantic Versioning (SemVer)](https://semver.org/). + +Using the given version number of `MAJOR.MINOR.PATCH`, we apply the following constructs: + +1. Use the `MAJOR` version for incompatible changes. +1. Use the `MINOR` version when adding functionality in a backwards compatible manner. +1. Use the `PATCH` version when introducing backwards compatible bug fixes. + +### Backwards compatibility in `0.0.z` and `0.y.z` version + +- In the context of initial development, backwards compatibility in versions `0.0.z` is **not guaranteed** when `z` is increased. (Initial development) +- In the context of pre-release, backwards compatibility in versions `0.y.z` is **not guaranteed** when `y` is increased. (Pre-release) + +## Copyright + +Copyright © 2018-2022 [Hadenlabs](https://hadenlabs.com) + +## Trademarks + +All other trademarks referenced herein are the property of their respective owners. + +## License + +The code and styles are licensed under the LGPL-3.0 license [See project license.](LICENSE). + +## Don't forget to 🌟 Star 🌟 the repo if you like terraform-module-template + +[Your feedback is appreciated](https://github.com/hadenlabs/terraform-module-template/issues) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..acfeba2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ + + + + + + + + +# Security Policy + +## Reporting a Security Bug + +If you think you have discovered a security issue in any of the terraform-module-template projects, we'd love to hear from you. We will take all security bugs seriously and if confirmed upon investigation we will patch it within a reasonable amount of time and release a public security bulletin discussing the impact and credit the discoverer. + +There are two ways to report a security bug. The easiest is to email a description of the flaw and any related information (e.g. reproduction steps, version) to [security at terraform-module-template dot org](mailto:security@hadenlabs.com). diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..25ad333 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,139 @@ +version: '3' + +includes: + changelog: ./provision/task/changelog.yml + confluence: ./provision/task/confluence.yml + python: ./provision/task/python.yml + yarn: ./provision/task/yarn.yml + git: ./provision/task/git.yml + go: ./provision/task/go.yml + docs: ./provision/task/docs.yml + docker: ./provision/task/docker.yml + version: ./provision/task/version.yml + plantuml: ./provision/task/plantuml.yml + prettier: ./provision/task/prettier.yml + sonar: ./provision/task/sonar.yml + ssh: ./provision/task/ssh.yml + diagrams: ./provision/diagrams/Taskfile.yml + terraform: ./provision/task/terraform.yml + +env: + DOCKER: + sh: docker --version 2> /dev/null || echo "not exist" + PYTHON: + sh: python --version 2> /dev/null || echo "not exist" + GO: + sh: go version 2> /dev/null || echo "not exist" + NODE: + sh: node --version 2> /dev/null || echo "not exist" + APP_TAG: + sh: git describe --tags $(git rev-list --tags --max-count=1) 2> /dev/null || echo "0.0.0" + README_YAML: provision/generators/README.yaml + README_TEMPLATE: provision/templates/README.tpl.md + README_INCLUDES: file:// + +dotenv: + - .env + +vars: + PROJECT_NAME: terraform-module-template + GROUP_NAME: hadenlabs + ORGANIZATION: hadenlabs + REVIEWERS: luismayta + PYTHON_VERSION: 3.10.6 + NODE_VERSION: 16.6.1 + GIT_IGNORES: python,node,go,zsh,sonar,java,maven,intellij+all,terraform,linux + DOCKER_PLATFORMS: linux/amd64 + GOLANGCI_VERSION: 1.42.0 + README_FILE: README.md + GIT_IGNORES_CUSTOM: | + bin + .scannerwork + .secrets + public + TMP_CHANGELOG.md + .task + .terraform.lock.hcl + *.lock.hcl + *.zip + .external_modules + vendor + +tasks: + default: + deps: + - task: check + cmds: + - cmd: echo Application {{.PROJECT_NAME}} + silent: true + - task: version:default + - task: summary + - cmd: task -l + silent: true + + summary: + desc: 'Summary information' + cmds: + - echo Go available {{.GO}} + - echo Python available {{.PYTHON}} + - echo Docker available {{.DOCKER}} + - echo Node available {{.NODE}} + silent: true + + check: + desc: 'Check all dependencies' + deps: + - python:check + - changelog:check + - git:check + - docs:check + - yarn:check + - sonar:check + - go:check + + readme: + run: once + desc: Generate Readme + silent: true + cmds: + - task: terraform:docs:all + - >- + gomplate --file {{.README_TEMPLATE}} + --out {{.README_FILE}} + --datasource config={{.README_YAML}} + --datasource includes={{.README_INCLUDES}} + - task: prettier + + prettier: + run: once + desc: Execute prettier files + cmds: + - task: prettier:all + + upgrade: + run: once + desc: Execute upgrade packages + cmds: + - >- + pipenv run pre-commit autoupdate + + setup: + desc: Setup dependences of project + cmds: + - >- + [ -e ".env" ] || cp -rf .env.example .env + - task: python:setup + - task: python:precommit + - task: go:setup + - task: yarn:setup + - task: git:setup + + environment: + desc: Setup environment of project + cmds: + - task: python:environment + + test: + desc: test all + cmds: + - task: go:test diff --git a/config/app.go b/config/app.go new file mode 100644 index 0000000..2cd4fb4 --- /dev/null +++ b/config/app.go @@ -0,0 +1,6 @@ +package config + +// App struct field. +type App struct { + Version string +} diff --git a/config/app_test.go b/config/app_test.go new file mode 100644 index 0000000..3dd8bd4 --- /dev/null +++ b/config/app_test.go @@ -0,0 +1,12 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAppVersionNotNil(t *testing.T) { + conf := Initialize() + assert.NotEmpty(t, conf.App.Version) +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..081e47b --- /dev/null +++ b/config/config.go @@ -0,0 +1,61 @@ +package config + +import ( + env "github.com/caarlos0/env/v6" + log "github.com/sirupsen/logrus" + + "github.com/joho/godotenv" + + "github.com/hadenlabs/terraform-module-template/internal/errors" + "github.com/hadenlabs/terraform-module-template/internal/version" +) + +// Config struct field. +type Config struct { + App App + Log Log +} + +const ( + applicationName = "terraform-module-template" +) + +// ReadConfig read values and files for config. +func ReadConfig() (*Config, error) { + conf := New() + + tag := version.Short() + conf.App.Version = tag + + if err := godotenv.Load(); err != nil { + log.Debugf("unable to load .env file: %s %s", applicationName, err) + } + + if err := env.Parse(conf); err != nil { + panic(errors.Wrapf(err, errors.ErrorParseConfig, "not allowed parse env with %v", conf)) + } + + return conf, nil +} + +// Initialize new instance. +func Initialize() *Config { + conf, err := ReadConfig() + if err != nil { + panic(errors.Wrap(err, errors.ErrorReadConfig, "")) + } + return conf +} + +func Must() *Config { + conf, err := ReadConfig() + if err != nil { + panic(errors.Wrapf(err, errors.ErrorReadConfig, "config: %v", conf)) + } + return conf +} + +// New create config. +func New() *Config { + return &Config{} +} diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 0000000..1c90ae7 --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,16 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInitialize(t *testing.T) { + conf := Initialize() + assert.IsType(t, &Config{}, conf) +} + +func TestNewConfig(t *testing.T) { + assert.IsType(t, &Config{}, New()) +} diff --git a/config/interface.go b/config/interface.go new file mode 100644 index 0000000..b2205b6 --- /dev/null +++ b/config/interface.go @@ -0,0 +1,6 @@ +package config + +// Configurer methods for config. +type Configurer interface { + ReadConfig() (*Config, error) +} diff --git a/config/log.go b/config/log.go new file mode 100644 index 0000000..6c5d93c --- /dev/null +++ b/config/log.go @@ -0,0 +1,5 @@ +package config + +type Log struct { + Provider string `env:"LOG_PROVIDER" envDefault:"zap"` +} diff --git a/data.tf b/data.tf new file mode 100644 index 0000000..e69de29 diff --git a/docs/authors.md b/docs/authors.md new file mode 100644 index 0000000..3eae9c2 --- /dev/null +++ b/docs/authors.md @@ -0,0 +1,7 @@ +# Authors + +## Leads + +- Luis Mayta [@luismayta](https://github.com/luismayta) + +## Contributors (chronological) diff --git a/docs/code_of_conduct.md b/docs/code_of_conduct.md new file mode 100644 index 0000000..1a0ed30 --- /dev/null +++ b/docs/code_of_conduct.md @@ -0,0 +1,43 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others\' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project\'s leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.4, available at [http://contributor-covenant.org/version/1/4](http://contributor-covenant.org/version/1/4/) diff --git a/docs/commands.md b/docs/commands.md new file mode 100644 index 0000000..169345e --- /dev/null +++ b/docs/commands.md @@ -0,0 +1,139 @@ + + + + + + + + + +## Commands + +### Terragrunt + +| Field | Description | +| ------ | :-----------------------: | +| REGION | region of aws | +| STAGE | stage or name environment | + +```bash +task terragrunt:init REGION=us-east-1 STAGE=core +``` + +```bash +task terragrunt:apply REGION=us-east-1 STAGE=core +``` + +```bash +task terragrunt:plan REGION=us-east-1 STAGE=core +``` + +```bash +task terragrunt:destroy REGION=us-east-1 STAGE=core +``` + +#### Import + +| Field | Description | +| ------- | :-----------------------------: | +| REGION | region of aws | +| STAGE | stage or name environment | +| COMMAND | command for execute with import | + +```bash +task terragrunt:import REGION=us-east-1 STAGE=core COMMAND=module.repository_learn_go.github_repository.this learn-go +``` + +**example** + +```bash +task terragrunt:import REGION=us-east-1 STAGE=core COMMAND=module.repository_learn_go.github_repository.this learn-go +``` + +#### Module + +| Field | Description | +| ------ | :-----------------------: | +| REGION | region of aws | +| STAGE | stage or name environment | +| MODULE | module name to destroy | + +```bash +task terragrunt:module:destroy REGION=us-east-1 STAGE=core MODULE=repository_eslint_config +``` + +#### State + +| Field | Description | +| ------- | :----------------------------: | +| REGION | region of aws | +| STAGE | stage or name environment | +| COMMAND | command for execute with state | + +```bash +task terragrunt:state REGION=us-east-1 STAGE=core COMMAND=list +``` + +### Confluence + +#### Sync Markdown with confluence + +```{.bash} +task mark:sync +``` + +### Diagrams + +#### Publish diagrams + +```{.bash} +task diagrams:publish +``` + +### Changelog + +#### Generate Changelog Next Tag + +```{.bash} +task changelog:next APP_TAG={{tag name}} +``` + +#### Parameters + +| Name | Description | sample | Required | +| -------- | ------------- | ------ | :------: | +| tag name | Name next tag | 0.1.0 | yes | + +### Version + +#### Version Major + +```{.bash} +task version:major +``` + +#### Version Minor + +```{.bash} +task version:minor +``` + +#### Version Patch + +```{.bash} +task version:patch +``` + +### Docs + +#### build + +```{.bash} +task docs:build +``` + +#### server + +```{.bash} +task docs:serve +``` diff --git a/docs/components.md b/docs/components.md new file mode 100755 index 0000000..84aeb9a --- /dev/null +++ b/docs/components.md @@ -0,0 +1,10 @@ + + + + + + + + + +# Components diff --git a/docs/contribute/github-flow.md b/docs/contribute/github-flow.md new file mode 100644 index 0000000..370b274 --- /dev/null +++ b/docs/contribute/github-flow.md @@ -0,0 +1,81 @@ + + + + + + + + + + +To contribute to terraform-module-template project on [GitHub](https://github.com/hadenlabs/terraform-module-template), We use [GitHub Flow](https://githubflow.github.io/), it means that you should branch from the main repository and contribute back by making [pull request](https://github.com/hadenlabs/terraform-module-template/pulls). + +GitHub Flow is very lightweight (especially compared to GitFlow). This workflow uses only two kinds of branches: + +- Feature branch +- Main branch (previously called master) + +The _feature_ branches are used to develop new features as well as fixes. These branches are usually created out of main. + +Anything in the _main_ branch is deployable. The _main_ branch is expected to be deployed regularly and is considered stable. + +For more information see [GitHub Flow](https://githubflow.github.io/) + +## Getting started + +To follow the instructions in this guide and start contributing to terraform-module-template project on GitHub: + +1. **Fork** the repo on GitHub +2. **Clone** the project to your own machine + +To synchronize with the main repository, add it to the remotes: + +```bash +git remote add upstream https://github.com/hadenlabs/terraform-module-template.git +``` + +Now your **upstream** points to **hadenlabs/terraform-module-template**. + +## Branches + +### master or main + +The master branch contains production code and it stores the official release history. + +### Feature Branch + +Each new feature should reside in its own branch, which can be pushed to the central repository for backup/collaboration. But, instead of branching off of main, **feature branches** use develop as their parent branch. + +- When a feature is complete, it gets merged back into main. + +## Merge requirements + +### No merge conflicts + +Resolve any merge conflicts that may arise. If conflict occurs, a corresponding message will be displayed on the PR page on GitHub. + +To resolve a conflict, run the following commands. + +```bash +# checkout a branch you open PR from +git fetch upstream # assuming upstream is hadenlabs/terraform-module-template +git merge upstream/merge_branch # Where merge_branch is a branch you open merge request against. +# resolve merge requests +git add changed_files +git commit +git push +``` + +Github will automatically update your pull request. + +### Testing + +All merge requests are automatically tested using [Github Actions](https://github.com/hadenlabs/terraform-module-template/actions). In case some tests fail, fix the issues or describe why the fix cannot be done. + +### Review + +Every pull request is reviewed by the assigned team members as per standard [Pull Request](https://opensource.com/article/19/7/create-pull-request-github). Reviewers can comment on a PR, approve it, or request changes to it. A PR can be merged when it is approved by at least two assigned reviewers and has no pending requests for changes. + +## Code of Conduct + +Please have a look at our [Code of Conduct](../code_of_conduct.md) before you write an Issue or make a PR. diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..b29596a --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,96 @@ + + + + + + + + +# How To Contribute + +Contributions to terraform-module-template are welcome. + +Feel free to use all of the contribution options: + +- Contribute to terraform-module-template repositories on [GitHub](https://github.com/hadenlabs/terraform-module-template). See [Git flow](./contribute/github-flow.md). + +## Getting Started + +### Development + +In general, MRs are welcome. We follow the typical "fork-and-pull" [Git flow](./contribute/github-flow.md). + +1. **Fork** the repo on Github +2. **Clone** the project to your own machine +3. **Commit** changes to your own branch using [Git flow](./contribute/github-flow.md) +4. **Push** your work back up to your fork + +5. Submit a **Pull Request** so that we can review your changes + +**NOTE:** Be sure to rebase the latest changes from "upstream" before making a pull request! + +## Styleguides + +### Git Commit Messages + +Your commit messages should serve these 3 important purposes: + +- To speed up the reviewing process. +- To provide the least amount of necessary documentation +- To help the future maintainers. + +Follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0) to make `git log`{.interpreted-text role="command"} a little easier to follow. We use commitlint enforcing conventional commits (See more [here](https://github.com/conventional-changelog/commitlint)) + +**chore**: something just needs to happen, e.g. versioning + +**docs**: documentation pages in `docs/` or docstrings + +**feat**: new code in `./` + +**fix**: code improvement in `./` + +**refactor**: code movement in `./` + +**style**: aesthetic changes + +**test**: test case modifications in `test/` + +Examples commit messages: + +- chore: IN-698 implement model devices +- docs: IN-698 implement configuration settings +- feat: IN-698 create lambda function +- fix: IN-698 retry upload on failure +- refactor: IN-698 extract duplicate code +- style: IN-698 format files python +- test: IN-698 coverage around add permissions + +**Keep it short and simple!** + +### Branches + +See [Git flow](./contribute/github-flow.md). + +### Documentation + +Documentation is a part of the terraform-module-template code base. You can find the documentation files in the `doc/` subdirectory of the [main repository](https://github.com/hadenlabs/terraform-module-template). This means that the contribution process is the same for both the source code and documentation. + +### Testing + +See [Testing](./testing.md). + +### Code Submission + +1. See if a [Pull Request](https://github.com/hadenlabs/terraform-module-template/pulls) exists + - Add some comments or review the code to help it along + - Don\'t be afraid to comment when logic needs clarification +2. Create a Fork and open a [Pull Request](https://github.com/hadenlabs/terraform-module-template/pulls) if needed + +### Code Review + +- Anyone can review code +- Any [Pull Request](https://github.com/hadenlabs/terraform-module-template/pulls) should be closed or merged within a week + +### Code Acceptance + +Try to keep history as linear as possible using a [rebase] merge strategy. diff --git a/docs/diagrams/example.png b/docs/diagrams/example.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8b301086a3a11f1dcf59fcb974c746fd8081d4 GIT binary patch literal 14731 zcmch8bzIbMx9u2!qJkhHN(f4qbc1wvw}PbLDBYug(jd~^B~mgpLr5syAuZiQ3_ZYo zhTr?1bM8H#``7#3x)Lpe|2E>uY!>1o6GLI)Bcw;}> z$mAyY!jKGsU)p*Q9rDXX4D<~gBJmG&O|Ri(>9JXSq^Qv`Y=6xkEZgxsD2vnSj_Cq_ z`|D&CiJl#Y-kqo;>Iq6*yCPTDp9)p;s2)WKidr}2XO`8#y_{+o;Y#6jUlWh(g#Oz= zti3lURPidf!j#QrotQ7Bj%L|y)I!-Vk%ANGuL zi!6G`L{=99;g^w@64!Dw*_yuX6{b6bv-529cQ-S^vs*#lHeENh6@sPUxrxtDEhk91 zhB;#=m|5?A#UA;}t?|ZLav+>GR!t$x>8^#HGz&F{#8%|}uxDS-E<9B!e!2JVFVYdt zi#8%xeD(zT{-o{;_aRnbeF(lIK|OGEO6}sk;Ez(*TRsrTOTqvCot79){(aG??&Yrl zY{*N(VEKBL6hZD9DnX~fK|bgVi)n*bjlsm|QpUkGeYz< zaIjFP$V_vEZ`MmPX<%R=Iv3aBahL|@UlR9+^{;evMkk?-%4^qdV9QBM=U%;GS1haN zayMD5;slTn0*uS8Sa(SJjmU_Iq}F`SPe)4EC#%@)HRy=dv2?h^#4e*$ zMctPZtc;9|61ilT|fUVNohWT0nfM=nH&y`6yD?c~+A8sZ-ID22s_t5V=xRs9Y?Nqu`h3yDjI@VM5 zR&sK(u!soGy+_Yj?~@q_UaqOaCMw>`%Jvkou@8x^LE@v# zRD@kNANIr)7Z=ym)KF4V-uON>J?-e=Ff}!mAIMaixWC+!r5qfxwzl@_)hj#+BO>~# z@o_x`9Bk~1qsB{RWn~Huvzr#}t*vUy`RZ8=a5cOfM!X>VtjtUo^hRNWwY>RA8E4|IGkHSx5UKQP>N0|z7%%pWAMc1@Q+ornAh>UvWeM?L%xZD z9~NB<$^^Q9BtHtUDAW7!p6T_+tWQDN88mb6j>I`$gD5G980!=n#8_&O zywoW%p&%udy>0M(z%bKLi(JD$xuaoW;)iOkx zQRnof2+7)jYx&OlDS30#F1EqvTySf+`4o@5(7f~w!5g;ahnu>sk0&mEtW4LrQuy;p z=~wKp^l2uh^6~5G2AB~*^g7Oqd$mXh)xR+zjo)~nEq1$oYK;6z4D+(xGfgTZ2lD&FYEa=jU4 zF$rT`8=se<>22$bF>U#LkHSgkrI{fD-drqg_MrV`BaOYJ3d`Q^ZU*Y}y~hlRgPJ$X zD8^Yw30fu9ixz#pd?|gK!&Ko0-g&cJSn_tt`*`d8tk^&ey-4 z3t{L5DmWPlNv=IJ;r_w8-rW!k0*KJhAUxw@N%4L#$;dGt3Gs7oWB}HN5xs}yQd)Q-HSy{!j zLv9sAlq+i@AC%IwB9@PPyhLsyPL5@w%v?5vg!LFk5h!hDFrgLBBrKfVt~nD-NI*c~ zL=3l=HWO70i5>xUDw7lq;BoVzFBJq5kM}?R-SoY~JBE>!@@V`Lt$|c#dpwA6&El`} z#>UIjgN>7A02(*0U-#b|EVOnUlC1oiNLs}ASj21P)4I5!zVN!L=!p~yz^SMifk=M6 z7*@kd%brAPYHA#ON}>?|;E067cM2mrkU8p(h!qjfL%7Y*XQ)P^!$0q*IbiT!V?SWC zD4W>UZKBicq4jj_0mv$M^_AWf`@4kSx#{WY85wO(QELE`E>HSkiwZd(4jJGAkex*h z;Z#3g-%7hb5pwD=LiJNE1o&K(^c>6H_;@>D2nMP0Xz zV%_%^J4_HB+65Xp4ojV2N%bBFOkH`Du`K$7-}TECVwfuICl7x|K0OkuwVJH7Z)j-f z?d=8lY+PxV&^8fl?tJ&u6mA_E7Z;b6l~qYRmM-r1fL=vy9(}T}wg23&8H_5i%_yp<_?F{s(UW;X-?uVXYJ6WN1VL73b?fy-q>}jkPmm zV;|DIUJgk#fCzVyI&rdg`Y=y2GUxul20wtF!9bIqgM)))viBJzS|ZpzICnFg zLP%r&6RFAE5TA4jz>92yfgyB96n(ju4V$Klmu8;I)^Nel+E5<5Nj<;Qs#@%ydiQ;Q ze}9kxJR&0JJ$$p|{O_KCWAi|*Mt=P&u`eejC3SYVg>-dN4SU3c0pOSzXY}#zm?!yb|gN*t6_pb)Ny1M$cYu7qDI&5rgyiZYNLM|*_ zq&9t_{1DqS)R5}R%8KE4cKm++gWe!1rW{Y{k#E{LGzd*15|Ys(!>T(v#&s^lM+_#K zh-Iu)zR1IOdS(FXz(a<0F05U{LQ(DX*C3Qa2a<4C>K_j~yUiNMl~$#tVzPqE za;v^Q8iWo25Hs}v%gO%!{_W{HO~Gf+76H4cu%?shjcpET{TLLA|Ala@#I#CJSHi4T z;uCKD^+r9}2+9$Y?{vzErOvE1PHSJQs`wN`;8rq%>*?uFg8MhdN?>a_aqt|EYz zi>_F05{`MsOd)D%{n*?aM3{X>I<1BECCPd6N5^wn;T4?#?$cGcmLk7Y26?fT;S)Hx z|K0IXrX>#!I#rc`d$EEG< znbKF1!5S=@-)#ED3`=&DQ%MH0l{8sd=kfy{^S#w7(D>w=5D|gDWT?fJ#hMg)b-N5M zg-V(~kImGz*vyv}7Z+Do(SF@ypdCpVCK6`_<&BS+O(sR>oz3k%lxZ8IWFIs z&WPow!MH5SA(TtP5?s|TOR^#?CiU^D-m?f#K2}y`p)m$NY3|v!U%xy(Jbox2`ruoc zUurNDuv%Mo#}9y#h+#Jxi8>#@2fEVmR9WnJ+!*?br{;dElbe?C!2|uo;zXCFvFi5= z(a}V)qmmm3Ac^;TK+)o{9S+QK7gH|Mn^VVARb)yL_4epX6~V;d>(V{*+cG6Jdq(m$ z_POzL%E~!Idw&C{_G~MYwVokx=up;Z|VPr%u5}AhvKw`7CtIl0$d(>0H6)v^qkutzLW zB=^1AtH!4qhZVRz4>vnwnEMiWLI%04db6GE>{yuRQ{;N=$uPOsc|(iRms2^2)YK~y zu_D`Sc!q7Sq;%I<`H_Ig`#*rb8S}@odms@<9BehxelIcNX+u` z@?c_w_o9Ee7R!&-G@9B6dq?P1$iZR$n2~#NHk?;ep}&}MZs50m?o5K#A-Ji4ZAmQ; z)Zkryv({Vq%nCcYBi8a`mG+YWi3f0Bc6_Dn{N<&h(%TyJ08w9WO_?SJ6YZL+e*aXN zW~no#P%{q?i+IZ@YwGprcm1JE={tZYnVQb}``?TO)MjaYy>nx79PHX@eVDP+s*uXy zNKKHDF^G8gRKw8_yM*s~&#jjR7L! zkY|Q``1xZ}pAZ6hf&V|i7kVYJ8owS-^9Oh?`hNXm9Le~rp!+7|!=Ma@@;(_*2nc{q zjEsy9VV=PjvCy&N>HR)2b_){4KItc0RZXuLm>IaPLDErbN<&`TDyph!0*;mecodW@ zjmW=NCxHB3GzSx!U9=n-abvWgWqN#WTg@3jX;62gtDV*~UcQ{8x;&OWRkShT;^Z7` zYs+z5>5XGIT`q#BdLRB_Z$xu4Gb?t^0wj9z0>Tp!5kb0NAs$G;1!{lG&!6=Ogoua; zDAxLx;0rl}Fg7+mN27gCmPpGQSm9?C4-X4M9W`?IhOa@I%wKc6=H=vk3J9orGZsF0 zetPg2WOCSJKAF&m1C214i6gj|Xn7dU-G@z{{h8w=fq|15Ckr zeVD_%{np6RaYlEx&c(&W@MG!d{(iMsfwxoDA8+7TzJ9HywLMu?qG$RiPl^nUJDC?< zAnXi*>^v-3dD}ZZeZG>A9&Io8B!%$U-)0)_D>MJqN%R*$Ql_J8e( z__^!;5!(91;R5X*V!8B-)5c<9X{pW7#(t{041^B&f+7w^6S%DOmV=3z-Qu5NSVoCy zrJa6opjT9+FD}+VYpWDTz;K~%L_3ScgvtcgB=@SOfC{6g`#JGk)`l`jc#{=+3AXt>Yv-9X` zV2k;Q#wZ^o8(TVr2?RORm7O-}!Rz7IFEi;7+pV&L@O`Fvvk{a&?Lr-UkT_&yWRH36(oug~0+tlO0##Y0ckbN2ogn1OHk%A8 zkLl&9Zmi3@cY6P3(@#slQ#-HKZ;DY-rGXURRaO`)GK|Y%JjTMoF|B_0F%I~6!taTi zO8_f!-JbfJ6kV)WMx&^?BjkC=!VZ4uM#$)!w%f@rCYDADTsq+(qGlxQ@(7l5gqDzy z&`b2C>cas~Nih2U0eSdMyRZ__%+S!#<6}1kDq*)T#MH;vARj2yaLPf*^Sl}T4k8}q z3icvQ)r=1`8N`?D|BEKWD8KNc=Dxp_HFH50Fxi_B2rtvr@Z~KDtO)sJqb$7`r%MP# z4VU=sI_ze~Ji(>}D$o_|Ea#)ydS6e^y*qdI4-XGfD3B5)A=zq?(b2<2hI~M!_NEBs zWoMUm11cZOYN%m3l&cJY^zD~|>`)mXyucw-(=PX=U3M~;lqxOF6u74dI_D}S?9GR; zt0Zy1FXHr!E#*A>sq*k zfS<>)8ROo&M+}xR0B91BYO^4u&7NUBj@1XI+r7uU0N++t2eN=@#7e8IT|K2xPB~`e?G1}AW_Aa|3 z;J#|U63|b$#6D11iQH87Ag4tqKLBGv!9mlqTOi^-(+u`^vU6~#_f{|&R&IhjI-x6C z0bECtUjiW=I zL4pwgp|PP70uabJwRCn+Xz1O$cZC5V1m+{1N-_fpsCBCWR6cV_Acv=Go!`jFv>)#- zxM#1;AkM&>TWGh0#DDu(Q%DEM?cpA>Cp_`94`a*Aj-Ar!!?$u z$Z!U3Zm03mS3sk|TfMd_#{7Zv`cjN2l8&C<>Zkv0c=6uO&hha=L|Z0UnJy3uI5EIH z0=`{}jzd{lnJ^a{Td{Nq3Aim_Z%x!V=85Ni^~1K%czyvQl418`CCznfB4$KuJB7Bj zk%fSga(jM$5X4hg9DBKvj9?}ZWB35|e=@Pc!o*^50SK{4@05!PR|0g9WTeNi3%WcCEPiN+J%?Sa{;>t5o~5-fpz0kk?AHb`3E;A zTIEMdAI&`;C%!f9w>UEFcF?Be;A6r$xtmJ#U_Z;!%3*?YQK0V`}ga4(B1F}P+{v_k$af{Z642t zg(wEOyuE|CM&x!F%tAwB)*a6=0oRB;GF<%pb$%U3A$p!>fNK>vM`~uk5@>F2X4wb7 z2-dX+GHquk{igj7^mXJmCZXTY-=ytL6GN`9x&d;dKu<@3lEo6mK6+RsV&FQVvG57$RRIDv0JRc@skd~d?L zj6C-Fc!^6l;Zg(3XeB6NInJ!CU7zu(RK`9nJ>CqVZB^cimo~GMk@*}F5)uu4&b#&A z<|t>nK#vIz+{qVhuCn;f`LhcZeJC_${$Q-yy zfLBB(R|^vnzfT#J%}_?VY})Xbj-H+rZW|2%_4&m2k}Mt>VJ#RpwP+eWt7UfD9FHVq zuiv@exG`k0F_@$HjaZ~5McAFQYpf3T?x{?uUg^tgvjctbv!B zkgF|G!~-QKFQ4&6QWYDdVc%Y!Qi6nJj$YU2Z)4P0a*1qW=P1oYj#;mL<=D3)--rue zzN<(1fB5u{keHbG{{1h2P{ziN=BcIuKKsK<{o@T1S?dL#JLE7BBo7D)ea;WYP$(xR z3gAOQe-jSoHv7bwlaOtO7~hfz+Sz#*3oT`j{lXig`{l2+-BO-N4z{@_W!%g|xIlFJ z#szSQ%C&`he*cP~sU++oV(-%J8f zPLpQd%e1+G#WyiMBuD-!x6%jAra}LrHyt3rfEaQo(4G6xMlex5d;J%CX23mGGJONV z$6iA(8#_5RA`jcnggsCU$f1{}EY$W)B~KRK;ft{6){*qE2wye_H%7MS3bP?NtR3}e z7#ITSwt*Gah#FL!&=5fpiSqIuf@&@tFwanQdpuc%`8P4Mj-DN5ww$nx2f8;5|46j+_2f?Kuhy`1b5yF`!ZnvUci2x_IK1vH+{xAFL(7;*a3 z#cynJPRubqL|&&%ou?s4lv)i1G7@-InPI7kW!$vZQ8@?OROBLCnRk@>N`Y|-(n&mu zXnGRZs0^k6AOc&J5Q$!zkG^eD1l#y65YMJ%1t^m-1AiH~_NQGT)z@)YmM5!Cm*U${ zpwI!HzLqScH*l*WrcK%J{D;3o6vuenkG`MViZz-tC4noCL$`eF&%J@+9orahS=Nwg zQfwp;Yspjfc3NTM8{k$y#vUG=MsChFrs+@uZx`^KY^wm4sAUwO2SeImd1a{8mngw8 zq4w(PY7lK2N;$+adTETC+RuLvKaO|NtdU*%bN^s{WTT6{aTuJ);@OB0*ThG%6~!d8 z22NI<*R2nVyMb3D{)qDHc0qLSj~OnaS_7hPy~I={#*%v?jHw*vGGoQYtfN&l49bNs zbg~h344!HxK8QNHFjfwZ$egv4bj)cW7GgZI+?i-;rMm~1-Zhyugq>-J>nmxtw1tok zJ!l6=o|}`i>vb4QtvkM;ovMWJR`)f%wO-#8lQ!cm|EOF}fHLIXia4@5+k2q=Km4!V zKC(SJ<)U%T2Z)Q9e0eXg`n){)N%UG?8t4|3zZokA{n0Y=$2bM9p%g+cMsVu^pkpy@ z+EFW1vG0t^JK z4FZnwUCz^0{V=^At)bi?U^AGFF}@lfyz~q(GeElK%mAw;|B=Y`HSr&=NE5*uW{jF3 zdAuGU6_S_7=gRx19?#Y|2E-y!uM<{u3w6T!NX^b^HsgjSNokKirRRyF&+j6<*QVpL zIYOcr%EsSOqQVs?#ypV-U{K4dW~}N9oab=EtW;{=ATDS@?Zd$%PZzbREm6mCu=)eP~B-{=hz#%TKL=-SJ4B^()pWn$KnO3)kpJ+l~P6#FKU8D;?uI~dyL*!`6 zae})rYx4?%%6#FB_wjJ&$J6}Kghl0hqdK(6%&ZC8WqVdExOo2Mbza5L^+?2n+xWVD;)uG7wU=cp?qDwWON3DN zxKY9=9n0w1Ag}_~PBlK{xd&NHI1r--cfP!1x~6a^@qwhIsvIPxZ~RZ{tEYHNj8jcC*~4Iy!vZ*dNjAs_!YsEYfUNkBxC5bk^37KSGHpeS(eADft(34$gxlERuh<9HiWKUv zHsZbju>?c!{&HZ0L_chMD)!{b9B7FwCE2;WyT6kOnj5-B1^@{Q?YQXa19(e-C0G?F&-6;-3Dzf4RFaPbdYH7HaiXA{uz+%C~s{( z$&}?3k+nPsxJ&lKtPMBhAgtK@S9lpN%BUKY5ElEc=x@4tE?W}-%0W~-P)y>s`8lde zvVr=$wZ$6CIe}-RVSd$=b97AYBkZIIiYB%bc+G(T%!-%ZWn+|;n;Q=N(`Y>4-j7Ww z$;e={9_S@{@MA2cA4@wmW{ny&@4vwFm+m}KNhsj+nV_H=8OV}7kf9x{i(_Jsm76Rr zmDHX|i9Q?I@b6!*1YzOz0HTm+#+wmCCBk`<>*DgI{&c+%NYcK(KIl|6N6`(2fLKmc za$JmtFR%VYETeWwFUWv3#>%=nPtb*AbSPCyeAB51d;p9QFnh*|9N18s;GX&Sc!Cu7njDF3Atgq}3_i{tr_bviek^ui z*_AI+ z4h#bPazKqf;4bPX>KjCP>Ho=iPmx#+v=K1Y|IjJV1NYwyi}mpEVIH3$8B$L1Te|CS zv#LQk6OXkVGA_$fSC8vAZZKjwr)L;@o(7 z;aPdIU5DIr{c8RGJ_$+t9#9@s1O(z;DZpw0tx}5s4`*LLKYVij7pfgLiC{_zyDKy( zD1%}^N}lTgOoJ3$oQH2`d}2wHXHCrNr%Z8>rLn+5NRqhHhrI?)JMc+TdESuZSoJ2$ zuYuVo9jPG;Bcmyh6o~(J!}D29T7TlH%>{4WyDD z-Bx67DDc$O&Vi69F|6A5kv)=eBapP_Eo+**TQ#mZlmQUX&(iGqV{BgS$pF^C(A(j_*-y%SSN*`G%nsP@N5?A-Y9 z^|L-U7&VloKu0&Ot2x-ga-p6*gDt>NO?M(!v3ckh7=hCWS}wG*9J@BKk&n^;b#le4 zwAMFlpRvT!+*|RLZE)~t=idE$6~SeN^V$>G?Z2XeX9Y18F8&z2_m`-ssOV^J?^7pT z-LXsbirCScLLwK@3Pi&ekF@j~?RtflhtUd?O|83gRd|qee+D|yr4qq+$i_<_FzKbp z+?X>X-t=wF`&_J~=|Ly*C#isS1JV?EgxgA&Y+_+wRnMx*&{%&7AYStG-3-aB%HbO& zCA7r5)IkYgSP9JG&CJZCrlz8Z{4ECcx2Eg(L{@hGabor8c#MFb8&(OXF+i8iGU4{^ z+hCWkt)M4+OV~ZqUUyN+pGl4|lOZE9+Nrg`wRwc*{nV@~6WFLMZiVqpobW*L6@$(Q z?CTg?=0n=>Tl~QLvU8UCe$axtj*bg6 zuT%fYo=>ng2#C6u(nD~kIU0+|XaV31!(cGMG~f)+UxtCPMSekZ&@3PdJ3ZX$;w+#} zvG2@gkjRU((0DRc`szkoe3op)XMg{P+@xh3YLd0vAQdbUI++VaoZB0fU+qK@%tJLn z1NKvjmyWV9{c*b@gn>GkOdqLB@i6$6*2kQKh8z=t0j@zPk=*Si*S{g;TC+zbXvFnM zeo6}qiz=2h`e@S`)jOiWLtupCA$j!=xlX(O^lMbuvR&*X^s5CoE;Ctdf9q7uABhhA z$#OmcGPPT`m?UMHX5AK~J$!i*w8i_hO!T)3xGwB*5$t%*ZaY?7A9+`Ut)+L*i)X= z^?@7Zw#0GfoWl2peBN_y%>&5L$mKkKZ&+!UVcj~|xlCi5nwY3icd^rg@18poGm8vkb?jJJW44tVOR-FA_a&&Mx z;lEe6BaJ6GdjuUon|zczdjrw1K)kJZ8qLc%co$gAvHHWYsoW3i#Vb4xY}bu8)mk|* z=%^I0R_9`mkB@&r0K*l7hk%~b;Cv|TvnDyd>JZmmmqUXJ+X~EhVSydnd=Hqm8V4hC zM>C#%nJ^31L`|!mNg{ngaH)7Rdvo-bD}8BwihTiv$Mt}Pi^Jo)fL(-618NTUOfPhp`tquqZCOTRRT@Td$(>qh3N^8H_V81vYrG_%wjYczbbDJf49hsdQ z5Qt|wSlZwZAM~zl0p~w^$L#Mp#sBTQ-&~a={ndj{F^@33&%>kmbD^A^Z1{yMNbJ1c zDhm9~zesFQx!3zX=DFx}MN)QF3IT!K&$HxJE0&Fd@tNsHl1p)pc`yT>i_^rzDqdmL z+Y`}m^2r4poL(RYc)F^xCV#_}(v7=#w#C6JKM+R7#8hzZWko!4(O;bipEau&D!Fy` zgo{hF*jp9!@>F*R3Ydiq8{YhaGG5-z?gj(yHHRWZEA96pb}q6^odZ@*daAb5R(dXe zeobQ^!|eRSd|X=N`+>n#9dWbq2T-kSZ(?pfKG#{-v}CesvD-C$i+&HZKbJQ z+C4c`M{tQ+Qr+(0x|ttE)aB@45>YML#r}kix3us2Smi`K{mgQ;NY&1zOtOlCSrOi) zCu>_}J*z`g9qcT1)VHr(SDf9XddDycjqW31v;VV5Y~K|17PD99zhGqc_zC8w(%q8B zVb*^)pcf<~+!-qM-UjDbl#k5oh5D$-YTw9TCM)-K3~YZaJ$j+iDRv{SwSMT})8$aR zfL{`HT1>O_wWKs=YXQ=V9ESxY_W7DK3>O1o(DqZ_OPh(b#dxcCXAN9M1S@#<7tx-~ z_FuRfu(0aOph(fHtE>gRpshRu%IX@CQpN^yCbnxfh~u`jGWP)ah}Cg zx>cyjb?s?F%VQVM+E2W{$!6C@rVB^nRj>AaU&6#at4Xy2?XtiuW-qa#v#KlJ_(m75 zD_$s2X-~$_znBHR3S~OV7BMKF_2_Z?wTV@WGi8I5-N&B9sQIzJiQ`lHx?Npyd$04T z>3Sp6Tbo>ehf?w|(2x!xLQl~n?Vi6k?rRJUV_bcZy0nC@`lSM|r)pdBCj7IlgL z&G6^lSvF>FC$x}>W8v+dL5<}lw`5cm8(=xV2I%xUfjF&;bXyOsWm6ASP{*(0|l z!Q%3JxBOPneC$a{DJdyn8rjwc$Nr1vj3}&XgEY-MH7Ut+{WW157v?o^sK8U8*b_Iv zRFx)VbaP4Hp1GuM+Uj}llsc>F05;bolJwiY(pF0eMb_D6R?r-bKt^a^;7Q^a>3Q>CE}*ZppsHH!3ThTCGzY)M^;0Qh076BRjz49 z+B+kI78>K`X|@6mi}^;{S5<2&DoxC_=cw=VFXD%2-e)Gph@);p?-{KI+*6-`M!VqI z_@pG}qs#Q~-@kKpox3egKF>QUW}Rh(&|jXR4p@Y|82Rg7x9MbA}+{eSO<-Do&{vOL(P=pd^D#D!M&z2G;Ep@F6X zrf6jYb#RHcIroBZctr3XYu!1JDY`4VZi9hPhzLCY)U4(3BJCN`L-b&|!-Gm_+~jOI z2#@jcaZnD`B~D)iH`j)(YZfZ+J_hX`rVBs+w$c&sU&pwB2=39r-o?ih>d<~B+vQ+Z za~(=1hn=hsaM1Om0v_l5r#l{L=;71(^1eocT079v=}EDU4nL|-dUO1!&dfEUdw~f82|2`0*I<~~_ZiRj!#Q1C zOw7N?*b;S%*7|6U0wOQ1B2_H$()WJ>)5q?? literal 0 HcmV?d00001 diff --git a/docs/diagrams/logo.png b/docs/diagrams/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8b301086a3a11f1dcf59fcb974c746fd8081d4 GIT binary patch literal 14731 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 literal 0 HcmV?d00001 diff --git a/docs/disclaimer.md b/docs/disclaimer.md new file mode 100644 index 0000000..0b55c17 --- /dev/null +++ b/docs/disclaimer.md @@ -0,0 +1 @@ +**NOTE**: this document is generated [mark](https://github.com/kovetskiy/mark), do not edit manually. diff --git a/docs/env-vars.md b/docs/env-vars.md new file mode 100644 index 0000000..7a0e8ff --- /dev/null +++ b/docs/env-vars.md @@ -0,0 +1,12 @@ + + + + + + + + + +--- + +## Env Vars diff --git a/docs/examples/common.md b/docs/examples/common.md new file mode 100644 index 0000000..67b8050 --- /dev/null +++ b/docs/examples/common.md @@ -0,0 +1,15 @@ + + + + + + + +### common + +```hcl + module "main" { + source = "hadenlabs/terraform-module-template/aws" + version = "0.0.0" + } +``` diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..cdf5dd6 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1 @@ +# Faq diff --git a/docs/include/targets.md b/docs/include/targets.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/include/terraform.md b/docs/include/terraform.md new file mode 100644 index 0000000..543d5c6 --- /dev/null +++ b/docs/include/terraform.md @@ -0,0 +1,29 @@ + + +## Requirements + +| Name | Version | +|------|---------| +| terraform | >= 0.12.20, < 2.0 | + +## Providers + +No providers. + +## Modules + +No modules. + +## Resources + +No resources. + +## Inputs + +No inputs. + +## Outputs + +No outputs. + + \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..ce51261 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +# Welcome to terraform-module-template documentation diff --git a/docs/releasing.md b/docs/releasing.md new file mode 100644 index 0000000..1896d3d --- /dev/null +++ b/docs/releasing.md @@ -0,0 +1,52 @@ + + + + + + + + + +# Releasing + +## Bump a new version + +Make a new version of terraform-module-template in the following steps: + +### Generate version major + +```bash +task version:major +``` + +### Generate version minor + +```bash +task version:minor +``` + +### Generate version patch + +```bash +task version:patch +``` + +## Generate Changelog + +### Generate Changelog Next Tag + +```bash +task changelog:next APP_TAG={{tag}} +``` + +#### Parameters + +| Name | Description | sample | Required | +| -------- | ------------- | ------ | :------: | +| tag name | Name next tag | 0.1.0 | yes | + +### Generate Changelog Tag Now + +```bash +task changelog:tag +``` diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..4d4f612 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + +# Roadmap 2021 + +The Roadmap is a list of all the things we're working on for the year. + +You can see the corresponding projects on [terraform-module-template](https://github.com/hadenlabs/terraform-module-template) + +## Legend + +- :todo: : To Do +- :done: : done +- :wip: : work in progress +- :feedback: : actively looking for feedback + +## Epics + +### Agosto 2021 + +### September 2021 + +### October 2021 + +### November 2021 + +### December 2021 + +## Long Lived Initiatives + +These projects don't have an end date. They are something we'll continuously work towards. + +- [Better Docs](https://hadenlabs.atlassian.net/wiki) diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 0000000..0710763 --- /dev/null +++ b/docs/support.md @@ -0,0 +1 @@ +# Support & Contact diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 0000000..fa42a33 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,11 @@ +# Testing + +## Running all tests + +```bash +task test +``` + +## Running tests + +## Running tests Syntax diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..33a95cf --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,11 @@ +# Troubleshooting + +## Environment + +### Wrong pre-commit with pipenv + +Execute the next: + +```{.bash} +task environment +``` diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..fc2844c --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,10 @@ +# How to use this project + +```hcl + module "main" { + source = "hadenlabs/terraform-module-template/aws" + version = "0.0.0" + } +``` + +Full working examples can be found in [examples](./examples) folder. diff --git a/examples/basic/docs/include/terraform.md b/examples/basic/docs/include/terraform.md new file mode 100644 index 0000000..2c6ae82 --- /dev/null +++ b/examples/basic/docs/include/terraform.md @@ -0,0 +1,29 @@ + +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | >= 0.13 | + +## Providers + +No providers. + +## Modules + +| Name | Source | Version | +|------|--------|---------| +| [main](#module\_main) | ../.. | n/a | + +## Resources + +No resources. + +## Inputs + +No inputs. + +## Outputs + +No outputs. + \ No newline at end of file diff --git a/examples/basic/main.tf b/examples/basic/main.tf new file mode 100644 index 0000000..4364760 --- /dev/null +++ b/examples/basic/main.tf @@ -0,0 +1,3 @@ +module "main" { + source = "../.." +} diff --git a/examples/basic/outputs.tf b/examples/basic/outputs.tf new file mode 100644 index 0000000..e69de29 diff --git a/examples/basic/variables.tf b/examples/basic/variables.tf new file mode 100644 index 0000000..e69de29 diff --git a/examples/basic/versions.tf b/examples/basic/versions.tf new file mode 100644 index 0000000..34653f9 --- /dev/null +++ b/examples/basic/versions.tf @@ -0,0 +1,6 @@ +terraform { + required_version = ">= 0.13" + + required_providers { + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8b40a71 --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module github.com/hadenlabs/terraform-module-template + +go 1.16 + +require ( + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d + github.com/bxcodec/faker/v3 v3.6.0 + github.com/caarlos0/env/v6 v6.7.1 + github.com/go-playground/validator/v10 v10.9.0 + github.com/joho/godotenv v1.4.0 + github.com/lithammer/shortuuid/v3 v3.0.7 + github.com/pkg/errors v0.9.1 + github.com/sirupsen/logrus v1.8.1 + github.com/stretchr/testify v1.7.0 + go.uber.org/zap v1.19.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..6da5ad3 --- /dev/null +++ b/go.sum @@ -0,0 +1,108 @@ +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bxcodec/faker/v3 v3.6.0 h1:Meuh+M6pQJsQJwxVALq6H5wpDzkZ4pStV9pmH7gbKKs= +github.com/bxcodec/faker/v3 v3.6.0/go.mod h1:gF31YgnMSMKgkvl+fyEo1xuSMbEuieyqfeslGYFjneM= +github.com/caarlos0/env/v6 v6.7.1 h1:2r2GyonA8aJX6lDEhwFfpxwAX8Z3mvbE1X6vhaSzEyU= +github.com/caarlos0/env/v6 v6.7.1/go.mod h1:FE0jGiAnQqtv2TenJ4KTa8+/T2Ss8kdS5s1VEjasoN0= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A= +github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8= +github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/app/external/faker/main.go b/internal/app/external/faker/main.go new file mode 100644 index 0000000..1ae5ca7 --- /dev/null +++ b/internal/app/external/faker/main.go @@ -0,0 +1,13 @@ +package faker + +import ( + "reflect" + + fakerTag "github.com/bxcodec/faker/v3" +) + +func Generator() { + _ = fakerTag.AddProvider("userNameFaker", func(v reflect.Value) (interface{}, error) { + return User().Name(), nil + }) +} diff --git a/internal/app/external/faker/user.go b/internal/app/external/faker/user.go new file mode 100644 index 0000000..53426c0 --- /dev/null +++ b/internal/app/external/faker/user.go @@ -0,0 +1,55 @@ +package faker + +import ( + "crypto/rand" + "fmt" + "math/big" + + "github.com/lithammer/shortuuid/v3" + + "github.com/hadenlabs/terraform-module-template/internal/errors" +) + +type FakeUser interface { + Name() string // username fake + FirstName() string // FirstName User + Path() string // Path of User +} + +type fakeUser struct{} + +func User() FakeUser { + return fakeUser{} +} + +var ( + names = []string{"user1", "user2"} + firstNames = []string{"luis", "juan"} + paths = []string{"/systems/", "/users/"} +) + +func (n fakeUser) Name() string { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(names)))) + if err != nil { + panic(errors.New(errors.ErrorUnknown, err.Error())) + } + nameuuid := fmt.Sprintf("%s-%s", names[num.Int64()], shortuuid.New()) + return nameuuid +} + +func (n fakeUser) FirstName() string { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(firstNames)))) + if err != nil { + panic(errors.New(errors.ErrorUnknown, err.Error())) + } + + return firstNames[num.Int64()] +} + +func (n fakeUser) Path() string { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(paths)))) + if err != nil { + panic(errors.New(errors.ErrorUnknown, err.Error())) + } + return paths[num.Int64()] +} diff --git a/internal/app/external/faker/user_test.go b/internal/app/external/faker/user_test.go new file mode 100644 index 0000000..e87b91b --- /dev/null +++ b/internal/app/external/faker/user_test.go @@ -0,0 +1,23 @@ +package faker + +import ( + "testing" + + "strings" + + "github.com/stretchr/testify/assert" +) + +func TestFakeUserName(t *testing.T) { + name := User().Name() + namePrefix := strings.Split(name, "-")[0] + assert.Contains(t, names, namePrefix, namePrefix) +} + +func TestFakeUserFirstName(t *testing.T) { + assert.Contains(t, firstNames, User().FirstName()) +} + +func TestFakeUserPath(t *testing.T) { + assert.Contains(t, paths, User().Path()) +} diff --git a/internal/common/log/interface.go b/internal/common/log/interface.go new file mode 100644 index 0000000..1309c87 --- /dev/null +++ b/internal/common/log/interface.go @@ -0,0 +1,56 @@ +package log + +import ( + "context" +) + +// Logger is the fundamental interface for all log operations. +type Logger interface { + // Trace logs a trace event. + Trace(msg string, fields ...map[string]interface{}) + + // Debug logs a debug event. + Debug(msg string, fields ...map[string]interface{}) + + // Info logs an info event. + Info(msg string, fields ...map[string]interface{}) + + // Warn logs a warning event. + Warn(msg string, fields ...map[string]interface{}) + + // Error logs an error event. + Error(msg string, fields ...map[string]interface{}) + + // TraceContext logs a trace event with a context. + TraceContext(ctx context.Context, msg string, fields ...map[string]interface{}) + + // DebugContext logs a debug event with a context. + DebugContext(ctx context.Context, msg string, fields ...map[string]interface{}) + + // InfoContext logs an info event with a context. + InfoContext(ctx context.Context, msg string, fields ...map[string]interface{}) + + // WarnContext logs a warning event with a context. + WarnContext(ctx context.Context, msg string, fields ...map[string]interface{}) + + // ErrorContext logs an error event with a context. + ErrorContext(ctx context.Context, msg string, fields ...map[string]interface{}) + + // WithFields annotates a logger with key-value pairs. + WithFields(fields map[string]interface{}) Logger + + // WithContext annotates a logger with a context. + WithContext(ctx context.Context) Logger +} + +// TracingLogger is the fundamental interface for tracing. +type TracingLogger interface { + // Error logs an error event. + Error(msg string) + + // Info logs an info event. + Infof(msg string, args ...interface{}) + + // Debug logs a debug event. + Debugf(msg string, args ...interface{}) +} diff --git a/internal/common/log/log.go b/internal/common/log/log.go new file mode 100644 index 0000000..4572b60 --- /dev/null +++ b/internal/common/log/log.go @@ -0,0 +1,23 @@ +package log + +import ( + "github.com/hadenlabs/terraform-module-template/config" + "github.com/hadenlabs/terraform-module-template/internal/common/log/provider" + "github.com/hadenlabs/terraform-module-template/internal/errors" +) + +// New initialize a new Log. +func NewLog(conf config.Config) TracingLogger { + return Factory(conf) +} + +// Factory Log. +func Factory(conf config.Config) (prov TracingLogger) { + switch conf.Log.Provider { + case "zap": + prov = provider.NewZap(conf) + default: + panic(errors.Errorf(errors.ErrorParseConfig, "unsupported email provider: %s", conf.Log.Provider)) + } + return prov +} diff --git a/internal/common/log/log_test.go b/internal/common/log/log_test.go new file mode 100644 index 0000000..cc74bc3 --- /dev/null +++ b/internal/common/log/log_test.go @@ -0,0 +1,22 @@ +package log + +// import ( +// "testing" + +// "github.com/hadenlabs/terraform-module-template/internal/testutil/config" +// "github.com/stretchr/testify/assert" +// ) + +// func logForTest() (TracingLogger, func()) { +// conf := config.MustLoadEnvWithFilename("./mocking/zap.env") + +// log := NewLog(*conf) + +// return log, func() {} +// } + +// func TestNewSuccess(t *testing.T) { +// log, tearDown := logForTest() +// defer tearDown() +// assert.IsType(t, &TracingLogger{}, log) +// } diff --git a/internal/common/log/mocking/zap.env b/internal/common/log/mocking/zap.env new file mode 100644 index 0000000..3f07cf6 --- /dev/null +++ b/internal/common/log/mocking/zap.env @@ -0,0 +1 @@ +LOG_PROVIDER="zap" diff --git a/internal/common/log/provider/mocking/zap.env b/internal/common/log/provider/mocking/zap.env new file mode 100644 index 0000000..3f07cf6 --- /dev/null +++ b/internal/common/log/provider/mocking/zap.env @@ -0,0 +1 @@ +LOG_PROVIDER="zap" diff --git a/internal/common/log/provider/zap.go b/internal/common/log/provider/zap.go new file mode 100644 index 0000000..42c2c0f --- /dev/null +++ b/internal/common/log/provider/zap.go @@ -0,0 +1,50 @@ +package provider + +import ( + "go.uber.org/zap" + + "github.com/hadenlabs/terraform-module-template/config" +) + +// Zap is a struct of Zap. +type ZapLog struct { + Client *zap.Logger +} + +func NewZap(conf config.Config) *ZapLog { + logger, _ := zap.NewProduction() + defer func() { // flushes buffer, if any + _ = logger.Sync() + }() + return &ZapLog{Client: logger} +} + +func (l *ZapLog) Close() { + defer func() { // flushes buffer, if any + _ = l.Client.Sync() + }() +} + +// Send an debug. +func (l *ZapLog) Debugf(msg string, args ...interface{}) { + l.Client.Sugar().Debugf(msg, args) + defer func() { // flushes buffer, if any + _ = l.Client.Sync() + }() +} + +// Send an infof. +func (l *ZapLog) Infof(msg string, args ...interface{}) { + l.Client.Sugar().Infof(msg, args) + defer func() { // flushes buffer, if any + _ = l.Client.Sync() + }() +} + +// Send an error. +func (l *ZapLog) Error(msg string) { + l.Client.Sugar().Error(msg) + defer func() { // flushes buffer, if any + _ = l.Client.Sync() + }() +} diff --git a/internal/common/log/provider/zap_test.go b/internal/common/log/provider/zap_test.go new file mode 100644 index 0000000..90c0b30 --- /dev/null +++ b/internal/common/log/provider/zap_test.go @@ -0,0 +1,21 @@ +package provider + +import ( + "testing" + + "github.com/hadenlabs/terraform-module-template/internal/testutil/config" +) + +func zapForTest() (*ZapLog, func()) { + conf := config.MustLoadEnvWithFilename("./mocking/zap.env") + log := NewZap(*conf) + + return log, func() {} +} + +func TestZapDebugSuccess(t *testing.T) { + log, tearDown := zapForTest() + defer tearDown() + + log.Debugf("test subject") +} diff --git a/internal/errors/errors.go b/internal/errors/errors.go new file mode 100644 index 0000000..ebfde08 --- /dev/null +++ b/internal/errors/errors.go @@ -0,0 +1,143 @@ +package errors + +import ( + stderrors "errors" + "fmt" + + "github.com/go-playground/validator/v10" + "github.com/pkg/errors" +) + +// Kind is the kind of error. +type Kind string + +// Error kinds. +const ( + ErrorReadConfig Kind = "config read error" + ErrorParseConfig Kind = "config parse error" + ErrorNotImplemented Kind = "not implement" + ErrorCanceled Kind = "canceled" + ErrorUnknown Kind = "unknown error" + ErrorInvalidArgument Kind = "invalid argument" + ErrorDeadlineExceeded Kind = "deadline exceeded" + ErrorNotFound Kind = "entity not found" + ErrorAlreadyExists Kind = "already exists" +) + +// FieldViolation is a struct for providing field error details in HTTP error. It matches the same struct in errdetails package. +type FieldViolation struct { + Field string + Description string +} + +// Error is an internal errors with stacktrace. It can be converted to a HTTP response. +type Error struct { + error + kind Kind + fieldViolations []FieldViolation +} + +// Kind returns the error kind. +func (e *Error) Kind() Kind { + return e.kind +} + +// FieldViolations returns a structure that represents field validation errors. +func (e *Error) FieldViolations() []FieldViolation { + return e.fieldViolations +} + +// New returns an error with the supplied kind and message. If message is empty, a default message, +// for the error kind will be used. +func New(kind Kind, msg string) error { + if msg == "" { + msg = string(kind) + } + return &Error{ + error: errors.New(msg), + kind: kind, + } +} + +// Errorf formats according to a format specifier and return an unknown error with the string. +func Errorf(kind Kind, format string, args ...interface{}) error { + return New(kind, fmt.Sprintf(format, args...)) +} + +// Wrap returns an error annotating err with a kind and a stacktrace at the point Wrap is called, +// and the supplied kind and message. If err is nil, Wrap returns nil. +func Wrap(err error, kind Kind, msg string) error { + if err == nil { + return nil + } + if msg == "" { + msg = string(kind) + } + return &Error{ + error: errors.Wrap(err, msg), + kind: kind, + } +} + +// Wrapf returns an error annotating err with a stack trace at the point Wrapf is called, and the +// kind and format specifier. If err is nil, Wrapf returns nil. +func Wrapf(err error, kind Kind, format string, args ...interface{}) error { + return Wrap(err, kind, fmt.Sprintf(format, args...)) +} + +// WithFieldViolations returns an error with supplied field +// violations. +func WithFieldViolations(kind Kind, msg string, fieldViolations []FieldViolation) error { + if msg == "" { + msg = string(kind) + } + return &Error{ + error: errors.New(msg), + kind: kind, + fieldViolations: fieldViolations, + } +} + +// WithValidateError maps a Validate error into an internal error representation. +func WithValidateError(err error) error { + if err == nil { + return nil + } + errWithType := err.(validator.ValidationErrors) //nolint:errorlint + if len(errWithType) == 0 { + return Wrap(err, ErrorUnknown, "") + } + fieldViolations := make([]FieldViolation, 0, len(errWithType)) + for _, fieldError := range errWithType { + fieldViolations = append(fieldViolations, FieldViolation{ + Field: ToUnderScore(fieldError.Field()), + Description: fieldError.Tag(), + }) + } + // Assume any field violations corresponds to error returns from validator, which is invalid argument. + return WithFieldViolations(ErrorInvalidArgument, "", fieldViolations) +} + +// IsKind checks whether any error in err's chain matches the error kind. +func IsKind(err error, kind Kind) bool { + ie := &Error{} + if As(err, &ie) { + return ie.kind == kind + } + return false +} + +// As finds the first error in err's chain that matches target, and if so, sets target to that +// error value and return true. +func As(err error, target interface{}) bool { + return stderrors.As(err, target) +} + +// Unwrap returns the result of calling the Unwrap method on err, if err's +// type contains an Unwrap method returning error. +// Otherwise, Unwrap returns nil. +// +// Same as Go's errors.Unwrap. +func Unwrap(err error) error { + return stderrors.Unwrap(err) +} diff --git a/internal/errors/errors_test.go b/internal/errors/errors_test.go new file mode 100644 index 0000000..abee2f7 --- /dev/null +++ b/internal/errors/errors_test.go @@ -0,0 +1,45 @@ +package errors + +import ( + stderrors "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFormat(t *testing.T) { + err := New(ErrorNotFound, "internal error") + assert.Equal(t, "internal error", fmt.Sprintf("%v", err)) + assert.Contains(t, fmt.Sprintf("%+v", err), "internal error", err) // with stacktrace +} + +func TestNotReadConfig(t *testing.T) { + err := New(ErrorReadConfig, "") + assert.Equal(t, "config read error", fmt.Sprintf("%v", err)) + assert.Contains(t, fmt.Sprintf("%+v", err), "config read error", err) // with stacktrace +} + +func TestNotParseConfig(t *testing.T) { + err := New(ErrorParseConfig, "") + assert.Equal(t, "config parse error", fmt.Sprintf("%v", err)) + assert.Contains(t, fmt.Sprintf("%+v", err), "config parse error", err) // with stacktrace +} + +func TestIsKind(t *testing.T) { + err := New(ErrorNotFound, "internal error") + assert.True(t, IsKind(err, ErrorNotFound)) + + err = stderrors.New("std error") + assert.False(t, IsKind(err, ErrorNotFound)) + + err = nil + assert.False(t, IsKind(err, ErrorNotFound)) +} + +func TestAs(t *testing.T) { + err := New(ErrorNotFound, "not found") + err2 := &Error{} + assert.True(t, As(err, &err2)) + assert.Equal(t, ErrorNotFound, err2.kind) +} diff --git a/internal/errors/string.go b/internal/errors/string.go new file mode 100644 index 0000000..1c584d4 --- /dev/null +++ b/internal/errors/string.go @@ -0,0 +1,11 @@ +package errors + +import ( + valid "github.com/asaskevich/govalidator" +) + +// ToUnderScore converts CamalCase to under_score case +// Source: https://gist.github.com/zxh/cee082053aa9674812e8cd4387088301 +func ToUnderScore(name string) string { + return valid.CamelCaseToUnderscore(name) +} diff --git a/internal/testutil/config/config.go b/internal/testutil/config/config.go new file mode 100644 index 0000000..2b1b278 --- /dev/null +++ b/internal/testutil/config/config.go @@ -0,0 +1,23 @@ +package config + +import ( + "github.com/joho/godotenv" + + coreconfig "github.com/hadenlabs/terraform-module-template/config" + "github.com/hadenlabs/terraform-module-template/internal/errors" +) + +func LoadEnvWithFilename(filename string) (*coreconfig.Config, error) { + if err := godotenv.Overload(filename); err != nil { + return nil, errors.Wrapf(err, errors.ErrorNotFound, "filename %s", filename) + } + return coreconfig.Must(), nil +} + +func MustLoadEnvWithFilename(filename string) *coreconfig.Config { + conf, err := LoadEnvWithFilename(filename) + if err != nil { + panic(err) + } + return conf +} diff --git a/internal/testutil/config/config_test.go b/internal/testutil/config/config_test.go new file mode 100644 index 0000000..dfd984b --- /dev/null +++ b/internal/testutil/config/config_test.go @@ -0,0 +1,27 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + coreconfig "github.com/hadenlabs/terraform-module-template/config" +) + +func TestConfigLoadEnvSuccess(t *testing.T) { + conf, err := LoadEnvWithFilename("./mocking/config.env") + assert.Empty(t, err, err) + assert.IsType(t, &coreconfig.Config{}, conf) + assert.Equal(t, "zap", conf.Log.Provider, conf.Log.Provider) +} + +func TestConfigMustLoadEnvWithPanic(t *testing.T) { + assert.Panics(t, func() { MustLoadEnvWithFilename("./mocking/notfound.env") }, "The code did not panic") +} + +func TestConfigLoadEnvFailedFailed(t *testing.T) { + conf, err := LoadEnvWithFilename("./mocking/notfound.env") + assert.NotEmpty(t, err, err) + assert.IsType(t, &coreconfig.Config{}, conf) + assert.Empty(t, conf) +} diff --git a/internal/testutil/config/mocking/config.env b/internal/testutil/config/mocking/config.env new file mode 100644 index 0000000..684242a --- /dev/null +++ b/internal/testutil/config/mocking/config.env @@ -0,0 +1 @@ +LOG_PROVICER=zap diff --git a/internal/testutil/testutil.go b/internal/testutil/testutil.go new file mode 100644 index 0000000..110b2e6 --- /dev/null +++ b/internal/testutil/testutil.go @@ -0,0 +1 @@ +package testutil diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..65adee2 --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,48 @@ +package version + +import ( + "fmt" + "runtime" + "strings" + "time" +) + +// current version +const dev = "0.0.0" + +// Provisioned by ldflags +var ( + version string + commitHash string + buildDate string +) + +// Load defaults for info variables +func init() { + if version == "" { + version = dev + } + if version == "v0.0.0-" { // building in a directory which is not a git repository + version = dev + } + if commitHash == "" { + commitHash = dev + } + if buildDate == "" { + buildDate = time.Now().Format(time.RFC3339) + } +} + +// Short return the version of the binary +func Short() string { + return version +} + +// Full return the full version of the binary including commit hash and build date +func Full() string { + if !strings.HasSuffix(version, commitHash) { + version += " " + commitHash + } + osArch := runtime.GOOS + "/" + runtime.GOARCH + return fmt.Sprintf("%s %s BuildDate: %s", version, osArch, buildDate) +} diff --git a/internal/version/version_test.go b/internal/version/version_test.go new file mode 100644 index 0000000..d2f00df --- /dev/null +++ b/internal/version/version_test.go @@ -0,0 +1,7 @@ +package version + +import "testing" + +func TestDocker(t *testing.T) { + // assert.Equal(t, DockerImageName) +} diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/main.tf @@ -0,0 +1 @@ + diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..5540c4c --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,24 @@ +site_name: terraform-module-template Documentation +theme: 'material' +markdown_extensions: + - toc: + permalink: True + - admonition + - smarty + - wikilinks + - codehilite: + linenums: True +extra: + palette: + primary: '#087da1' + accent: '#00a889' + font: + text: 'Source Sans Pro' + +repo_name: 'hadenlabs/terraform-module-template' +repo_url: 'https://github.com/hadenlabs/terraform-module-template' +copyright: 'Copyright © 2021 hadenlabs' + +google_analytics: + - '' + - 'auto' diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..1bfff05 --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "@hadenlabs/terraform-module-template", + "version": "0.0.0", + "description": "terraform-module-template", + "author": "Luis Mayta ", + "license": "LGPL-3.0", + "engines": { + "node": ">=14" + }, + "scripts": { + "build": "tsc -p ./", + "clean": "rimraf -rf dist", + "clean:all": "yarn clean:cache && yarn clean:build:all && yarn clean node_modules", + "clean:build": "yarn clean dist .next out .serverless_nextjs", + "clean:build:all": "yarn clean && yarn clean:build && yarn clean:build:test", + "clean:build:test": "yarn clean ./coverage", + "clean:cache": "yarn clean ./node_modules/.cache", + "plop": "cross-env TS_NODE_PROJECT='./provision/generators/plop/ts-node.tsconfig.json' plop --plopfile provision/generators/plop/index.ts", + "lint": "eslint --config=.ci/linters/.eslintrc.js --ignore-path=.ci/linters/.eslintignore ./ --ext .js,.jsx,.mjs,.d.ts,.ts,.tsx", + "lint:fix": "yarn lint --fix", + "lint:less": "stylelint --config=.ci/linters/.stylintrc --syntax less **/*.less", + "lint:less:fix": "yarn lint:less --fix", + "ncu": "ncu -u --target minor", + "ncu:patch": "ncu -u --target patch", + "prebuild": "mkdirp build && yarn run clean:build:all", + "prettier": "prettier --config=.ci/linters/prettier.config.js --ignore-path=.ci/linters/.prettierignore --list-different", + "prettier:fix": "yarn prettier:lint --write=true", + "prettier:lint": "yarn prettier '**/*.{js?(on),ts?(x),scss,md,y?(a)ml,gql,graphql?(s),less,mjml}' --write=false" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hadenlabs/terraform-module-template.git" + }, + "keywords": [ + "hadenlabs", + "template", + "base", + "tool" + ], + "bugs": { + "url": "https://github.com/hadenlabs/terraform-module-template/issues" + }, + "homepage": "https://github.com/hadenlabs/terraform-module-template#readme", + "dependencies": {}, + "devDependencies": { + "@types/rimraf": "^3.0.2", + "@typescript-eslint/eslint-plugin": "^4.26.1", + "@typescript-eslint/parser": "^4.26.1", + "cross-env": "^7.0.3", + "eslint": "^7.28.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-prettier": "^3.4.1", + "eslint-plugin-promise": "^5.1.1", + "node-plop": "^0.26.3", + "plop": "^2.7.6", + "prettier": "^2.3.2", + "prettier-eslint": "^12.0.0", + "slugify": "^1.5.3", + "rimraf": "^3.0.2", + "ts-node": "^10.0.0", + "typescript": "^4.3.5" + }, + "prettier": "./.ci/linters/prettier.config.js" +} diff --git a/provision/diagrams/Taskfile.yml b/provision/diagrams/Taskfile.yml new file mode 100644 index 0000000..53c3c41 --- /dev/null +++ b/provision/diagrams/Taskfile.yml @@ -0,0 +1,46 @@ +# https://taskfile.dev + +version: '3' + +tasks: + build: + desc: Build Diagrams Plantuml. + run: once + silent: true + cmds: + - cmd: mkdir -p decks/images/diagrams + - cmd: mkdir -p static/images/diagrams + - cmd: mkdir -p docs/images/diagrams + - task: make + + publish: + desc: Publish Diagrams. + run: once + silent: true + deps: + - task: build + cmds: + - >- + rsync -avhP --remove-source-files + --include='*.png' --include='*/' + --exclude='*' + provision/diagrams/ ./ + + make: + desc: generate files plantuml. + cmds: + - cmd: echo {{.FILES_PLANTUML}} + - cmd: |- + docker run + --platform linux/amd64 + --rm + --workdir /data + -v {{.PWD}}:/data + infosisarg/plantuml {{.FILES_PLANTUML}} + vars: + FILES_PLANTUML: + sh: >- + find ./ -type f -name '*.plantuml' + | grep -v '.terraform' + | sort -u + | xargs diff --git a/provision/diagrams/docs/diagrams/example.plantuml b/provision/diagrams/docs/diagrams/example.plantuml new file mode 100644 index 0000000..7a1a009 --- /dev/null +++ b/provision/diagrams/docs/diagrams/example.plantuml @@ -0,0 +1,2 @@ +@startuml +@enduml diff --git a/provision/diagrams/docs/diagrams/logo.plantuml b/provision/diagrams/docs/diagrams/logo.plantuml new file mode 100644 index 0000000..7a1a009 --- /dev/null +++ b/provision/diagrams/docs/diagrams/logo.plantuml @@ -0,0 +1,2 @@ +@startuml +@enduml diff --git a/provision/generators/README.yaml b/provision/generators/README.yaml new file mode 100644 index 0000000..826d52d --- /dev/null +++ b/provision/generators/README.yaml @@ -0,0 +1,84 @@ +--- +# +# This is the canonical configuration for the `README.md` +# Run `make readme` to rebuild the `README.md` +# + +# Name of this project +name: terraform-module-template + +# Tags of this project +tags: + - template + +# Categories of this project +categories: + - terraform-modules + +email: + support: support@hadenlabs.com + +# Logo for this project +# logo: docs/logo.png + +# License of this project +license: 'LGPL-3.0' + +# Canonical GitHub repo +github_repo: hadenlabs/terraform-module-template + +# Badges to display +badges: + - name: Latest Release + image: https://img.shields.io/github/release/hadenlabs/terraform-module-template + url: https://github.com/hadenlabs/terraform-module-template/releases + - name: Lint + image: https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/lint-code + url: https://github.com/hadenlabs/terraform-module-template/actions?workflow=lint-code + - name: CI + image: https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/ci + url: https://github.com/hadenlabs/terraform-module-template/actions?workflow=ci + - name: Test + image: https://img.shields.io/github/workflow/status/hadenlabs/terraform-module-template/test + url: https://github.com/hadenlabs/terraform-module-template/actions?workflow=test + - name: pre-commit + image: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white + url: https://github.com/pre-commit/pre-commit + - name: Conventional Commits + image: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow + url: https://conventionalcommits.org + - name: KeepAChangelog + image: https://img.shields.io/badge/changelog-Keep%20a%20Changelog%20v1.0.0-orange + url: https://keepachangelog.com + - name: Terraform Version + image: https://img.shields.io/badge/terraform-1.x%20|%200.15%20|%200.14%20|%200.13%20|%200.12.20+-623CE4.svg?logo=terraform + url: https://github.com/hashicorp/terraform/releases + +requirements: |- + + This is a list of plugins that need to be installed previously to enjoy all the goodies of this configuration: + + - [gomplate](https://github.com/hairyhenderson/gomplate) + - [terraform](https://github.com/hashicorp/terraform) + - [python](https://www.python.org) + - [taskfile](https://github.com/go-task/task) + +# Short description of this project +description: |- + + terraform-module-template for project + + ### Replace name project to New Project + + ```bash + agr 'terraform-module-template' 'new-project' + ``` +usages: + - docs/usage.md + +examples: + - 'docs/examples/common.md' + +include: + - 'docs/include/targets.md' + - 'docs/include/terraform.md' diff --git a/provision/generators/plop/generators/index.ts b/provision/generators/plop/generators/index.ts new file mode 100644 index 0000000..7f5b2d7 --- /dev/null +++ b/provision/generators/plop/generators/index.ts @@ -0,0 +1,2 @@ +import { testGenerator } from './test' +export { testGenerator } diff --git a/provision/generators/plop/generators/test.ts b/provision/generators/plop/generators/test.ts new file mode 100644 index 0000000..e334762 --- /dev/null +++ b/provision/generators/plop/generators/test.ts @@ -0,0 +1,88 @@ +import { Actions, PlopGeneratorConfig } from 'node-plop' +import slugify from 'slugify' +import * as path from 'path' +import { baseGeneratorPath, baseTemplatesPath, pathExists, pathMake } from '../utils' + +export enum TestPrompNames { + 'testName' = 'testName' +} + +type Answers = { [P in TestPrompNames]: string } + +const testPath = path.join(baseGeneratorPath, 'test') + +export const testGenerator: PlopGeneratorConfig = { + description: 'add an path to test', + prompts: [ + { + type: 'input', + name: TestPrompNames.testName, + message: 'What should it be test?', + default: 'basic' + } + ], + actions: (data) => { + const answers = data as Answers + const containerPath = `${testPath}/replace_name-${slugify(answers.testName, '-')}` + const containerDocsPath = `${containerPath}/docs` + + if (!pathExists(containerPath)) { + pathMake(containerPath) + pathMake(containerDocsPath) + pathMake(path.join(containerDocsPath, 'include')) + } + + const actions: Actions = [] + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test.add.hbs`, + path: `${testPath}/replace_name_${slugify(answers.testName, '_')}_test.go`, + abortOnFail: true + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/main.add.hbs`, + path: `${containerPath}/main.tf`, + abortOnFail: false + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/data.add.hbs`, + path: `${containerPath}/data.tf`, + abortOnFail: false + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/outputs.add.hbs`, + path: `${containerPath}/outputs.tf`, + abortOnFail: true + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/variables.add.hbs`, + path: `${containerPath}/variables.tf`, + abortOnFail: true + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/versions.add.hbs`, + path: `${containerPath}/versions.tf`, + abortOnFail: true + }) + + actions.push({ + type: 'add', + templateFile: `${baseTemplatesPath}/test/docs/include/terraform.md`, + path: `${containerDocsPath}/include/terraform.md`, + abortOnFail: true + }) + + return actions + } +} diff --git a/provision/generators/plop/index.ts b/provision/generators/plop/index.ts new file mode 100644 index 0000000..45b0674 --- /dev/null +++ b/provision/generators/plop/index.ts @@ -0,0 +1,6 @@ +import { NodePlopAPI } from 'node-plop' +import { testGenerator } from './generators' + +export default function plop(plop: NodePlopAPI): void { + plop.setGenerator('test', testGenerator) +} diff --git a/provision/generators/plop/templates/test.add.hbs b/provision/generators/plop/templates/test.add.hbs new file mode 100644 index 0000000..2b05d5a --- /dev/null +++ b/provision/generators/plop/templates/test.add.hbs @@ -0,0 +1,36 @@ +package test + +import ( + "testing" + + "github.com/gruntwork-io/terratest/modules/terraform" + + "github.com/hadenlabs/terraform-module-template/config" + "github.com/stretchr/testify/assert" + "github.com/hadenlabs/terraform-module-template/internal/common/log" +) + +func Test{{pascalCase testName}}Success(t *testing.T) { + t.Parallel() + conf := config.Must() + logger := log.Factory(*conf) + logger.Debugf( + "values for test terraform-module-template is", + ) + + terraformOptions := &terraform.Options{ + // The path to where your Terraform code is located + TerraformDir: "replace-name-{{dashCase testName}}", + Upgrade: true, + Vars: map[string]interface{}{ + }, + } + + // At the end of the test, run `terraform destroy` to clean up any resources that were created + defer terraform.Destroy(t, terraformOptions) + + // This will run `terraform init` and `terraform apply` and fail the test if there are any errors + terraform.InitAndApply(t, terraformOptions) + outputID := terraform.Output(t, terraformOptions, "id") + assert.NotEmpty(t, outputID, outputID) +} diff --git a/provision/generators/plop/templates/test/data.add.hbs b/provision/generators/plop/templates/test/data.add.hbs new file mode 100644 index 0000000..e69de29 diff --git a/provision/generators/plop/templates/test/docs/include/terraform.md b/provision/generators/plop/templates/test/docs/include/terraform.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/provision/generators/plop/templates/test/docs/include/terraform.md @@ -0,0 +1 @@ + diff --git a/provision/generators/plop/templates/test/main.add.hbs b/provision/generators/plop/templates/test/main.add.hbs new file mode 100644 index 0000000..c002622 --- /dev/null +++ b/provision/generators/plop/templates/test/main.add.hbs @@ -0,0 +1,3 @@ +module "main" { + source = "../.." +} diff --git a/provision/generators/plop/templates/test/outputs.add.hbs b/provision/generators/plop/templates/test/outputs.add.hbs new file mode 100644 index 0000000..e69de29 diff --git a/provision/generators/plop/templates/test/variables.add.hbs b/provision/generators/plop/templates/test/variables.add.hbs new file mode 100644 index 0000000..e69de29 diff --git a/provision/generators/plop/templates/test/versions.add.hbs b/provision/generators/plop/templates/test/versions.add.hbs new file mode 100644 index 0000000..027a8e3 --- /dev/null +++ b/provision/generators/plop/templates/test/versions.add.hbs @@ -0,0 +1,6 @@ +terraform { + required_version = ">= 0.12.20, < 2.0" + + required_providers { + } +} diff --git a/provision/generators/plop/ts-node.tsconfig.json b/provision/generators/plop/ts-node.tsconfig.json new file mode 100644 index 0000000..7532767 --- /dev/null +++ b/provision/generators/plop/ts-node.tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "module": "commonjs", + "moduleResolution": "node", + "noEmit": true, + "allowSyntheticDefaultImports": true + } +} diff --git a/provision/generators/plop/utils/helpers.ts b/provision/generators/plop/utils/helpers.ts new file mode 100644 index 0000000..7f1558b --- /dev/null +++ b/provision/generators/plop/utils/helpers.ts @@ -0,0 +1,21 @@ +import * as path from 'path' +import fs from 'fs' + +export const baseGeneratorPath = path.join(__dirname, '../../../../') +export const baseTemplatesPath = path.join(__dirname, '../templates') + +export const cleanString = (text: string): string => { + return text.replace(/[.-_]+/g, ' ').toLowerCase() +} + +export const hyphenate = (text: string): string => { + return text.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase() +} + +export function pathExists(path: string): boolean { + return fs.existsSync(path) +} + +export function pathMake(path: string): void { + return fs.mkdirSync(path) +} diff --git a/provision/generators/plop/utils/index.ts b/provision/generators/plop/utils/index.ts new file mode 100644 index 0000000..368cef9 --- /dev/null +++ b/provision/generators/plop/utils/index.ts @@ -0,0 +1,9 @@ +import { + hyphenate, + baseGeneratorPath, + pathExists, + pathMake, + baseTemplatesPath, + cleanString +} from './helpers' +export { hyphenate, baseGeneratorPath, pathExists, pathMake, baseTemplatesPath, cleanString } diff --git a/provision/task/changelog.yml b/provision/task/changelog.yml new file mode 100644 index 0000000..0979f9a --- /dev/null +++ b/provision/task/changelog.yml @@ -0,0 +1,58 @@ +version: '3' + +env: + TMP_CHANGELOG_FILENAME: TMP_CHANGELOG.md + +tasks: + check: + desc: Exist git-chglog + run: once + deps: + - task: check:go + - task: check:chglog + + check:chglog: + desc: Exist git-chglog + run: once + preconditions: + - sh: command -v git-chglog + msg: 'Please install git-chglog' + + check:go: + desc: Exist go + run: once + preconditions: + - sh: command -v go + msg: 'Please install go' + + install: + desc: install dependences git-chglog + run: once + cmds: + - go install github.com/git-chglog/git-chglog/cmd/git-chglog@latest + deps: + - task: check:go + + generate: + desc: Generate changelog + run: once + cmds: + - git-chglog -o CHANGELOG.md + deps: + - task: check:chglog + + tag: + desc: Generate tag changelog + run: once + cmds: + - git-chglog {{.APP_TAG}} > {{.TMP_CHANGELOG_FILENAME}} + deps: + - task: check:chglog + + next: + desc: Generate next tag changelog + run: once + cmds: + - git-chglog --next-tag {{.APP_TAG}} --output CHANGELOG.md + deps: + - task: check:chglog diff --git a/provision/task/confluence.yml b/provision/task/confluence.yml new file mode 100644 index 0000000..ba9af71 --- /dev/null +++ b/provision/task/confluence.yml @@ -0,0 +1,150 @@ +# https://taskfile.dev + +version: '3' + +tasks: + default: + desc: Show commands confluence + run: once + silent: true + cmds: + - cmd: task -l + + check: + desc: Exist Mark and dependences + run: once + deps: + - task: check:docker + - task: check:vars + + check:docker: + desc: Exist docker + run: once + preconditions: + - sh: command -v docker + msg: 'Please Install docker' + + check:vars: + desc: Exist vars for mark + run: once + preconditions: + - sh: test -v CONFLUENCE_BASE_URL + msg: 'Please add var environment CONFLUENCE_BASE_URL' + - sh: test -v CONFLUENCE_ACCESS_TOKEN + msg: 'Please add var environment CONFLUENCE_ACCESS_TOKEN' + - sh: test -v CONFLUENCE_USER + msg: 'Please add var environment CONFLUENCE_USER' + + make:credentials: + desc: run sync mark. + run: once + silent: true + cmds: + - cmd: echo initial sync files + - cmd: echo "" > config.log + - cmd: echo "username = '{{.CONFLUENCE_USER}}'" >> config.log + - cmd: echo "password = '{{.CONFLUENCE_ACCESS_TOKEN}}'" >> config.log + - cmd: echo "base_url = '{{.CONFLUENCE_BASE_URL}}'" >> config.log + deps: + - task: check + + sync: + desc: run sync mark. + run: once + cmds: + - cmd: >- + for file in {{.FILES_CONFLUENCE}}; do + echo "> Sync $file"; + docker run \ + --platform linux/amd64 \ + --rm \ + --workdir /usr/src/ \ + -v {{.PWD}}/:/usr/src/ \ + -v {{.PWD}}/config.log:/config/config.toml \ + kovetskiy/mark:latest mark --config /config/config.toml \ + --minor-edit \ + -f $file; + echo; + done + - cmd: echo ending sync files + deps: + - task: make:credentials + + sync:all: + desc: run sync mark branch develop. + run: once + deps: + - task: check + cmds: + - task: sync + vars: + FILES_CONFLUENCE: + sh: >- + find ./docs -type f -name '*.md' -print + | grep -v '.tpl.md' + | grep -v '^.terraform' + | xargs grep ' {{ end }} +{{ if has $confluence "parent" }} {{- end -}} +{{ if has $confluence "title" -}} {{ end }} +{{ if has $confluence "images" -}} +{{ range $image := $confluence.images -}} + +{{ end }} +{{ end }} +{{- end }} + + + + + +{{ if has (ds "config") "badges" }}{{- range $badge := (ds "config").badges -}}{{ printf " [![%s](%s)](%s)" $badge.name $badge.image $badge.url }}{{ end }}{{ end }} + +# {{(ds "config").name}}{{ if gt (len (ds "config").name) 34 }}{{ print "\n\n" }}{{ end }} + +{{ if has (ds "config") "logo" -}} ![{{(ds "config").name}}]({{ (ds "config").logo }}) {{ end }} + +{{ if has (ds "config") "description" -}} {{(ds "config").description }} {{ end }} + +{{ if has (ds "config") "screenshots" }} + +## Screenshots + +{{ range $screenshot := (ds "config").screenshots }} +{{ printf "![%s](%s)\n*%s*" $screenshot.name $screenshot.url $screenshot.description }} +{{ end }}{{ end }} + +{{ if has (ds "config") "features" }} + +## Features +{{ range $feature := (ds "config").features }}{{printf "- %s\n" $feature}}{{ end }} +{{ end }} + +{{ if has (ds "config") "introduction" }} + +## Introduction + +{{ (ds "config").introduction -}} {{ end }} + +{{ if has (ds "config") "todo" }} + +## TODO + +{{ range $todo := (ds "config").todo }} +{{ printf "* [%s](%s)" $todo.name $todo.url }} +{{ end }} +{{ end }} + +{{ if has (ds "config") "requirements" }} + +## Requirements + +{{ (ds "config").requirements -}} {{ end }} + +{{ if has (ds "config") "installation" }} + +## Installation + +{{ range $file := (datasource "config").installation -}} +{{ (include "includes" $file) }} +{{- end }} +{{- end }} + +{{ if has (ds "config") "usages" }} + +## Usage + +{{ range $file := (datasource "config").usages -}} +{{ (include "includes" $file) }} +{{- end }} +{{ end }} + +{{ if has (ds "config") "quickstart" -}} + +## Quick Start + +{{ (ds "config").quickstart -}} {{ end }} + +{{ if has (ds "config") "examples" }} + +## Examples + +{{ range $file := (datasource "config").examples -}} +{{ (include "includes" $file) }} +{{- end }} +{{ end }} + +{{ if has (ds "config") "include" }} {{ range $file := (datasource "config").include -}} {{ (include "includes" $file) }} {{- end }} {{- end }} + +{{ if has (ds "config") "related" }} + +## Related Projects + +Check out these related projects. +{{ range $related := (ds "config").related }} +{{ printf "* [%s](%s) - %s" $related.name $related.url $related.description }} +{{ end }} + +{{ end}} + +{{ if has (ds "config") "references" }} + +## References + +For additional context, refer to some of these links. +{{ range $reference := (ds "config").references }} +{{ printf "* [%s](%s) - %s" $reference.name $reference.url $reference.description }} +{{ end }} +{{ end}} + +## Help + +**Got a question?** +{{ if has (ds "config") "github_repo" }} +File a GitHub [issue]({{ printf "https://github.com/%s/issues" (ds "config").github_repo}}). +{{ else if has (ds "config") "gitlab_host" }} +File a GitLab [issue]({{ printf "https://%s/%s/-/issues" (ds "config").gitlab_host (ds "config").gitlab_repo}}). +{{ else if has (ds "config") "gitlab_repo" }} +File a GitLab [issue]({{ printf "https://gitlab.com/%s/-/issues" (ds "config").gitlab_repo}}). +{{ end }} + +## Contributing + +See [Contributing](./docs/contributing.md). + +## Module Versioning + +This Module follows the principles of [Semantic Versioning (SemVer)](https://semver.org/). + +Using the given version number of `MAJOR.MINOR.PATCH`, we apply the following constructs: + +1. Use the `MAJOR` version for incompatible changes. +1. Use the `MINOR` version when adding functionality in a backwards compatible manner. +1. Use the `PATCH` version when introducing backwards compatible bug fixes. + +### Backwards compatibility in `0.0.z` and `0.y.z` version + +- In the context of initial development, backwards compatibility in versions `0.0.z` is **not guaranteed** when `z` is + increased. (Initial development) +- In the context of pre-release, backwards compatibility in versions `0.y.z` is **not guaranteed** when `y` is + increased. (Pre-release) + + +{{ if has (ds "config") "copyrights" }} + +## Copyrights + +{{ range $copyright := (ds "config").copyrights -}} {{ printf "Copyright © %s-%d [%s](%s)\n" $copyright.year time.Now.Year $copyright.name $copyright.url }} {{ end }} + +{{ else }} + +## Copyright + +Copyright © 2018-{{ time.Now.Year }} [Hadenlabs](https://hadenlabs.com) +{{ end}} + + +## Trademarks + +All other trademarks referenced herein are the property of their respective owners. + +{{ if has (datasource "config") "contributors" }} + +### :star: Contributors + +| {{ range $contributor := (ds "config").contributors }}{{ printf " [![%s][%s_avatar]][%s_homepage]
[%s][%s_homepage] |" $contributor.name $contributor.github $contributor.github $contributor.name $contributor.github}}{{ end }} +|{{- range $contributor := (ds "config").contributors -}}---|{{ end }} + +{{ range $contributor := (ds "config").contributors -}} +{{- if has $contributor "homepage" }} +{{ printf " [%s_homepage]: %s" $contributor.github $contributor.homepage }} +{{ else -}} +{{ printf " [%s_homepage]: https://github.com/%s" $contributor.github $contributor.github }} +{{ end -}} +{{ if has $contributor "avatar" }} +{{ printf " [%s_avatar]: %s" $contributor.github $contributor.avatar }} +{{ else -}} +{{ printf " [%s_avatar]: https://github.com/%s.png?size=150" $contributor.github $contributor.github }} +{{- end }} +{{ end }} + +{{ end }} + + +{{ if has (ds "config") "license" }} + +## License + +The code and styles are licensed under the {{(ds "config").license }} license [See project license.](LICENSE). + +{{ end }} + +## Don't forget to 🌟 Star 🌟 the repo if you like {{(ds "config").name}} + +{{ if has (ds "config") "github_repo" }} +[Your feedback is appreciated]({{ printf "https://github.com/%s/issues" (ds "config").github_repo}}) +{{ else if has (ds "config") "gitlab_host" }} +[Your feedback is appreciated]({{ printf "https://%s/%s/-/issues" (ds "config").gitlab_host (ds "config").gitlab_repo}}) +{{ else if has (ds "config") "gitlab_repo" }} +[Your feedback is appreciated]({{ printf "https://gitlab.com/%s/-/issues" (ds "config").gitlab_repo}}) +{{ end }} diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..f67650f --- /dev/null +++ b/setup.cfg @@ -0,0 +1,29 @@ +[bumpversion] +files = package.json docs/usage.md internal/version/version.go docs/examples/common.md +commit = False +tag = False +current_version = 0.0.0 + +[bumpversion:file:setup.cfg] +search = {current_version} +replace = {new_version} + +[bumpversion:file:package.json] +search = {current_version} +replace = {new_version} + +[bumpversion:file:docs/usage.md] +search = {current_version} +replace = {new_version} + +[bumpversion:file:internal/version/version.go] +search = {current_version} +replace = {new_version} + +[bumpversion:file:sonar-project.properties] +search = {current_version} +replace = {new_version} + +[bumpversion:file:docs/examples/common.md] +search = {current_version} +replace = {new_version} diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..ce6b454 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,9 @@ +sonar.organization=hadenlabs +sonar.projectKey=hadenlabs:terraform-module-template +sonar.projectName=terraform-module-template +sonar.projectVersion=0.0.0 +sonar.projectBaseDir=./ +sonar.sources=./ +sonar.coverage.dtdVerification=false +sonar.coverage.exclusions=provision +sonar.sourceEncoving=UTF-8 diff --git a/test/.keep b/test/.keep new file mode 100644 index 0000000..e69de29 diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..e69de29 diff --git a/versions.tf b/versions.tf new file mode 100644 index 0000000..027a8e3 --- /dev/null +++ b/versions.tf @@ -0,0 +1,6 @@ +terraform { + required_version = ">= 0.12.20, < 2.0" + + required_providers { + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..7103981 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3374 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/highlight@^7.10.4": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/runtime-corejs3@^7.9.2": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz#6bf5fbc0b961f8e3202888cb2cd0fb7a0a9a3f66" + integrity sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@eslint/eslintrc@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" + integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606" + integrity sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.7.tgz#677bd9117e8164dc319987dd6ff5fc1ba6fbf18b" + integrity sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A== + +"@tsconfig/node14@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.0.tgz#5bd046e508b1ee90bc091766758838741fdefd6e" + integrity sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ== + +"@tsconfig/node16@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" + integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/fined@*": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/fined/-/fined-1.1.2.tgz#05d2b9f93d144855c97c18c9675f424ed01400c4" + integrity sha512-hzzTS+X9EqDhx4vwdch/DOZci/bfh5J6Nyz8lqvyfBg2ROx2fPafX+LpDfpVgSvQKj0EYkwTYpBO3z2etwbkOw== + +"@types/glob@*", "@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/inquirer@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-6.5.0.tgz#b83b0bf30b88b8be7246d40e51d32fe9d10e09be" + integrity sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw== + dependencies: + "@types/through" "*" + rxjs "^6.4.0" + +"@types/interpret@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/interpret/-/interpret-1.1.1.tgz#b1bf85b0420e2414b989ce237658ad20dc03719b" + integrity sha512-HZ4d0m2Ebl8DmrOdYZHgYyipj/8Ftq1/ssB/oQR7fqfUrwtTP7IW3BDi2V445nhPBLzZjEkApaPVp83moSCXlA== + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.7": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/liftoff@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@types/liftoff/-/liftoff-2.5.1.tgz#2eb4c1f86e9d5ee85571e56db0084b26af129ced" + integrity sha512-nB3R6Q9CZcM07JgiTK6ibxqrG1reiHE+UX7em/W1DKwVBxDlfKWOefQjk4jubY5xX+GDxVsWR2KD1SenPby8ow== + dependencies: + "@types/fined" "*" + "@types/interpret" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== + +"@types/node@*": + version "14.14.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" + integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== + +"@types/rimraf@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8" + integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + +"@types/through@*": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" + integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^4.26.1": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" + integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== + dependencies: + "@typescript-eslint/experimental-utils" "4.31.2" + "@typescript-eslint/scope-manager" "4.31.2" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" + integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^3.0.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/parser@^4.26.1": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" + integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== + dependencies: + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" + integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/types@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" + integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" + integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" + integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== + dependencies: + "@typescript-eslint/types" "4.31.2" + eslint-visitor-keys "^2.0.0" + +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" + integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + 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" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" + integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +common-tags@^1.4.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-pure@^3.0.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.14.0.tgz#72bcfacba74a65ffce04bf94ae91d966e80ee553" + integrity sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= + dependencies: + no-case "^2.2.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + +es-abstract@^1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.23.4: + version "2.23.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" + integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.4.0" + minimatch "^3.0.4" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-prettier@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" + integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^7.28.0: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" + integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +eslint@^7.9.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.21" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.0.3, fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@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-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + +globals@^13.9.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" + integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + dependencies: + type-fest "^0.20.2" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@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" + +globby@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.2: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +handlebars@^4.4.3: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +interpret@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-core-module@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= + dependencies: + lower-case "^1.1.0" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= + dependencies: + upper-case "^1.1.0" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.2: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +liftoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.merge@^4.6.0, lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +loglevel-colored-level-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" + integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= + dependencies: + chalk "^1.1.3" + loglevel "^1.4.1" + +loglevel@^1.4.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= + dependencies: + lower-case "^1.1.2" + +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^3.0.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-plop@^0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/node-plop/-/node-plop-0.26.3.tgz#d6fa7e71393c8b940513ba8c4868f8aaa6dea9df" + integrity sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q== + dependencies: + "@babel/runtime-corejs3" "^7.9.2" + "@types/inquirer" "^6.5.0" + change-case "^3.1.0" + del "^5.1.0" + globby "^10.0.1" + handlebars "^4.4.3" + inquirer "^7.1.0" + isbinaryfile "^4.0.2" + lodash.get "^4.4.2" + mkdirp "^0.5.1" + resolve "^1.12.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= + dependencies: + no-case "^2.2.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.2.1, picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +plop@^2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/plop/-/plop-2.7.6.tgz#1fa5360cd5b04e9932ce677bb6bd44750d97ae67" + integrity sha512-IgnYAsC3Ni7t1cDU7wH2151CD22YhMxH8PFh+iPzCf+WuGEWXslJ5t1Tpr0N/gjL23CAV/HbLAWug2IPM2YrHg== + dependencies: + "@types/liftoff" "^2.5.1" + chalk "^1.1.3" + interpret "^1.2.0" + liftoff "^2.5.0" + minimist "^1.2.5" + node-plop "^0.26.3" + ora "^3.4.0" + v8flags "^2.0.10" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-eslint@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-12.0.0.tgz#b4dab5111aad1c0dca062eb7f92a69d5fb1ac1d3" + integrity sha512-N8SGGQwAosISXTNl1E57sBbtnqUGlyRWjcfIUxyD3HF4ynehA9GZ8IfJgiep/OfYvCof/JEpy9ZqSl250Wia7A== + dependencies: + "@typescript-eslint/parser" "^3.0.0" + common-tags "^1.4.0" + dlv "^1.1.0" + eslint "^7.9.0" + indent-string "^4.0.0" + lodash.merge "^4.6.0" + loglevel-colored-level-prefix "^1.0.0" + prettier "^2.0.0" + pretty-format "^23.0.1" + require-relative "^0.8.7" + typescript "^3.9.3" + vue-eslint-parser "~7.1.0" + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + +prettier@^2.3.2: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + +pretty-format@^23.0.1: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.4.0, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slugify@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.5.3.tgz#36e009864f5476bfd5db681222643d92339c890d" + integrity sha512-/HkjRdwPY3yHJReXu38NiusZw2+LLE2SrhkWJtmlPDB1fqFSvioYj62NkPcrKiNCgRLeGcGK7QBvr1iQwybeXw== + +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= + dependencies: + no-case "^2.2.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + 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" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + 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@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + +table@^6.0.4: + version "6.0.9" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.9.tgz#790a12bf1e09b87b30e60419bafd6a1fd85536fb" + integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ== + dependencies: + ajv "^8.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + lodash.clonedeep "^4.5.0" + lodash.flatten "^4.4.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +ts-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" + integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== + dependencies: + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.17.1, tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typescript@^3.9.3: + version "3.9.9" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" + integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + +typescript@^4.3.5: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + +uglify-js@^3.1.4: + version "3.13.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" + integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + +unbox-primitive@^1.0.0, unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= + dependencies: + upper-case "^1.1.1" + +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vue-eslint-parser@~7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz#c43c1c715ff50778b9a7e9a4e16921185f3425d3" + integrity sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA== + dependencies: + debug "^4.1.1" + eslint-scope "^5.0.0" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.0.1" + lodash "^4.17.15" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==