diff --git a/.cspell.json b/.cspell.json new file mode 100644 index 0000000..3483b82 --- /dev/null +++ b/.cspell.json @@ -0,0 +1,30 @@ +{ + "version": "0.2", + "language": "en", + "words": ["cpus", "graphviz", "markdownlint", "pytest", "setuptools", "venv"], + "ignoreWords": [ + "amannn", + "asctime", + "codeowners", + "doctest", + "dorny", + "getcwd", + "hapag", + "ibiqlik", + "Intelli", + "jsonlogger", + "junitxml", + "kayman", + "levelname", + "pycache", + "pythonjsonlogger", + "qualname", + "regexes", + "renovaterc", + "rhysd", + "shuf", + "shunsuke", + "signoff", + "tpng" + ] +} diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..28e6208 --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 132 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..1dd2b61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug report +about: Found a bug? Report it! +title: '' +labels: new, bug +assignees: '' +--- + + + +# Describe the bug + +A clear and concise description of what the bug is. + +# To Reproduce + +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +# Expected behavior + +A clear and concise description of what you expected to happen. + +# Additional context + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..437c9db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,39 @@ +--- +name: Feature Request +about: Propose a new feature +title: '' +labels: new, enhancement +assignees: '' +--- + +# Describe the solution you'd like + + + +# Describe alternatives you've considered + + + +# Suggest a solution + + + +# Additional context + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 34e0e0d..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/.github/workflows" - schedule: - interval: "weekly" - commit-message: - prefix: "ci" - - - package-ecosystem: "npm" - directory: "/.release" - schedule: - interval: "weekly" - commit-message: - prefix: "ci" - - - package-ecosystem: "maven" - directory: "/" - schedule: - interval: "daily" - commit-message: - prefix: "chore(deps)" \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c955f1a..11d70f3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,6 +10,10 @@ Fixes #(issue number) yes: please describe the migration no: please delete the whole paragraph +# Verification + +Please describe the test cases you used to verify your code. Did you check the change in your environment? + # Checklist - [ ] My code follows the style guidelines of the project diff --git a/.github/workflows/feature-branch.yml b/.github/workflows/feature-branch.yml new file mode 100644 index 0000000..a31a683 --- /dev/null +++ b/.github/workflows/feature-branch.yml @@ -0,0 +1,75 @@ +--- +name: Python package + +# yamllint disable-line rule:truthy +on: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11"] + steps: + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e . + + - name: Test with pytest + run: | + pip install -e ".[test]" + pytest tests --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html + + - name: Upload pytest test results + uses: actions/upload-artifact@v3 + with: + name: pytest-results-${{ matrix.python-version }} + path: junit/test-results-${{ matrix.python-version }}.xml + # Use always() to always run this step to publish test results when there are test failures + if: ${{ always() }} + + flake8-lint: + runs-on: ubuntu-latest + name: Lint with Flake8 + steps: + - name: Check out source repository + # yamllint disable-line rule:comments + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Set up Python environment + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: flake8 Lint + uses: py-actions/flake8@v2 + + ruff-lint: + runs-on: ubuntu-latest + name: Lint with Ruff + steps: + - name: Check out source repository + # yamllint disable-line rule:comments + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Set up Python environment + uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: Ruff Lint + run: | + pip install -e ".[pipeline]" + + # default set of ruff rules with GitHub Annotations + ruff --format=github --target-version=py310 src/ diff --git a/.github/workflows/java-pr.yml b/.github/workflows/java-pr.yml deleted file mode 100644 index 57bb369..0000000 --- a/.github/workflows/java-pr.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Build Java PR - -on: - pull_request: - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn -B verify package --file pom.xml diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 0000000..175ef00 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,105 @@ +--- +name: Lint files + +# yamllint disable-line rule:truthy +on: + pull_request: + +jobs: + find-changes: + runs-on: ubuntu-latest + steps: + # yamllint disable-line rule:comments + - uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 # v2.11.1 + id: changes + with: + filters: | + json: + - '**/*.json' + markdown: + - '**/*.md' + renovate-config: + - '.renovaterc.json' + workflow: + - '.github/workflows/*.yml' + - '.github/workflows/*.yaml' + yaml: + - '**/*.yaml' + - '**/*.yml' + outputs: + json: ${{ steps.changes.outputs.json }} + markdown: ${{ steps.changes.outputs.markdown }} + renovate-config: ${{ steps.changes.outputs.renovate-config }} + workflow: ${{ steps.changes.outputs.workflow }} + yaml: ${{ steps.changes.outputs.yaml }} + + lint-json: + runs-on: ubuntu-latest + continue-on-error: true + if: needs.find-changes.outputs.json == 'true' + needs: find-changes + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Run JSON Lint + run: bash <(curl -s https://raw.githubusercontent.com/CICDToolbox/json-lint/master/pipeline.sh) + + lint-markdown: + runs-on: ubuntu-latest + continue-on-error: true + if: needs.find-changes.outputs.markdown == 'true' + needs: find-changes + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Validate Markdown file + run: | + npm install -g markdownlint-cli + markdownlint -c .markdownlint.yml -i CHANGELOG.md "**/*.md" + + lint-renovate: + runs-on: ubuntu-latest + continue-on-error: true + if: needs.find-changes.outputs.renovate-config == 'true' + needs: find-changes + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + # yamllint disable-line rule:comments + - uses: suzuki-shunsuke/github-action-renovate-config-validator@7ab3d8f19305664925f3e626580f075f14e40386 # v0.1.2 + + lint-workflow: + runs-on: ubuntu-latest + continue-on-error: true + needs: find-changes + if: needs.find-changes.outputs.workflow == 'true' + container: + image: rhysd/actionlint:1.6.23@sha256:02ccb6d91e4cb4a7b21eb99d5274d257e81ae667688d730e89d7ea0d6d35db91 + options: --cpus 1 --user root + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Validate Github workflows + run: | + mkdir .git + actionlint -color + + lint-yaml: + runs-on: ubuntu-latest + continue-on-error: true + needs: find-changes + if: needs.find-changes.outputs.yaml == 'true' + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: yaml-lint + # yamllint disable-line rule:comments + uses: ibiqlik/action-yamllint@2576378a8e339169678f9939646ee3ee325e845c # v3.1.1 + with: + config_file: .yamllint.yml + strict: true diff --git a/.github/workflows/pull-request-lint.yml b/.github/workflows/pull-request-lint.yml deleted file mode 100644 index 2640aea..0000000 --- a/.github/workflows/pull-request-lint.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: "Lint PR" - -on: - pull_request_target: - types: - - opened - - edited - - synchronize - -jobs: - main: - name: Validate PR title - runs-on: ubuntu-latest - steps: - - uses: amannn/action-semantic-pull-request@v5 - env: - GITHUB_TOKEN: ${{ secrets.LINT_PR_GH_TOKEN }} - with: - # Default: https://github.com/commitizen/conventional-commit-types - types: | - build - chore - ci - docs - feat - fix - perf - refactor - revert - style - test - # Configure which scopes are allowed. - scopes: | - deps - # Configure that a scope must always be provided. - requireScope: false - # Configure additional validation for the subject based on a regex. - # This example ensures the subject doesn't start with an uppercase character. - subjectPattern: ^(?![A-Z]).+$ - # If `subjectPattern` is configured, you can use this property to override - # the default error message that is shown when the pattern doesn't match. - # The variables `subject` and `title` can be used within the message. - subjectPatternError: | - The subject "{subject}" found in the pull request title "{title}" - didn't match the configured pattern. Please ensure that the subject - doesn't start with an uppercase character. - # For work-in-progress PRs you can typically use draft pull requests - # from GitHub. However, private repositories on the free plan don't have - # this option and therefore this action allows you to opt-in to using the - # special "[WIP]" prefix to indicate this state. This will avoid the - # validation of the PR title and the pull request checks remain pending. - # Note that a second check will be reported if this is enabled. - wip: true - # When using "Squash and merge" on a PR with only one commit, GitHub - # will suggest using that commit message instead of the PR title for the - # merge commit, and it's easy to commit this by mistake. Enable this option - # to also validate the commit message for one commit PRs. - validateSingleCommit: true - # Related to `validateSingleCommit` you can opt-in to validate that the PR - # title matches a single commit to avoid confusion. - validateSingleCommitMatchesPrTitle: true diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..36f7ce5 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,50 @@ +--- +name: "Pull Request" + +# yamllint disable-line rule:truthy +on: + pull_request_target: + types: + - opened + - edited + - synchronize + branches-ignore: + - "release-please--branches--*" + +jobs: + main: + name: Validate PR title + runs-on: ubuntu-latest + steps: + # yamllint disable-line rule:comments + - uses: amannn/action-semantic-pull-request@b6bca70dcd3e56e896605356ce09b76f7e1e0d39 # v5.1.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + build + chore + ci + docs + feat + fix + perf + refactor + revert + style + test + # Configure which scopes are allowed. + # deps - dependency updates + # main - for release-please (scope used for releases) + scopes: | + deps + main + requireScope: false + subjectPattern: ^(?![A-Z]).+$ + subjectPatternError: | + The subject "{subject}" found in the pull request title "{title}" + didn't match the configured pattern. Please ensure that the subject + doesn't start with an uppercase character. + wip: true + validateSingleCommit: false + validateSingleCommitMatchesPrTitle: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ec89723 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,21 @@ +--- +name: Create a release + +# yamllint disable-line rule:truthy +on: + push: + branches: + - main + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Release + # yamllint disable-line rule:comments + uses: google-github-actions/release-please-action@d3c71f9a0a55385580de793de58da057b3560862 # v3.7.4 + with: + # to create protected tags + token: ${{ secrets.RELEASE_PLEASE_GITHUB_TOKEN }} + release-type: python + signoff: "Matthias Kay " diff --git a/.github/workflows/semantic-release-dry-run.yml b/.github/workflows/semantic-release-dry-run.yml deleted file mode 100644 index 0a6779d..0000000 --- a/.github/workflows/semantic-release-dry-run.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Release Test - -on: - push: - branches: - - release-dry-run - -jobs: - dry-release: - name: Release dry-run - runs-on: ubuntu-latest - steps: - - name: Checkout dry branch - uses: actions/checkout@v3 - with: - ref: release-dry-run - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: "lts/*" - - - name: Install dependencies - run: npm --prefix .release/ ci - - - name: Dry run - env: - GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GH_TOKEN }} - run: unset GITHUB_ACTIONS && npx --prefix .release/ semantic-release --dry-run --no-ci --debug diff --git a/.github/workflows/semantic-release.yml b/.github/workflows/semantic-release.yml deleted file mode 100644 index 6d920be..0000000 --- a/.github/workflows/semantic-release.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Release - -on: - push: - branches: - - main - -jobs: - release: - name: Release - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: "lts/*" - - name: Install dependencies - run: npm --prefix .release/ ci - - name: Release - run: npx --prefix .release/ semantic-release - env: - GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_GH_TOKEN }} diff --git a/.github/workflows/slash-ops-command-help.yml b/.github/workflows/slash-ops-command-help.yml new file mode 100644 index 0000000..1b8a8d7 --- /dev/null +++ b/.github/workflows/slash-ops-command-help.yml @@ -0,0 +1,37 @@ +--- +name: Execute ChatOps command + +# yamllint disable-line rule:truthy +on: + repository_dispatch: + types: + - help-command + +jobs: + help-command: + name: "ChatOps: /help" + runs-on: ubuntu-latest + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + - name: Choose maintainer + id: vars + run: | + maintainer=$(grep -oE "@[a-zA-Z0-9_-]+" CODEOWNERS | shuf -n 1) + echo "maintainer=$maintainer" >> "$GITHUB_OUTPUT" + + - name: Create comment + # yamllint disable-line rule:comments + uses: actions/github-script@98814c53be79b1d30f795b907e553d8679345975 # v6.4.0 + with: + # yamllint disable rule:line-length + script: | + // adds a comment to the PR (there is the issue API, which works work PRs too) + github.rest.issues.createComment({ + issue_number: context.payload.client_payload.github.payload.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Hey there ${{ steps.vars.outputs.maintainer }}, could you please help @${{ github.event.client_payload.github.payload.comment.user.login }} out?' + }) + # yamllint enable rule:line-length diff --git a/.github/workflows/slash-ops-comment-dispatch.yml b/.github/workflows/slash-ops-comment-dispatch.yml new file mode 100644 index 0000000..a941006 --- /dev/null +++ b/.github/workflows/slash-ops-comment-dispatch.yml @@ -0,0 +1,22 @@ +--- +name: PR commented + +# yamllint disable-line rule:truthy +on: + issue_comment: + types: + - created + +jobs: + slash-command-dispatch: + runs-on: ubuntu-latest + steps: + - name: Slash Command Dispatch + # yamllint disable-line rule:comments + uses: peter-evans/slash-command-dispatch@a28ee6cd74d5200f99e247ebc7b365c03ae0ef3c # v3.0.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue-type: pull-request + reactions: true + commands: | + help diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml new file mode 100644 index 0000000..c676d4f --- /dev/null +++ b/.github/workflows/spelling.yml @@ -0,0 +1,18 @@ +--- +name: 'Check spelling' + +# yamllint disable-line rule:truthy +on: + pull_request: + +jobs: + cspell: + runs-on: ubuntu-latest + steps: + # yamllint disable-line rule:comments + - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + + # yamllint disable-line rule:comments + - uses: streetsidesoftware/cspell-action@cdaa4625255f2e8d5cc9d06c60ed9b4b0fe4bf03 # v2.20.0 + with: + config: .cspell.json diff --git a/.github/workflows/welcome-message.yml b/.github/workflows/welcome-message.yml new file mode 100644 index 0000000..c6e3f0a --- /dev/null +++ b/.github/workflows/welcome-message.yml @@ -0,0 +1,28 @@ +--- +name: PR opened + +# yamllint disable-line rule:truthy +on: + pull_request_target: + types: + - opened + +jobs: + add-welcome-message: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + # yamllint disable-line rule:comments + - uses: actions/github-script@98814c53be79b1d30f795b907e553d8679345975 # v6.4.0 + with: + # yamllint disable rule:line-length + script: | + // adds a comment to the PR (there is the issue API only which works work PRs too) + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Hey @${{ github.event.pull_request.user.login }}! 👋\n\nThank you for your contribution to the project. Please refer to the [contribution rules](../blob/main/CONTRIBUTING.md) for a quick overview of the process.\n\nMake sure that this PR clearly explains:\n\n- the problem being solved\n- the best way a reviewer and you can test your changes\n\nWith submitting this PR you confirm that you hold the rights of the code added and agree that it will published under this [LICENSE](../blob/main/LICENSE).\n\nThe following ChatOps commands are supported:\n- `/help`: notifies a maintainer to help you out\n\nSimply add a comment with the command in the first line. If you need to pass more information, separate it with a blank line from the command.\n\n_This message was generated automatically. You are welcome to [improve it](../blob/main/.github/workflows/welcome-message.yml)._' + }) + # yamllint enable rule:line-length diff --git a/.gitignore b/.gitignore index c87169d..0b53f57 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,11 @@ +# IntelliJ .idea/ -target/ -node_modules/ -release/ -*.iml -model*.json -model*.dot -my-file.dot -my-file.json +# Python +**/__pycache__ +**/*.egg-info/ +.pytest_cache/ +venv/ + +# test output +target/ diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 0000000..5ed51f8 --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,12 @@ +--- +# Default state for all rules +default: true + +# MD013/line-length - Line length +MD013: + # Number of characters + line_length: 132 + # Number of characters for headings + heading_line_length: 132 + # Number of characters for code blocks + code_block_line_length: 132 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b6dfba6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +--- +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.1.0 + hooks: + - id: fix-byte-order-marker + - id: check-added-large-files + args: + - "--maxkb=20" + - id: check-case-conflict + - id: check-yaml + - id: check-json + - id: end-of-file-fixer + - id: trailing-whitespace + - id: mixed-line-ending + - id: check-merge-conflict + - id: check-shebang-scripts-are-executable + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.6.0 + hooks: + - id: prettier diff --git a/.release/package-lock.json b/.release/package-lock.json deleted file mode 100644 index 73b8542..0000000 --- a/.release/package-lock.json +++ /dev/null @@ -1,4426 +0,0 @@ -{ - "name": "terraform-aws-bastion-host-ssm", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", - "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", - "requires": { - "@octokit/types": "^8.0.0" - } - }, - "@octokit/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz", - "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", - "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", - "requires": { - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", - "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^8.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", - "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==" - }, - "@octokit/plugin-paginate-rest": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz", - "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", - "requires": { - "@octokit/types": "^8.0.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==" - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz", - "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", - "requires": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", - "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", - "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", - "requires": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz", - "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", - "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^5.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.7.0" - } - }, - "@octokit/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz", - "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", - "requires": { - "@octokit/openapi-types": "^14.0.0" - } - }, - "@pnpm/config.env-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", - "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==" - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "requires": { - "graceful-fs": "4.2.10" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - } - } - }, - "@pnpm/npm-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", - "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", - "requires": { - "@pnpm/config.env-replace": "^1.0.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - } - }, - "@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - } - }, - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==" - }, - "@semantic-release/exec": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", - "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - } - }, - "@semantic-release/git": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", - "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - } - }, - "@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "requires": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@semantic-release/npm": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-10.0.2.tgz", - "integrity": "sha512-Mo0XoBza4pUapxiBhLLYXeSZ9tkuHDUd/WvMbpilwuPRfJDnQXMqx5tBVon8d2mBk8JXmXpqB+ExhlWJmVT40A==", - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^4.0.1", - "execa": "^7.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^9.5.0", - "rc": "^1.2.8", - "read-pkg": "^7.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==" - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - }, - "read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "requires": { - "type-fest": "^1.0.2" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" - }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - } - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "env-ci": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.0.0.tgz", - "integrity": "sha512-Q3cjr1tX9xwigprw4G8M3o7PIOO/1LYji6TyGsbD1WfMmD23etZvhgmPXJqkP788yH4dgSSK7oaIMuaayUJIfg==", - "requires": { - "execa": "^7.0.0", - "java-properties": "^1.0.2" - }, - "dependencies": { - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "requires": { - "semver-regex": "^4.0.5" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==" - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - }, - "marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==" - }, - "npm": { - "version": "9.6.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.3.tgz", - "integrity": "sha512-KMAw6cJF5JGPJz/NtsU8H1sMqb34qPGnSMaSWrVO8bzxOdAXJNAtDXATvLl0lflrImIze1FZCqocM8wdIu3Sfg==", - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.6", - "@npmcli/config": "^6.1.5", - "@npmcli/map-workspaces": "^3.0.3", - "@npmcli/package-json": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.0.5", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.1", - "glob": "^9.3.1", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^3.0.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.14", - "libnpmexec": "^5.0.14", - "libnpmfund": "^4.0.14", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.3", - "libnpmpack": "^5.0.14", - "libnpmpublish": "^7.1.3", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.0.3", - "minimatch": "^7.4.3", - "minipass": "^4.2.5", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.3", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.1", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.0.0", - "read-package-json": "^6.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.8", - "ssri": "^10.0.1", - "tar": "^6.1.13", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.0", - "write-file-atomic": "^5.0.0" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true - }, - "@npmcli/arborist": { - "version": "6.2.6", - "bundled": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^7.4.2", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/config": { - "version": "6.1.5", - "bundled": true, - "requires": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^3.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "3.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "bundled": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.0.4", - "bundled": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "bundled": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/map-workspaces": { - "version": "3.0.3", - "bundled": true, - "requires": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^9.3.1", - "minimatch": "^7.4.2", - "read-package-json-fast": "^3.0.0" - } - }, - "@npmcli/metavuln-calculator": { - "version": "5.0.0", - "bundled": true, - "requires": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "bundled": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "2.0.0", - "bundled": true - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "bundled": true - }, - "@npmcli/package-json": { - "version": "3.0.0", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "bundled": true, - "requires": { - "which": "^3.0.0" - } - }, - "@npmcli/query": { - "version": "3.0.0", - "bundled": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@npmcli/run-script": { - "version": "6.0.0", - "bundled": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - } - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "bundled": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true - }, - "@tufjs/models": { - "version": "1.0.1", - "bundled": true, - "requires": { - "minimatch": "^7.4.2" - } - }, - "abbrev": { - "version": "2.0.0", - "bundled": true - }, - "abort-controller": { - "version": "3.0.0", - "bundled": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "bundled": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "4.0.0", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true - }, - "bin-links": { - "version": "4.0.1", - "bundled": true, - "requires": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "bundled": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.0.5", - "bundled": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^9.3.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true - }, - "ci-info": { - "version": "3.8.0", - "bundled": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.3", - "bundled": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true - }, - "cmd-shim": { - "version": "6.0.1", - "bundled": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "cssesc": { - "version": "3.0.0", - "bundled": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true - } - } - }, - "defaults": { - "version": "1.0.4", - "bundled": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "depd": { - "version": "2.0.0", - "bundled": true - }, - "diff": { - "version": "5.1.0", - "bundled": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true - }, - "event-target-shim": { - "version": "5.0.1", - "bundled": true - }, - "events": { - "version": "3.3.0", - "bundled": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "bundled": true - }, - "fs-minipass": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "gauge": { - "version": "5.0.0", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "9.3.1", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "6.1.1", - "bundled": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "bundled": true - }, - "ignore-walk": { - "version": "6.0.2", - "bundled": true, - "requires": { - "minimatch": "^7.4.2" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "3.0.1", - "bundled": true - }, - "init-package-json": { - "version": "5.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.11.0", - "bundled": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "bundled": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "just-diff": { - "version": "6.0.0", - "bundled": true - }, - "just-diff-apply": { - "version": "5.5.0", - "bundled": true - }, - "libnpmaccess": { - "version": "7.0.2", - "bundled": true, - "requires": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmdiff": { - "version": "5.0.14", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.2.6", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^7.4.2", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - } - }, - "libnpmexec": { - "version": "5.0.14", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.2.6", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "4.0.14", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.2.6" - } - }, - "libnpmhook": { - "version": "9.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmorg": { - "version": "5.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmpack": { - "version": "5.0.14", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.2.6", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - } - }, - "libnpmpublish": { - "version": "7.1.3", - "bundled": true, - "requires": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.0.0", - "ssri": "^10.0.1" - } - }, - "libnpmsearch": { - "version": "6.0.2", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmteam": { - "version": "5.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmversion": { - "version": "4.0.2", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.18.3", - "bundled": true - }, - "make-fetch-happen": { - "version": "11.0.3", - "bundled": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minimatch": { - "version": "7.4.3", - "bundled": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.5", - "bundled": true - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.1", - "bundled": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^4.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true - }, - "ms": { - "version": "2.1.3", - "bundled": true - }, - "mute-stream": { - "version": "1.0.0", - "bundled": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true - }, - "node-gyp": { - "version": "9.3.1", - "bundled": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "bundled": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "cacache": { - "version": "16.1.3", - "bundled": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "bundled": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "bundled": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "bundled": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "bundled": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "7.1.0", - "bundled": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "4.0.0", - "bundled": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "3.0.0", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.1.0", - "bundled": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.0", - "bundled": true - }, - "npm-package-arg": { - "version": "10.1.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "7.0.4", - "bundled": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "bundled": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "7.0.1", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-registry-fetch": { - "version": "14.0.3", - "bundled": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-user-validate": { - "version": "2.0.0", - "bundled": true - }, - "npmlog": { - "version": "7.0.1", - "bundled": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "15.1.1", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "3.0.1", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-scurry": { - "version": "1.6.1", - "bundled": true, - "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "bundled": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "3.0.0", - "bundled": true - }, - "process": { - "version": "0.11.10", - "bundled": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "1.0.0", - "bundled": true, - "requires": { - "read": "^2.0.0" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true - }, - "read": { - "version": "2.0.0", - "bundled": true, - "requires": { - "mute-stream": "~1.0.0" - } - }, - "read-cmd-shim": { - "version": "4.0.0", - "bundled": true - }, - "read-package-json": { - "version": "6.0.1", - "bundled": true, - "requires": { - "glob": "^9.3.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "4.3.0", - "bundled": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "semver": { - "version": "7.3.8", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true - }, - "sigstore": { - "version": "1.2.0", - "bundled": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.0.0" - } - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true - }, - "socks": { - "version": "2.7.1", - "bundled": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.2.0", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "bundled": true - }, - "ssri": { - "version": "10.0.1", - "bundled": true, - "requires": { - "minipass": "^4.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.13", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true - }, - "treeverse": { - "version": "3.0.0", - "bundled": true - }, - "tuf-js": { - "version": "1.1.2", - "bundled": true, - "requires": { - "@tufjs/models": "1.0.1", - "make-fetch-happen": "^11.0.1" - } - }, - "unique-filename": { - "version": "3.0.0", - "bundled": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "bundled": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "3.0.0", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "5.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==" - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "requires": { - "p-map": "^2.0.0" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==" - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "requires": { - "esprima": "~4.0.0" - } - }, - "registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semantic-release": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-21.0.1.tgz", - "integrity": "sha512-UhGxTUXHJQCBFgEQRZszLOHDpMduDSHGq3Q+30Bu+g0GbXh/EW508+kuFHezP5m0mN8xINW8hooiR3dzSV5ZLA==", - "requires": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^10.0.2", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^9.0.0", - "execa": "^7.0.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", - "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "requires": { - "lru-cache": "^7.5.1" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==" - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "requires": { - "p-locate": "^6.0.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==" - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - }, - "read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - } - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "requires": { - "semver": "^7.3.5" - } - }, - "semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - }, - "tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "requires": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==" - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "uglify-js": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", - "integrity": "sha512-6iCVm2omGJbsu3JWac+p6kUiOpg3wFO2f8lIXjfEb8RrmLjzog1wTPMmwKB7swfzzqxj9YM+sGUM++u1qN4qJg==", - "optional": true - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" - } - } -} diff --git a/.release/package.json b/.release/package.json deleted file mode 100644 index cef2cce..0000000 --- a/.release/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "terraform-aws-bastion-host-ssm", - "version": "1.0.0", - "description": "# Module Documentation ## Requirements", - "main": "index.js", - "directories": { - "example": "../examples" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Hapag-Lloyd/terraform-aws-bastion-host-ssm.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/Hapag-Lloyd/terraform-aws-bastion-host-ssm/issues" - }, - "homepage": "https://github.com/Hapag-Lloyd/terraform-aws-bastion-host-ssm#readme", - "dependencies": { - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^8.0.7", - "@semantic-release/release-notes-generator": "^10.0.3", - "conventional-changelog-conventionalcommits": "^5.0.0", - "semantic-release": "^21.0.1" - } -} diff --git a/.release/prepare-release.sh b/.release/prepare-release.sh deleted file mode 100755 index d1a874d..0000000 --- a/.release/prepare-release.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -echo "version = $1" - -# Get version number from version tag -JAR_VERSION=`echo $1 | cut -d'v' -f2` -echo "jar = $JAR_VERSION" -# Set new library version in pom.xml using mvn versions:set command -# These new pom.xml and changelog.md generated by @semantic-release/changelog -# will be commit it by @semantic-release/git -mvn versions:set -DnewVersion=$JAR_VERSION - -# Package the new library version and copy it to release folder -# These files will be upload to github by @semantic-release/github -mvn package - -# copy files to release folder which is published on Github -mkdir release -find . -maxdepth 3 -name "*.jar" -exec cp {} release/ \; diff --git a/.releaserc.yml b/.releaserc.yml deleted file mode 100644 index 44b6bb1..0000000 --- a/.releaserc.yml +++ /dev/null @@ -1,114 +0,0 @@ ---- -branches: - - main - - release-dry-run - -tagFormat: "${version}" - -preset: 'conventionalcommits' - -plugins: - - "@semantic-release/commit-analyzer" - - "@semantic-release/release-notes-generator" - - "@semantic-release/changelog" - - "@semantic-release/git" - - "@semantic-release/github" - - "@semantic-release/exec" - -verifyConditions: - - '@semantic-release/git' - - '@semantic-release/github' - - '@semantic-release/changelog' - -analyzeCommits: - - path: "@semantic-release/commit-analyzer" - releaseRules: - - breaking: true - release: major - - type: build - release: false - - type: chore - scope: deps - release: patch - - type: ci - release: false - - type: docs - release: patch - - type: feat - release: minor - - type: fix - release: patch - - type: perf - release: patch - - type: refactor - release: patch - - type: revert - release: patch - - type: style - release: false - - type: test - release: false - -generateNotes: - - path: "@semantic-release/release-notes-generator" - writerOpts: - groupBy: "type" - commitGroupsSort: - - "feat" - - "perf" - - "fix" - commitsSort: "header" - linkCompare: true - linkReferences: true - types: - - type: 'build' - section: '🦊 CI/CD' - hidden: false - - type: 'chore' - section: 'Other' - hidden: false - - type: 'ci' - section: '🦊 CI/CD' - hidden: false - - type: 'docs' - section: '📔 Docs' - hidden: false - - type: 'feat' - section: '🚀 Features' - hidden: false - - type: 'fix' - section: '🛠 Fixes' - hidden: false - - type: 'perf' - section: '⏩ Performance' - hidden: false - - type: 'refactor' - section: ':scissors: Refactor' - hidden: false - - type: 'revert' - section: '🙅‍♂️ Reverts' - hidden: false - - type: 'style' - section: '💈 Style' - hidden: false - - type: 'test' - section: '🧪 Tests' - hidden: false - -prepare: - - path: "@semantic-release/git" - - path: "@semantic-release/changelog" - changelogFile: "CHANGELOG.md" - - path: "@semantic-release/exec" - prepareCmd: ".release/prepare-release.sh ${nextRelease.version}" - -publish: - - path: "@semantic-release/github" - assets: - - path: "CHANGELOG.md" - label: "Changelog" - - path: "release/**" - -success: - -fail: \ No newline at end of file diff --git a/.renovaterc.json b/.renovaterc.json new file mode 100644 index 0000000..d52f58b --- /dev/null +++ b/.renovaterc.json @@ -0,0 +1,6 @@ +{ + "extends": ["github>Hapag-Lloyd/Renovate-Global-Configuration"], + "pip_requirements": { + "fileMatch": ["requirements.txt", "requirements-test.txt", "samples/[\\S/]*constraints.txt", "samples/[\\S/]*constraints-test.txt"] + } +} diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..b77e64c --- /dev/null +++ b/.ruff.toml @@ -0,0 +1 @@ +line-length = 132 diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 0000000..ac95fe9 --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,6 @@ +--- +extends: default + +rules: + line-length: + max: 132 diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..6086aed --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @kayman-mk diff --git a/CONTRIBUTION.md b/CONTRIBUTING.md similarity index 64% rename from CONTRIBUTION.md rename to CONTRIBUTING.md index 64d4ef7..01223a5 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTING.md @@ -7,13 +7,19 @@ We appreciate your thought to contribute to open source. :heart: We want to make - Submit a fix - Propose new features -We use [Github Flow](https://guides.github.com/introduction/flow/index.html), so all code changes happen through pull requests. We actively welcome your pull requests: +We use [Github Flow](https://guides.github.com/introduction/flow/index.html), so all code changes happen through pull +requests. We actively welcome your pull requests: 1. Fork the repo and create your branch from `main`. 2. If you've added code, check one of the examples. 3. Make sure your code lints. 4. Raise a pull request. +## Documentation + +We use [pre-commit](https://pre-commit.com/) for some default checks which are fast and find the most common errors. + ## License -By contributing, you agree that your contributions will be licensed under its MIT license. \ No newline at end of file +By contributing, you agree that your contributions will be licensed under the license available at +[LICENSE](blob/main/LICENSE). diff --git a/README.md b/README.md index d479e02..232b8a7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ + + [![Actions](https://github.com/Hapag-Lloyd/dist-comm-vis/workflows/Release/badge.svg)](https://github.com/Hapag-Lloyd/dist-comm-vis/actions) # Distributed Communication Visualization -This tool analyzes JAR files and creates a diagram to show +This tool analyzes Java source code and creates a diagram to show + - incoming/outgoing HTTP(S) traffic - event receivers and senders @@ -11,36 +14,28 @@ It also creates a high level diagram of multi project communication, e.g. servic Especially useful to visualize the communication between several services. This documentation is always up-to-date as it is generated automatically based on the current version of the software. -# Example -```shell -release="1.11.1" -curl -o analyzer.jar https://github.com/Hapag-Lloyd/dist-comm-vis/releases/download/${RELEASE}/analyzer-${RELEASE}.jar +## Example -# make sure that all dependencies are added to the classpath! -java -cp "analyzer.jar:distributed-projects/microservice-a/target/test-classes" org.springframework.boot.loader.JarLauncher scan com.hlag.tools.commvis.example 1 --name=Customer +```shell +python --name=ServiceNameHere yum install graphviz dot -Tpng model.dot > model.png ``` -For a more sophisticated example check the [scan.sh](scripts/scan.sh) -```shell -scripts/scan.sh distributed-projects/microservice-a/target 1234 service-a -scripts/scan.sh distributed-projects/microservice-b/target 2345 service-b -``` - ![Communication](image/communication.png) - ## Features + +None so far. + +## Planned Features + - extract HTTP(S) consumers: JAX RS, Spring - extract JMS consumers - extract producers via special annotation: Kafka, SQS, SNS, HTTP(S) - extract consumers via special annotation: Kafka, SQS - write a `model.json` file - write a `model.dot` file for [GraphViz](https://gitlab.com/graphviz/graphviz) -- support user defined scanners (see https://github.com/Hapag-Lloyd/dist-comm-vis-api) - -## Planned Features - extract endpoints from Swagger YAML - extract JMS producers diff --git a/distcommvis.iml b/distcommvis.iml new file mode 100644 index 0000000..edcbc0f --- /dev/null +++ b/distcommvis.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/logging.ini b/logging.ini new file mode 100644 index 0000000..2aafa36 --- /dev/null +++ b/logging.ini @@ -0,0 +1,30 @@ +[loggers] +keys = root + +[logger_root] +level = INFO +handlers = console, json_file +qualname = custom + +[handlers] +keys = json_file, console + +[handler_json_file] +class=handlers.RotatingFileHandler +formatter=json +args=(os.getcwd() + '/log.json', 'w', 99999, 10) + +[handler_console] +class = StreamHandler +formatter = plain +args = (sys.stdout,) + +[formatters] +keys = json, plain + +[formatter_json] +format = %(asctime)s - %(name)s - %(levelname)s - %(message)s +class = pythonjsonlogger.jsonlogger.JsonFormatter + +[formatter_plain] +format = %(asctime)s - %(name)s - %(levelname)s - %(message)s diff --git a/lombok.config b/lombok.config deleted file mode 100644 index 869049d..0000000 --- a/lombok.config +++ /dev/null @@ -1,8 +0,0 @@ -# this file is in the root of the project. Don't check parent directories -config.stopBubbling = true - -# fixes Sonar issues. Otherwise the generated code has to be tested -lombok.addLombokGeneratedAnnotation = true - -# throw an IllegalArgumentException if @NonNull fields are null -lombok.nonNull.exceptionType = IllegalArgumentException diff --git a/model.json b/model.json new file mode 100644 index 0000000..d57af4f --- /dev/null +++ b/model.json @@ -0,0 +1,10 @@ +{ + "relations": [ + {}, + { + "type": "rest", + "direction": "out", + "target_project_id": null + } + ] +} diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f486910..0000000 --- a/pom.xml +++ /dev/null @@ -1,237 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 3.0.6 - - - - com.hlag.tools.commvis - distcommvis - 0.0.1-SNAPSHOT - jar - Distributed Communication Visualizer - https://github.com/Hapag-Lloyd/dist-comm-vis - - - - MIT License - https://github.com/Hapag-Lloyd/dist-comm-vis/blob/main/LICENSE - - - - - - Hapag-Lloyd AG - https://www.hapag-lloyd.com/ - - - - - scm:git:git://github.com/Hapag-Lloyd/dist-comm-vis.git - scm:git:ssh://gitHub.com:Hapag-Lloyd/dist-comm-vis.git - https://github.com/Hapag-Lloyd/dist-comm-vis/tree/main - - - - src/main/java - - - src/main/resources - - - - src/test/java - - - src/test/resources - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - pl.project13.maven - git-commit-id-plugin - 4.9.10 - - - get-the-git-infos - - revision - - - - validate-the-git-infos - - validateRevision - - - - - true - true - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0 - - - maven-failsafe-plugin - 3.0.0 - - - - integration-test - verify - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - - com.hlag.tools.commvis.DistributedCommunicationVisualizerApplication - - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.1 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.5.0 - - - attach-javadocs - - jar - - - - - - - - - - com.google.code.gson - gson - 2.10.1 - - - com.hlag.tools.commvis - api - 2.9.12 - - - javax.ejb - javax.ejb-api - 3.2.2 - - - javax.ws.rs - javax.ws.rs-api - 2.1.1 - - - info.picocli - picocli-spring-boot-starter - 4.7.3 - - - org.slf4j - slf4j-api - 1.7.36 - - - org.reflections - reflections - 0.10.2 - - - ch.qos.logback - logback-classic - 1.2.11 - - - com.fasterxml.jackson.core - jackson-databind - 2.15.0 - - - org.apache.commons - commons-lang3 - 3.12.0 - - - org.springframework - spring-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.github.stefanbirkner - system-lambda - 1.2.1 - test - - - org.assertj - assertj-core - 3.24.2 - test - - - org.skyscreamer - jsonassert - 1.5.1 - test - - - - org.projectlombok - lombok - true - provided - - - diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..94b288f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ['setuptools==67.0.0'] +build-backend = 'setuptools.build_meta' diff --git a/scripts/scan.sh b/scripts/scan.sh deleted file mode 100755 index 7e2757d..0000000 --- a/scripts/scan.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Builds the classpath with all libraries and runs the scanner to produce the model. -# -# $1 - path to project to scan. Should contain the jars and classes needed (all dependencies) -# $2 - project id of your choice -# $3 - project name of your choice -# -# Note: I had troubles to get this running on Windows machines: classpath entries have to be separated by ';' instead of ':' -# and the JarLauncher wasn't found. -# Note: Add the maven-dependency plugin to your project to put all dependencies into a separate folder. See -# /distributed-projects/microservice-a/pom.xml - -set -euo pipefail - -# download latest release -analyzer_jar_file_name="/tmp/analyzer.jar" -release_version=$(curl -s https://api.github.com/repos/Hapag-Lloyd/dist-comm-vis/releases/latest | jq .tag_name -r) - -curl https://github.com/Hapag-Lloyd/dist-comm-vis/releases/download/"${release_version}"/distcommvis-"${release_version}".jar -o "${analyzer_jar_file_name}" -L - -# find all libraries to include -jars=$(find "$1" -name "*.jar") - -classpath="" - -for f in $jars; do - classpath="$classpath:$f" -done - -# add the scanner downloaded above -classpath="${classpath:1}:${analyzer_jar_file_name}" - -java -cp "${classpath}" org.springframework.boot.loader.JarLauncher scan com.hlag.tools.commvis.example "$2" --name="$3" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..821120b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,41 @@ +[metadata] +# the version is overwritten by the pipeline +name = dist_comm_vis +version = 1.0.0 +author = Hapag-Lloyd AG +author_email = info.de@hlag.com +description = Analyzes source code for special comments to visualize dependencies between services +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/Hapag-Lloyd/dist-comm-vis +project_urls = + Bug Tracker = https://github.com/Hapag-Lloyd/dist-comm-vis/issues + repository = https://github.com/Hapag-Lloyd/dist-comm-vis/ +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: MIT License + Operating System :: OS Independent + +[options] +package_dir = + = src +packages = find: +python_requires = >=3.10 +install_requires = + dependency-injector==4.41.0 + python-json-logger==2.0.7 + +[options.extras_require] +pipeline = + ruff==0.0.263 + +test = + pytest==7.3.1 + pytest-cov==4.0.0 + +[options.packages.find] +where = src + +[options.entry_points] +console_scripts = + dist-comm-vis = dist_comm_vis.adapter.endpoint.cli:bootstrap diff --git a/src/dist_comm_vis/__init__.py b/src/dist_comm_vis/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/adapter/__init__.py b/src/dist_comm_vis/adapter/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/adapter/dependency_injection/__init__.py b/src/dist_comm_vis/adapter/dependency_injection/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/adapter/dependency_injection/container.py b/src/dist_comm_vis/adapter/dependency_injection/container.py new file mode 100644 index 0000000..b635122 --- /dev/null +++ b/src/dist_comm_vis/adapter/dependency_injection/container.py @@ -0,0 +1,53 @@ +from logging.config import fileConfig + +from dependency_injector import containers, providers + +from dist_comm_vis.adapter.service.ModelWriterService import JsonModelWriterService +from dist_comm_vis.adapter.service.LocalFileFinderService import LocalFileFinderService +from dist_comm_vis.adapter.service.LocalFileReaderService import LocalFileReaderService +from dist_comm_vis.adapter.service.LocalFileWriterService import LocalFileWriterService +from dist_comm_vis.application.ServiceModel import ServiceModelApplication +from dist_comm_vis.domain.service.FileAnalyzerService import FileAnalyzerServiceFactory + + +class Container(containers.DeclarativeContainer): + # configuration values + config = providers.Configuration() + + # services + file_finder_service = providers.Singleton( + LocalFileFinderService + ) + + file_reader_service = providers.Singleton( + LocalFileReaderService + ) + + file_writer_service = providers.Singleton( + LocalFileWriterService + ) + + model_writer_service = providers.Singleton( + JsonModelWriterService + ) + + # factories + file_analyzer_service_factory = providers.Singleton( + FileAnalyzerServiceFactory, + file_reader_service + ) + + # applications + service_model_application = providers.Singleton( + ServiceModelApplication, + file_finder_service, + file_analyzer_service_factory, + file_writer_service, + model_writer_service + ) + + # utilities + logging = providers.Resource( + fileConfig, + config.log_config_file + ) diff --git a/src/dist_comm_vis/adapter/endpoint/__init__.py b/src/dist_comm_vis/adapter/endpoint/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/adapter/endpoint/cli.py b/src/dist_comm_vis/adapter/endpoint/cli.py new file mode 100644 index 0000000..e7f2753 --- /dev/null +++ b/src/dist_comm_vis/adapter/endpoint/cli.py @@ -0,0 +1,48 @@ +import argparse +import os +import sys +from typing import List + +from dependency_injector.wiring import inject, Provide + +from dist_comm_vis.adapter.dependency_injection.container import Container +from dist_comm_vis.application.ServiceModel import ServiceModelApplication + + +def bootstrap(): + # injects the configuration values from the command line arguments into the container + arguments = parse_command_line_arguments(sys.argv[1:]) + configuration = create_configuration_values_from_command_line_arguments(arguments) + + container = Container() + container.config.from_dict(configuration) + container.init_resources() + container.wire(modules=[__name__]) + + main() + + +@inject +def main(service_model_application: ServiceModelApplication = Provide[Container.service_model_application], + config: any = Provide[Container.config]): + service_model_application.create_for_project(config.get("path"), config.get("output_path")) + + +def parse_command_line_arguments(args: List[str]) -> argparse.Namespace: + parser = argparse.ArgumentParser() + + parser.add_argument("path") + parser.add_argument("--output-path", help="path to the output file", default=os.getcwd()) + parser.add_argument("--log-config-file", help="config file for logging in ini style", + default="../../../../logging.ini") + + return parser.parse_args(args) + + +def create_configuration_values_from_command_line_arguments(args) -> dict[str, str]: + return { + "path": args.path, + "output_path": args.output_path, + + "log_config_file": args.log_config_file + } diff --git a/src/dist_comm_vis/adapter/service/LocalFileFinderService.py b/src/dist_comm_vis/adapter/service/LocalFileFinderService.py new file mode 100644 index 0000000..9bf0db3 --- /dev/null +++ b/src/dist_comm_vis/adapter/service/LocalFileFinderService.py @@ -0,0 +1,19 @@ +import os +from typing import Iterable + +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.service.FileFinderService import FileFinderService + + +class LocalFileFinderService(FileFinderService): + """Service that finds files on the local file system.""" + + def __init__(self): + super().__init__() + + def find_files(self, directory: str) -> Iterable[File]: + """Generator that yields all files in a directory recursively.""" + + for root, d_names, f_names in os.walk(directory): + for f in f_names: + yield File(os.path.join(root, f)) diff --git a/src/dist_comm_vis/adapter/service/LocalFileReaderService.py b/src/dist_comm_vis/adapter/service/LocalFileReaderService.py new file mode 100644 index 0000000..db3d851 --- /dev/null +++ b/src/dist_comm_vis/adapter/service/LocalFileReaderService.py @@ -0,0 +1,11 @@ +from typing import Iterable + +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.service.FileReaderService import FileReaderService + + +class LocalFileReaderService(FileReaderService): + def read_lines(self, file: File) -> Iterable[str]: + with open(file.full_qualified_name, 'r') as f: + for line in f: + yield line diff --git a/src/dist_comm_vis/adapter/service/LocalFileWriterService.py b/src/dist_comm_vis/adapter/service/LocalFileWriterService.py new file mode 100644 index 0000000..442988c --- /dev/null +++ b/src/dist_comm_vis/adapter/service/LocalFileWriterService.py @@ -0,0 +1,11 @@ +from pathlib import Path +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.service.FileWriterService import FileWriterService + + +class LocalFileWriterService(FileWriterService): + def write(self, file: File, content: str) -> None: + Path(file.full_qualified_name).parent.mkdir(parents=True, exist_ok=True) + + with open(file.full_qualified_name, 'w') as f: + f.write(content) diff --git a/src/dist_comm_vis/adapter/service/ModelWriterService.py b/src/dist_comm_vis/adapter/service/ModelWriterService.py new file mode 100644 index 0000000..6a1958b --- /dev/null +++ b/src/dist_comm_vis/adapter/service/ModelWriterService.py @@ -0,0 +1,18 @@ +import json +from json import JSONEncoder + +from dist_comm_vis.domain.model.Model import Model +from dist_comm_vis.domain.service.ModelWriterService import ModelWriterService + + +class JsonModelWriterService(ModelWriterService): + def __init__(self): + super().__init__() + + def write(self, model: Model) -> str: + return json.dumps(model.__dict__, indent=4, cls=JsonModelEncoder) + + +class JsonModelEncoder(JSONEncoder): + def default(self, o): + return o.__dict__ diff --git a/src/dist_comm_vis/adapter/service/__init__.py b/src/dist_comm_vis/adapter/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/application/ServiceModel.py b/src/dist_comm_vis/application/ServiceModel.py new file mode 100644 index 0000000..4d5a802 --- /dev/null +++ b/src/dist_comm_vis/application/ServiceModel.py @@ -0,0 +1,41 @@ +import logging +import os + +from dist_comm_vis.adapter.service.ModelWriterService import JsonModelWriterService +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.model.Model import Model +from dist_comm_vis.domain.service import FileFinderService, ModelWriterService +from dist_comm_vis.domain.service.FileAnalyzerService import FileAnalyzerServiceFactory +from dist_comm_vis.domain.service.FileWriterService import FileWriterService + + +class ServiceModelApplication: + file_finder_service: FileFinderService + file_analyzer_service_factory: FileAnalyzerServiceFactory + file_writer_service: FileWriterService + logger: logging.Logger + + def __init__(self, file_finder: FileFinderService, file_analyzer_service_factory: FileAnalyzerServiceFactory, + file_writer_service: FileWriterService, model_writer_service: ModelWriterService): + self.file_finder_service = file_finder + self.file_analyzer_service_factory = file_analyzer_service_factory + self.file_writer_service = file_writer_service + self.model_writer_service = model_writer_service + self.logger = logging.getLogger(__name__) + + def create_for_project(self, path_to_analyze: str, output_path: str): + # find all files + # create an analyzer per file + # extract all connection strings + # build the resulting model + + json_file = File(os.path.abspath(os.path.join(output_path, "model.json"))) + + for file in self.file_finder_service.find_files(path_to_analyze): + self.logger.info("Found file: %s", file.full_qualified_name) + + analyzer = self.file_analyzer_service_factory.create(file) + model_relations = analyzer.detect_model_relations(file) + + model = Model(model_relations) + self.file_writer_service.write(json_file, JsonModelWriterService().write(model)) diff --git a/src/dist_comm_vis/application/__init__.py b/src/dist_comm_vis/application/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/dist_comm_vis/definitions.py b/src/dist_comm_vis/definitions.py new file mode 100644 index 0000000..9cd37d0 --- /dev/null +++ b/src/dist_comm_vis/definitions.py @@ -0,0 +1,3 @@ +import os + +ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")) diff --git a/src/dist_comm_vis/domain/model/File.py b/src/dist_comm_vis/domain/model/File.py new file mode 100644 index 0000000..71bdc34 --- /dev/null +++ b/src/dist_comm_vis/domain/model/File.py @@ -0,0 +1,12 @@ +import os + + +class File: + """Represents an ordinary file, e.g. on a local file system.""" + full_qualified_name: str + extension: str + + def __init__(self, full_qualified_name: str): + self.full_qualified_name = full_qualified_name + # removes the leading "." from the extension + self.extension = os.path.splitext(full_qualified_name)[1][1:] diff --git a/src/dist_comm_vis/domain/model/Model.py b/src/dist_comm_vis/domain/model/Model.py new file mode 100644 index 0000000..87cd322 --- /dev/null +++ b/src/dist_comm_vis/domain/model/Model.py @@ -0,0 +1,49 @@ +from abc import ABC +from typing import List + + +class ModelRelation(ABC): + def __init__(self): + pass + + +class Model: + def __init__(self, relations: List[ModelRelation]): + self.relations = relations + + +class ModelRelationFactory: + def __init__(self): + pass + + @staticmethod + def create(relation_type: str, direction: str, target_project_id: str) -> ModelRelation: + if relation_type == "rest" and direction == "in": + return RestApiEndpoint() + elif relation_type == "rest" and direction == "out": + return RestApiCall(target_project_id) + else: + raise Exception("No relation found for relation type: " + relation_type) + + +class RestApiEndpoint(ModelRelation): + def __init__(self): + super().__init__() + + self.type = "rest" + self.direction = "out" + + def __str__(self): + return "RestApiEndpoint" + + +class RestApiCall(ModelRelation): + def __init__(self, target_project_id: str): + super().__init__() + + self.type = "rest" + self.direction = "out" + self.target_project_id = target_project_id + + def __str__(self): + return "RestApiCall to " + self.target_project_id diff --git a/src/dist_comm_vis/domain/service/FileAnalyzerService.py b/src/dist_comm_vis/domain/service/FileAnalyzerService.py new file mode 100644 index 0000000..5a7b3a1 --- /dev/null +++ b/src/dist_comm_vis/domain/service/FileAnalyzerService.py @@ -0,0 +1,86 @@ +import re +from abc import ABC, abstractmethod +from re import Pattern +from typing import AnyStr, List + +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.model.Model import ModelRelation, ModelRelationFactory +from dist_comm_vis.domain.service.FileReaderService import FileReaderService + + +class FileAnalyzerService(ABC): + """Knows how to find the model information in source code files.""" + + MODEL_REGEXES: List[Pattern[AnyStr]] = [ + # published REST API endpoint + r'dist-comm-vis type=(rest) direction=(in)\s*', + # REST API call + r'dist-comm-vis type=(rest) direction=(out) target-project-id=(?P\d+)\s*' + ] + + file_reader_service: FileReaderService + + def __init__(self, file_reader_service: FileReaderService): + self.file_reader_service = file_reader_service + + @abstractmethod + def detect_model_relations(self, file: File) -> List[ModelRelation]: + raise NotImplementedError + + +class FileAnalyzerServiceFactory: + file_reader_service: FileReaderService + + def __init__(self, file_reader_service: FileReaderService): + self.file_reader_service = file_reader_service + + def create(self, file: File) -> FileAnalyzerService: + match file.extension: + case "java": + return JavaFileAnalyzerService(self.file_reader_service) + case _: + raise Exception("No analyzer found for file: " + file.full_qualified_name) + + +class JavaFileAnalyzerService(FileAnalyzerService): + _instance = None + + model_regexes: List[Pattern[AnyStr]] = [ + ] + + def __new__(cls, file_reader_service: FileReaderService): + if cls._instance is None: + cls._instance = super(JavaFileAnalyzerService, cls).__new__(cls) + cls._instance.__init__(file_reader_service) + + cls._instance._init_model_regex() + + return cls._instance + + def __init__(self, file_reader_service: FileReaderService): + super().__init__(file_reader_service) + + def _init_model_regex(self): + prefixes: List[str] = [ + r"\s*// " + ] + + for prefix in prefixes: + for regex in FileAnalyzerService.MODEL_REGEXES: + self.model_regexes.append(re.compile(prefix + regex)) + + def detect_model_relations(self, file: File) -> List[ModelRelation]: + relations: List[ModelRelation] = [] + + for line in self.file_reader_service.read_lines(file): + for regex in self.model_regexes: + model_match = regex.search(line) + + if model_match: + target_project_id = model_match.group('target-project-id') if \ + "target-project-id" in model_match.groupdict().keys() else None + + relations.append(ModelRelationFactory.create(model_match.group(1), model_match.group(2), + target_project_id)) + + return relations diff --git a/src/dist_comm_vis/domain/service/FileFinderService.py b/src/dist_comm_vis/domain/service/FileFinderService.py new file mode 100644 index 0000000..5f8f77a --- /dev/null +++ b/src/dist_comm_vis/domain/service/FileFinderService.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + +from dist_comm_vis.domain.model.File import File + + +class FileFinderService(ABC): + def __init__(self): + pass + + @abstractmethod + def find_files(self, directory: str) -> File: + pass diff --git a/src/dist_comm_vis/domain/service/FileReaderService.py b/src/dist_comm_vis/domain/service/FileReaderService.py new file mode 100644 index 0000000..a55a7d9 --- /dev/null +++ b/src/dist_comm_vis/domain/service/FileReaderService.py @@ -0,0 +1,14 @@ +from abc import ABC, abstractmethod + +from dist_comm_vis.domain.model.File import File + + +class FileReaderService(ABC): + """Knows how to read files.""" + + def __init__(self): + pass + + @abstractmethod + def read_lines(self, file: File) -> str: + raise NotImplementedError diff --git a/src/dist_comm_vis/domain/service/FileWriterService.py b/src/dist_comm_vis/domain/service/FileWriterService.py new file mode 100644 index 0000000..da06ba4 --- /dev/null +++ b/src/dist_comm_vis/domain/service/FileWriterService.py @@ -0,0 +1,13 @@ +from abc import ABC, abstractmethod + +from dist_comm_vis.domain.model.File import File + + +class FileWriterService(ABC): + def __init__(self): + pass + + @abstractmethod + def write(self, file: File, content: str) -> None: + """Writes the given content to the given file. The file is overwritten if it already exists.""" + pass diff --git a/src/dist_comm_vis/domain/service/ModelWriterService.py b/src/dist_comm_vis/domain/service/ModelWriterService.py new file mode 100644 index 0000000..f017d4b --- /dev/null +++ b/src/dist_comm_vis/domain/service/ModelWriterService.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + +from dist_comm_vis.domain.model.Model import Model + + +class ModelWriterService(ABC): + def __init__(self): + pass + + @abstractmethod + def write(self, model: Model) -> str: + raise NotImplementedError diff --git a/src/dist_comm_vis/domain/service/__init__.py b/src/dist_comm_vis/domain/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplication.java b/src/main/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplication.java deleted file mode 100644 index 9f65414..0000000 --- a/src/main/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.hlag.tools.commvis; - -import com.hlag.tools.commvis.adapter.in.CombineCommandLine; -import com.hlag.tools.commvis.adapter.in.ScanCommandLine; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.ExitCodeGenerator; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import picocli.CommandLine; - -@RequiredArgsConstructor -@SpringBootApplication -@CommandLine.Command(subcommands = {ScanCommandLine.class, CombineCommandLine.class}, mixinStandardHelpOptions = true) -public class DistributedCommunicationVisualizerApplication implements CommandLineRunner, ExitCodeGenerator { - private final CommandLine.IFactory factory; - private int exitCode; - - public static void main(String... args) { - // let Spring instantiate and inject dependencies - System.exit(SpringApplication.exit(SpringApplication.run(DistributedCommunicationVisualizerApplication.class, args))); - } - - @Override - public void run(String... args) throws Exception { - // let picocli parse command line args and run the business logic - exitCode = new CommandLine(this, factory).execute(args); - } - - @Override - public int getExitCode() { - return exitCode; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/PropertyFilesConfiguration.java b/src/main/java/com/hlag/tools/commvis/PropertyFilesConfiguration.java deleted file mode 100644 index 317a2f2..0000000 --- a/src/main/java/com/hlag/tools/commvis/PropertyFilesConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hlag.tools.commvis; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; -import org.springframework.core.io.ClassPathResource; - -@Configuration -public class PropertyFilesConfiguration { - @Bean - public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { - PropertySourcesPlaceholderConfigurer propsConfig - = new PropertySourcesPlaceholderConfigurer(); - - propsConfig.setLocation(new ClassPathResource("git.properties")); - propsConfig.setIgnoreResourceNotFound(true); - propsConfig.setIgnoreUnresolvablePlaceholders(true); - - return propsConfig; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/adapter/in/CombineCommandLine.java b/src/main/java/com/hlag/tools/commvis/adapter/in/CombineCommandLine.java deleted file mode 100644 index e6e024d..0000000 --- a/src/main/java/com/hlag/tools/commvis/adapter/in/CombineCommandLine.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.hlag.tools.commvis.application.port.in.CombineCommand; -import com.hlag.tools.commvis.application.port.in.CombineUseCase; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import picocli.CommandLine; - -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -@Slf4j -@CommandLine.Command(name = "combine", aliases = {"c"}, description = "Combines models from different projects and creates the big picture graph.") -public class CombineCommandLine implements Callable { - @CommandLine.Parameters(index = "0", description = "Top level directory containing the model*.json files. Subdirectories are scanned.") - private String topLevelDirectory; - - @CommandLine.Option(names = {"-n", "--name"}, defaultValue = "big-picture", description = "Name of the resulting graph model.") - private String projectName; - - private final CombineUseCase combineUseCase; - - @Override - public Integer call() { - CombineCommand command = new CombineCommand(topLevelDirectory, projectName); - - combineUseCase.combineModelsAsDot(command); - - return 0; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapter.java b/src/main/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapter.java deleted file mode 100644 index c69223c..0000000 --- a/src/main/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.google.gson.Gson; -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.springframework.stereotype.Component; - -import java.io.BufferedReader; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Slf4j -@Component -public class CommunicationModelFromJsonFileAdapter { - @SneakyThrows(IOException.class) - public Collection getModelFiles(String baseDir) { - try (Stream files = Files.walk(Paths.get(baseDir))) { - return files - .filter(f -> f.getFileName().toString().startsWith("model")) - .filter(f -> f.getFileName().toString().endsWith(".json")) - .collect(Collectors.toList()); - } - } - - @SneakyThrows(IOException.class) - public CommunicationModel getModelFromFile(Path path) { - try (BufferedReader reader = Files.newBufferedReader(path)) { - return new Gson().fromJson(reader, CommunicationModel.class); - } - } -} diff --git a/src/main/java/com/hlag/tools/commvis/adapter/in/ScanCommandLine.java b/src/main/java/com/hlag/tools/commvis/adapter/in/ScanCommandLine.java deleted file mode 100644 index e5c130f..0000000 --- a/src/main/java/com/hlag/tools/commvis/adapter/in/ScanCommandLine.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.hlag.tools.commvis.application.port.in.ScannerCommand; -import com.hlag.tools.commvis.application.port.in.ScannerUseCase; -import lombok.RequiredArgsConstructor; -import picocli.CommandLine; - -import java.util.concurrent.Callable; - -@RequiredArgsConstructor -@CommandLine.Command(name = "scan", aliases = {"s"}, description = "Analyzes the classpath and extracts endpoints and event sender/receiver.") -public class ScanCommandLine implements Callable { - private final ScannerUseCase scannerUseCase; - - @CommandLine.Parameters(index = "0", description = "The root package to analyze (including all sub packages)") - private String rootPackageName; - - @CommandLine.Parameters(index = "1", description = "ID of the project to be analyzed. Used to link projects.") - private String projectId; - - @CommandLine.Option(names = {"-n", "--name"}, defaultValue = "application", description = "Name of the project to be analyzed. This name is appended to the resulting model file.") - private String projectName; - - @Override - public Integer call() { - ScannerCommand command = new ScannerCommand(rootPackageName, projectId, projectName); - - scannerUseCase.scanSenderReceiverAndExport(command); - - return 0; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapter.java b/src/main/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapter.java deleted file mode 100644 index 23ee2b5..0000000 --- a/src/main/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapter.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.hlag.tools.commvis.adapter.out; - -import com.hlag.tools.commvis.application.port.out.FileWriterPort; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.springframework.stereotype.Component; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; - -@Slf4j -@Component -public class FileWriterAdapter implements FileWriterPort { - @Override - public void writeToFile(String filename, String content) { - try (FileWriter fw = new FileWriter(filename)) { - fw.write(content); - } catch (IOException e) { - log.error("Failed to write file.", e); - ExceptionUtils.rethrow(e); - } - } -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/in/CombineCommand.java b/src/main/java/com/hlag/tools/commvis/application/port/in/CombineCommand.java deleted file mode 100644 index 007cb65..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/in/CombineCommand.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.hlag.tools.commvis.application.port.in; - -import lombok.Value; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Value -public class CombineCommand { - String baseDirectory; - String projectName; -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/in/CombineUseCase.java b/src/main/java/com/hlag/tools/commvis/application/port/in/CombineUseCase.java deleted file mode 100644 index b5bd663..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/in/CombineUseCase.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.hlag.tools.commvis.application.port.in; - -public interface CombineUseCase { - String combineModelsAsDot(CombineCommand command); -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerCommand.java b/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerCommand.java deleted file mode 100644 index edea26e..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hlag.tools.commvis.application.port.in; - -import lombok.Value; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Value -public class ScannerCommand { - String rootPackage; - String projectId; - String projectName; -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerUseCase.java b/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerUseCase.java deleted file mode 100644 index d941188..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/in/ScannerUseCase.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.hlag.tools.commvis.application.port.in; - -public interface ScannerUseCase { - void scanSenderReceiverAndExport(ScannerCommand command); -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/out/DotCommunicationModelVisitor.java b/src/main/java/com/hlag/tools/commvis/application/port/out/DotCommunicationModelVisitor.java deleted file mode 100644 index d8238c8..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/out/DotCommunicationModelVisitor.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.hlag.tools.commvis.application.port.out; - -import com.hlag.tools.commvis.analyzer.model.*; -import org.springframework.stereotype.Component; - -/** - * Transforms the internal model into a DOT representation for GraphViz. - */ -@Component -public class DotCommunicationModelVisitor extends AbstractCommunicationModelVisitor { - private StringBuilder nodeDefinitions = new StringBuilder(); - private StringBuilder graphDefinitions = new StringBuilder(); - - private int nodes = 0; - - public String getDotContent() { - return "digraph G {\n" + nodeDefinitions.toString() + "\n" + graphDefinitions.toString() + "}"; - } - - @Override - public void visit(CommunicationModel model) { - nodeDefinitions.append(String.format(" \"application\" [label=\"%s\" shape=\"rectangle\"]\n", model.getProjectName())); - } - - @Override - public void visit(HttpConsumer consumer) { - String label = consumer.getClassName() + "." + consumer.getMethodName() + "\\n" + consumer.getPath() + "\\n" + consumer.getType(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"ellipse\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"%d\" -> \"application\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(HttpProducer producer) { - String label = producer.getClassName() + "." + producer.getMethodName() + "\\n" + producer.getPath() + "\\n" + producer.getType(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"ellipse\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"application\" -> \"%d\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(JmsReceiver endpoint) { - String label = endpoint.getClassName() + "\\n" + endpoint.getDestination() + "\\n" + endpoint.getDestinationType(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"%d\" -> \"application\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(SqsConsumer sqsConsumer) { - String label = sqsConsumer.getClassName() + "\\n" + sqsConsumer.getMethodName() + "\\n" + sqsConsumer.getQueueName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"%d\" -> \"application\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(SqsViaSnsConsumer sqsViaSnsConsumer) { - String label = sqsViaSnsConsumer.getClassName() + "\\n" + sqsViaSnsConsumer.getMethodName() + "\\n" + sqsViaSnsConsumer.getTopicName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"%d\" -> \"application\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(SqsProducer sqsProducer) { - String label = sqsProducer.getClassName() + "\\n" + sqsProducer.getMethodName() + "\\n" + sqsProducer.getQueueName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"application\" -> \"%d\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(SnsProducer snsProducer) { - String label = snsProducer.getClassName() + "\\n" + snsProducer.getMethodName() + "\\n" + snsProducer.getTopicName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"application\" -> \"%d\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(KafkaProducer kafkaProducer) { - String label = kafkaProducer.getClassName() + "\\n" + kafkaProducer.getMethodName() + "\\n" + kafkaProducer.getTopicName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"application\" -> \"%d\"\n", nodes)); - - ++nodes; - } - - @Override - public void visit(KafkaConsumer kafkaConsumer) { - String label = kafkaConsumer.getClassName() + "\\n" + kafkaConsumer.getMethodName() + "\\n" + kafkaConsumer.getTopicName(); - nodeDefinitions.append(String.format(" \"%d\" [label=\"%s\" shape=\"diamond\"]\n", nodes, label)); - - graphDefinitions.append(String.format(" \"%d\" -> \"application\"\n", nodes)); - - ++nodes; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/application/port/out/FileWriterPort.java b/src/main/java/com/hlag/tools/commvis/application/port/out/FileWriterPort.java deleted file mode 100644 index f1e29fc..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/port/out/FileWriterPort.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.hlag.tools.commvis.application.port.out; - -public interface FileWriterPort { - void writeToFile(String filename, String content); -} diff --git a/src/main/java/com/hlag/tools/commvis/application/service/CombineService.java b/src/main/java/com/hlag/tools/commvis/application/service/CombineService.java deleted file mode 100644 index ea45222..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/service/CombineService.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.hlag.tools.commvis.application.service; - -import com.hlag.tools.commvis.adapter.in.CommunicationModelFromJsonFileAdapter; -import com.hlag.tools.commvis.analyzer.model.*; -import com.hlag.tools.commvis.application.port.in.CombineCommand; -import com.hlag.tools.commvis.application.port.in.CombineUseCase; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -@Component -@RequiredArgsConstructor -@Slf4j -// output format should always contain \n as line break. It shouldn't be platform dependent -@SuppressWarnings({"squid:S3457"}) -public class CombineService implements CombineUseCase { - private final CommunicationModelFromJsonFileAdapter modelReader; - - @Override - public String combineModelsAsDot(CombineCommand command) { - Map models = new HashMap<>(); - - // find all model files and read them - modelReader.getModelFiles(command.getBaseDirectory()).forEach(p -> { - CommunicationModel model = modelReader.getModelFromFile(p); - models.put(model.getProjectId(), model); - }); - - // export all models to one DOT file - StringBuilder dotModel = new StringBuilder(); - StringBuilder nodeDefinitions = new StringBuilder(); - StringBuilder graphDefinitions = new StringBuilder(); - - dotModel.append("digraph G {\n"); - models.forEach((id, m) -> dotModel.append(String.format(" \"%s\" [label=\"%s\" shape=\"rectangle\"]\n", m.getProjectId(), m.getProjectName()))); - dotModel.append("\n"); - - models.forEach((id, m) -> { - ModelVisitor visitor = new ModelVisitor(models); - m.visit(visitor); - - nodeDefinitions.append(visitor.getNodeDefinitions().toString()); - graphDefinitions.append(visitor.getGraphDefinitions().toString()); - }); - - dotModel.append(nodeDefinitions); - dotModel.append(graphDefinitions); - dotModel.append("}"); - - return dotModel.toString(); - } - - @RequiredArgsConstructor - private static class ModelVisitor extends AbstractCommunicationModelVisitor { - private final Map modelsById; - - @Getter - private final StringBuilder nodeDefinitions = new StringBuilder(); - @Getter - private final StringBuilder graphDefinitions = new StringBuilder(); - - private String modelId; - - @Override - public void visit(CommunicationModel communicationModel) { - modelId = communicationModel.getProjectId(); - } - - @Override - public void visit(HttpConsumer consumer) { - String label = String.format("%s.%s\\n%s\\n%s", consumer.getClassName(), consumer.getMethodName(), consumer.getPath(), consumer.getType()); - String id = String.format("%s#%s", modelId, consumer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"ellipse\"]\n", id, label)); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, modelId)); - } - - @Override - public void visit(HttpProducer producer) { - String label = producer.getClassName() + "." + producer.getMethodName(); - String id = String.format("%s#%s", modelId, producer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"ellipse\"]\n", id, label)); - findConsumerIdFor(producer).ifPresent(consumerId -> graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, consumerId))); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", modelId, id)); - } - - private Optional findConsumerIdFor(IProducer producer) { - CommunicationModel destinationModel = modelsById.get(producer.getDestinationProjectId()); - - ConsumerFinderVisitor consumerFinderVisitor = new ConsumerFinderVisitor(producer); - destinationModel.visit(consumerFinderVisitor); - - return consumerFinderVisitor.getConsumer().map(consumer -> producer.getDestinationProjectId() + "#" + consumer.getId()); - } - - @Override - public void visit(JmsReceiver endpoint) { - String label = String.format("%s\\n%s\\n%s", endpoint.getClassName(), endpoint.getDestination(), endpoint.getDestinationType()); - String id = String.format("%s#%s", modelId, endpoint.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, modelId)); - } - - @Override - public void visit(SqsConsumer sqsConsumer) { - String label = String.format("%s.%s\\n%s", sqsConsumer.getClassName(), sqsConsumer.getMethodName(), sqsConsumer.getQueueName()); - String id = String.format("%s#%s", modelId, sqsConsumer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, modelId)); - } - - @Override - public void visit(SqsViaSnsConsumer sqsViaSnsConsumer) { - String label = String.format("%s.%s\\n%s", sqsViaSnsConsumer.getClassName(), sqsViaSnsConsumer.getMethodName(), sqsViaSnsConsumer.getTopicName()); - String id = String.format("%s#%s", modelId, sqsViaSnsConsumer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, modelId)); - } - - @Override - public void visit(SqsProducer sqsProducer) { - String label = String.format("%s.%s\\n%s", sqsProducer.getClassName(), sqsProducer.getMethodName(), sqsProducer.getQueueName()); - String id = String.format("%s#%s", modelId, sqsProducer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - findConsumerIdFor(sqsProducer).ifPresent(consumerId -> graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, consumerId))); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", modelId, id)); - } - - @Override - public void visit(SnsProducer snsProducer) { - String label = String.format("%s.%s\\n%s", snsProducer.getClassName(), snsProducer.getMethodName(), snsProducer.getTopicName()); - String id = String.format("%s#%s", modelId, snsProducer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - findConsumerIdFor(snsProducer).ifPresent(consumerId -> graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, consumerId))); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", modelId, id)); - } - - @Override - public void visit(KafkaProducer kafkaProducer) { - String label = String.format("%s.%s\\n%s", kafkaProducer.getClassName(), kafkaProducer.getMethodName(), kafkaProducer.getTopicName()); - String id = String.format("%s#%s", modelId, kafkaProducer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - findConsumerIdFor(kafkaProducer).ifPresent(consumerId -> graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, consumerId))); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", modelId, id)); - } - - @Override - public void visit(KafkaConsumer kafkaConsumer) { - String label = String.format("%s.%s\\n%s", kafkaConsumer.getClassName(), kafkaConsumer.getMethodName(), kafkaConsumer.getTopicName()); - String id = String.format("%s#%s", modelId, kafkaConsumer.getId()); - - nodeDefinitions.append(String.format(" \"%s\" [label=\"%s\" shape=\"diamond\"]\n", id, label)); - graphDefinitions.append(String.format(" \"%s\" -> \"%s\"\n", id, modelId)); - } - } - - @RequiredArgsConstructor - private static class ConsumerFinderVisitor extends AbstractCommunicationModelVisitor { - private final IProducer producer; - - @Getter - private Optional consumer = Optional.empty(); - - @Override - public void visit(CommunicationModel communicationModel) { - // it's a ConsumerFinder and this is not a consumer - } - - @Override - public void visit(HttpConsumer httpConsumer) { - if (producer instanceof HttpProducer) { - HttpProducer httpProducer = (HttpProducer) this.producer; - - if (httpConsumer.isProducedBy(httpProducer)) { - consumer = Optional.of(httpConsumer); - } - } - } - - @Override - public void visit(HttpProducer httpProducer) { - // it's a ConsumerFinder and this is not a consumer - } - - @Override - public void visit(JmsReceiver jmsReceiver) { - // we have no producers so far - } - - @Override - public void visit(SqsConsumer sqsConsumer) { - if (producer instanceof SqsProducer) { - SqsProducer sqsProducer = (SqsProducer) this.producer; - - if (sqsConsumer.isProducedBy(sqsProducer)) { - consumer = Optional.of(sqsConsumer); - } - } - } - - @Override - public void visit(SqsViaSnsConsumer sqsViaSnsConsumer) { - if (producer instanceof SnsProducer) { - SnsProducer snsProducer = (SnsProducer) this.producer; - - if (sqsViaSnsConsumer.isProducedBy(snsProducer)) { - consumer = Optional.of(sqsViaSnsConsumer); - } - } - } - - @Override - public void visit(SqsProducer sqsProducer) { - // it's a ConsumerFinder and this is not a consumer - } - - @Override - public void visit(SnsProducer snsProducer) { - // it's a ConsumerFinder and this is not a consumer - } - - @Override - public void visit(KafkaProducer kafkaProducer) { - // it's a ConsumerFinder and this is not a consumer - } - - @Override - public void visit(KafkaConsumer kafkaConsumer) { - if (producer instanceof KafkaProducer) { - KafkaProducer kafkaProducer = (KafkaProducer) this.producer; - - if (kafkaConsumer.isProducedBy(kafkaProducer)) { - consumer = Optional.of(kafkaConsumer); - } - } - } - } -} diff --git a/src/main/java/com/hlag/tools/commvis/application/service/ScannerService.java b/src/main/java/com/hlag/tools/commvis/application/service/ScannerService.java deleted file mode 100644 index 7709192..0000000 --- a/src/main/java/com/hlag/tools/commvis/application/service/ScannerService.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hlag.tools.commvis.application.service; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import com.hlag.tools.commvis.application.port.in.ScannerCommand; -import com.hlag.tools.commvis.application.port.in.ScannerUseCase; -import com.hlag.tools.commvis.domain.service.IExportModelService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.Optional; - -@Component -@Slf4j -public class ScannerService implements ScannerUseCase { - private final IScannerService[] scannerServices; - private final IExportModelService[] exportModelServices; - private final String version; - - public ScannerService(IScannerService[] scannerServices, IExportModelService[] exportModelServices, @Value("${git.tags}") String version) { - this.scannerServices = scannerServices; - this.exportModelServices = exportModelServices; - this.version = version; - } - - @Override - public void scanSenderReceiverAndExport(ScannerCommand command) { - CommunicationModel model = new CommunicationModel(command.getProjectId(), command.getProjectName(), version); - - Arrays.asList(scannerServices).forEach(s -> { - s.scanSenderAndReceiver(command.getRootPackage()).forEach(model::addSenderReceiver); - }); - - String fileName = Optional.ofNullable(command.getProjectName()).map(pn -> String.format("model-%s", pn)).orElse("model"); - Arrays.asList(exportModelServices).forEach(s -> s.export(model, fileName)); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImpl.java deleted file mode 100644 index 06f4b52..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import com.hlag.tools.commvis.application.port.out.DotCommunicationModelVisitor; -import com.hlag.tools.commvis.application.port.out.FileWriterPort; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * Convert the internal model into a DOT (GraphViz) representation and save it to a file. - */ -@Service -@RequiredArgsConstructor -public class ExportModelDotServiceImpl implements IExportModelService { - private final DotCommunicationModelVisitor visitor; - private final FileWriterPort fileWriter; - - public void export(CommunicationModel model, String filename) { - model.visit(visitor); - - String dotContent = visitor.getDotContent(); - fileWriter.writeToFile(filename + ".dot", dotContent); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImpl.java deleted file mode 100644 index 5d4f67f..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.google.gson.GsonBuilder; -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import com.hlag.tools.commvis.application.port.out.FileWriterPort; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -/** - * Convert the internal model into a JSON representation and save it to a file. - */ -@Service -@RequiredArgsConstructor -public class ExportModelJsonServiceImpl implements IExportModelService { - private final FileWriterPort fileWriter; - - public void export(CommunicationModel model, String filename) { - String jsonContent = new GsonBuilder().setPrettyPrinting().create().toJson(model); - - fileWriter.writeToFile(filename + ".json", jsonContent); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImpl.java deleted file mode 100644 index efcf00b..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeHttpsCall; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeHttpsCalls; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpProducer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for outgoing HTTP endpoints. Methods calling an HTTP endpoint have to be annotated with - * {@link VisualizeHttpsCalls} or {@link VisualizeHttpsCall}. - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class HttpEndpointProducerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeHttpsCall.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeHttpsCall visualizeAnnotation = m.getDeclaredAnnotation(VisualizeHttpsCall.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeHttpCall annotation could not be read!"); - } - - endpoints.add(createHttpProducer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeHttpsCalls.class).as(Method.class)); - methods.forEach(m -> { - VisualizeHttpsCalls visualizeAnnotations = m.getDeclaredAnnotation(VisualizeHttpsCalls.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeHttpCalls annotation could not be read!"); - } - - for (VisualizeHttpsCall visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(createHttpProducer(visualizeAnnotation, m)); - } - }); - - log.info("Outgoing HTTP calls found: {}", endpoints.size()); - - return endpoints; - } - - private HttpProducer createHttpProducer(VisualizeHttpsCall annotation, Method method) { - return endpointFactory.createHttpProducer(method.getDeclaringClass().getCanonicalName(), method.getName(), annotation.type(), annotation.path(), annotation.projectId()); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/IExportModelService.java b/src/main/java/com/hlag/tools/commvis/domain/service/IExportModelService.java deleted file mode 100644 index 62c986f..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/IExportModelService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; - -/** - * Exports the internal model. - */ -public interface IExportModelService { - /** - * Converts the internal model and stores it as file. - * @param model the model to export - * @param filename the output file name without an extension - */ - void export(CommunicationModel model, String filename); -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImpl.java deleted file mode 100644 index d0ed094..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpConsumer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import javax.ws.rs.*; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for JaxRs HTTP endpoints. - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class JaxRsHttpEndpointConsumerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - List> httpMethodsToScan = Arrays.asList(DELETE.class, GET.class, HEAD.class, OPTIONS.class, PATCH.class, POST.class, PUT.class); - - for (Class httpMethod : httpMethodsToScan) { - Set methods = reflections.get(MethodsAnnotated.with(httpMethod).as(Method.class)); - - methods.forEach(m -> { - Path pathOnMethod = m.getAnnotation(Path.class); - Path pathOnClass = m.getDeclaringClass().getAnnotation(Path.class); - - String path = Stream.of(pathOnClass, pathOnMethod).filter(Objects::nonNull).map(Path::value).collect(Collectors.joining("/")); - - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), httpMethod.getSimpleName(), path)); - }); - } - - log.info("Incoming JaxRs endpoints found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImpl.java deleted file mode 100644 index 735b91d..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.model.JmsReceiver; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import javax.ejb.ActivationConfigProperty; -import javax.ejb.MessageDriven; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.TypesAnnotated; - -@Service -@Slf4j -@RequiredArgsConstructor -public class JmsEndpointScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - Set> classes = reflections.get(TypesAnnotated.with(MessageDriven.class).asClass()); - - classes.forEach(c -> { - MessageDriven[] annotation = c.getDeclaredAnnotationsByType(MessageDriven.class); - - //as we found classes with the Annotation we must get a result here - if (annotation.length == 0) { - log.error("Unable to find the annotation, but we found a class with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("MessageDriven annotation could not be read!"); - } - - String destinationType = null; - String destination = null; - - for (ActivationConfigProperty config : annotation[0].activationConfig()) { - if ("destinationType".equals(config.propertyName())) { - destinationType = config.propertyValue(); - } else if ("destination".equals(config.propertyName())) { - destination = config.propertyValue(); - } - } - - endpoints.add(endpointFactory.createJmsReceiver(c.getCanonicalName(), destinationType, destination)); - }); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImpl.java deleted file mode 100644 index 4ce4a4c..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaConsumers; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for incoming Kafka events. Methods consuming these events have to be annotated with - * {@code VisualizeKafkaConsumer}. - * - * @see VisualizeKafkaConsumer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class KafkaConsumerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeKafkaConsumer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeKafkaConsumer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeKafkaConsumer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeKafkaConsumer annotation could not be read!"); - } - - endpoints.add(endpointFactory.createKafkaConsumer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeKafkaConsumers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeKafkaConsumers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeKafkaConsumers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeKafkaConsumers annotation could not be read!"); - } - - for (VisualizeKafkaConsumer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(endpointFactory.createKafkaConsumer(visualizeAnnotation, m)); - } - }); - - log.info("Kafka consumers found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImpl.java deleted file mode 100644 index 61ad4cc..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaProducers; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for outgoing Kafka events. Methods consuming these events have to be annotated with - * {@code VisualizeKafkaProducer}. - * - * @see VisualizeKafkaProducer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class KafkaProducerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeKafkaProducer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeKafkaProducer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeKafkaProducer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeKafkaProducer annotation could not be read!"); - } - - endpoints.add(endpointFactory.createKafkaProducer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeKafkaProducers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeKafkaProducers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeKafkaProducers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeKafkaProducers annotation could not be read!"); - } - - for (VisualizeKafkaProducer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(endpointFactory.createKafkaProducer(visualizeAnnotation, m)); - } - }); - - log.info("Kafka producers found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImpl.java deleted file mode 100644 index 7670a4e..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.model.SqsProducer; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for outgoing SNS events. Methods consuming these events have to be annotated with - * {@code VisualizeSnsProducer}. - * - * @see VisualizeSnsProducer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SnsProducerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeSnsProducer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeSnsProducer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeSnsProducer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSnsProducer annotation could not be read!"); - } - - endpoints.add(endpointFactory.createSnsProducer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeSnsProducers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeSnsProducers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeSnsProducers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSnsProducers annotation could not be read!"); - } - - for (VisualizeSnsProducer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(endpointFactory.createSnsProducer(visualizeAnnotation, m)); - } - }); - - log.info("SNS producers found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImpl.java deleted file mode 100644 index 1fb784d..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImpl.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.*; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for Spring HTTP endpoints. - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SpringHttpEndpointScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(GetMapping.class).as(Method.class)); - - methods.forEach(m -> { - GetMapping mapping = m.getAnnotation(GetMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), "GET", path)); - }); - - methods = reflections.get(MethodsAnnotated.with(PutMapping.class).as(Method.class)); - - methods.forEach(m -> { - PutMapping mapping = m.getAnnotation(PutMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), "PUT", path)); - }); - - methods = reflections.get(MethodsAnnotated.with(PostMapping.class).as(Method.class)); - - methods.forEach(m -> { - PostMapping mapping = m.getAnnotation(PostMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), "POST", path)); - }); - - methods = reflections.get(MethodsAnnotated.with(PatchMapping.class).as(Method.class)); - - methods.forEach(m -> { - PatchMapping mapping = m.getAnnotation(PatchMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), "PATCH", path)); - }); - - methods = reflections.get(MethodsAnnotated.with(DeleteMapping.class).as(Method.class)); - - methods.forEach(m -> { - DeleteMapping mapping = m.getAnnotation(DeleteMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), "DELETE", path)); - }); - - methods = reflections.get(MethodsAnnotated.with(RequestMapping.class).as(Method.class)); - - methods.forEach(m -> { - RequestMapping mapping = m.getAnnotation(RequestMapping.class); - - String path = mapping.path().length == 0 ? mapping.value()[0] : mapping.path()[0]; - - //TODO HttpConsumer should allow multiple HTTP methods and multiple paths - endpoints.add(endpointFactory.createHttpConsumer(m.getDeclaringClass().getCanonicalName(), m.getName(), mapping.method()[0].name(), path)); - }); - - log.info("Incoming Spring HTTP endpoints found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImpl.java deleted file mode 100644 index ed6bae5..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeHttpsCall; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpProducer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.model.SqsConsumer; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for incoming SQS events. Methods consuming these events have to be annotated with - * {@code VisualizeSqsConsumer}. - * - * @see com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SqsConsumerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeSqsConsumer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeSqsConsumer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeSqsConsumer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeHttpCall annotation could not be read!"); - } - - endpoints.add(createSqsConsumer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeSqsConsumers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeSqsConsumers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeSqsConsumers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeHttpCalls annotation could not be read!"); - } - - for (VisualizeSqsConsumer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(createSqsConsumer(visualizeAnnotation, m)); - } - }); - - log.info("Outgoing HTTP calls found: {}", endpoints.size()); - - return endpoints; - } - - private SqsConsumer createSqsConsumer(VisualizeSqsConsumer annotation, Method method) { - return endpointFactory.createSqsReceiver(method.getDeclaringClass().getCanonicalName(), method.getName(), annotation.queueName()); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImpl.java deleted file mode 100644 index b41b4e1..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumers; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsProducers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.model.SqsConsumer; -import com.hlag.tools.commvis.analyzer.model.SqsProducer; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for outgoing SQS events. Methods consuming these events have to be annotated with - * {@code VisualizeSqsProducer}. - * - * @see VisualizeSqsConsumer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SqsProducerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeSqsProducer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeSqsProducer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeSqsProducer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSqsProducer annotation could not be read!"); - } - - endpoints.add(createSqsProducer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeSqsProducers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeSqsProducers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeSqsProducers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSqsProducers annotation could not be read!"); - } - - for (VisualizeSqsProducer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(createSqsProducer(visualizeAnnotation, m)); - } - }); - - log.info("SQS producers found: {}", endpoints.size()); - - return endpoints; - } - - private SqsProducer createSqsProducer(VisualizeSqsProducer annotation, Method method) { - return endpointFactory.createSqsProducer(method.getDeclaringClass().getCanonicalName(), method.getName(), annotation.queueName(), annotation.projectId()); - } -} diff --git a/src/main/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImpl.java b/src/main/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImpl.java deleted file mode 100644 index 81a147f..0000000 --- a/src/main/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumers; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumers; -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.model.SqsConsumer; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.springframework.stereotype.Service; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import static org.reflections.scanners.Scanners.MethodsAnnotated; - -/** - * Scans the classpath for incoming SQS events received from SNS. Methods consuming these events have to be annotated with - * {@code VisualizeSqsViaSnsConsumer}. - * - * @see VisualizeSqsViaSnsConsumer - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SqsViaSnsConsumerScannerImpl implements IScannerService { - private final EndpointFactory endpointFactory; - - @Override - public Collection scanSenderAndReceiver(String rootPackageName) { - Set endpoints = new HashSet<>(); - Reflections reflections = new Reflections(rootPackageName, Scanners.values()); - - Set methods = reflections.get(MethodsAnnotated.with(VisualizeSqsViaSnsConsumer.class).as(Method.class)); - - methods.forEach(m -> { - VisualizeSqsViaSnsConsumer visualizeAnnotation = m.getDeclaredAnnotation(VisualizeSqsViaSnsConsumer.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotation == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSqsViaSnsConsumer annotation could not be read!"); - } - - endpoints.add(endpointFactory.createSqsViaSnsConsumer(visualizeAnnotation, m)); - }); - - methods = reflections.get(MethodsAnnotated.with(VisualizeSqsViaSnsConsumers.class).as(Method.class)); - methods.forEach(m -> { - VisualizeSqsViaSnsConsumers visualizeAnnotations = m.getDeclaredAnnotation(VisualizeSqsViaSnsConsumers.class); - - //as we found methods with the Annotation we must get a result here - if (visualizeAnnotations == null) { - log.error("Unable to find the annotation, but we found a method with the annotation. Make sure that the classpath contains all relevant libraries for your application."); - throw new IllegalStateException("VisualizeSqsViaSnsConsumers annotation could not be read!"); - } - - for (VisualizeSqsViaSnsConsumer visualizeAnnotation : visualizeAnnotations.value()) { - endpoints.add(endpointFactory.createSqsViaSnsConsumer(visualizeAnnotation, m)); - } - }); - - log.info("SQS consumers for SNS found: {}", endpoints.size()); - - return endpoints; - } -} diff --git a/src/test/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplicationIT.java b/src/test/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplicationIT.java deleted file mode 100644 index d856f6f..0000000 --- a/src/test/java/com/hlag/tools/commvis/DistributedCommunicationVisualizerApplicationIT.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.hlag.tools.commvis; - -import com.hlag.tools.commvis.adapter.in.ScanCommandLine; -import com.hlag.tools.commvis.application.port.in.ScannerUseCase; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.skyscreamer.jsonassert.JSONAssert; -import org.skyscreamer.jsonassert.JSONCompareMode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import picocli.CommandLine; - -import java.io.File; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.contentOf; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) -class DistributedCommunicationVisualizerApplicationIT { - @Autowired - private ScannerUseCase scannerUseCase; - - @Autowired - CommandLine.IFactory factory; - - @Value("${git.tags}") - private String modelVersion; - - @Test - void shouldMatchCurrentJsonModel_whenScan() throws Exception { - String expectedJson = contentOf(new File("src/test/resources/model/integration-model.json")); - - new CommandLine(new ScanCommandLine(scannerUseCase), factory).execute("integration", "4711", "--name=my-project-1"); - - File actualJsonFile = new File("model-my-project-1.json"); - - assertThat(actualJsonFile).exists().isFile().canRead(); - - // remove the ids from the objects as they always change - JSONObject actualJson = new JSONObject(contentOf(actualJsonFile)); - removeIdFromListObjects(actualJson.getJSONArray("http_consumers")); - removeIdFromListObjects(actualJson.getJSONArray("http_producers")); - removeIdFromListObjects(actualJson.getJSONArray("jms_consumers")); - removeIdFromListObjects(actualJson.getJSONArray("sqs_producers")); - removeIdFromListObjects(actualJson.getJSONArray("sqs_consumers")); - removeIdFromListObjects(actualJson.getJSONArray("sqs_via_sns_consumers")); - removeIdFromListObjects(actualJson.getJSONArray("kafka_producers")); - removeIdFromListObjects(actualJson.getJSONArray("kafka_consumers")); - removeIdFromListObjects(actualJson.getJSONArray("sns_producers")); - - JSONAssert.assertEquals(expectedJson.replace("###version###", modelVersion), actualJson.toString(), JSONCompareMode.STRICT); - } - - private void removeIdFromListObjects(JSONArray list) throws JSONException { - for (int i = 0; i < list.length(); i++) { - assertThat(list.getJSONObject(i).has("id")).isTrue(); - - list.getJSONObject(i).remove("id"); - } - } - - @Test - void shouldMatchCurrentDotModel_whenScan() { - String expectedDot = contentOf(new File("src/test/resources/model/integration-model.dot")); - - new CommandLine(new ScanCommandLine(scannerUseCase), factory).execute("-n", "my-project-2", "integration", "4711"); - - File currentDotFile = new File("model-my-project-2.dot"); - - assertThat(currentDotFile).exists().isFile().canRead(); - assertThat(contentOf(currentDotFile)).isEqualTo(expectedDot); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/adapter/in/CombineCommandLineTest.java b/src/test/java/com/hlag/tools/commvis/adapter/in/CombineCommandLineTest.java deleted file mode 100644 index a3fb373..0000000 --- a/src/test/java/com/hlag/tools/commvis/adapter/in/CombineCommandLineTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.hlag.tools.commvis.application.port.in.CombineUseCase; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import picocli.CommandLine; - -import static org.assertj.core.api.Assertions.assertThat; - -class CombineCommandLineTest { - private CombineCommandLine commandLine; - - @Mock - private CombineUseCase combineUseCase; - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - commandLine = new CombineCommandLine(combineUseCase); - } - - @Test - void shouldAcceptTopLevelDirectory_whenCalledFromCommandLine() { - int actualExitCode = new CommandLine(commandLine).execute("/tmp/path"); - - assertThat(actualExitCode).isZero(); - } - - @Test - void shouldReturn0_whenCall_givenNoErrorOccurred() { - Integer actualExitCode = commandLine.call(); - - Assertions.assertThat(actualExitCode).isZero(); - } - - @Test - void shouldExitWithStatusCode2_whenCalledFromCommandLine_givenNoParameters() { - int actualExitCode = new CommandLine(commandLine).execute(); - - assertThat(actualExitCode).isEqualTo(2); - } - - @Test - void shouldAcceptANameForTheModel_whenCalledFromCommandLine() { - int actualExitCode = new CommandLine(commandLine).execute("/tmp/path", "-n", "a-fancy-name"); - - assertThat(actualExitCode).isZero(); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapterTest.java b/src/test/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapterTest.java deleted file mode 100644 index 2c01556..0000000 --- a/src/test/java/com/hlag/tools/commvis/adapter/in/CommunicationModelFromJsonFileAdapterTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import lombok.extern.slf4j.Slf4j; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; - -@Slf4j -class CommunicationModelFromJsonFileAdapterTest { - private CommunicationModelFromJsonFileAdapter adapter; - - @BeforeEach - void init() { - adapter = new CommunicationModelFromJsonFileAdapter(); - } - - @Test - void shouldFindAllModelFilesInSubDirectories_when() { - Path p = Paths.get("src/test/resources/json-file-adapter"); - String givenBaseDirectory = p.toFile().getAbsolutePath(); - - Collection actualModelFiles = adapter.getModelFiles(givenBaseDirectory); - - Assertions.assertThat(actualModelFiles).hasSize(6); - } - - @Test - void shouldReadModelFromFile_whenGetModelFromFile() { - CommunicationModel actualModel = adapter.getModelFromFile(Paths.get("src/test/resources/json-file-adapter/model.json")); - - Assertions.assertThat(actualModel).isNotNull(); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/adapter/in/ScanCommandLineTest.java b/src/test/java/com/hlag/tools/commvis/adapter/in/ScanCommandLineTest.java deleted file mode 100644 index 816e771..0000000 --- a/src/test/java/com/hlag/tools/commvis/adapter/in/ScanCommandLineTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.hlag.tools.commvis.adapter.in; - -import com.hlag.tools.commvis.application.port.in.ScannerUseCase; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import picocli.CommandLine; - -import static org.assertj.core.api.Assertions.assertThat; - -class ScanCommandLineTest { - @Mock - private ScannerUseCase scannerUseCase; - - private ScanCommandLine commandLine; - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - commandLine = new ScanCommandLine(scannerUseCase); - } - - @Test - void shouldReturn0_whenCall_givenNoErrorOccurred() { - Integer actualExitCode = commandLine.call(); - - Assertions.assertThat(actualExitCode).isZero(); - } - - @Test - void shouldAcceptProjectIdAndPackageName_whenCalledFromCommandLine() { - int actualExitCode = new CommandLine(commandLine).execute("com.hlag", "4711"); - - assertThat(actualExitCode).isZero(); - } - - @Test - void shouldExitWithStatusCode2_whenCalledFromCommandLine_givenNoParameters() { - int actualExitCode = new CommandLine(commandLine).execute(); - - assertThat(actualExitCode).isEqualTo(2); - } - - @Test - void shouldExitWithStatusCode2_whenCalledFromCommandLine_givenRootPackageOnly() { - int actualExitCode = new CommandLine(commandLine).execute("com.hlag"); - - assertThat(actualExitCode).isEqualTo(2); - } - - @Test - void shouldAcceptANameForTheModel_whenCalledFromCommandLine() { - int actualExitCode = new CommandLine(commandLine).execute("com.hlag", "4711", "-n", "a-fancy-name"); - - assertThat(actualExitCode).isZero(); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapterTest.java b/src/test/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapterTest.java deleted file mode 100644 index daed940..0000000 --- a/src/test/java/com/hlag/tools/commvis/adapter/out/FileWriterAdapterTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.hlag.tools.commvis.adapter.out; - -import org.junit.jupiter.api.Test; - -import java.io.File; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.contentOf; - -class FileWriterAdapterTest { - @Test - void shouldWriteContentToFile_whenWriteToFile() { - String givenFilename = "test-file.txt"; - String givenContent = "some content"; - - new FileWriterAdapter().writeToFile(givenFilename, givenContent); - - File actualFile = new File(givenFilename); - - assertThat(actualFile).exists().isFile().canRead(); - assertThat(contentOf(actualFile)).isEqualTo(givenContent); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/analyzer/scanner/user/UserDefinedScanner.java b/src/test/java/com/hlag/tools/commvis/analyzer/scanner/user/UserDefinedScanner.java deleted file mode 100644 index 32f5a74..0000000 --- a/src/test/java/com/hlag/tools/commvis/analyzer/scanner/user/UserDefinedScanner.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hlag.tools.commvis.analyzer.scanner.user; - -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.Collections; - -@Service -public class UserDefinedScanner implements IScannerService { - @Override - public Collection scanSenderAndReceiver(String s) { - return Collections.emptySet(); - } -} diff --git a/src/test/java/com/hlag/tools/commvis/application/service/CombineServiceTest.java b/src/test/java/com/hlag/tools/commvis/application/service/CombineServiceTest.java deleted file mode 100644 index cb661e8..0000000 --- a/src/test/java/com/hlag/tools/commvis/application/service/CombineServiceTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.hlag.tools.commvis.application.service; - -import com.hlag.tools.commvis.adapter.in.CommunicationModelFromJsonFileAdapter; -import com.hlag.tools.commvis.application.port.in.CombineCommand; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.io.File; - -class CombineServiceTest { - @Test - void shouldCombineMultipleModelsReferencingEachOther_whenCombineModelAsDot() { - CombineService combineService = new CombineService(new CommunicationModelFromJsonFileAdapter()); - CombineCommand command = new CombineCommand("src/test/resources/combine-models", "test"); - String actualDotModel = combineService.combineModelsAsDot(command); - - Assertions.assertThat(actualDotModel).isEqualTo(Assertions.contentOf(new File("src/test/resources/combine-models/combined-model.dot"))); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/application/service/ScannerServiceTest.java b/src/test/java/com/hlag/tools/commvis/application/service/ScannerServiceTest.java deleted file mode 100644 index 6aa38f6..0000000 --- a/src/test/java/com/hlag/tools/commvis/application/service/ScannerServiceTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.hlag.tools.commvis.application.service; - -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import com.hlag.tools.commvis.application.port.in.ScannerCommand; -import com.hlag.tools.commvis.domain.service.IExportModelService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class ScannerServiceTest { - @Mock - private IScannerService scanner1; - @Mock - private IScannerService scanner2; - @Mock - private IExportModelService exportModelService1; - @Mock - private IExportModelService exportModelService2; - - private ScannerService scannerService; - private final ScannerCommand command = new ScannerCommand("com.hlag", "4711", "my-project-name"); - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - - scannerService = new ScannerService(new IScannerService[]{scanner1, scanner2}, new IExportModelService[]{exportModelService1, exportModelService2}, "1.2.3"); - } - - @Test - void shouldCallAllScanners_whenScanSenderReceiverAndExport() { - scannerService.scanSenderReceiverAndExport(command); - - Mockito.verify(scanner1).scanSenderAndReceiver(command.getRootPackage()); - Mockito.verify(scanner2).scanSenderAndReceiver(command.getRootPackage()); - } - - @Test - void shouldCallAllExporters_whenScanSenderReceiverAndExport() { - scannerService.scanSenderReceiverAndExport(command); - - Mockito.verify(exportModelService1).export(Mockito.any(), Mockito.any()); - Mockito.verify(exportModelService2).export(Mockito.any(), Mockito.any()); - } - - @Test - void shouldUseTheProjectNameAsSuffixForExportedFile_whenScanSenderReceiverAndExport() { - scannerService.scanSenderReceiverAndExport(command); - - Mockito.verify(exportModelService1).export(Mockito.any(), Mockito.eq("model-my-project-name")); - } - - @Test - void shouldNameTheModelFileModel_whenScanSenderReceiverAndExport_givenNoProjectName() { - ScannerCommand givenCommand = new ScannerCommand("com.hlag", "4711", null); - - scannerService.scanSenderReceiverAndExport(givenCommand); - - Mockito.verify(exportModelService1).export(Mockito.any(), Mockito.eq("model")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImplTest.java deleted file mode 100644 index 1963efb..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelDotServiceImplTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import com.hlag.tools.commvis.application.port.out.DotCommunicationModelVisitor; -import com.hlag.tools.commvis.application.port.out.FileWriterPort; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class ExportModelDotServiceImplTest { - @Mock - private FileWriterPort fileWriter; - @Mock - private DotCommunicationModelVisitor visitor; - - @InjectMocks - private ExportModelDotServiceImpl exportModelDotService; - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldWriteDotFile_whenExport() { - String givenFilename = "file"; - CommunicationModel givenModel = new CommunicationModel("id", "name", "version"); - - exportModelDotService.export(givenModel, givenFilename); - - Mockito.verify(fileWriter, Mockito.times(1)).writeToFile(Mockito.eq(givenFilename + ".dot"), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImplTest.java deleted file mode 100644 index 7cefe27..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/ExportModelJsonServiceImplTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.CommunicationModel; -import com.hlag.tools.commvis.application.port.out.FileWriterPort; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class ExportModelJsonServiceImplTest { - @Mock - private FileWriterPort fileWriter; - - @InjectMocks - private ExportModelJsonServiceImpl exportModelJsonService; - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldWriteJsonFile_whenExport() { - String givenFilename = "file"; - CommunicationModel givenModel = new CommunicationModel("id", "name", "version"); - - exportModelJsonService.export(givenModel, givenFilename); - - Mockito.verify(fileWriter, Mockito.times(1)).writeToFile(Mockito.eq(givenFilename + ".json"), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImplTest.java deleted file mode 100644 index bad56db..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/HttpEndpointProducerScannerImplTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpProducer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import java.util.Collection; - -class HttpEndpointProducerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private HttpEndpointProducerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllHttpProducers_whenScanClasspath() { - Collection actualEndpoints = clazz.scanSenderAndReceiver("test.http"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpProducer(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); - } - - @Test - void shouldExtractAllHttpProducerInformation_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.http"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpProducer(Mockito.eq("test.http.CallHttpsEndpoints"), Mockito.eq("getCustomerInvoices"), Mockito.eq("GET"), Mockito.eq("customers/{customerId}/invoices"), Mockito.eq("4711")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImplTest.java deleted file mode 100644 index 81985a9..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/JaxRsHttpEndpointConsumerScannerImplTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpConsumer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import javax.ws.rs.HttpMethod; -import java.util.Collection; - -class JaxRsHttpEndpointConsumerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - @InjectMocks - private JaxRsHttpEndpointConsumerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindEndpointsForAllHttpMethods_whenScanClasspath() { - Collection actualEndpoints = clazz.scanSenderAndReceiver("test.http.jaxrs"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.GET), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.HEAD), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.POST), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.DELETE), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.PUT), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.OPTIONS), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.PATCH), Mockito.any()); - } - - @Test - void shouldExtractAllEndpointInformation_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.http.jaxrs"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.eq("test.http.jaxrs.ConsumerEndpoints"), Mockito.eq("receivesAPostRequest"), Mockito.eq("POST"), Mockito.eq("endpoint/a")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImplTest.java deleted file mode 100644 index 90e136f..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/JmsEndpointScannerImplTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.JmsReceiver; -import com.hlag.tools.commvis.domain.service.JmsEndpointScannerImpl; -import org.assertj.core.api.Assertions; -import org.assertj.core.groups.Tuple; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import javax.ws.rs.HttpMethod; -import java.util.Collection; - -import static org.assertj.core.api.Assertions.assertThat; - -class JmsEndpointScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - @InjectMocks - private JmsEndpointScannerImpl clazz; - - @BeforeEach - void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindJmsReceivers_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.jms"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createJmsReceiver(Mockito.any(), Mockito.any(), Mockito.any()); - } - - @Test - void shouldExtractAllEndpointInformation_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.jms"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createJmsReceiver(Mockito.eq("test.jms.CustomerCancelledOrderReceiver"), Mockito.eq("javax.jms.Queue"), Mockito.eq("jms/customer/orderCancelled")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImplTest.java deleted file mode 100644 index 88ceb7f..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/KafkaConsumerScannerImplTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class KafkaConsumerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private KafkaConsumerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllKafkaConsumers_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.kafka.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(3)).createKafkaConsumer(Mockito.any(), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImplTest.java deleted file mode 100644 index 5a1ba97..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/KafkaProducerScannerImplTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import static org.junit.jupiter.api.Assertions.*; - -class KafkaProducerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private KafkaProducerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllKafkaProducers_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.kafka.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(3)).createKafkaProducer(Mockito.any(), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImplTest.java deleted file mode 100644 index cd78af2..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/SnsProducerScannerImplTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class SnsProducerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private SnsProducerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllSnsProducers_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.sns.visualize"); - - Mockito.verify(endpointFactory).createSnsProducer(Mockito.any(), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImplTest.java deleted file mode 100644 index 40b53bb..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/SpringHttpEndpointScannerImplTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpConsumer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import javax.ws.rs.HttpMethod; -import java.util.Collection; - -class SpringHttpEndpointScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - @InjectMocks - private SpringHttpEndpointScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindEndpointsForAllHttpMethods_whenScanClasspath() { - Collection actualEndpoints = clazz.scanSenderAndReceiver("test.http.spring"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.GET), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.HEAD), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.POST), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.DELETE), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.PUT), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.OPTIONS), Mockito.any()); - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.any(), Mockito.any(), Mockito.eq(HttpMethod.PATCH), Mockito.any()); - } - - @Test - void shouldExtractAllEndpointInformation_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.http.spring"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createHttpConsumer(Mockito.eq("test.http.spring.ConsumerEndpoints"), Mockito.eq("receivesAPostRequest"), Mockito.eq("POST"), Mockito.eq("a")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImplTest.java deleted file mode 100644 index 3391443..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/SqsConsumerScannerImplTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import com.hlag.tools.commvis.analyzer.model.HttpProducer; -import com.hlag.tools.commvis.analyzer.model.ISenderReceiverCommunication; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -import java.util.Collection; - -class SqsConsumerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private SqsConsumerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllSqsConsunmers_whenScanClasspath() { - Collection actualEndpoints = clazz.scanSenderAndReceiver("test.sqs.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(3)).createSqsReceiver(Mockito.any(), Mockito.any(), Mockito.any()); - } - - @Test - void shouldExtractAllHttpProducerInformation_whenScanClasspath() { - Collection actualEndpoints = (Collection) clazz.scanSenderAndReceiver("test.sqs.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(1)).createSqsReceiver(Mockito.eq("test.sqs.visualize.SqsReceiver"), Mockito.eq("receiveLocationSyncEvent"), Mockito.eq("locations")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImplTest.java deleted file mode 100644 index 1503c3b..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/SqsProducerScannerImplTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class SqsProducerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private SqsProducerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllSqsProducers_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.sqs.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(2)).createSqsProducer(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); - } - - @Test - void shouldExtractAllSqsProducerInformation_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.sqs.visualize"); - - Mockito.verify(endpointFactory).createSqsProducer(Mockito.eq("test.sqs.visualize.SqsProducer"), Mockito.eq("produceLocationSyncEvent"), Mockito.eq("locations"), Mockito.eq("myProject")); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImplTest.java b/src/test/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImplTest.java deleted file mode 100644 index 72d1e4d..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/SqsViaSnsConsumerScannerImplTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.model.EndpointFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -class SqsViaSnsConsumerScannerImplTest { - @Mock - private EndpointFactory endpointFactory; - - @InjectMocks - private SqsViaSnsConsumerScannerImpl clazz; - - @BeforeEach - public void init() { - MockitoAnnotations.openMocks(this); - } - - @Test - void shouldFindAllSqsConsumers_whenScanClasspath() { - clazz.scanSenderAndReceiver("test.sqs.visualize"); - - Mockito.verify(endpointFactory, Mockito.times(3)).createSqsViaSnsConsumer(Mockito.any(), Mockito.any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/hlag/tools/commvis/domain/service/UserDefinedScannerIT.java b/src/test/java/com/hlag/tools/commvis/domain/service/UserDefinedScannerIT.java deleted file mode 100644 index fb8cf32..0000000 --- a/src/test/java/com/hlag/tools/commvis/domain/service/UserDefinedScannerIT.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.hlag.tools.commvis.domain.service; - -import com.hlag.tools.commvis.analyzer.service.IScannerService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) -public class UserDefinedScannerIT { - @Autowired - private IScannerService[] scannerServices; - - @Test - void shouldFindUserDefinedScannersAndStandardScannersInPackage() { - assertThat(scannerServices).hasSize(11); - } -} diff --git a/src/test/java/integration/Application.java b/src/test/java/integration/Application.java deleted file mode 100644 index b14f72b..0000000 --- a/src/test/java/integration/Application.java +++ /dev/null @@ -1,18 +0,0 @@ -package integration; - -import integration.endpoint.CustomerEndpoint; - -import javax.ws.rs.ApplicationPath; -import java.util.HashSet; -import java.util.Set; - -@ApplicationPath("api/core") -public class Application extends javax.ws.rs.core.Application { - @Override - public Set> getClasses() { - Set> classes = new HashSet<>(); - classes.add(CustomerEndpoint.class); - - return classes; - } -} diff --git a/src/test/java/integration/endpoint/CallHttpsEndpoints.java b/src/test/java/integration/endpoint/CallHttpsEndpoints.java deleted file mode 100644 index a7ba65b..0000000 --- a/src/test/java/integration/endpoint/CallHttpsEndpoints.java +++ /dev/null @@ -1,10 +0,0 @@ -package integration.endpoint; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeHttpsCall; - -public class CallHttpsEndpoints { - @VisualizeHttpsCall(path = "/customers/{customerId}/invoices", type = "GET", projectId = "4711", projectName = "accounting service") - public void getCustomerInvoices() { - - } -} diff --git a/src/test/java/integration/endpoint/CustomerCancelledOrderReceiver.java b/src/test/java/integration/endpoint/CustomerCancelledOrderReceiver.java deleted file mode 100644 index c071200..0000000 --- a/src/test/java/integration/endpoint/CustomerCancelledOrderReceiver.java +++ /dev/null @@ -1,8 +0,0 @@ -package integration.endpoint; - -import javax.ejb.ActivationConfigProperty; -import javax.ejb.MessageDriven; - -@MessageDriven(name = "CustomerCancelledOrderReceiver", activationConfig = {@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/customer/orderCancelled"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")}) -public class CustomerCancelledOrderReceiver { -} diff --git a/src/test/java/integration/endpoint/CustomerEndpoint.java b/src/test/java/integration/endpoint/CustomerEndpoint.java deleted file mode 100644 index 132c204..0000000 --- a/src/test/java/integration/endpoint/CustomerEndpoint.java +++ /dev/null @@ -1,11 +0,0 @@ -package integration.endpoint; - -import javax.ws.rs.*; - -@Path("sales") -public class CustomerEndpoint { - @POST - @Path("customers") - public void createCustomer() { - } -} diff --git a/src/test/java/integration/endpoint/CustomerService.java b/src/test/java/integration/endpoint/CustomerService.java deleted file mode 100644 index eb07ccd..0000000 --- a/src/test/java/integration/endpoint/CustomerService.java +++ /dev/null @@ -1,22 +0,0 @@ -package integration.endpoint; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsProducer; - -public class CustomerService { - @VisualizeSqsProducer(queueName = "revoke-credit-line", projectId = "2", projectName = "Customer Service") - public void revokeCreditLineFromCustomer() { - - } - - @VisualizeKafkaProducer(topicName = "vip-customer-created", projectId = "2", projectName = "Customer Service") - public void addVipCustomer() { - - } - - @VisualizeSnsProducer(topicName = "stop-customer-business", projectId = "2", projectName = "Customer Service") - public void stopCustomerBusiness() { - - } -} diff --git a/src/test/java/integration/endpoint/MasterDataEndpoint.java b/src/test/java/integration/endpoint/MasterDataEndpoint.java deleted file mode 100644 index 99d38ad..0000000 --- a/src/test/java/integration/endpoint/MasterDataEndpoint.java +++ /dev/null @@ -1,20 +0,0 @@ -package integration.endpoint; - -import com.hlag.tools.commvis.analyzer.annotation.*; - -public class MasterDataEndpoint { - @VisualizeKafkaConsumer(topicName = "location-invalidated", projectName = "Master Data Catalog") - public void locationInvalidated() { - - } - - @VisualizeSqsViaSnsConsumer(topicName = "new-country", projectName = "Master Data Catalog") - public void countryAdded() { - - } - - @VisualizeSqsConsumer(queueName = "revoke-credit-line", projectName = "Master Data Catalog") - public void revokeCreditLine() { - - } -} diff --git a/src/test/java/test/http/CallHttpsEndpoints.java b/src/test/java/test/http/CallHttpsEndpoints.java deleted file mode 100644 index 52ce0eb..0000000 --- a/src/test/java/test/http/CallHttpsEndpoints.java +++ /dev/null @@ -1,10 +0,0 @@ -package test.http; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeHttpsCall; - -public class CallHttpsEndpoints { - @VisualizeHttpsCall(path = "customers/{customerId}/invoices", type = "GET", projectId = "4711", projectName = "accounting service") - public void getCustomerInvoices() { - - } -} diff --git a/src/test/java/test/http/jaxrs/Application.java b/src/test/java/test/http/jaxrs/Application.java deleted file mode 100644 index dd86210..0000000 --- a/src/test/java/test/http/jaxrs/Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package test.http.jaxrs; - -import javax.ws.rs.Path; -import java.util.HashSet; -import java.util.Set; - -@Path("/api") -public class Application extends javax.ws.rs.core.Application { - public Set> getClasses() { - Set> classes = new HashSet<>(); - classes.add(ConsumerEndpoints.class); - - return classes; - } -} diff --git a/src/test/java/test/http/jaxrs/ConsumerEndpoints.java b/src/test/java/test/http/jaxrs/ConsumerEndpoints.java deleted file mode 100644 index 37eca55..0000000 --- a/src/test/java/test/http/jaxrs/ConsumerEndpoints.java +++ /dev/null @@ -1,41 +0,0 @@ -package test.http.jaxrs; - -import javax.ws.rs.*; - -@Path("endpoint") -public class ConsumerEndpoints { - @POST - @Path("a") - public void receivesAPostRequest() { - } - - @GET - @Path("b") - public void receivesAGetRequest() { - } - - @HEAD - @Path("c") - public void receivesAHeadRequest() { - } - - @OPTIONS - @Path("d") - public void receivesAOptionsRequest() { - } - - @PUT - @Path("e") - public void receivesAPutRequest() { - } - - @PATCH - @Path("f") - public void receivesAPatchRequest() { - } - - @DELETE - @Path("g") - public void receivesADeleteRequest() { - } -} diff --git a/src/test/java/test/http/spring/ConsumerEndpoints.java b/src/test/java/test/http/spring/ConsumerEndpoints.java deleted file mode 100644 index 820c78c..0000000 --- a/src/test/java/test/http/spring/ConsumerEndpoints.java +++ /dev/null @@ -1,34 +0,0 @@ -package test.http.spring; - -import org.springframework.web.bind.annotation.*; - - -public class ConsumerEndpoints { - @PostMapping(value = "a") - public void receivesAPostRequest() { - } - - @GetMapping(value = "b") - public void receivesAGetRequest() { - } - - @RequestMapping(path = "c", method = RequestMethod.HEAD) - public void receivesAHeadRequest() { - } - - @RequestMapping(value = "d", method = RequestMethod.OPTIONS) - public void receivesAOptionsRequest() { - } - - @PutMapping(value = "e") - public void receivesAPutRequest() { - } - - @PatchMapping(value = "f") - public void receivesAPatchRequest() { - } - - @DeleteMapping(value = "g") - public void receivesADeleteRequest() { - } -} diff --git a/src/test/java/test/jms/CustomerCancelledOrderReceiver.java b/src/test/java/test/jms/CustomerCancelledOrderReceiver.java deleted file mode 100644 index e4ce58b..0000000 --- a/src/test/java/test/jms/CustomerCancelledOrderReceiver.java +++ /dev/null @@ -1,8 +0,0 @@ -package test.jms; - -import javax.ejb.ActivationConfigProperty; -import javax.ejb.MessageDriven; - -@MessageDriven(name = "CustomerCancelledOrderReceiver", activationConfig = {@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/customer/orderCancelled"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")}) -public class CustomerCancelledOrderReceiver { -} diff --git a/src/test/java/test/kafka/visualize/KafkaConsumer.java b/src/test/java/test/kafka/visualize/KafkaConsumer.java deleted file mode 100644 index ac89f25..0000000 --- a/src/test/java/test/kafka/visualize/KafkaConsumer.java +++ /dev/null @@ -1,18 +0,0 @@ -package test.kafka.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaConsumers; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumers; - -public class KafkaConsumer { - @VisualizeKafkaConsumer(topicName = "locations", projectName = "master data") - public void receiveLocationSyncEvent() { - - } - - @VisualizeKafkaConsumers({@VisualizeKafkaConsumer(topicName = "customer_data", projectName = "master data"), @VisualizeKafkaConsumer(topicName = "account_data", projectName = "master data")}) - public void receiveFromManyTopics() { - - } -} diff --git a/src/test/java/test/kafka/visualize/KafkaProducer.java b/src/test/java/test/kafka/visualize/KafkaProducer.java deleted file mode 100644 index 39d064a..0000000 --- a/src/test/java/test/kafka/visualize/KafkaProducer.java +++ /dev/null @@ -1,15 +0,0 @@ -package test.kafka.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeKafkaProducers; - -public class KafkaProducer { - @VisualizeKafkaProducer(topicName = "locations", projectId = "myProject", projectName = "my very interesting project") - public void produceLocationSyncEvent() { - } - - @VisualizeKafkaProducers({@VisualizeKafkaProducer(topicName = "locations", projectId = "myProject", projectName = "my very interesting project"), @VisualizeKafkaProducer(topicName = "locations2", projectId = "myProject", projectName = "my very interesting project")}) - public void produceSomeEvents() { - - } -} diff --git a/src/test/java/test/sns/visualize/SnsProducer.java b/src/test/java/test/sns/visualize/SnsProducer.java deleted file mode 100644 index f8ae45c..0000000 --- a/src/test/java/test/sns/visualize/SnsProducer.java +++ /dev/null @@ -1,9 +0,0 @@ -package test.sns.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSnsProducer; - -public class SnsProducer { - @VisualizeSnsProducer(topicName = "locations", projectId = "myProject", projectName = "my very interesting project") - public void produceLocationSyncEvent() { - } -} diff --git a/src/test/java/test/sqs/visualize/SqsProducer.java b/src/test/java/test/sqs/visualize/SqsProducer.java deleted file mode 100644 index dea3cec..0000000 --- a/src/test/java/test/sqs/visualize/SqsProducer.java +++ /dev/null @@ -1,14 +0,0 @@ -package test.sqs.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsProducer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsProducers; - -public class SqsProducer { - @VisualizeSqsProducer(queueName = "locations", projectId = "myProject", projectName = "my very interesting project") - public void produceLocationSyncEvent() { - } - - @VisualizeSqsProducers(@VisualizeSqsProducer(queueName = "location", projectId = "myProject", projectName = "my very interesting project")) - public void produceLocationSyncEvents() { - } -} diff --git a/src/test/java/test/sqs/visualize/SqsReceiver.java b/src/test/java/test/sqs/visualize/SqsReceiver.java deleted file mode 100644 index 65d2977..0000000 --- a/src/test/java/test/sqs/visualize/SqsReceiver.java +++ /dev/null @@ -1,16 +0,0 @@ -package test.sqs.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsConsumers; - -public class SqsReceiver { - @VisualizeSqsConsumer(queueName = "locations", projectName = "master data") - public void receiveLocationSyncEvent() { - - } - - @VisualizeSqsConsumers({@VisualizeSqsConsumer(queueName = "customer_data", projectName = "master data"), @VisualizeSqsConsumer(queueName = "account_data", projectName = "master data")}) - public void receiveFromManyQueues() { - - } -} diff --git a/src/test/java/test/sqs/visualize/SqsViaSnsReceiver.java b/src/test/java/test/sqs/visualize/SqsViaSnsReceiver.java deleted file mode 100644 index 539afb9..0000000 --- a/src/test/java/test/sqs/visualize/SqsViaSnsReceiver.java +++ /dev/null @@ -1,16 +0,0 @@ -package test.sqs.visualize; - -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumer; -import com.hlag.tools.commvis.analyzer.annotation.VisualizeSqsViaSnsConsumers; - -public class SqsViaSnsReceiver { - @VisualizeSqsViaSnsConsumer(topicName = "locations", projectName = "master data") - public void receiveLocationSyncEvent() { - - } - - @VisualizeSqsViaSnsConsumers({@VisualizeSqsViaSnsConsumer(topicName = "customer_data", projectName = "master data"), @VisualizeSqsViaSnsConsumer(topicName = "account_data", projectName = "master data")}) - public void receiveFromManyQueues() { - - } -} diff --git a/src/test/resources/combine-models/combined-model.dot b/src/test/resources/combine-models/combined-model.dot deleted file mode 100644 index c469ff9..0000000 --- a/src/test/resources/combine-models/combined-model.dot +++ /dev/null @@ -1,25 +0,0 @@ -digraph G { - "1" [label="Customer" shape="rectangle"] - "2" [label="Invoice" shape="rectangle"] - - "1#6e184a1a-b56b-4765-86db-f7ecc8173e78" [label="integration.endpoint.CustomerEndpoint.getCustomer\n/customers/{customerId}\nGET" shape="ellipse"] - "1#f3a6ead6-80b4-441e-9c2d-bf27b6301630" [label="integration.endpoint.CustomerEndpoint.getInvoice\ninvoice" shape="diamond"] - "1#97a4fada-961d-4dc1-8608-eeb1619e085c" [label="integration.endpoint.CustomerEndpoint.invoiceWasSettled\ninvoiceSettled" shape="diamond"] - "1#ed141072-13ce-4d31-ab16-e32124aa1bf9" [label="integration.endpoint.CustomerEndpoint.customerDeleted\ncustomerDeleted" shape="diamond"] - "2#2d9f08b8-c469-4ead-8d79-38e2e6070ffe" [label="integration.endpoint.CallHttpsEndpoints.getCustomerInvoices" shape="ellipse"] - "2#afef900b-313a-45ec-a507-6dd629714eed" [label="integration.endpoint.CallSqsEndpoints.updateInvoice\ninvoice" shape="diamond"] - "2#eece73d3-d53d-43d5-aea1-dde19a81647a" [label="integration.endpoint.CallSnsEndpoints.invoiceSettled\ninvoiceSettled" shape="diamond"] - "2#f2fc2e50-c651-4261-aab1-692d402f51b7" [label="integration.endpoint.CallKafkaEndpoints.deleteCustomer\ncustomerDeleted" shape="diamond"] - "1#6e184a1a-b56b-4765-86db-f7ecc8173e78" -> "1" - "1#f3a6ead6-80b4-441e-9c2d-bf27b6301630" -> "1" - "1#97a4fada-961d-4dc1-8608-eeb1619e085c" -> "1" - "1#ed141072-13ce-4d31-ab16-e32124aa1bf9" -> "1" - "2#2d9f08b8-c469-4ead-8d79-38e2e6070ffe" -> "1#6e184a1a-b56b-4765-86db-f7ecc8173e78" - "2" -> "2#2d9f08b8-c469-4ead-8d79-38e2e6070ffe" - "2#afef900b-313a-45ec-a507-6dd629714eed" -> "1#f3a6ead6-80b4-441e-9c2d-bf27b6301630" - "2" -> "2#afef900b-313a-45ec-a507-6dd629714eed" - "2#eece73d3-d53d-43d5-aea1-dde19a81647a" -> "1#97a4fada-961d-4dc1-8608-eeb1619e085c" - "2" -> "2#eece73d3-d53d-43d5-aea1-dde19a81647a" - "2#f2fc2e50-c651-4261-aab1-692d402f51b7" -> "1#ed141072-13ce-4d31-ab16-e32124aa1bf9" - "2" -> "2#f2fc2e50-c651-4261-aab1-692d402f51b7" -} \ No newline at end of file diff --git a/src/test/resources/combine-models/model1.json b/src/test/resources/combine-models/model1.json deleted file mode 100644 index 02741c7..0000000 --- a/src/test/resources/combine-models/model1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "model_version": "###version###", - "project_id": "1", - "project_name": "Customer", - "http_consumers": [ - { - "id": "6e184a1a-b56b-4765-86db-f7ecc8173e78", - "class_name": "integration.endpoint.CustomerEndpoint", - "method_name": "getCustomer", - "type": "GET", - "path": "/customers/{customerId}" - } - ], - "sqs_consumers": [ - { - "id": "f3a6ead6-80b4-441e-9c2d-bf27b6301630", - "class_name": "integration.endpoint.CustomerEndpoint", - "method_name": "getInvoice", - "queue_name": "invoice" - } - ], - "sqs_via_sns_consumers": [ - { - "id": "97a4fada-961d-4dc1-8608-eeb1619e085c", - "class_name": "integration.endpoint.CustomerEndpoint", - "method_name": "invoiceWasSettled", - "topic_name": "invoiceSettled" - } - ], - "kafka_consumers": [ - { - "id": "ed141072-13ce-4d31-ab16-e32124aa1bf9", - "class_name": "integration.endpoint.CustomerEndpoint", - "method_name": "customerDeleted", - "topic_name": "customerDeleted" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/combine-models/model2.json b/src/test/resources/combine-models/model2.json deleted file mode 100644 index 3fcc02f..0000000 --- a/src/test/resources/combine-models/model2.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "model_version": "###version###", - "project_id": "2", - "project_name": "Invoice", - "http_producers": [ - { - "id": "2d9f08b8-c469-4ead-8d79-38e2e6070ffe", - "class_name": "integration.endpoint.CallHttpsEndpoints", - "method_name": "getCustomerInvoices", - "type": "GET", - "path": "/customers/{customerId}", - "destination_project_id": "1" - } - ], - "sqs_producers": [ - { - "id": "afef900b-313a-45ec-a507-6dd629714eed", - "class_name": "integration.endpoint.CallSqsEndpoints", - "method_name": "updateInvoice", - "queue_name": "invoice", - "destination_project_id": "1" - } - ], - "sns_producers": [ - { - "id": "eece73d3-d53d-43d5-aea1-dde19a81647a", - "class_name": "integration.endpoint.CallSnsEndpoints", - "method_name": "invoiceSettled", - "topic_name": "invoiceSettled", - "destination_project_id": "1" - } - ], - "kafka_producers": [ - { - "id": "f2fc2e50-c651-4261-aab1-692d402f51b7", - "class_name": "integration.endpoint.CallKafkaEndpoints", - "method_name": "deleteCustomer", - "topic_name": "customerDeleted", - "destination_project_id": "1" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/model-newer-name.json b/src/test/resources/json-file-adapter/model-newer-name.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/model-newer-name.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/model.json b/src/test/resources/json-file-adapter/model.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/model.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/subdir1/model-old-name.json b/src/test/resources/json-file-adapter/subdir1/model-old-name.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/subdir1/model-old-name.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/subdir1/model.json b/src/test/resources/json-file-adapter/subdir1/model.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/subdir1/model.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/subdir2/model-new-name.json b/src/test/resources/json-file-adapter/subdir2/model-new-name.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/subdir2/model-new-name.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/json-file-adapter/subdir2/model.json b/src/test/resources/json-file-adapter/subdir2/model.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/test/resources/json-file-adapter/subdir2/model.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/test/resources/model/integration-model.dot b/src/test/resources/model/integration-model.dot deleted file mode 100644 index f308f10..0000000 --- a/src/test/resources/model/integration-model.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G { - "application" [label="my-project-2" shape="rectangle"] - "0" [label="integration.endpoint.CustomerEndpoint.createCustomer\nsales/customers\nPOST" shape="ellipse"] - "1" [label="integration.endpoint.CallHttpsEndpoints.getCustomerInvoices\n/customers/{customerId}/invoices\nGET" shape="ellipse"] - "2" [label="integration.endpoint.CustomerCancelledOrderReceiver\njms/customer/orderCancelled\njavax.jms.Queue" shape="diamond"] - "3" [label="integration.endpoint.MasterDataEndpoint\nrevokeCreditLine\nrevoke-credit-line" shape="diamond"] - "4" [label="integration.endpoint.CustomerService\nrevokeCreditLineFromCustomer\nrevoke-credit-line" shape="diamond"] - "5" [label="integration.endpoint.CustomerService\nstopCustomerBusiness\nstop-customer-business" shape="diamond"] - "6" [label="integration.endpoint.MasterDataEndpoint\ncountryAdded\nnew-country" shape="diamond"] - "7" [label="integration.endpoint.CustomerService\naddVipCustomer\nvip-customer-created" shape="diamond"] - "8" [label="integration.endpoint.MasterDataEndpoint\nlocationInvalidated\nlocation-invalidated" shape="diamond"] - - "0" -> "application" - "application" -> "1" - "2" -> "application" - "3" -> "application" - "application" -> "4" - "application" -> "5" - "6" -> "application" - "application" -> "7" - "8" -> "application" -} \ No newline at end of file diff --git a/src/test/resources/model/integration-model.json b/src/test/resources/model/integration-model.json deleted file mode 100644 index 2fbfbb8..0000000 --- a/src/test/resources/model/integration-model.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "model_version": "###version###", - "project_id": "4711", - "project_name": "my-project-1", - "http_consumers": [ - { - "class_name": "integration.endpoint.CustomerEndpoint", - "method_name": "createCustomer", - "type": "POST", - "path": "sales/customers" - } - ], - "http_producers": [ - { - "class_name": "integration.endpoint.CallHttpsEndpoints", - "method_name": "getCustomerInvoices", - "type": "GET", - "path": "/customers/{customerId}/invoices", - "destination_project_id": "4711" - } - ], - "jms_consumers": [ - { - "class_name": "integration.endpoint.CustomerCancelledOrderReceiver", - "destination": "jms/customer/orderCancelled", - "destination_type": "javax.jms.Queue" - } - ], - "sns_producers": [ - { - "class_name": "integration.endpoint.CustomerService", - "method_name": "stopCustomerBusiness", - "topic_name": "stop-customer-business", - "destination_project_id": "2" - } - ], - "sqs_producers": [ - { - "class_name": "integration.endpoint.CustomerService", - "method_name": "revokeCreditLineFromCustomer", - "queue_name": "revoke-credit-line", - "destination_project_id": "2" - } - ], - "sqs_consumers": [ - { - "class_name": "integration.endpoint.MasterDataEndpoint", - "method_name": "revokeCreditLine", - "queue_name": "revoke-credit-line" - } - ], - "sqs_via_sns_consumers": [ - { - "class_name": "integration.endpoint.MasterDataEndpoint", - "method_name": "countryAdded", - "topic_name": "new-country" - } - ], - "kafka_producers": [ - { - "class_name": "integration.endpoint.CustomerService", - "method_name": "addVipCustomer", - "topic_name": "vip-customer-created", - "destination_project_id": "2" - } - ], - "kafka_consumers": [ - { - "class_name": "integration.endpoint.MasterDataEndpoint", - "method_name": "locationInvalidated", - "topic_name": "location-invalidated" - } - ] -} \ No newline at end of file diff --git a/tests/data/local_file_finder_service/a.txt b/tests/data/local_file_finder_service/a.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/data/local_file_finder_service/dir/b.txt b/tests/data/local_file_finder_service/dir/b.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/data/local_file_finder_service/dir/dir/c.txt b/tests/data/local_file_finder_service/dir/dir/c.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/data/local_file_reader_service/a.txt b/tests/data/local_file_reader_service/a.txt new file mode 100644 index 0000000..bae42c5 --- /dev/null +++ b/tests/data/local_file_reader_service/a.txt @@ -0,0 +1,2 @@ +test1 +test2 diff --git a/tests/data/service_model/Class1.java b/tests/data/service_model/Class1.java new file mode 100644 index 0000000..dfefd6d --- /dev/null +++ b/tests/data/service_model/Class1.java @@ -0,0 +1,9 @@ +package data.service_model; + +public class Class1 { + // dist-comm-vis type=rest direction=in + public void restEndpoint() { } + + // dist-comm-vis type=rest direction=out target-project-id=4711 + public void callsARestApi() { } +} diff --git a/tests/data/source/java/Class1.java b/tests/data/source/java/Class1.java new file mode 100644 index 0000000..e1355c6 --- /dev/null +++ b/tests/data/source/java/Class1.java @@ -0,0 +1,9 @@ +package data.source.java; + +public class Class1 { + // dist-comm-vis type=rest direction=in + public void restEndpoint() { } + + // dist-comm-vis type=rest direction=out target-project-id=4711 + public void callsARestApi() { } +} diff --git a/tests/dist_comm_vis/adapter/endpoint/__init__.py b/tests/dist_comm_vis/adapter/endpoint/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/dist_comm_vis/adapter/endpoint/test_cli.py b/tests/dist_comm_vis/adapter/endpoint/test_cli.py new file mode 100644 index 0000000..a8f2592 --- /dev/null +++ b/tests/dist_comm_vis/adapter/endpoint/test_cli.py @@ -0,0 +1,39 @@ +from dist_comm_vis.adapter.endpoint.cli import parse_command_line_arguments, \ + create_configuration_values_from_command_line_arguments + + +def test_that_mandatory_parameters_are_parsed(): + # given + given_args = ["my-path"] + + # when + actual_args = parse_command_line_arguments(given_args) + + # then + assert actual_args.path == "my-path" + + +def test_log_config_file_parameter_accepted(): + # given + given_args = ["my-path", "--log-config-file", "my-log-config-file"] + + # when + actual_args = parse_command_line_arguments(given_args) + + # then + assert actual_args.log_config_file == "my-log-config-file" + + +def test_all_parameters_are_present_in_container_dictionary(): + # given + given_all_args = ["my-path", "--log-config-file", "my-log-config-file", "--output-path", "my-output-path"] + + # when + actual_args = create_configuration_values_from_command_line_arguments(parse_command_line_arguments(given_all_args)) + + # then + assert actual_args == { + "path": "my-path", + "output_path": "my-output-path", + "log_config_file": "my-log-config-file" + } diff --git a/tests/dist_comm_vis/adapter/endpoint/test_e2e_cli.py b/tests/dist_comm_vis/adapter/endpoint/test_e2e_cli.py new file mode 100644 index 0000000..d6378b1 --- /dev/null +++ b/tests/dist_comm_vis/adapter/endpoint/test_e2e_cli.py @@ -0,0 +1,17 @@ +import os +import sys +from unittest.mock import patch + +from dist_comm_vis.adapter.endpoint.cli import bootstrap +from dist_comm_vis.definitions import ROOT_DIR + + +def test_cli_calls_application(): + testargs = ["prog-name", "path", "--log-config-file", os.path.abspath(os.path.join(ROOT_DIR, "logging.ini")), + "--output-path", os.path.abspath(os.path.join(ROOT_DIR, "target/"))] + + with patch.object(sys, 'argv', testargs): + bootstrap() + + # not sure what can be asserted here + assert True is True diff --git a/tests/dist_comm_vis/adapter/service/test_local_file_finder_service.py b/tests/dist_comm_vis/adapter/service/test_local_file_finder_service.py new file mode 100644 index 0000000..ab6a554 --- /dev/null +++ b/tests/dist_comm_vis/adapter/service/test_local_file_finder_service.py @@ -0,0 +1,25 @@ +import os +import pytest + +from dist_comm_vis.adapter.service.LocalFileFinderService import LocalFileFinderService +from dist_comm_vis.definitions import ROOT_DIR + + +@pytest.fixture +def service(): + return LocalFileFinderService() + + +def test_find_files_recursively(service: LocalFileFinderService): + # given + given_local_path = os.path.abspath(os.path.join(ROOT_DIR, "tests/data/local_file_finder_service")) + + # when + actual_files = list(service.find_files(given_local_path)) + + # then + assert len(actual_files) == 3 + + assert actual_files[0].full_qualified_name == os.path.abspath(given_local_path + "/a.txt") + assert actual_files[1].full_qualified_name == os.path.abspath(given_local_path + "/dir/b.txt") + assert actual_files[2].full_qualified_name == os.path.abspath(given_local_path + "/dir/dir/c.txt") diff --git a/tests/dist_comm_vis/adapter/service/test_local_file_reader_service.py b/tests/dist_comm_vis/adapter/service/test_local_file_reader_service.py new file mode 100644 index 0000000..8b4a141 --- /dev/null +++ b/tests/dist_comm_vis/adapter/service/test_local_file_reader_service.py @@ -0,0 +1,20 @@ +import os + +from dist_comm_vis.adapter.service.LocalFileReaderService import LocalFileReaderService +from dist_comm_vis.definitions import ROOT_DIR +from dist_comm_vis.domain.model.File import File + + +def test_returns_file_content(): + # given + given_full_qualified_name = os.path.abspath(os.path.join(ROOT_DIR, "tests/data/local_file_reader_service/a.txt")) + given_content = "my-content" + given_file = File(given_full_qualified_name) + given_file.content = given_content + + # when + actual_content = [line for line in LocalFileReaderService().read_lines(given_file)] + + # then + assert actual_content[0] == "test1\n" + assert actual_content[1] == "test2\n" diff --git a/tests/dist_comm_vis/application/test_service_model.py b/tests/dist_comm_vis/application/test_service_model.py new file mode 100644 index 0000000..2fc65d3 --- /dev/null +++ b/tests/dist_comm_vis/application/test_service_model.py @@ -0,0 +1,26 @@ +import os + +import pytest + +from dist_comm_vis.adapter.service.ModelWriterService import JsonModelWriterService +from dist_comm_vis.adapter.service.LocalFileFinderService import LocalFileFinderService +from dist_comm_vis.adapter.service.LocalFileReaderService import LocalFileReaderService +from dist_comm_vis.adapter.service.LocalFileWriterService import LocalFileWriterService +from dist_comm_vis.application.ServiceModel import ServiceModelApplication +from dist_comm_vis.definitions import ROOT_DIR +from dist_comm_vis.domain.service.FileAnalyzerService import FileAnalyzerServiceFactory + + +@pytest.fixture +def application(): + return ServiceModelApplication(LocalFileFinderService(), FileAnalyzerServiceFactory(LocalFileReaderService()), + LocalFileWriterService(), JsonModelWriterService()) + + +def test_dummy(application): + # given + given_path_to_analyze = os.path.abspath(os.path.join(ROOT_DIR, "tests/data/service_model")) + given_output_path = os.path.abspath(os.path.join(ROOT_DIR, "target")) + + # when + application.create_for_project(given_path_to_analyze, given_output_path) diff --git a/tests/dist_comm_vis/domain/model/test_file.py b/tests/dist_comm_vis/domain/model/test_file.py new file mode 100644 index 0000000..aacc7af --- /dev/null +++ b/tests/dist_comm_vis/domain/model/test_file.py @@ -0,0 +1,12 @@ +from dist_comm_vis.domain.model.File import File + + +def test_extension_is_present_after_init(): + # given + given_full_qualified_name = "my-file.java" + + # when + actual_file = File(given_full_qualified_name) + + # then + assert actual_file.extension == "java" diff --git a/tests/dist_comm_vis/domain/service/test_file_analyzer_service_factory.py b/tests/dist_comm_vis/domain/service/test_file_analyzer_service_factory.py new file mode 100644 index 0000000..afbf45a --- /dev/null +++ b/tests/dist_comm_vis/domain/service/test_file_analyzer_service_factory.py @@ -0,0 +1,24 @@ +import pytest + +from dist_comm_vis.adapter.service.LocalFileReaderService import LocalFileReaderService +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.service.FileAnalyzerService import FileAnalyzerServiceFactory, JavaFileAnalyzerService + + +def test_returns_an_analyzer_for_java_files(): + # given + given_file = File("my-file.java") + + # when + actual_analyzer = FileAnalyzerServiceFactory(LocalFileReaderService()).create(given_file) + + # then + assert isinstance(actual_analyzer, JavaFileAnalyzerService) + + +def test_throws_exception_for_unknown_file_extension(): + # given + given_file = File("my-file.unknown") + + with pytest.raises(Exception): + FileAnalyzerServiceFactory(LocalFileReaderService()).create(given_file) diff --git a/tests/dist_comm_vis/domain/service/test_java_file_analyzer_service.py b/tests/dist_comm_vis/domain/service/test_java_file_analyzer_service.py new file mode 100644 index 0000000..d0478a1 --- /dev/null +++ b/tests/dist_comm_vis/domain/service/test_java_file_analyzer_service.py @@ -0,0 +1,18 @@ +import os + +from dist_comm_vis.adapter.service.LocalFileReaderService import LocalFileReaderService +from dist_comm_vis.definitions import ROOT_DIR +from dist_comm_vis.domain.model.File import File +from dist_comm_vis.domain.service.FileAnalyzerService import JavaFileAnalyzerService + + +def test_detects_model_string_in_double_slash_comment(): + # given + given_local_path = os.path.abspath(os.path.join(ROOT_DIR, "tests/data/source/java")) + given_file = File(os.path.join(given_local_path, "Class1.java")) + + # when + actual_model = JavaFileAnalyzerService(LocalFileReaderService()).detect_model_relations(given_file) + + # then + assert len(actual_model) == 2 diff --git a/tests/log.json b/tests/log.json new file mode 100644 index 0000000..3b9d3c6 --- /dev/null +++ b/tests/log.json @@ -0,0 +1,6 @@ +{ + "asctime": "2023-05-03 11:57:06,373", + "name": "endpoint.test_e2e_cli", + "levelname": "INFO", + "message": "Hello World!" +}