diff --git a/.eslintrc.yaml b/.eslintrc.yaml deleted file mode 100644 index 0e75d025b..000000000 --- a/.eslintrc.yaml +++ /dev/null @@ -1,102 +0,0 @@ -root: true - -env: - node: true - -plugins: - - prefer-arrow-functions - - simple-import-sort - -extends: - # Order matters, later configs purposefully override settings from earlier configs - - eslint:recommended - - plugin:@typescript-eslint/recommended - - plugin:@typescript-eslint/recommended-requiring-type-checking - - plugin:import/recommended - - plugin:node/recommended - - prettier # this actually turns OFF all prettier rules running via eslint - -parserOptions: - ecmaVersion: latest - sourceType: module - project: tsconfig.json - -rules: - # Turn off base eslint rules in lieu of @typescript-eslint rules (just below) - no-return-await: off - no-shadow: off - no-unused-expressions: off - no-unused-vars: off - no-use-before-define: off - no-useless-constructor: off - "@typescript-eslint/lines-between-class-members": [error, always, { exceptAfterSingleLine: true }] - "@typescript-eslint/naming-convention": - - error - - selector: typeLike - format: [PascalCase] - - selector: function - format: [camelCase] - - selector: variable - modifiers: [global, const] - # The plugin can't differentiate between: - # - values, which should be UPPER_CASE - # - arrow functions, which should be camelCase - format: [UPPER_CASE, camelCase] - "@typescript-eslint/no-shadow": error - "@typescript-eslint/no-unused-expressions": [error] - "@typescript-eslint/no-unused-vars": [error, { argsIgnorePattern: ^_ }] - "@typescript-eslint/no-use-before-define": [error] - "@typescript-eslint/no-useless-constructor": [error] - "@typescript-eslint/no-explicit-any": off - class-methods-use-this: off - curly: error - func-names: [error, as-needed] - func-style: [error, expression, { "allowArrowFunctions": true }] - import/extensions: - - error - - ignorePackages - - js: never - ts: never - import/no-extraneous-dependencies: - - error - - devDependencies: ["**/*.test.ts", "**/tests/**"] - import/no-unresolved: off - import/prefer-default-export: off - lines-between-class-members: off - max-len: - - error - - code: 120 - comments: 130 - tabWidth: 2 - ignoreComments: false - ignoreTrailingComments: false - ignoreUrls: true - ignoreStrings: true - ignoreTemplateLiterals: true - ignoreRegExpLiterals: true - no-continue: off - no-param-reassign: [error, { props: false }] - no-restricted-syntax: off - node/no-extraneous-import: [error] - node/no-unpublished-import: off - node/no-missing-import: off - node/no-unsupported-features/es-syntax: [error, { ignores: [modules, dynamicImport] }] - prefer-arrow-functions/prefer-arrow-functions: - - error # only allow arrow functions - - returnStyle: implicit # required to be set for autofixes - simple-import-sort/exports: error - simple-import-sort/imports: error - -settings: - import/resolver: - typescript: - alwaysTryTypes: true - -overrides: - - files: ["**/*test.ts"] - env: - jest: true - plugins: - - jest - extends: - - plugin:jest/recommended diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index a38f874bd..cb72013d0 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -3,6 +3,7 @@ self-hosted-runner: labels: - ubuntu-x64 - macOS + - ubuntu-latest # Configuration variables in array of strings defined in your repository or # organization. `null` means disabling configuration variables check. # Empty array means no configuration variable is allowed. diff --git a/.github/actions/action_tests/action.yaml b/.github/actions/action_tests/action.yaml index 16b5a7251..eaf56a4a5 100644 --- a/.github/actions/action_tests/action.yaml +++ b/.github/actions/action_tests/action.yaml @@ -16,18 +16,21 @@ inputs: description: Additional args to append to the test invocation required: false default: actions/ -- - trunk-token: - description: CI debugger api token - required: true + trunk-staging-token: + description: Test analytics staging api token (org token) + required: false + trunk-prod-token: + description: Test analytics prod api token (org token) + required: false runs: # TODO(Tyler): See if this can be converted to a js action using: composite steps: - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 - name: Specify defaults run: | @@ -49,25 +52,37 @@ runs: working-directory: ${{ inputs.path }} - name: Run action tests - if: runner.os == 'Windows' run: npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --passWithNoTests --ci shell: bash working-directory: ${{ inputs.path }} + continue-on-error: true env: + JEST_SUITE_NAME: Action Tests PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} - - name: Run action tests - if: runner.os != 'Windows' - uses: trunk-io/breakpoint@v1.3.0 + - name: Upload prod results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-prod-token != ''" + uses: trunk-io/analytics-uploader@main with: - breakpoint-id: trunk-plugins-action-tests - shell: bash - working-directory: ${{ inputs.path }} - trunk-token: ${{ inputs.trunk-token }} - org: trunk-staging-org - run: - npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --passWithNoTests --ci + junit-paths: junit.xml + org-slug: trunk + token: ${{ inputs.trunk-prod-token }} + variant: ${{ runner.os }} + continue-on-error: true env: - PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} - PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk.io + + - name: Upload staging results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-staging-token != ''" + uses: trunk-io/analytics-uploader@main + with: + junit-paths: junit.xml + org-slug: trunk-staging-org + token: ${{ inputs.trunk-staging-token }} + quarantine: true + variant: ${{ runner.os }} + env: + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk-staging.io diff --git a/.github/actions/linter_tests/action.yaml b/.github/actions/linter_tests/action.yaml index 0bc5897ff..48be0d800 100644 --- a/.github/actions/linter_tests/action.yaml +++ b/.github/actions/linter_tests/action.yaml @@ -20,35 +20,64 @@ inputs: description: Additional args to append to the test invocation required: false default: linters -- + snyk-token: + description: Token to login for snyk test + required: true sourcery-token: description: Token to login for sourcery test required: true - trunk-token: - description: CI debugger api token - required: true + trunk-staging-token: + description: Test analytics staging api token (org token) + required: false + trunk-prod-token: + description: Test analytics prod api token (org token) + required: false + ref-type: + description: release or main + required: false + default: main runs: # TODO(Tyler): See if this can be converted to a js action using: composite steps: - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 + # NOTE: tzdata is a dependency of php, but without the DEBIAN_FRONTEND=noninteractive + # it will prompt for a timezone selection - name: Install packages and specify defaults run: | echo "CLI_PATH=${{ inputs.cli-path }}" >> "$GITHUB_ENV" + if [[ "${{ inputs.linter-version }}" == "Latest" ]]; then + echo "JEST_LINTER_VERSION=Latest" >> "$GITHUB_ENV" + else + # If the linter version is KnownGoodVersions, coalesce to Snapshots + # For flaky analysis. + echo "JEST_LINTER_VERSION=Snapshots" >> "$GITHUB_ENV" + fi case "$RUNNER_OS" in Linux) + # Cleanup any existing apt locks + sudo killall apt-get || true + sudo rm /var/lib/apt/lists/lock || true + + # Install non-hermetic linters + sudo add-apt-repository ppa:ondrej/php sudo apt-get update - sudo apt-get -y install libperl-critic-perl perltidy zlib1g-dev + sudo apt-get -y install libperl-critic-perl perltidy zlib1g-dev software-properties-common + DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC sudo apt-get -y install tzdata + sudo apt install -y php8.2-fpm php8.2-xml php8.2-mbstring php8.2-curl ;; macOS) - brew install cpm - cpm install -g --no-test --color Perl::Critic Perl::Tidy + brew install powershell/tap/powershell + brew install cpanminus + cpanm YAML::PP Class::Tiny Perl::Critic brew unlink perl && brew link perl + brew install php gnupg ;; Windows) echo "PLATFORM_APPEND_ARGS=--maxWorkers=5" >> "$GITHUB_ENV" @@ -64,33 +93,50 @@ runs: shell: bash working-directory: ${{ inputs.path }} + - name: Clean jest cache + run: npx jest --clearCache + shell: bash + working-directory: ${{ inputs.path }} + - name: Run plugin tests - if: runner.os == 'Windows' run: npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --ci shell: bash working-directory: ${{ inputs.path }} + continue-on-error: true env: PLUGINS_TEST_LINTER_VERSION: ${{ inputs.linter-version }} PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} + SNYK_TOKEN: ${{ inputs.snyk-token }} SOURCERY_TOKEN: ${{ inputs.sourcery-token }} # Debug recurrent eslint circular JSON errors - DEBUG: Driver:eslint:*,Driver:cspell:*,Driver:nixpkgs-fmt:* + DEBUG: Driver:eslint:*,Driver:nixpkgs-fmt:*,Driver:trunk-toolbox:* + JEST_SUITE_NAME: Linter Tests + JEST_JUNIT_SUITE_NAME: + "{title} ${{ runner.os }} ${{ inputs.ref-type }} ${{ inputs.linter-version }}" - - name: Run plugin tests - if: runner.os != 'Windows' - # trunk-ignore(semgrep/yaml.github-actions.security.third-party-action-not-pinned-to-commit-sha.third-party-action-not-pinned-to-commit-sha) - uses: trunk-io/breakpoint@v1.3.0 + - name: Upload prod results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-prod-token != ''" + uses: trunk-io/analytics-uploader@main with: - breakpoint-id: trunk-plugins-linter-tests - shell: bash - working-directory: ${{ inputs.path }} - trunk-token: ${{ inputs.trunk-token }} - org: trunk-staging-org - run: npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --ci + junit-paths: junit.xml + org-slug: trunk + token: ${{ inputs.trunk-prod-token }} + variant: ${{ runner.os }} + continue-on-error: true env: - PLUGINS_TEST_LINTER_VERSION: ${{ inputs.linter-version }} - PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} - PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} - SOURCERY_TOKEN: ${{ inputs.sourcery-token }} - DEBUG: Driver:nixpkgs-fmt:*, Driver:eslint:* + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk.io + + - name: Upload staging results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-staging-token != ''" + uses: trunk-io/analytics-uploader@main + with: + junit-paths: junit.xml + org-slug: trunk-staging-org + token: ${{ inputs.trunk-staging-token }} + quarantine: true + variant: ${{ runner.os }} + env: + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk-staging.io diff --git a/.github/actions/tool_tests/action.yaml b/.github/actions/tool_tests/action.yaml index 1aabf985f..c36bf3e17 100644 --- a/.github/actions/tool_tests/action.yaml +++ b/.github/actions/tool_tests/action.yaml @@ -16,24 +16,43 @@ inputs: description: Additional args to append to the test invocation required: false default: tools -- - trunk-token: - description: CI debugger api token - required: true + trunk-staging-token: + description: Test analytics staging api token (org token) + required: false + trunk-prod-token: + description: Test analytics prod api token (org token) + required: false + ref-type: + description: release or main + required: false + default: main runs: # TODO(Tyler): See if this can be converted to a js action using: composite steps: - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 - - name: Specify defaults + - name: Install packages and specify defaults run: | echo "CLI_PATH=${{ inputs.cli-path }}" >> "$GITHUB_ENV" case "$RUNNER_OS" in + Linux) + # Cleanup any existing apt locks + sudo killall apt-get || true + sudo rm /var/lib/apt/lists/lock || true + + sudo add-apt-repository ppa:ondrej/php + sudo apt-get update + sudo apt install -y php8.2-fpm php8.2-xml php8.2-mbstring php8.2-curl + ;; + macOS) + brew install php gnupg + ;; Windows) echo "PLATFORM_APPEND_ARGS=--maxWorkers=5" >> "$GITHUB_ENV" if [[ "${{ inputs.cli-path }}" == "" ]]; then @@ -49,25 +68,38 @@ runs: working-directory: ${{ inputs.path }} - name: Run plugin tests - if: runner.os == 'Windows' run: npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --ci shell: bash working-directory: ${{ inputs.path }} + continue-on-error: true env: PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} + JEST_SUITE_NAME: Tool Tests + JEST_JUNIT_SUITE_NAME: "{title} ${{ runner.os }} ${{ inputs.ref-type }}" - - name: Run plugin tests - if: runner.os != 'Windows' - # trunk-ignore(semgrep/yaml.github-actions.security.third-party-action-not-pinned-to-commit-sha.third-party-action-not-pinned-to-commit-sha) - uses: trunk-io/breakpoint@v1.3.0 + - name: Upload prod results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-prod-token != ''" + uses: trunk-io/analytics-uploader@main with: - breakpoint-id: trunk-plugins-tool-tests - shell: bash - working-directory: ${{ inputs.path }} - trunk-token: ${{ inputs.trunk-token }} - org: trunk-staging-org - run: npm test ${{ inputs.append-args }} ${{ env.PLATFORM_APPEND_ARGS }} --ci + junit-paths: junit.xml + org-slug: trunk + token: ${{ inputs.trunk-prod-token }} + variant: ${{ runner.os }} + continue-on-error: true env: - PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} - PLUGINS_TEST_CLI_PATH: ${{ env.CLI_PATH }} + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk.io + + - name: Upload staging results + # TODO(Tyler): Add upload on Windows once the action supports it. + if: "!cancelled() && runner.os != 'Windows' && inputs.trunk-staging-token != ''" + uses: trunk-io/analytics-uploader@main + with: + junit-paths: junit.xml + org-slug: trunk-staging-org + token: ${{ inputs.trunk-staging-token }} + quarantine: true + variant: ${{ runner.os }} + env: + TRUNK_PUBLIC_API_ADDRESS: https://api.trunk-staging.io diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index d6b401a61..2900b5a2a 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -5,9 +5,7 @@ updates: schedule: interval: weekly day: sunday - # trunk-ignore(yamllint/quoted-strings) - time: "08:00" # UTC - labels: [🤖 dependabot] + time: "10:00" # UTC groups: dependencies: patterns: @@ -19,9 +17,9 @@ updates: schedule: interval: weekly day: sunday - # trunk-ignore(yamllint/quoted-strings) - time: "08:00" # UTC - labels: [🤖 dependabot] + time: "10:00" # UTC + ignore: + - dependency-name: eslint groups: dependencies: patterns: diff --git a/.github/workflows/annotate_pr.yaml b/.github/workflows/annotate_pr.yaml index ec05aa67c..44d92e11d 100644 --- a/.github/workflows/annotate_pr.yaml +++ b/.github/workflows/annotate_pr.yaml @@ -18,7 +18,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Trunk Check - uses: trunk-io/trunk-action@65228585e2c6128315f0f2d5190e2eae7f5c32c6 # v1.1.10 + uses: trunk-io/trunk-action@b8812b3da2f527db878ef7541c4177f8d280cd89 # v1.2.3 with: post-annotations: true # This job may fail when the PR was not run on a fork, and that's okay diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5eb4a60d7..230a4509d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -34,7 +34,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 # Override language selection by uncommenting this and choosing your languages with: languages: javascript @@ -42,7 +42,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below). - name: Autobuild - uses: github/codeql-action/autobuild@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + uses: github/codeql-action/autobuild@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -56,4 +56,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + uses: github/codeql-action/analyze@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 81ddd0038..0f742fc01 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -1,8 +1,8 @@ name: Nightly on: schedule: - # Times in UTC (PST+8), this translates to running Mon-Fri at midnight/1am (depending on DST) - - cron: 0 8 * * 1-5 + # Times in UTC (PST+8), this translates to running Mon-Fri at 2am/3am (depending on DST) + - cron: 0 10 * * 1-5 # Only enable on pull requests for testing # pull_request: # paths: [.github/workflows/nightly.yaml] @@ -28,14 +28,14 @@ jobs: # This job is used to diagnose plugin config health in advance of a release linter_tests_main: name: Plugin Tests Main - # runs-on: [self-hosted, "${{ matrix.os }}"] TODO(Tyler): Set after Windows self-hosted are established. runs-on: ${{ matrix.os }} timeout-minutes: 120 strategy: fail-fast: false matrix: linter-version: [Snapshots, Latest] - os: [ubuntu-x64, macOS, windows-latest] + # TODO(Tyler): Re-add Windows runners. + os: [ubuntu-latest, macOS] steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -43,7 +43,7 @@ jobs: - name: Cache tool downloads # ubuntu runner has persistent cache if: matrix.os == 'windows-latest' - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache # No need to key on trunk version unless we change how we store downloads. @@ -66,29 +66,29 @@ jobs: uses: ./.github/actions/linter_tests with: linter-version: ${{ matrix.linter-version }} + ref-type: main + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} # Run tests against all linters for snapshots and latest version as they exist in latest release # This job is used to update the list of validated versions linter_tests_release: name: Plugin Tests Release - # runs-on: [self-hosted, "${{ matrix.os }}"] TODO(Tyler): Set after Windows self-hosted are established. runs-on: ${{ matrix.os }} timeout-minutes: 150 strategy: fail-fast: false matrix: linter-version: [Snapshots, Latest] - os: [ubuntu-x64, macOS, windows-latest] + os: [ubuntu-latest, macOS] include: # Normalize the filenames as inputs for ease of parsing - - os: ubuntu-x64 + - os: ubuntu-latest results-file: ubuntu-latest - os: macOS results-file: macos-latest - - os: windows-latest - results-file: windows-latest outputs: plugin-version: ${{ steps.get-release.outputs.tag }} @@ -149,7 +149,7 @@ jobs: - name: Cache tool downloads # ubuntu, mac runners have persistent cache if: matrix.os == 'windows-latest' - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache # No need to key on trunk version unless we change how we store downloads. @@ -157,12 +157,11 @@ jobs: - name: Delete cache # For now, avoid deleting cache on pull request changes to nightly. This improves PR experience. - if: env.TRIGGER != 'pull_request' run: | - if [ -d "/tmp/plugins_testing_download_cache" ] + if [ -d "${TMPDIR:-/tmp}/plugins_testing_download_cache" ] then - tmp_dir=/tmp/${GITHUB_RUN_ID}-${GITHUB_RUN_NUMBER}-${GITHUB_RUN_ATTEMPT} - mv "/tmp/plugins_testing_download_cache" ${tmp_dir} + tmp_dir=${TMPDIR:-/tmp}/${GITHUB_RUN_ID}-${GITHUB_RUN_NUMBER}-${GITHUB_RUN_ATTEMPT} + mv "${TMPDIR:-/tmp}/plugins_testing_download_cache" ${tmp_dir} chmod -R u+w ${tmp_dir} rm -rf ${tmp_dir} fi @@ -174,13 +173,16 @@ jobs: with: linter-version: ${{ matrix.linter-version }} append-args: linters -- --json --outputFile=${{ matrix.results-file }}-res.json + ref-type: release + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} - name: Upload Test Outputs for Upload Job # Only upload results from latest. Always run, except when cancelled. if: (failure() || success()) && matrix.linter-version == 'Latest' - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ matrix.results-file }}-test-results path: ${{ matrix.results-file }}-res.json @@ -198,8 +200,10 @@ jobs: TRUNK_API_TOKEN: ${{ secrets.TRUNK_API_TOKEN }} TRUNK_OPEN_PR_APP_ID: ${{ secrets.TRUNK_OPEN_PR_APP_ID }} TRUNK_OPEN_PR_APP_PRIVATE_KEY: ${{ secrets.TRUNK_OPEN_PR_APP_PRIVATE_KEY }} + TRUNK_SNYK_TOKEN: ${{ secrets.TRUNK_SNYK_TOKEN }} TRUNK_SOURCERY_TOKEN: ${{ secrets.TRUNK_SOURCERY_TOKEN }} TRUNK_DEBUGGER_TOKEN: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + TRUNK_ORG_PROD_TOKEN: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} with: plugin-version: ${{ needs.linter_tests_release.outputs.plugin-version }} upload-validated-versions: true @@ -209,21 +213,21 @@ jobs: # Run tool tests only on main tool_tests_main: name: Tool Tests Main - # runs-on: [self-hosted, "${{ matrix.os }}"] TODO(Tyler): Set after Windows self-hosted are established. runs-on: ${{ matrix.os }} timeout-minutes: 120 strategy: fail-fast: false matrix: - os: [ubuntu-x64, macOS, windows-latest] + # TODO(Tyler): Re-add Windows runners. + os: [ubuntu-latest, macOS] include: # Normalize the filenames as inputs for ease of parsing - - os: ubuntu-x64 + - os: ubuntu-latest results-file: ubuntu-latest - os: macOS results-file: macos-latest - - os: windows-latest - results-file: windows-latest + # - os: windows-latest + # results-file: windows-latest steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -234,12 +238,13 @@ jobs: uses: ./.github/actions/tool_tests with: append-args: tools -- --json --outputFile=${{ matrix.results-file }}-res.json - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} - name: Upload Test Outputs for Notification Job # Always run, except when cancelled. if: (failure() || success()) - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: tools-${{ matrix.results-file }}-test-results path: ${{ matrix.results-file }}-res.json @@ -252,8 +257,10 @@ jobs: uses: ./.github/workflows/upload_results.reusable.yaml secrets: TRUNKBOT_SLACK_BOT_TOKEN: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} + TRUNK_SNYK_TOKEN: ${{ secrets.TRUNK_SNYK_TOKEN }} TRUNK_SOURCERY_TOKEN: ${{ secrets.TRUNK_SOURCERY_TOKEN }} TRUNK_DEBUGGER_TOKEN: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + TRUNK_ORG_PROD_TOKEN: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} with: plugin-version: main results-prefix: tools- @@ -268,7 +275,7 @@ jobs: action_tests_main: name: Action Tests Main - runs-on: [self-hosted, Linux] + runs-on: [ubuntu-latest] timeout-minutes: 30 steps: - name: Checkout @@ -277,4 +284,5 @@ jobs: - name: Action Tests uses: ./.github/actions/action_tests with: - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 4e4241a72..62e14c18a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -117,7 +117,7 @@ jobs: # Run tests against all linters for known_good_version and latest version linter_tests: name: Linter Tests ${{ matrix.os }} - runs-on: [self-hosted, "${{ matrix.os }}"] + runs-on: ${{ matrix.os }} needs: detect_changes if: needs.detect_changes.outputs.linters == 'true' || needs.detect_changes.outputs.all-linters == @@ -126,21 +126,38 @@ jobs: strategy: fail-fast: false matrix: - os: [Linux, macOS] + os: [ubuntu-latest, macOS] steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # TODO(Tyler): Remove this once the cache has stabilized + - name: Delete cache (mac only) + if: matrix.os == 'macOS' + # For now, avoid deleting cache on pull request changes to nightly. This improves PR experience. + run: | + if [ -d "${TMPDIR:-/tmp}/plugins_testing_download_cache" ] + then + tmp_dir=${TMPDIR:-/tmp}/${GITHUB_RUN_ID}-${GITHUB_RUN_NUMBER}-${GITHUB_RUN_ATTEMPT} + mv "${TMPDIR:-/tmp}/plugins_testing_download_cache" ${tmp_dir} + chmod -R u+w ${tmp_dir} + rm -rf ${tmp_dir} + fi + shell: bash + - name: Linter Tests # Run tests using KnownGoodVersion with any modified linters and conditionally all linters uses: ./.github/actions/linter_tests with: linter-version: KnownGoodVersion + ref-type: main + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} append-args: ${{ needs.detect_changes.outputs.all-linters }} ${{ needs.detect_changes.outputs.linters-files }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} - name: Linter Tests Latest # Run tests on Latest with any modified linters (see filters.yaml). Don't run when cancelled. @@ -150,13 +167,16 @@ jobs: uses: ./.github/actions/linter_tests with: linter-version: Latest + ref-type: main + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} append-args: ${{ needs.detect_changes.outputs.linters-files }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} tool_tests: name: Tool Tests - runs-on: [self-hosted, "${{ matrix.os }}"] + runs-on: ${{ matrix.os }} needs: detect_changes if: needs.detect_changes.outputs.tools == 'true' || needs.detect_changes.outputs.all-tools == @@ -165,7 +185,7 @@ jobs: strategy: fail-fast: false matrix: - os: [Linux, macOS] + os: [ubuntu-latest, macOS] steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -178,11 +198,12 @@ jobs: append-args: ${{ needs.detect_changes.outputs.all-tools }} ${{ needs.detect_changes.outputs.tools-files }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} action_tests: name: Action Tests - runs-on: [self-hosted, Linux] + runs-on: ubuntu-latest needs: detect_changes if: needs.detect_changes.outputs.actions == 'true' || needs.detect_changes.outputs.all-actions == @@ -198,7 +219,8 @@ jobs: append-args: ${{ needs.detect_changes.outputs.all-actions }} ${{ needs.detect_changes.outputs.actions-files }} -- - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} trunk_check_runner: name: Trunk Check runner [linux] @@ -214,24 +236,24 @@ jobs: lfs: true - name: Trunk Check - uses: trunk-io/trunk-action@65228585e2c6128315f0f2d5190e2eae7f5c32c6 + uses: trunk-io/trunk-action@b8812b3da2f527db878ef7541c4177f8d280cd89 env: TRUNK_GITHUB_CHECK_RUN_TITLE: Trunk Check # Run Windows tests for modified linters and tools - # TODO(Tyler): When this is more stabilized and we want to gate on it, we can make it part of the matrix above. windows_linter_tests: name: Windows Linter Tests runs-on: windows-latest needs: detect_changes - if: needs.detect_changes.outputs.linters == 'true' + # TODO(Tyler): Re-add Windows runners. + if: needs.detect_changes.outputs.linters == 'true' && false timeout-minutes: 90 steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Cache tool downloads - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache key: trunk-${{ runner.os }} @@ -241,23 +263,27 @@ jobs: uses: ./.github/actions/linter_tests with: linter-version: Latest + ref-type: main + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} cli-path: ${{ github.workspace }}\trunk.ps1 append-args: ${{needs.detect_changes.outputs.linters-files }} -- --maxWorkers=5 - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} + # TODO(Tyler): Re-add Windows runners. windows_tool_tests: name: Windows Tool Tests runs-on: windows-latest needs: detect_changes - if: needs.detect_changes.outputs.tools == 'true' + if: needs.detect_changes.outputs.tools == 'true' && false timeout-minutes: 60 steps: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Cache tool downloads - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache key: trunk-${{ runner.os }} @@ -268,7 +294,8 @@ jobs: with: append-args: ${{needs.detect_changes.outputs.tools-files }} -- --maxWorkers=5 cli-path: ${{ github.workspace }}\trunk.ps1 - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} # Run repo healthcheck tests repo_tests: diff --git a/.github/workflows/repo_tests.reusable.yaml b/.github/workflows/repo_tests.reusable.yaml index b930aa75c..98e5ae20c 100644 --- a/.github/workflows/repo_tests.reusable.yaml +++ b/.github/workflows/repo_tests.reusable.yaml @@ -13,12 +13,14 @@ on: required: false type: string -permissions: read-all +permissions: + contents: read + statuses: read jobs: plugins_test: name: Plugin Tests - runs-on: ubuntu-x64 + runs-on: ubuntu-latest timeout-minutes: 15 steps: @@ -26,7 +28,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 18 @@ -36,5 +38,6 @@ jobs: - name: Run repo tests run: npm test tests/repo_tests --ci env: + JEST_SUITE_NAME: Repo Tests PLUGINS_TEST_CLI_VERSION: ${{ inputs.cli-version }} PLUGINS_TEST_CLI_PATH: ${{ inputs.cli-path }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 8ef7c18be..4b189dc5b 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -35,7 +35,7 @@ jobs: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif @@ -57,7 +57,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: SARIF file path: results.sarif @@ -65,6 +65,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 with: sarif_file: results.sarif diff --git a/.github/workflows/upgrade_trunk.yaml b/.github/workflows/upgrade_trunk.yaml index ba325590e..f952240c1 100644 --- a/.github/workflows/upgrade_trunk.yaml +++ b/.github/workflows/upgrade_trunk.yaml @@ -1,8 +1,8 @@ name: Upgrade Trunk Weekly on: schedule: - # Weekly at midnight W morning - - cron: 0 8 * * 3 + # Weekly W morning + - cron: 0 10 * * 3 workflow_dispatch: {} permissions: read-all @@ -26,7 +26,7 @@ jobs: private_key: ${{ secrets.TRUNK_OPEN_PR_APP_PRIVATE_KEY }} - name: Trunk Upgrade - uses: trunk-io/trunk-action/upgrade@65228585e2c6128315f0f2d5190e2eae7f5c32c6 + uses: trunk-io/trunk-action/upgrade@b8812b3da2f527db878ef7541c4177f8d280cd89 with: arguments: -n --bleeding-edge github-token: ${{ steps.generate-token.outputs.token }} diff --git a/.github/workflows/upload_results.reusable.yaml b/.github/workflows/upload_results.reusable.yaml index 6fe46d6d1..48877cb2e 100644 --- a/.github/workflows/upload_results.reusable.yaml +++ b/.github/workflows/upload_results.reusable.yaml @@ -34,17 +34,25 @@ on: required: false TRUNK_OPEN_PR_APP_PRIVATE_KEY: required: false + TRUNK_SNYK_TOKEN: + required: false TRUNK_SOURCERY_TOKEN: required: false TRUNK_DEBUGGER_TOKEN: required: false + TRUNK_ORG_PROD_TOKEN: + required: false -permissions: read-all +permissions: + actions: write + contents: read + statuses: read + pull-requests: write jobs: upload_test_results: name: Upload Test Results - runs-on: ubuntu-x64 + runs-on: ubuntu-latest timeout-minutes: 10 env: SLACK_CHANNEL_ID: plugins-notifications @@ -56,24 +64,25 @@ jobs: - name: Retrieve Test Outputs ubuntu id: download-ubuntu - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 continue-on-error: true with: name: ${{ inputs.results-prefix }}ubuntu-latest-test-results - name: Retrieve Test Outputs macOS id: download-macos - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 continue-on-error: true with: name: ${{ inputs.results-prefix }}macos-latest-test-results - - name: Retrieve Test Outputs Windows - id: download-windows - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - continue-on-error: true - with: - name: ${{ inputs.results-prefix }}windows-latest-test-results + # TODO(Tyler): Re-add Windows runners. + # - name: Retrieve Test Outputs Windows + # id: download-windows + # uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + # continue-on-error: true + # with: + # name: ${{ inputs.results-prefix }}windows-latest-test-results - name: Print Test Outputs continue-on-error: true @@ -87,35 +96,29 @@ jobs: cat "macos-latest-res.json" || echo "missing" echo "::endgroup::" - echo "::group::Windows results" - cat "windows-latest-res.json" || echo "missing" - echo "::endgroup::" + # echo "::group::Windows results" + # cat "windows-latest-res.json" || echo "missing" + # echo "::endgroup::" - name: Slack Notification For Missing Artifacts - uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 if: - steps.download-ubuntu.outcome == 'failure' || steps.download-macos.outcome == 'failure' || - steps.download-windows.outcome == 'failure' + steps.download-ubuntu.outcome == 'failure' || steps.download-macos.outcome == 'failure' + # || steps.download-windows.outcome == 'failure' with: - channel-id: ${{ env.SLACK_CHANNEL_ID }} + method: chat.postMessage + token: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} payload: | - { - "text": "Artifact Download Failure", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Failure: " - } - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} + channel: ${{ env.SLACK_CHANNEL_ID }} + text: "Artifact Download Failure" + blocks: + - type: section + text: + type: mrkdwn + text: "Failure: " - name: Setup Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 18 @@ -133,8 +136,9 @@ jobs: id: parse run: | npm run parse - echo "failures=$([[ -f failures.json ]] && echo "true" || echo "false")" >> "$GITHUB_OUTPUT" - echo "failures-payload=$(cat failures.json)" >> "$GITHUB_OUTPUT" + echo "failures=$([[ -f failures.yaml ]] && echo "true" || echo "false")" >> "$GITHUB_OUTPUT" + failures_payload=$(cat failures.yaml) + printf "failures-payload<> "$GITHUB_OUTPUT" echo "reruns=$(cat reruns.txt)" >> "$GITHUB_OUTPUT" env: PLUGIN_VERSION: ${{ inputs.plugin-version }} @@ -142,6 +146,7 @@ jobs: RUN_ID: ${{ github.run_id }} TEST_REF: ${{ inputs.test-ref }} TEST_TYPE: ${{ inputs.test-type }} + SLACK_CHANNEL_ID: ${{ env.SLACK_CHANNEL_ID }} - name: Upload Test Results Staging if: inputs.upload-validated-versions == true @@ -175,58 +180,45 @@ jobs: # Slack notifications - name: Slack Notification For Failures - uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 if: always() && steps.parse.outputs.failures == 'true' with: - channel-id: ${{ env.SLACK_CHANNEL_ID }} + method: chat.postMessage + token: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} payload: ${{ steps.parse.outputs.failures-payload }} - env: - SLACK_BOT_TOKEN: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} - name: Slack Notification For Staging Upload Failure - uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 if: inputs.upload-validated-versions == true && steps.upload-staging.outcome == 'failure' with: - channel-id: ${{ env.SLACK_CHANNEL_ID }} + method: chat.postMessage + token: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} payload: | - { - "text": "Upload Failure", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Failure: " - } - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} + channel: ${{ env.SLACK_CHANNEL_ID }} + text: "Upload Failure" + blocks: + - type: section + text: + type: mrkdwn + text: "Failure: " - name: Slack Notification For Prod Upload Failure - uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 if: inputs.upload-validated-versions == true && steps.upload-prod.outcome == 'failure' with: - channel-id: ${{ env.SLACK_CHANNEL_ID }} + method: chat.postMessage + token: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} payload: | - { - "text": "Upload Failure", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Failure: " - } - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ secrets.TRUNKBOT_SLACK_BOT_TOKEN }} + channel: ${{ env.SLACK_CHANNEL_ID }} + text: "Upload Failure" + blocks: + - type: section + text: + type: mrkdwn + text: "Failure: " generate_snapshots_pr: name: Generate Snapshots PR - runs-on: ubuntu-x64 + runs-on: ubuntu-latest timeout-minutes: 30 needs: upload_test_results if: needs.upload_test_results.outputs.reruns != '' @@ -235,7 +227,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 18 @@ -251,9 +243,12 @@ jobs: uses: ./.github/actions/linter_tests with: linter-version: Latest + ref-type: main append-args: ${{ needs.upload_test_results.outputs.reruns }} -- -u + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} env: PLUGINS_TEST_UPDATE_SNAPSHOTS: "true" @@ -270,7 +265,7 @@ jobs: private_key: ${{ secrets.TRUNK_OPEN_PR_APP_PRIVATE_KEY }} - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 with: title: Auto-add missing snapshots body: diff --git a/.github/workflows/windows_nightly.yaml b/.github/workflows/windows_nightly.yaml index 6af54a00c..53313f2ec 100644 --- a/.github/workflows/windows_nightly.yaml +++ b/.github/workflows/windows_nightly.yaml @@ -1,6 +1,6 @@ name: Windows Tests on: - # TODO(Tyler): Preserve this workflow for testing, but in the future we'll want to remove it. + # NOTE(Tyler): Preserve this workflow for testing, but in the future we'll want to remove it. workflow_dispatch: {} permissions: read-all @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Cache tool downloads - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache # No need to key on trunk version unless we change how we store downloads. @@ -44,12 +44,15 @@ jobs: uses: ./.github/actions/linter_tests with: linter-version: ${{ matrix.linter-version }} + ref-type: main + snyk-token: ${{ secrets.TRUNK_SNYK_TOKEN }} sourcery-token: ${{ secrets.TRUNK_SOURCERY_TOKEN }} cli-path: ${{ github.workspace }}\trunk.ps1 # manually specify more parallelism to avoid bottlenecks append-args: linters -- --maxWorkers=5 - # CI Debugger is not yet supported on Windows - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + # Analytics uploader is not yet supported on Windows + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} tool_tests_main: name: Tool Tests Main @@ -60,7 +63,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Cache tool downloads - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: /tmp/plugins_testing_download_cache # No need to key on trunk version unless we change how we store downloads. @@ -87,5 +90,6 @@ jobs: with: cli-path: ${{ github.workspace }}\trunk.ps1 append-args: tools -- --maxWorkers=5 - # CI Debugger is not yet supported on Windows - trunk-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + # Analytics uploader is not yet supported on Windows + trunk-staging-token: ${{ secrets.TRUNK_DEBUGGER_TOKEN }} + trunk-prod-token: ${{ secrets.TRUNK_ORG_PROD_TOKEN }} diff --git a/.gitignore b/.gitignore index 003c57f6f..75a65a35c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,8 @@ node_modules/ # Typescript out/ + +junit.xml + +# Snyk +.dccache diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 479320601..14495507f 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -2,7 +2,7 @@ version: 0.1 # version used for local trunk runs and testing cli: - version: 1.21.0 + version: 1.22.15 shell_hooks: enforce: true @@ -17,10 +17,39 @@ plugins: - id: configs uri: https://github.com/trunk-io/configs - ref: v1.0.4 + ref: v1.0.12 + +runtimes: + enabled: + - node@22.16.0 + - python@3.12.2 lint: - # enabled linters inherited from github.com/trunk-io/configs plugin + files: + - name: plugin.yaml + filenames: [plugin.yaml] + definitions: + - name: definition-checker + description: Checks plugin.yaml files for repo best practices + files: [plugin.yaml] + runtime: node + extra_packages: + - ts-node + - yaml + commands: + - name: check + run: ts-node ${workspace}/repo-tools/definition-checker/check.ts ${target} + batch: true + sandbox_type: expanded + output: regex + parse_regex: "((?P.*) \\[(?P.*)\\]: (?P.*) \\((?P.*)\\))" + success_codes: [0] + enabled: + # enabled linters inherited from github.com/trunk-io/configs plugin + - pmd@pmd_releases/7.12.0 + - definition-checker + - eslint@9.27.0 + - trunk-toolbox@0.5.4 disabled: - pylint # pylint diagnostics are too strict - semgrep @@ -30,6 +59,11 @@ lint: paths: - "**/test_data" # required for golangci-lint, which runs on directories - "**/test_data/**" + - linters: [prettier] + paths: [linters/markdownlint/README.md] + threshold: + - linters: [trunk] + level: high actions: # Uncomment to enable more verbose action logs @@ -79,8 +113,9 @@ actions: - tool-test-helper tools: enabled: - - clangd-indexing-tools@17.0.3 - - clangd@17.0.3 + - clangd-indexing-tools@19.1.2 + - clangd@19.1.2 + runtimes: # expose shims in .trunk/tools - node diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c2c767cd2..a5515c6fe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,18 +1,24 @@ # Contribution -Thanks for contributing to trunk's default plugins! Read on to learn more. +Thanks for contributing to Trunk's default plugins! Read on to learn more. +- [Prerequisites](#prerequisites) - [Overview](#overview) -- [Release process](#releases) - [Adding new linters](#linters) -- [Adding new actions](#actions) - [Adding new tools](#tools) +- [Adding new actions](#actions) +- [Release process](#releases) - [Guidelines](#guidelines) - [Docs](https://docs.trunk.io) +## Prerequisites + +1. Please [install the trunk CLI](https://docs.trunk.io/check/usage#install-the-cli) +2. Run `trunk check` in this repo to quickstart git-hooks and codegen + ## Overview -We use this repository to provide our users with default linters, actions, and tools. Trunk +We use this repository to provide our users with default linters, tools, and actions. Trunk automatically adds the following to users' trunk.yaml: ```yaml @@ -32,43 +38,24 @@ plugins: local: ``` -Adding a plugin source lets users run `trunk check enable` or `trunk actions enable` with linters -and actions defined in that plugin. For more information, see our +Adding a plugin source lets users run `trunk check enable`, `trunk tools enable`, or +`trunk actions enable` with definitions in that plugin. For more information, see our [docs](https://docs.trunk.io/docs/plugins). +**Please review our [Testing Guide](tests/README.md) for info on writing and running tests.** + If you have questions, please [stop by our community Slack](https://slack.trunk.io/), and if you have a feature request, you can [file it here](https://features.trunk.io/). -## Releases - -`trunk-io/plugins` is released on a fairly regular cadence that is independent of PRs. Users will -pick up these configuration changes by running `trunk upgrade` to automatically update their plugin -version to the latest release. - -```yaml -plugins: - sources: - - id: trunk - uri: https://github.com/trunk-io/plugins - ref: v1.2.5 # will change to the latest release on next `trunk upgrade` -``` - -We recommend only setting the above `ref` field to be our released tags, but if you need a linter or -action that hasn't been released yet, you can set `ref` to be a git SHA. Do **not** set `ref` to be -a branch name, or `HEAD`, as users will observe buggy behavior. - -Note that the ref and the cli version in the trunk.yaml must be compatible. This is managed by -`required_trunk_version`, as specified in [`plugin.yaml`](plugin.yaml). Users will not be able to -load a plugin source until they have upgraded to a compliant CLI version. - ## Linters To add a new linter: 1. Run `trunk check` to start up Trunk in the background. -2. Create a directory inside `linters/` with the name of your new linter. -3. Inside this new directory, create the following structure. Most of these files will be - automatically created for you: +2. Run `mkdir linters/` to start. This should autopopulate with a sample + [plugin.yaml](./repo-tools/linter-test-helper/linter_sample_plugin.yaml) and + [test file](./repo-tools/linter-test-helper/linter_sample.test.ts). If necessary, add them + yourself: ```text linters/ @@ -78,24 +65,57 @@ To add a new linter: │ README.md (optional) │ my-config.json (optional) └─test_data/ - └─basic.in.py (with appropriate extension) + └─basic.in.foo (with appropriate extension) ``` -4. Add your linter definition to `plugin.yaml` (consult the docs for [custom linters] and [custom - parsers] to understand how it should be defined). Most linters in this repository are defined as - tools as well, so that they can be easily run manually from the command line. -5. Making sure the plugin in [`.trunk/trunk.yaml`](.trunk/trunk.yaml) is pointing to your local - repository, run `trunk check enable ` to enable your linter, and run `trunk check` to - verify that the configuration is valid and that you get desired diagnostics. Running - `trunk check --verbose` can help provide greater insights when debugging. -6. Add a few simple test cases to `my_linter.test.ts` to exercise your linter and generate - snapshots. Refer to [Testing Guidelines](tests/README.md) for more information on writing and - running tests. -7. Run `trunk check` to lint your changes. -8. Open a PR! +3. Add your linter definition to `plugin.yaml` (consult the docs for [custom linters] and [custom + parsers] + to understand how it should be defined). Most linters in this repository are defined as tools as + well, so that they can be easily run manually from the command line. +4. Run `trunk check enable ` to enable your linter, and run `trunk check` to verify that + the configuration is valid and that you get desired diagnostics. Running `trunk check --verbose` + can help provide greater insights when debugging. You may also wish to run on your test data, + i.e. `trunk check --verbose --force linters//test_data/basic.in.foo`. +5. Add a few simple test cases to `my_linter.test.ts` to exercise your linter and generate + snapshots. **Refer to the [Testing Guide](tests/README.md) for more information on writing, + running, and debugging tests.** +6. Revert any `.trunk/trunk.yaml` changes, and run `trunk check` to lint your changes. +7. Open a PR! + +[custom linters]: https://docs.trunk.io/code-quality/linters/custom-linters +[custom parsers]: https://docs.trunk.io/cli/configuration/lint/output-parsing -[custom linters]: https://docs.trunk.io/check/custom-linters -[custom parsers]: https://docs.trunk.io/check/custom-parsers +## Tools + +If the tool you intend to add functions primarily as a linter, please follow the instruction in +[linters](#linters). If it functions more as a standalone tool, please add it in the `tools/` +directory and follow the instructions below. + +To add a new tool: + +1. Run `trunk check` to start up Trunk in the background. +2. Run `mkdir tools/` to start. This should autopopulate with a sample + [plugin.yaml](./repo-tools/tool-test-helper/tool_sample_plugin.yaml) and + [test file](./repo-tools/tool-test-helper/tool_sample.test.ts). If necessary, add them yourself: + + ```text + tests/ + └─my-tool/ + │ plugin.yaml + │ my_tool.test.ts + └─README.md (optional) + ``` + +3. Add your tool definition to `plugin.yaml` (consult the docs for + [custom tools](https://docs.trunk.io/tools/configuration#tool-definitions) to understand how it + should be defined). +4. Run `trunk tools enable ` to enable your tool, and run its shim(s) from + `.trunk/tools/`. +5. Add a `toolInstallTest` to `my_tool.test.ts` to verify your tool's installation. If neccessary, + use `toolTest` instead. **Refer to the [Testing Guide](tests/README.md) for more information on + writing, running, and debugging tests.** +6. Revert any `.trunk/trunk.yaml` changes, and run `trunk check` to lint your changes. +7. Open a PR! ## Actions @@ -118,54 +138,44 @@ To add a new action: `trunk actions enable ` to enable your linter, and run `trunk run ` to verify that the configuration is valid and that you get desired results. Running `trunk actions history ` can help provide greater insights when debugging. -6. We have not yet defined a testing framework for plugin actions, but we are working to add one - soon! Please briefly document your action in its README.md and in your PR. +6. Please briefly document your action in its README.md as appropriate. 7. Run `trunk check` to lint your changes. 8. Open a PR! -[actions]: https://docs.trunk.io/actions +Testing for Trunk Actions in this repo is in early development, so we do not require testing for new +action definitions. -## Tools +[actions]: https://docs.trunk.io/actions -If the tool you intend to add functions primarily as a linter, please follow the instruction in -[linters](#linters). If it functions more as a standalone tool, please add it in the `tools/` -directory and follow the instructions below. +## Releases -To add a new tool: +`trunk-io/plugins` is released on every few weeks. Users will pick up these configuration changes by +running `trunk upgrade` to automatically update their plugin version to the latest release. -1. Run `trunk check` to start up Trunk in the background. -2. Create a directory inside `tools/` with the name of your new linter. -3. Inside this new directory, create the following structure. Most of these files will be - automatically created for you: +```yaml +plugins: + sources: + - id: trunk + uri: https://github.com/trunk-io/plugins + ref: v1.2.5 # will change to the latest release on next `trunk upgrade` +``` - ```text - tests/ - └─my-tool/ - │ plugin.yaml - │ my_tool.test.ts - └─README.md (optional) - ``` +We recommend only setting the above `ref` field to be our released tags, but if you need a +linter/tool/action that hasn't been released yet, you can set `ref` to be a git SHA. Do **not** set +`ref` to be a branch name, as plugin branches are not refreshed. -4. Add your tool definition to `plugin.yaml` (consult the docs for - [custom tools](https://docs.trunk.io/tools/configuration#tool-definitions) to understand how it - should be defined). -5. Making sure the plugin in [`.trunk/trunk.yaml`](.trunk/trunk.yaml) is pointing to your local - repository, run `trunk tools enable ` to enable your tool, and access its shim(s) to run - it from `.trunk/tools/`. -6. Add a `toolInstallTest` to `my_tool.test.ts` to verify your tool's installation. If neccessary, - use `toolTest` instead. Refer to [Testing Guidelines](tests/README.md) for more information on - writing and running tests. -7. Run `trunk check` to lint your changes. -8. Open a PR! +Note that the ref and the cli version in the trunk.yaml must be compatible. This is managed by +`required_trunk_version`, as specified in [`plugin.yaml`](plugin.yaml). Users will not be able to +load a plugin source until they have upgraded to a compliant CLI version. ## Guidelines Please follow the guidelines below when contributing: - After defining a new linter or action, please add it to [`README.md`](README.md). -- If you run into any problems while defining new linters or actions, feel free to reach out on our - [Slack](https://slack.trunk.io/). We are continuously working to improve the process of - integrating with trunk, and all feedback is appreciated! +- If you run into any problems while defining new linters/tools/actions, feel free to reach out on + our [Slack](https://slack.trunk.io/). We are continuously working to improve the process of + integrating with Trunk, and all feedback is appreciated! ## Development diff --git a/README.md b/README.md index 25535fcfa..b73c04509 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,19 @@ [![Trunk.io](https://static.trunk.io/assets/trunk_plugins_logo.png)](https://trunk.io) [![docs](https://img.shields.io/badge/-docs-darkgreen?logo=readthedocs&logoColor=ffffff)][docs] +[![contributing](https://img.shields.io/badge/contributing-darkgreen?logo=readthedocs&logoColor=ffffff)][contributing] +[![testing guide](https://img.shields.io/badge/testing_guide-darkgreen?logo=readthedocs&logoColor=ffffff)][testing guide] [![slack](https://img.shields.io/badge/-slack-611f69?logo=slack)][slack] [![vscode](https://img.shields.io/visual-studio-marketplace/i/trunk.io?color=0078d7&label=vscode&logo=visualstudiocode)][vscode] [![openssf](https://api.securityscorecards.dev/projects/github.com/trunk-io/plugins/badge)](https://api.securityscorecards.dev/projects/github.com/trunk-io/plugins) +[testing guide]: ./tests/README.md +[contributing]: ./CONTRIBUTING.md + ### Welcome This repository is the official [Trunk.io](https://trunk.io/) repo containing Trunk's integrations -for linters, formatters, security tools, githooks, and default configs. By default, all trunk users +for linters, formatters, security tools, githooks, and default configs. By default, all Trunk users import this repo as a plugin, via this snippet in `.trunk/trunk.yaml`: ```yaml @@ -18,12 +23,11 @@ plugins: sources: - id: trunk uri: https://github.com/trunk-io/plugins - ref: v1.4.4 + ref: v1.5.0 ``` -This repo is open to contributions! See our -[contribution guidelines](https://github.com/trunk-io/plugins/blob/main/CONTRIBUTING.md) and join -our [slack community][slack] for help. **If you're adding new tools, please see our +This repo is open to contributions! See our [contribution guidelines](CONTRIBUTING.md) and join our +[slack community][slack] for help. **If you're adding new tools, please see our [testing guide](tests/README.md) as well!** ### Supported Linters, Formatters, and Security Tools @@ -34,70 +38,71 @@ Enable the following tools via: trunk check enable {linter} ``` -| Technology | Linters | -| --------------- | -------------------------------------------------------------------------------------------------------------------- | -| All | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox] | -| Ansible | [ansible-lint] | -| Apex | [pmd] | -| Bash | [shellcheck], [shfmt] | -| Bazel, Starlark | [buildifier] | -| C, C++ | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once] | -| C# | [dotnet-format] | -| CircleCI Config | [circleci] | -| Cloudformation | [cfnlint], [checkov] | -| CMake | [cmake-format] | -| CSS, SCSS | [stylelint], [prettier] | -| Cue | [cue-fmt] | -| Dart | [dart] | -| Docker | [hadolint], [checkov] | -| Dotenv | [dotenv-linter] | -| GitHub | [actionlint] | -| Go | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep] | -| GraphQL | [graphql-schema-linter], [prettier] | -| HAML | [haml-lint] | -| HTML Templates | [djlint] | -| Java | [google-java-format], [pmd], [semgrep] | -| Javascript | [biome], [deno], [eslint], [prettier], [rome], [semgrep] | -| JSON | [biome], [deno], [eslint], [prettier], [semgrep] | -| Kotlin | [detekt], [ktlint] | -| Kubernetes | [kube-linter] | -| Lua | [stylua] | -| Markdown | [deno], [markdownlint], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint] | -| Nix | [nixpkgs-fmt] | -| package.json | [sort-package-json] | -| Perl | [perlcritic], [perltidy] | -| PNG | [oxipng] | -| PowerShell | [psscriptanalyzer] | -| Prisma | [prisma] | -| Protobuf | [buf] (breaking, lint, and format), [clang-format], [clang-tidy] | -| Python | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery] | -| Rego | [regal], [opa] | -| Renovate | [renovate] | -| Ruby | [brakeman], [rubocop], [rufo], [semgrep], [standardrb] | -| Rust | [clippy], [rustfmt] | -| Scala | [scalafmt] | -| Security | [checkov], [dustilock], [nancy], [osv-scanner], [tfsec], [trivy], [trufflehog], [terrascan] | -| SQL | [sqlfluff], [sqlfmt], [sql-formatter] | -| SVG | [svgo] | -| Swift | [stringslint], [swiftlint], [swiftformat] | -| Terraform | [terraform] (validate and fmt), [checkov], [tflint],[tfsec],[terrascan] | -| Terragrunt | [terragrunt] | -| Textproto | [txtpbfmt] | -| TOML | [taplo] | -| Typescript | [deno], [eslint], [prettier], [rome], [semgrep] | -| YAML | [prettier], [semgrep], [yamllint] | +| Technology | Linters | +| --------------- | -------------------------------------------------------------------------------------------------------------------------- | +| All | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox], [vale] | +| Ansible | [ansible-lint] | +| Apex | [pmd] | +| Bash | [shellcheck], [shfmt] | +| Bazel, Starlark | [buildifier] | +| C, C++ | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once] | +| C# | [dotnet-format] | +| CircleCI Config | [circleci] | +| Cloudformation | [cfnlint], [checkov] | +| CMake | [cmake-format] | +| CSS, SCSS | [stylelint], [prettier] | +| Cue | [cue-fmt] | +| Dart | [dart] | +| Docker | [hadolint], [checkov] | +| Dotenv | [dotenv-linter] | +| GitHub | [actionlint] | +| Go | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep] | +| GraphQL | [graphql-schema-linter], [prettier] | +| HAML | [haml-lint] | +| HTML Templates | [djlint] | +| Java | [google-java-format], [pmd], [semgrep] | +| Javascript | [biome], [deno], [eslint], [prettier], [rome], [semgrep] | +| JSON | [biome], [deno], [eslint], [prettier], [semgrep] | +| Kotlin | [detekt], [ktlint] | +| Kubernetes | [kube-linter] | +| Lua | [stylua] | +| Markdown | [deno], [markdownlint], [markdownlint-cli2], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint] | +| Nix | [nixpkgs-fmt] | +| package.json | [sort-package-json] | +| Perl | [perlcritic], [perltidy] | +| PHP | [php-cs-fixer], [phpstan] | +| PNG | [oxipng] | +| PowerShell | [psscriptanalyzer] | +| Prisma | [prisma] | +| Protobuf | [buf] (breaking, lint, and format), [clang-format], [clang-tidy] | +| Python | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery], [ty] | +| Rego | [regal], [opa] | +| Renovate | [renovate] | +| Ruby | [brakeman], [rubocop], [rufo], [semgrep], [standardrb] | +| Rust | [clippy], [rustfmt] | +| Scala | [scalafmt] | +| Security | [checkov], [dustilock], [nancy], [osv-scanner], [snyk], [tfsec], [trivy], [trufflehog], [terrascan] | +| SQL | [sqlfluff], [sqlfmt], [sql-formatter], [squawk] | +| SVG | [svgo] | +| Swift | [stringslint], [swiftlint], [swiftformat] | +| Terraform | [terraform] (validate and fmt), [checkov], [tflint], [tfsec], [terrascan], [tofu] | +| Terragrunt | [terragrunt] | +| Textproto | [txtpbfmt] | +| TOML | [taplo] | +| Typescript | [deno], [eslint], [prettier], [rome], [semgrep] | +| YAML | [prettier], [semgrep], [yamlfmt], [yamllint] | -[actionlint]: https://github.com/rhysd/actionlint#readme +[actionlint]: https://trunk.io/linters/infra/actionlint [ansible-lint]: https://github.com/ansible/ansible-lint#readme [autopep8]: https://github.com/hhatto/autopep8#readme -[bandit]: https://github.com/PyCQA/bandit#readme +[bandit]: https://trunk.io/linters/python/bandit [biome]: https://github.com/biomejs/biome#readme [black]: https://github.com/psf/black#readme -[brakeman]: https://github.com/presidentbeef/brakeman#readme +[brakeman]: https://trunk.io/linters/security/brakeman [buf]: https://github.com/bufbuild/buf#readme [buildifier]: https://github.com/bazelbuild/buildtools/blob/master/buildifier/README.md [cfnlint]: https://github.com/aws-cloudformation/cfn-lint#readme -[checkov]: https://github.com/bridgecrewio/checkov#readme +[checkov]: https://trunk.io/linters/security/checkov [circleci]: https://github.com/CircleCI-Public/circleci-cli#readme [clang-format]: https://clang.llvm.org/docs/ClangFormat.html [clang-tidy]: https://clang.llvm.org/extra/clang-tidy/ @@ -113,10 +118,10 @@ trunk check enable {linter} [dotenv-linter]: https://github.com/dotenv-linter/dotenv-linter#readme [dotnet-format]: https://github.com/dotnet/format#readme [dustilock]: https://github.com/Checkmarx/dustilock -[eslint]: https://github.com/eslint/eslint#readme -[flake8]: https://github.com/PyCQA/flake8#readme +[eslint]: https://eslint.org/docs/latest/ +[flake8]: https://trunk.io/linters/python/flake8 [git-diff-check]: https://git-scm.com/docs/git-diff -[gitleaks]: https://github.com/zricethezav/gitleaks#readme +[gitleaks]: https://trunk.io/linters/security/gitleaks [gofmt]: https://pkg.go.dev/cmd/gofmt [gofumpt]: https://pkg.go.dev/mvdan.cc/gofumpt [goimports]: https://pkg.go.dev/golang.org/x/tools/cmd/goimports @@ -132,16 +137,19 @@ trunk check enable {linter} [ktlint]: https://github.com/pinterest/ktlint#readme [kube-linter]: https://github.com/stackrox/kube-linter#readme [markdownlint]: https://github.com/DavidAnson/markdownlint#readme +[markdownlint-cli2]: https://github.com/DavidAnson/markdownlint-cli2#readme [markdown-table-prettify]: https://github.com/darkriszty/MarkdownTablePrettify-VSCodeExt#readme [markdown-link-check]: https://github.com/tcort/markdown-link-check#readme [mypy]: https://github.com/python/mypy#readme [nancy]: https://github.com/sonatype-nexus-community/nancy#readme [nixpkgs-fmt]: https://github.com/nix-community/nixpkgs-fmt [opa]: https://www.openpolicyagent.org/docs/latest/cli/ -[osv-scanner]: https://github.com/google/osv-scanner +[osv-scanner]: https://trunk.io/linters/security/osv-scanner [oxipng]: https://github.com/shssoichiro/oxipng#readme [perlcritic]: https://metacpan.org/pod/Perl::Critic [perltidy]: https://metacpan.org/dist/Perl-Tidy/view/bin/perltidy +[php-cs-fixer]: https://github.com/PHP-CS-Fixer/PHP-CS-Fixer#readme +[phpstan]: https://phpstan.org/ [pmd]: https://pmd.github.io/ [pragma-once]: linters/pragma-once/README.md [prettier]: https://github.com/prettier/prettier#readme @@ -155,36 +163,42 @@ trunk check enable {linter} [renovate]: https://github.com/renovatebot/renovate#readme [rome]: https://github.com/rome/tools#readme [rubocop]: https://github.com/rubocop/rubocop#readme -[ruff]: https://github.com/charliermarsh/ruff +[ruff]: https://trunk.io/linters/python/ruff [rufo]: https://github.com/ruby-formatter/rufo#readme [rustfmt]: https://github.com/rust-lang/rustfmt#readme [scalafmt]: https://github.com/scalameta/scalafmt#readme [semgrep]: https://github.com/returntocorp/semgrep#readme -[shellcheck]: https://github.com/koalaman/shellcheck#readme +[shellcheck]: https://trunk.io/linters/shell/shellcheck [shfmt]: https://github.com/mvdan/sh#readme [sort-package-json]: https://github.com/keithamus/sort-package-json#readme [sql-formatter]: https://github.com/sql-formatter-org/sql-formatter#readme [sqlfluff]: https://github.com/sqlfluff/sqlfluff#readme [sqlfmt]: https://github.com/tconbeer/sqlfmt#readme +[squawk]: https://github.com/sbdchd/squawk#readme +[snyk]: https://github.com/snyk/cli#readme [standardrb]: https://github.com/testdouble/standard#readme [stringslint]: https://github.com/dral3x/StringsLint#readme [stylelint]: https://github.com/stylelint/stylelint#readme [stylua]: https://github.com/JohnnyMorganz/StyLua/tree/main [sourcery]: https://sourcery.ai/ -[svgo]: https://github.com/svg/svgo#readme +[svgo]: https://trunk.io/linters/nodejs/svgo [swiftformat]: https://github.com/nicklockwood/SwiftFormat#readme [swiftlint]: https://github.com/realm/SwiftLint#readme [taplo]: https://github.com/tamasfe/taplo#readme [terrascan]: https://github.com/tenable/terrascan#readme [terraform]: https://developer.hashicorp.com/terraform/cli/code +[tofu]: https://opentofu.org/ [terragrunt]: https://terragrunt.gruntwork.io/docs/getting-started/quick-start/ [tflint]: https://github.com/terraform-linters/tflint#readme [tfsec]: https://github.com/aquasecurity/tfsec -[trivy]: https://github.com/aquasecurity/trivy#readme -[trufflehog]: https://github.com/trufflesecurity/trufflehog#readme +[trivy]: https://trunk.io/linters/security/trivy +[trufflehog]: https://trunk.io/linters/security/trufflehog [trunk-toolbox]: https://github.com/trunk-io/toolbox#readme [txtpbfmt]: https://github.com/protocolbuffers/txtpbfmt#readme -[yamllint]: https://github.com/adrienverge/yamllint#readme +[ty]: https://github.com/astral-sh/ty#readme +[vale]: https://vale.sh/docs/ +[yamlfmt]: https://github.com/google/yamlfmt#readme +[yamllint]: https://trunk.io/linters/yaml/yamllint [yapf]: https://github.com/google/yapf#readme
@@ -201,16 +215,18 @@ Enable trunk actions via: trunk actions enable {action} ``` -| action | description | -| -------------------------------------------------------------------- | ---------------------------------------------------------- | -| [`buf-gen`](actions/buf/README.md) | run `buf` on .proto file change | -| [`commitizen`](actions/commitizen/README.md) | enforce conventional commits and manage releases | -| [`commitlint`](https://github.com/conventional-changelog/commitlint) | enforce conventional commit message for your local commits | -| [`go-mod-tidy`](actions/go-mod-tidy/README.md) | automatically tidy go.mod file | -| [`go-mod-tidy-vendor`](actions/go-mod-tidy-vendor/README.md) | automatically tidy and vendor go.mod file | -| [`git-blame-ignore-revs`](actions/git-blame-ignore-revs/README.md) | automatically configure git to use .git-blame-ignore-revs | -| [`npm-check`](actions/npm-check/README.md) | check whether NPM installation is up to date | -| [`yarn-check`](actions/yarn-check/README.md) | check whether Yarn installation is up to date | +| action | description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| [`buf-gen`](actions/buf/README.md) | run `buf` on .proto file change | +| [`commitizen`](actions/commitizen/README.md) | enforce conventional commits and manage releases | +| [`commitlint`](https://github.com/conventional-changelog/commitlint) | enforce conventional commit message for your local commits | +| [`go-mod-tidy`](actions/go-mod-tidy/README.md) | automatically tidy go.mod file | +| [`go-mod-tidy-vendor`](actions/go-mod-tidy-vendor/README.md) | automatically tidy and vendor go.mod file | +| [`git-blame-ignore-revs`](actions/git-blame-ignore-revs/README.md) | automatically configure git to use .git-blame-ignore-revs | +| [`npm-check`](actions/npm-check/README.md) | check whether NPM installation is up to date | +| [`terraform-docs`](actions/terraform-docs/README.md) | generate documentation from Terraform modules | +| [`poetry-check`](actions/poetry/README.md), [`poetry-lock`](actions/poetry/README.md), [`poetry-export`](actions/poetry/README.md), [`poetry-install`](actions/poetry/README.md) | hooks to enforce poetry configuration | +| [`yarn-check`](actions/yarn-check/README.md) | check whether Yarn installation is up to date | ### Supported Tools diff --git a/actions/commitlint/README.md b/actions/commitlint/README.md index 1d2111e51..b4f8e2ad4 100644 --- a/actions/commitlint/README.md +++ b/actions/commitlint/README.md @@ -4,7 +4,7 @@ https://github.com/conventional-changelog/commitlint ## Simple configuration -1. `echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js` +1. `echo "export default {extends: ['@commitlint/config-conventional']}" > commitlint.config.mjs` 2. `trunk actions enable commitlint` This will install the basic config and run commitlint on every `commit-msg` hook. @@ -14,7 +14,7 @@ This will install the basic config and run commitlint on every `commit-msg` hook In order to use different commitlint configuration or specify a specific commitlint version, you must: -1. Modify your `commitlint.config.js` accordingly +1. Modify your `commitlint.config.mjs` accordingly 2. Override the `packages_file` field for the action and specify a package.json For example: @@ -30,10 +30,10 @@ actions: packages_file: ${workspace}/.trunk/commitlint/package.json ``` -`commitlint.config.js`: +`commitlint.config.mjs`: ```js -module.exports = { +export default { extends: ["@commitlint/config-angular", "@commitlint/config-conventional"], }; ``` diff --git a/actions/commitlint/commitlint.test.ts b/actions/commitlint/commitlint.test.ts index fe8402105..8eaee21c4 100644 --- a/actions/commitlint/commitlint.test.ts +++ b/actions/commitlint/commitlint.test.ts @@ -1,11 +1,10 @@ -/* trunk-ignore-all(eslint/import/no-extraneous-dependencies) */ import { actionRunTest } from "tests"; import { TrunkActionDriver } from "tests/driver"; const preCheck = (driver: TrunkActionDriver) => { driver.writeFile( - "commitlint.config.js", - "module.exports = {extends: ['@commitlint/config-conventional']}", + "commitlint.config.mjs", + "export default {extends: ['@commitlint/config-conventional']}", ); }; diff --git a/actions/commitlint/package.json b/actions/commitlint/package.json index dedb725d5..972a41131 100644 --- a/actions/commitlint/package.json +++ b/actions/commitlint/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@commitlint/cli": "^17.0", - "@commitlint/config-conventional": "^17.0" + "@commitlint/cli": "^19.0", + "@commitlint/config-conventional": "^19.0" } } diff --git a/actions/git/plugin.yaml b/actions/git/plugin.yaml index ff4748e99..c057b2d12 100644 --- a/actions/git/plugin.yaml +++ b/actions/git/plugin.yaml @@ -14,5 +14,7 @@ actions: - name: SSH_AGENT_PID value: ${env.SSH_AGENT_PID} optional: true - + - name: GITHUB_SERVER_URL + value: ${env.GITHUB_SERVER_URL} + optional: true notify_on_error: false diff --git a/actions/npm-check-pre-push/package.json b/actions/npm-check-pre-push/package.json index a133bd03c..1d1082a3f 100644 --- a/actions/npm-check-pre-push/package.json +++ b/actions/npm-check-pre-push/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "chalk": "^5.0.0", + "chalk": "4.1.2", "npm-check": "^6.0.1" } } diff --git a/actions/npm-check/npm_check.js b/actions/npm-check/npm_check.js index 53643b6a3..8fbe1c2da 100755 --- a/actions/npm-check/npm_check.js +++ b/actions/npm-check/npm_check.js @@ -1,6 +1,5 @@ #!/usr/bin/env node -// trunk-ignore-all(eslint) const npmCheck = require("npm-check"); const YAML = require("yaml"); const path = require("path"); @@ -30,7 +29,7 @@ npmCheck({}) message: `${uninstalled_count} npm ${pluralize( uninstalled_count, "package", - "packages" + "packages", )} ${pluralize(uninstalled_count, "needs", "need")} to be installed\n`, commands: [{ run: "npm install", title: "npm install" }], icon: iconPath, diff --git a/actions/npm-check/package.json b/actions/npm-check/package.json index 5d545a016..1d1082a3f 100644 --- a/actions/npm-check/package.json +++ b/actions/npm-check/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "chalk": "4.1.2", "npm-check": "^6.0.1" } } diff --git a/actions/poetry/README.md b/actions/poetry/README.md new file mode 100644 index 000000000..fd584b1b1 --- /dev/null +++ b/actions/poetry/README.md @@ -0,0 +1,52 @@ +# Poetry + +## Recommended Usage + +The recommended way to run [Poetry](https://python-poetry.org/docs/) using Trunk is to use the +SYSTEM environment, rather than a hermetic setup. This is because Poetry provides its own +environment management that will often collide with Trunk's hermetic setup. Nevertheless, leveraging +Poetry and Trunk in parallel can be powerful. + +Trunk provides 4 different Actions for running your Poetry validation, matching parity with +[Poetry pre-commit hooks](https://python-poetry.org/docs/pre-commit-hooks/). + +| action | description | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | +| `poetry-check` | Validate `pyproject.toml` when running `git commit` | +| `poetry-lock` | Update `poetry.lock` to match `pyproject.toml` when running `git commit`. To avoid updating packages, you can override `run` to include `--no-update` | +| `poetry-export` | Update `requirements.txt` to match `pyproject.toml` when running `git commit` | +| `poetry-install` | Install dependencies to make sure all locked packages are installed when running `git checkout` or `git merge` | + +You can enable any subset of these Actions using `trunk actions enable`. + +As written, all of these actions require that you have `poetry` in your `PATH` in order to run. + +## Hermetic Installation + +Trunk provides some mechanisms for a hermetic installation and execution of `poetry`. You can use +the Poetry [Tool](https://docs.trunk.io/check/advanced-setup/tools) to run `poetry` manually, and +you can override each of the action definitions to include the `packages_file` and `runtime`, like +so: + +```yaml +version: 0.1 +actions: + definitions: + - id: poetry-check + runtime: python + packages_file: ${cwd}/requirements.txt +``` + +These overrides will tell Trunk to use the hermetic install of `poetry` and use a sandboxed +execution for the Action. Note that this approach has some limitations, namely when creating +`poetry` shells or virtual environments. Currently full functionality is blocked by the inability to +unset runtime-inherited environments. Note that the `poetry` Tool suffers from the same problem. + +When using the hermetic installation, you will want to ensure that your `python` runtime is enabled +at the same version required by your Poetry configuration. See our +[docs](https://docs.trunk.io/check/advanced-setup/runtimes) for more information about specifying +runtime versions. + +## Notes + +Poetry requires Python 3.8 or higher to run. diff --git a/actions/poetry/plugin.yaml b/actions/poetry/plugin.yaml new file mode 100644 index 000000000..f088e7e29 --- /dev/null +++ b/actions/poetry/plugin.yaml @@ -0,0 +1,68 @@ +version: 0.1 +# NOTE: See README.md for usage guidelines. +actions: + definitions: + - id: poetry-check + display_name: poetry check + description: Run 'poetry check' to validate config + # runtime: python + # packages_file: ${cwd}/requirements.txt + run: poetry check + triggers: + - git_hooks: [pre-commit] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + + - id: poetry-lock + display_name: poetry lock + # You may wish to override this with 'poetry lock --no-update' + description: Run 'poetry lock' to update lock file to match pyproject.toml + run: poetry lock --no-update + # runtime: python + # packages_file: ${cwd}/requirements.txt + triggers: + - git_hooks: [pre-commit] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + + - id: poetry-export + display_name: poetry export + description: Run 'poetry export' to sync requirements.txt with lock file + run: poetry export -f requirements.txt -o requirements.txt + # packages_file: ${cwd}/requirements.txt + # runtime: python + triggers: + - git_hooks: [pre-commit] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + + - id: poetry-install + display_name: poetry install + description: Run 'poetry install' to ensure all locked packages are installed + run: poetry install + # packages_file: ${cwd}/requirements.txt + # runtime: python + triggers: + - git_hooks: [post-checkout, post-merge] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + +tools: + definitions: + - name: poetry + runtime: python + package: poetry + extra_packages: [poetry-plugin-export] + known_good_version: 1.8.2 + health_checks: + - command: poetry --version + parse_regex: ${semver} + shims: [poetry] diff --git a/actions/poetry/poetry.test.ts b/actions/poetry/poetry.test.ts new file mode 100644 index 000000000..46a4001a9 --- /dev/null +++ b/actions/poetry/poetry.test.ts @@ -0,0 +1,103 @@ +import * as fs from "fs"; +import * as path from "path"; +import { actionRunTest, toolInstallTest } from "tests"; +import { TrunkActionDriver } from "tests/driver"; + +toolInstallTest({ + toolName: "poetry", + toolVersion: "1.8.2", +}); + +const preCheck = (authors: boolean) => (driver: TrunkActionDriver) => { + const trunkYamlPath = ".trunk/trunk.yaml"; + const currentContents = driver.readFile(trunkYamlPath); + const newContents = currentContents.concat(` + definitions: + - id: poetry-check + runtime: python + packages_file: \${cwd}/requirements.txt + - id: poetry-lock + runtime: python + packages_file: \${cwd}/requirements.txt + - id: poetry-export + runtime: python + packages_file: \${cwd}/requirements.txt`); + driver.writeFile(trunkYamlPath, newContents); + + const authorsSection = authors ? "authors = []" : ""; + driver.writeFile( + "pyproject.toml", + `[tool.poetry] +name = "poetry-test" +version = "0.1.0" +description = "" +${authorsSection} + +[tool.poetry.dependencies] +python = "^3.10" +pendulum = "^3.0.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + `, + ); +}; + +const checkTestCallback = async (driver: TrunkActionDriver) => { + try { + await driver.gitDriver?.commit( + "Test commit", + [], + { "--allow-empty": null }, + (error, result) => { + expect(error?.message).toContain("The fields ['authors'] are required in package mode."); + expect(result).toBeUndefined(); + }, + ); + + // Commit step should throw + expect(1).toBe(2); + } catch (_err) { + // Intentionally empty + } +}; + +const fileExistsCallback = (filename: string) => async (driver: TrunkActionDriver) => { + try { + await driver.gitDriver?.commit( + "Test commit", + [], + { "--allow-empty": null }, + (_error, result) => { + expect(_error).toBeFalsy(); + expect(result).toBeTruthy(); + }, + ); + + expect(fs.existsSync(path.resolve(driver.getSandbox(), filename))).toBeTruthy(); + } catch (_err) { + // Intentionally empty + } +}; + +actionRunTest({ + actionName: "poetry-check", + syncGitHooks: true, + testCallback: checkTestCallback, + preCheck: preCheck(/*authors=*/ false), +}); + +actionRunTest({ + actionName: "poetry-lock", + syncGitHooks: true, + testCallback: fileExistsCallback("poetry.lock"), + preCheck: preCheck(/*authors=*/ true), +}); + +actionRunTest({ + actionName: "poetry-export", + syncGitHooks: true, + testCallback: fileExistsCallback("requirements.txt"), + preCheck: preCheck(/*authors=*/ true), +}); diff --git a/actions/poetry/requirements.txt b/actions/poetry/requirements.txt new file mode 100644 index 000000000..541d1dabd --- /dev/null +++ b/actions/poetry/requirements.txt @@ -0,0 +1,2 @@ +poetry==1.8.2 +poetry-plugin-export==1.7.1 diff --git a/actions/submodules/plugin.yaml b/actions/submodules/plugin.yaml new file mode 100644 index 000000000..dcae26219 --- /dev/null +++ b/actions/submodules/plugin.yaml @@ -0,0 +1,10 @@ +version: 0.1 +actions: + definitions: + - id: submodule-init-update + display_name: Submodule Init Update + description: Git hook for updating submodules + run: git submodule update --init --recursive + triggers: + - git_hooks: [post-checkout, post-merge, pre-rebase] + notify_on_error: false diff --git a/actions/terraform-docs/README.md b/actions/terraform-docs/README.md new file mode 100644 index 000000000..39a43a3c4 --- /dev/null +++ b/actions/terraform-docs/README.md @@ -0,0 +1,13 @@ +# terraform-docs + +Generate documentation from Terraform modules in various output formats. Read more about +terraform-docs [here](https://terraform-docs.io). + +This action is intended to be used only with output mode as `inject` with `README.md` files as the +target. You can configure terraform-docs via a `.terraform-docs.yml` file at the root of your +repository. Read more about the configuration +[here](https://terraform-docs.io/user-guide/configuration/). + +Is markdownlint causing consistent diffs in your README files? Try using the < !-- +markdownlint-disable --> and < !-- markdownlint-enable --> comments to disable and re-enable +markdownlint for your terraform-docs section of your README. diff --git a/actions/terraform-docs/plugin.yaml b/actions/terraform-docs/plugin.yaml new file mode 100644 index 000000000..f18454a45 --- /dev/null +++ b/actions/terraform-docs/plugin.yaml @@ -0,0 +1,10 @@ +version: 0.1 +actions: + definitions: + - id: terraform-docs + display_name: Terraform Docs + description: Generate documentation from Terraform modules in various output formats + runtime: python + triggers: + - git_hooks: [pre-commit] + run: python3 ${cwd}/terraform-docs.py diff --git a/actions/terraform-docs/terraform-docs.py b/actions/terraform-docs/terraform-docs.py new file mode 100755 index 000000000..26f56ddb1 --- /dev/null +++ b/actions/terraform-docs/terraform-docs.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +""" +Trunk.io plugin for terraform-docs integration. + +This script acts as a pre-commit hook to ensure terraform documentation is up to date. +It performs the following: +1. Runs terraform-docs to update documentation +2. Checks if any README.md files show up in the unstaged changes +3. Exits with failure if there are unstaged README changes, success otherwise +""" + +# trunk-ignore(bandit/B404) +import subprocess +import sys + + +def run_command(cmd): + """ + Execute a shell command and return its exit code, stdout, and stderr. + + Args: + cmd: List of command arguments to execute + + Returns: + Tuple containing (return_code, stdout, stderr) + """ + try: + + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + # trunk-ignore(bandit/B603) + shell=False, # Explicitly disable shell to prevent command injection + ) + stdout, stderr = process.communicate() + return process.returncode, stdout, stderr + except FileNotFoundError: + print( + f"terraform-docs error: {cmd[0]} not found. Please ensure it's installed and in your PATH" + ) + sys.exit(1) + except Exception as e: + print(f"terraform-docs error: Executing command {' '.join(cmd)}: {e}") + sys.exit(1) + + +# First, run terraform-docs to update documentation +update_cmd = ["terraform-docs", "."] +return_code, stdout, stderr = run_command(update_cmd) + +if stderr: + print(f"terraform-docs error: Warning during execution:\n{stderr}", file=sys.stderr) + +# Check git status for unstaged README changes +status_cmd = ["git", "status", "--porcelain"] +return_code, stdout, stderr = run_command(status_cmd) + +# Look for any README.md files in the unstaged changes +unstaged_readmes = [ + line.split()[-1] + for line in stdout.splitlines() + if line.startswith(" M") and line.endswith("README.md") +] + +# Check if we found any unstaged README files +if len(unstaged_readmes) > 0: + print("terraform-docs error: Please stage any README changes before committing.") + sys.exit(1) + +print("terraform-docs: Documentation is up to date") +sys.exit(0) diff --git a/actions/uv/README.md b/actions/uv/README.md new file mode 100644 index 000000000..f8b07092d --- /dev/null +++ b/actions/uv/README.md @@ -0,0 +1,49 @@ +# uv + +## Recommended Usage + +The recommended way to run [uv](https://docs.astral.sh/uv/) using Trunk is to use the SYSTEM +environment, rather than a hermetic setup. This is because uv provides its own environment +management that will often collide with Trunk's hermetic setup. Nevertheless, leveraging uv and +Trunk in parallel can be powerful. + +Trunk provides several different Actions for running your uv validation and dependency management. + +| action | description | +| ---------- | ------------------------------------------------------------------------------ | +| `uv-check` | Validate `pyproject.toml` when running `git commit` | +| `uv-lock` | Create or update `uv.lock` when running `git commit` | +| `uv-sync` | Install dependencies from `uv.lock` when running `git checkout` or `git merge` | + +You can enable any subset of these Actions using `trunk actions enable`. + +As written, all of these actions require that you have `uv` in your `PATH` in order to run. + +## Hermetic Installation + +Trunk provides some mechanisms for a hermetic installation and execution of `uv`. You can use the uv +[Tool](https://docs.trunk.io/check/advanced-setup/tools) to run `uv` manually, and you can override +each of the action definitions to include the `packages_file` and `runtime`, like so: + +```yaml +version: 0.1 +actions: + definitions: + - id: uv-check + runtime: python + packages_file: ${cwd}/requirements.txt +``` + +These overrides will tell Trunk to use the hermetic install of `uv` and use a sandboxed execution +for the Action. Note that this approach has some limitations, namely when creating uv virtual +environments. Currently full functionality is blocked by the inability to unset runtime-inherited +environments. Note that the `uv` Tool suffers from the same problem. + +When using the hermetic installation, you will want to ensure that your `python` runtime is enabled +at the same version required by your uv configuration. See our +[docs](https://docs.trunk.io/check/advanced-setup/runtimes) for more information about specifying +runtime versions. + +## Notes + +uv requires Python 3.8 or higher to run. diff --git a/actions/uv/plugin.yaml b/actions/uv/plugin.yaml new file mode 100644 index 000000000..d298a513f --- /dev/null +++ b/actions/uv/plugin.yaml @@ -0,0 +1,47 @@ +version: 0.1 +# NOTE: See README.md for usage guidelines. +actions: + definitions: + - id: uv-check + display_name: uv check + description: Run 'uv check' to validate the project configuration. + run: uv check + triggers: + - git_hooks: [pre-commit] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + + - id: uv-lock + display_name: uv lock + description: Run 'uv lock' to create or update the lock file. + run: uv lock + triggers: + - git_hooks: [pre-commit] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + + - id: uv-sync + display_name: uv sync + description: Run 'uv sync' to install dependencies from the lock file. + run: uv sync + triggers: + - git_hooks: [post-checkout, post-merge] + environment: + - name: VIRTUAL_ENV + value: ${env.VIRTUAL_ENV} + optional: true + +tools: + definitions: + - name: uv + runtime: python + package: uv + known_good_version: 0.7.8 + health_checks: + - command: uv --version + parse_regex: ${semver} + shims: [uv] diff --git a/actions/uv/requirements.txt b/actions/uv/requirements.txt new file mode 100644 index 000000000..b213e4fa2 --- /dev/null +++ b/actions/uv/requirements.txt @@ -0,0 +1 @@ +uv==0.7.8 diff --git a/actions/uv/uv.test.ts b/actions/uv/uv.test.ts new file mode 100644 index 000000000..ebc02e0cc --- /dev/null +++ b/actions/uv/uv.test.ts @@ -0,0 +1,92 @@ +import * as fs from "fs"; +import * as path from "path"; +import { actionRunTest, toolInstallTest } from "tests"; +import { TrunkActionDriver } from "tests/driver"; + +toolInstallTest({ + toolName: "uv", + toolVersion: "0.3", +}); + +const preCheck = (driver: TrunkActionDriver) => { + const trunkYamlPath = ".trunk/trunk.yaml"; + const currentContents = driver.readFile(trunkYamlPath); + const newContents = currentContents.concat(` + definitions: + - id: uv-check + runtime: python + - id: uv-lock + runtime: python + - id: uv-sync + runtime: python`); + driver.writeFile(trunkYamlPath, newContents); + + driver.writeFile( + "pyproject.toml", + `[project] +name = "uv-test" +version = "0.1.0" +description = "" + +[project.dependencies] +python = "^3.12" +pendulum = "^3.0.0" + `, + ); +}; + +const checkTestCallback = async (driver: TrunkActionDriver) => { + try { + await driver.gitDriver?.commit( + "Test commit", + [], + { "--allow-empty": null }, + (error, result) => { + // uv check should pass for a valid pyproject.toml + expect(error).toBeFalsy(); + expect(result).toBeTruthy(); + }, + ); + } catch { + // Intentionally empty + } +}; + +const fileExistsCallback = (filename: string) => async (driver: TrunkActionDriver) => { + try { + await driver.gitDriver?.commit( + "Test commit", + [], + { "--allow-empty": null }, + (_error, result) => { + expect(_error).toBeFalsy(); + expect(result).toBeTruthy(); + }, + ); + + expect(fs.existsSync(path.resolve(driver.getSandbox(), filename))).toBeTruthy(); + } catch { + // Intentionally empty + } +}; + +actionRunTest({ + actionName: "uv-check", + syncGitHooks: true, + testCallback: checkTestCallback, + preCheck: preCheck, +}); + +actionRunTest({ + actionName: "uv-lock", + syncGitHooks: true, + testCallback: fileExistsCallback("uv.lock"), + preCheck: preCheck, +}); + +actionRunTest({ + actionName: "uv-sync", + syncGitHooks: true, + testCallback: fileExistsCallback(".venv"), // Assuming uv creates a .venv by default + preCheck: preCheck, +}); diff --git a/actions/yarn-check/yarn_check.js b/actions/yarn-check/yarn_check.js index 6fbd71028..7ccfe3488 100755 --- a/actions/yarn-check/yarn_check.js +++ b/actions/yarn-check/yarn_check.js @@ -1,6 +1,5 @@ #!/usr/bin/env node -// trunk-ignore-all(eslint) const yarnCheck = require("yarn-check"); const YAML = require("yaml"); const path = require("path"); @@ -28,7 +27,7 @@ yarnCheck({}) message: `${uninstalled_count} yarn ${pluralize( uninstalled_count, "package", - "packages" + "packages", )} ${pluralize(uninstalled_count, "needs", "need")} to be installed\n`, commands: [{ run: "yarn install", title: "yarn install" }], icon: iconPath, diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 000000000..a1e9fb120 --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,145 @@ +const eslint = require("@eslint/js"); +const typescriptEslint = require("typescript-eslint"); +const importPlugin = require("eslint-plugin-import-x"); +const nodeRecommended = require("eslint-plugin-n"); +const prettier = require("eslint-config-prettier"); +const jestPlugin = require("eslint-plugin-jest"); +const simpleImportSort = require("eslint-plugin-simple-import-sort"); +// const preferArrowFunctions = require("eslint-plugin-prefer-arrow-functions"); + +module.exports = [ + eslint.configs.recommended, + prettier, + ...typescriptEslint.config({ + files: ["**/*.ts"], + extends: [ + ...typescriptEslint.configs.recommended, + ...typescriptEslint.configs.strictTypeChecked, + ...typescriptEslint.configs.stylisticTypeChecked, + ], + plugins: { + // "prefer-arrow-functions": preferArrowFunctions, + "simple-import-sort": simpleImportSort, + "import-x": importPlugin, + n: nodeRecommended, + }, + languageOptions: { + ecmaVersion: "latest", + parser: typescriptEslint.parser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + sourceType: "module", + project: "tsconfig.json", + }, + }, + rules: { + ...importPlugin.configs.recommended.rules, + ...importPlugin.configs.typescript.rules, + ...nodeRecommended.configs.recommended.rules, + "no-return-await": "off", + "no-shadow": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "no-use-before-define": "off", + "no-useless-constructor": "off", + "@typescript-eslint/naming-convention": [ + "error", + { selector: "typeLike", format: ["PascalCase"] }, + { selector: "function", format: ["camelCase"] }, + { + selector: "variable", + modifiers: ["global", "const"], + format: ["UPPER_CASE", "camelCase"], + }, + ], + "@typescript-eslint/no-shadow": "error", + "@typescript-eslint/no-unused-expressions": ["error"], + "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], + "@typescript-eslint/no-use-before-define": ["error"], + "@typescript-eslint/no-useless-constructor": ["error"], + "@typescript-eslint/no-explicit-any": "off", + "class-methods-use-this": "off", + curly: "error", + "func-names": ["error", "as-needed"], + "func-style": ["error", "expression", { allowArrowFunctions: true }], + "import-x/extensions": "off", + "import-x/first": "error", + "import-x/no-extraneous-dependencies": [ + "error", + { + devDependencies: ["**/*.test.ts", "**/tests/**"], + }, + ], + "import-x/no-unresolved": "off", + "import-x/prefer-default-export": "off", + "lines-between-class-members": ["error", "always", { exceptAfterSingleLine: true }], + "max-len": [ + "error", + { + code: 120, + comments: 130, + tabWidth: 2, + ignoreComments: false, + ignoreTrailingComments: false, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreRegExpLiterals: true, + }, + ], + "no-continue": "off", + "no-param-reassign": ["error", { props: false }], + "no-restricted-syntax": "off", + "n/no-extraneous-import": ["error"], + "n/no-unpublished-import": "off", + "n/no-missing-import": "off", + "n/no-unsupported-features/es-syntax": ["error", { ignores: ["modules", "dynamicImport"] }], + // TODO(Tyler): Add prefer-arrow-functions once it becomes compatible. + // "prefer-arrow-functions/prefer-arrow-functions": [ + // "error", + // { + // returnStyle: "implicit", + // }, + // ], + "simple-import-sort/exports": "error", + "simple-import-sort/imports": "error", + "@typescript-eslint/no-confusing-void-expression": "off", + "@typescript-eslint/restrict-template-expressions": "off", + }, + settings: [ + "error", + { + "import-x/resolver": { + typescript: { + alwaysTryTypes: true, + }, + }, + }, + ], + }), + { + files: ["**/*test.ts"], + plugins: { + jest: jestPlugin, + }, + rules: { + ...jestPlugin.configs.recommended.rules, + }, + }, + { + // Used for scripts and Trunk Actions. + files: ["**/*.{js,cjs}"], + languageOptions: { + globals: { + node: true, + require: true, + console: true, + module: true, + __dirname: true, + }, + ecmaVersion: "latest", + }, + }, +]; diff --git a/jest.config.json b/jest.config.json index 138e05427..a6a94bbe4 100644 --- a/jest.config.json +++ b/jest.config.json @@ -2,5 +2,6 @@ "preset": "ts-jest", "modulePaths": [""], "setupFilesAfterEnv": ["/tests/jest_setup.ts"], - "reporters": ["/tests/reporter/index.js", "default"] + "reporters": ["/tests/reporter/index.js", "default", "jest-junit"], + "testPathIgnorePatterns": ["/node_modules/", "/repo-tools/"] } diff --git a/linters/actionlint/actionlint.test.ts b/linters/actionlint/actionlint.test.ts index b7fe2eb01..fcb655f3c 100644 --- a/linters/actionlint/actionlint.test.ts +++ b/linters/actionlint/actionlint.test.ts @@ -6,11 +6,9 @@ import { TEST_DATA } from "tests/utils"; // actionlint is specially triggered to run on github workflow files const preCheck = async (driver: TrunkLintDriver) => { - // trunk-ignore-begin(semgrep): driver.getSandbox() is generated during testing and is safe fs.readdirSync(path.resolve(driver.getSandbox(), TEST_DATA)).forEach((file) => { driver.moveFile(path.join(TEST_DATA, file), path.join(".github/workflows", file)); }); - // trunk-ignore-end(semgrep) await driver.gitDriver?.add(".").commit("moved"); }; diff --git a/linters/actionlint/plugin.yaml b/linters/actionlint/plugin.yaml index 4b2c0a170..54eae807a 100644 --- a/linters/actionlint/plugin.yaml +++ b/linters/actionlint/plugin.yaml @@ -29,6 +29,7 @@ lint: files: [github-workflow] # Custom parser/trigger type defined in the trunk cli. tools: [actionlint] + description: Verify your Github workflows commands: - name: lint output: actionlint diff --git a/linters/ansible-lint/README.md b/linters/ansible-lint/README.md index 23be34fe1..2a6226784 100644 --- a/linters/ansible-lint/README.md +++ b/linters/ansible-lint/README.md @@ -2,10 +2,32 @@ ## Usage -[Ansible-lint](https://github.com/ansible/ansible-lint) is used to check ansible playbooks. In order -to integrate well with trunk, ansible is usually run using triggers. The trigger system allows file -changes to trigger lint runs. An example of an ansible-lint trigger is included below, but more -information can be found in our [docs](https://docs.trunk.io/check/configuration#trigger-rules). +### New Recommendation + +We now recommend using +[inverse ignores](https://docs.trunk.io/code-quality/linters/ignoring-issues-and-files#ignoring-multiple-files) +to run ansible-lint. For backwards compatibility, you will need to specify filetypes yourself and +then a list of ignores. + +```yaml +lint: + definitions: + - name: ansible-lint + files: [yaml] + enabled: + - ansible-lint@5.3.2 + ignore: + - linters: [ansible-lint] + paths: + - "**" + - "!test_data/jboss-standalone" +``` + +### Legacy Mode + +[Ansible-lint](https://github.com/ansible/ansible-lint) is used to check ansible playbooks. +Historically, in order to integrate well with trunk, you would invoke ansible-lint with +[triggers](https://docs.trunk.io/check/configuration#trigger-rules). ```yaml lint: diff --git a/linters/ansible-lint/ansible_lint.test.ts b/linters/ansible-lint/ansible_lint.test.ts index 896f5cba6..3510159b8 100644 --- a/linters/ansible-lint/ansible_lint.test.ts +++ b/linters/ansible-lint/ansible_lint.test.ts @@ -9,16 +9,14 @@ const preCheck = (driver: TrunkLintDriver) => { const trunkYamlPath = ".trunk/trunk.yaml"; const currentContents = driver.readFile(trunkYamlPath); - const newContents = currentContents.concat(` triggers: - # Run these linters - - linters: - - ansible-lint - # If any files matching these change + const newContents = currentContents.concat(` definitions: + - name: ansible-lint + files: [yaml] + ignore: + - linters: [ansible-lint] paths: - "**" - # On this target (A directory in this case) - targets: - - jboss-standalone + - "!jboss-standalone" `); driver.writeFile(trunkYamlPath, newContents); diff --git a/linters/ansible-lint/plugin.yaml b/linters/ansible-lint/plugin.yaml index bcb557669..d7188d1b0 100644 --- a/linters/ansible-lint/plugin.yaml +++ b/linters/ansible-lint/plugin.yaml @@ -1,7 +1,6 @@ version: 0.1 tools: definitions: - # TODO(Tyler): Once we can make ansible its own tool without breaking upgrade, this should be extracted into its own tool directory - name: ansible-lint runtime: python package: ansible-lint @@ -14,23 +13,26 @@ lint: supported_platforms: [linux, macos] # No files as this linter must be triggered manually. files: [] + description: Improve ansible playbooks commands: - name: lint version: ">=6.1.0" # sarif support was added in version 6.1.0 output: sarif - run: ansible-lint -f sarif + run: ansible-lint -f sarif ${target} # ansible-lint >=6.15.0 return exit code 5 when no files matched success_codes: [0, 2, 5] - run_from: ${target_directory} + run_from: ${parent} + batch: true - name: lint version: ">=5.1.3" # Custom parser type defined in the trunk cli to handle ansible-lint's output. output: ansible_lint # parseable-severity was removed after 5.4.0 - run: ansible-lint --parseable-severity + run: ansible-lint --parseable-severity ${target} success_codes: [0, 2] - run_from: ${target_directory} + run_from: ${parent} + batch: true tools: [ansible-lint] suggest_if: never direct_configs: [.ansible-lint] diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.14.3_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v24.6.0_FQCN.check.shot similarity index 88% rename from linters/ansible-lint/test_data/ansible_lint_v6.14.3_FQCN.check.shot rename to linters/ansible-lint/test_data/ansible_lint_v24.6.0_FQCN.check.shot index cd3fa027e..a67527fe7 100644 --- a/linters/ansible-lint/test_data/ansible_lint_v6.14.3_FQCN.check.shot +++ b/linters/ansible-lint/test_data/ansible_lint_v24.6.0_FQCN.check.shot @@ -13,7 +13,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "28", "linter": "ansible-lint", "message": "Use \`ansible.builtin.wait_for\` or \`ansible.legacy.wait_for\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -25,7 +25,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "5", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[play]", @@ -37,19 +37,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/java-app", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name java-app does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -61,7 +49,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -73,7 +61,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "Task/Handler: Copy application WAR file to host", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -85,7 +73,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "19", "linter": "ansible-lint", "message": "Action \`jboss\` is not FQCN.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -97,7 +85,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -109,7 +97,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Task/Handler: Copy application WAR file to host", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -121,19 +109,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Action \`jboss\` is not FQCN.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/jboss-standalone", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name jboss-standalone does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -145,7 +121,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -157,7 +133,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Task/Handler: restart jboss", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -169,7 +145,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -181,7 +157,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Task/Handler: restart iptables", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -193,7 +169,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "Use \`ansible.builtin.get_url\` or \`ansible.legacy.get_url\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -205,7 +181,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "Task/Handler: Download JBoss from jboss.org", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -217,7 +193,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "17", "linter": "ansible-lint", "message": "Use \`ansible.builtin.unarchive\` or \`ansible.legacy.unarchive\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -228,8 +204,8 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "level": "LEVEL_HIGH", "line": "2", "linter": "ansible-lint", - "message": "Use \`ansible.builtin.yum\` or \`ansible.legacy.yum\` instead.", - "targetType": "custom", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -241,7 +217,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "22", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -253,7 +229,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "25", "linter": "ansible-lint", "message": "Use \`ansible.builtin.command\` or \`ansible.legacy.command\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -265,7 +241,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -277,7 +253,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "Task/Handler: Copying standalone.xml configuration file", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -289,7 +265,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "37", "linter": "ansible-lint", "message": "Use \`ansible.builtin.group\` or \`ansible.legacy.group\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -301,7 +277,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "41", "linter": "ansible-lint", "message": "Use \`ansible.builtin.user\` or \`ansible.legacy.user\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -313,7 +289,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "47", "linter": "ansible-lint", "message": "Use \`ansible.builtin.file\` or \`ansible.legacy.file\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -325,7 +301,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "53", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -337,7 +313,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "55", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[octal-values]", @@ -349,7 +325,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "59", "linter": "ansible-lint", "message": "Forbidden implicit octal value "0755"", - "targetType": "custom", + "targetType": "yaml", }, { "code": "command-instead-of-module", @@ -361,7 +337,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -373,7 +349,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Use \`ansible.builtin.shell\` or \`ansible.legacy.shell\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "ignore-errors", @@ -385,7 +361,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "no-changed-when", @@ -397,7 +373,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -409,7 +385,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "63", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -421,7 +397,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "65", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -433,7 +409,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "68", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -445,7 +421,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -457,7 +433,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Task/Handler: deploy iptables rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -469,7 +445,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Task/Handler: deploy iptables rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -480,8 +456,8 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "level": "LEVEL_HIGH", "line": "78", "linter": "ansible-lint", - "message": "Use \`ansible.builtin.yum\` or \`ansible.legacy.yum\` instead.", - "targetType": "custom", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -493,7 +469,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "84", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -505,7 +481,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "Action \`firewalld\` is not FQCN.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -517,7 +493,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "Task/Handler: deploy firewalld rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -529,7 +505,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "92", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -541,7 +517,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "95", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[play]", @@ -553,27 +529,62 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", + "targetType": "yaml", }, ], "lintActions": [ { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", ], "verb": "TRUNK_VERB_CHECK", }, { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/site.yml", ], - "upstream": true, "verb": "TRUNK_VERB_CHECK", }, ], diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.22.1_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v24.6.0_non_FQCN.check.shot similarity index 85% rename from linters/ansible-lint/test_data/ansible_lint_v6.22.1_FQCN.check.shot rename to linters/ansible-lint/test_data/ansible_lint_v24.6.0_non_FQCN.check.shot index cd3fa027e..50b3c44c4 100644 --- a/linters/ansible-lint/test_data/ansible_lint_v6.22.1_FQCN.check.shot +++ b/linters/ansible-lint/test_data/ansible_lint_v24.6.0_non_FQCN.check.shot @@ -1,31 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Testing linter ansible-lint test FQCN 1`] = ` +exports[`Testing linter ansible-lint test non_FQCN 1`] = ` { "issues": [ { - "code": "fqcn[action-core]", - "column": "1", - "file": "jboss-standalone/demo-aws-launch.yml", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", - "level": "LEVEL_HIGH", - "line": "28", - "linter": "ansible-lint", - "message": "Use \`ansible.builtin.wait_for\` or \`ansible.legacy.wait_for\` instead.", - "targetType": "custom", - }, - { - "code": "yaml[truthy]", - "column": "1", + "code": "syntax-check[unknown-module]", + "column": "7", "file": "jboss-standalone/demo-aws-launch.yml", "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#syntax-check[unknown-module]", "level": "LEVEL_HIGH", - "line": "5", + "line": "12", "linter": "ansible-lint", - "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "message": "couldn't resolve module/action 'ec2'. This often indicates a misspelling, missing collection, or incorrect module path.", + "targetType": "yaml", }, { "code": "name[play]", @@ -37,19 +25,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/java-app", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name java-app does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -61,7 +37,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -73,7 +49,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "Task/Handler: Copy application WAR file to host", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -85,7 +61,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "19", "linter": "ansible-lint", "message": "Action \`jboss\` is not FQCN.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -97,7 +73,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -109,7 +85,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Task/Handler: Copy application WAR file to host", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -121,19 +97,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Action \`jboss\` is not FQCN.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/jboss-standalone", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name jboss-standalone does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -145,7 +109,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -157,7 +121,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Task/Handler: restart jboss", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -169,7 +133,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -181,7 +145,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Task/Handler: restart iptables", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -193,7 +157,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "Use \`ansible.builtin.get_url\` or \`ansible.legacy.get_url\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -205,7 +169,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "Task/Handler: Download JBoss from jboss.org", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -217,7 +181,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "17", "linter": "ansible-lint", "message": "Use \`ansible.builtin.unarchive\` or \`ansible.legacy.unarchive\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -228,8 +192,8 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "level": "LEVEL_HIGH", "line": "2", "linter": "ansible-lint", - "message": "Use \`ansible.builtin.yum\` or \`ansible.legacy.yum\` instead.", - "targetType": "custom", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -241,7 +205,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "22", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -253,7 +217,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "25", "linter": "ansible-lint", "message": "Use \`ansible.builtin.command\` or \`ansible.legacy.command\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -265,7 +229,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -277,7 +241,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "Task/Handler: Copying standalone.xml configuration file", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -289,7 +253,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "37", "linter": "ansible-lint", "message": "Use \`ansible.builtin.group\` or \`ansible.legacy.group\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -301,7 +265,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "41", "linter": "ansible-lint", "message": "Use \`ansible.builtin.user\` or \`ansible.legacy.user\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -313,7 +277,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "47", "linter": "ansible-lint", "message": "Use \`ansible.builtin.file\` or \`ansible.legacy.file\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -325,7 +289,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "53", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -337,7 +301,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "55", "linter": "ansible-lint", "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[octal-values]", @@ -349,7 +313,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "59", "linter": "ansible-lint", "message": "Forbidden implicit octal value "0755"", - "targetType": "custom", + "targetType": "yaml", }, { "code": "command-instead-of-module", @@ -361,7 +325,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -373,7 +337,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Use \`ansible.builtin.shell\` or \`ansible.legacy.shell\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "ignore-errors", @@ -385,7 +349,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "no-changed-when", @@ -397,7 +361,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Task/Handler: Workaround for systemd bug", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -409,7 +373,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "63", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -421,7 +385,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "65", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -433,7 +397,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "68", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -445,7 +409,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -457,7 +421,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Task/Handler: deploy iptables rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -469,7 +433,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Task/Handler: deploy iptables rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -480,8 +444,8 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "level": "LEVEL_HIGH", "line": "78", "linter": "ansible-lint", - "message": "Use \`ansible.builtin.yum\` or \`ansible.legacy.yum\` instead.", - "targetType": "custom", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -493,7 +457,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "84", "linter": "ansible-lint", "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -505,7 +469,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "Action \`firewalld\` is not FQCN.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -517,7 +481,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "Task/Handler: deploy firewalld rules", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -529,7 +493,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "92", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -541,7 +505,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "95", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[play]", @@ -553,27 +517,62 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", + "targetType": "yaml", }, ], "lintActions": [ { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", ], "verb": "TRUNK_VERB_CHECK", }, { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/site.yml", ], - "upstream": true, "verb": "TRUNK_VERB_CHECK", }, ], diff --git a/linters/ansible-lint/test_data/ansible_lint_v25.2.0_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v25.2.0_FQCN.check.shot new file mode 100644 index 000000000..cdb54c019 --- /dev/null +++ b/linters/ansible-lint/test_data/ansible_lint_v25.2.0_FQCN.check.shot @@ -0,0 +1,595 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter ansible-lint test FQCN 1`] = ` +{ + "issues": [ + { + "code": "fqcn[action-core]", + "column": "7", + "file": "jboss-standalone/demo-aws-launch.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "29", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.wait_for\` or \`ansible.legacy.wait_for\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/demo-aws-launch.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "name[play]", + "column": "1", + "file": "jboss-standalone/deploy-application.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[play]", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "ansible-lint", + "message": "All plays should be named.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ansible-lint", + "message": "Task/Handler: Copy application WAR file to host", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "15", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Task/Handler: Copy application WAR file to host", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "20", + "linter": "ansible-lint", + "message": "Action \`jboss\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "ansible-lint", + "message": "Action \`jboss\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Task/Handler: restart jboss", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "ansible-lint", + "message": "Task/Handler: restart iptables", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ansible-lint", + "message": "Task/Handler: Download JBoss from jboss.org", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "13", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.get_url\` or \`ansible.legacy.get_url\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.unarchive\` or \`ansible.legacy.unarchive\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "22", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "26", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.command\` or \`ansible.legacy.command\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ansible-lint", + "message": "Task/Handler: Copying standalone.xml configuration file", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "32", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "38", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.group\` or \`ansible.legacy.group\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "42", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.user\` or \`ansible.legacy.user\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "48", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.file\` or \`ansible.legacy.file\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "53", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "56", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[octal-values]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[octal-values]", + "level": "LEVEL_HIGH", + "line": "59", + "linter": "ansible-lint", + "message": "Forbidden implicit octal value "0755"", + "targetType": "yaml", + }, + { + "code": "command-instead-of-module", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#command-instead-of-module", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "ignore-errors", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#ignore-errors", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "no-changed-when", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#no-changed-when", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "62", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.shell\` or \`ansible.legacy.shell\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "63", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "66", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "68", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "Task/Handler: deploy iptables rules", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "Task/Handler: deploy iptables rules", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "72", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "79", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "85", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "90", + "linter": "ansible-lint", + "message": "Task/Handler: deploy firewalld rules", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "91", + "linter": "ansible-lint", + "message": "Action \`firewalld\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "92", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "95", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "name[play]", + "column": "1", + "file": "jboss-standalone/site.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[play]", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "ansible-lint", + "message": "All plays should be named.", + "targetType": "yaml", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/site.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ansible-lint/test_data/ansible_lint_v25.2.0_non_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v25.2.0_non_FQCN.check.shot new file mode 100644 index 000000000..a993e1d2a --- /dev/null +++ b/linters/ansible-lint/test_data/ansible_lint_v25.2.0_non_FQCN.check.shot @@ -0,0 +1,583 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter ansible-lint test non_FQCN 1`] = ` +{ + "issues": [ + { + "code": "syntax-check[unknown-module]", + "column": "7", + "file": "jboss-standalone/demo-aws-launch.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#syntax-check[unknown-module]", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ansible-lint", + "message": "couldn't resolve module/action 'ec2'. This often indicates a misspelling, missing collection, or incorrect module path.", + "targetType": "yaml", + }, + { + "code": "name[play]", + "column": "1", + "file": "jboss-standalone/deploy-application.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[play]", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "ansible-lint", + "message": "All plays should be named.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ansible-lint", + "message": "Task/Handler: Copy application WAR file to host", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "15", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Task/Handler: Copy application WAR file to host", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "20", + "linter": "ansible-lint", + "message": "Action \`jboss\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "ansible-lint", + "message": "Action \`jboss\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Task/Handler: restart jboss", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "ansible-lint", + "message": "Task/Handler: restart iptables", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ansible-lint", + "message": "Task/Handler: Download JBoss from jboss.org", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "13", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.get_url\` or \`ansible.legacy.get_url\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.unarchive\` or \`ansible.legacy.unarchive\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "22", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "26", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.command\` or \`ansible.legacy.command\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ansible-lint", + "message": "Task/Handler: Copying standalone.xml configuration file", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "32", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "38", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.group\` or \`ansible.legacy.group\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "42", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.user\` or \`ansible.legacy.user\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "48", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.file\` or \`ansible.legacy.file\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "53", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "56", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.copy\` or \`ansible.legacy.copy\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[octal-values]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[octal-values]", + "level": "LEVEL_HIGH", + "line": "59", + "linter": "ansible-lint", + "message": "Forbidden implicit octal value "0755"", + "targetType": "yaml", + }, + { + "code": "command-instead-of-module", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#command-instead-of-module", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "ignore-errors", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#ignore-errors", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "no-changed-when", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#no-changed-when", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Task/Handler: Workaround for systemd bug", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "62", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.shell\` or \`ansible.legacy.shell\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "63", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "66", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "68", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "Task/Handler: deploy iptables rules", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "Task/Handler: deploy iptables rules", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "72", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.template\` or \`ansible.legacy.template\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "79", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.dnf\` or \`ansible.legacy.dnf\` instead.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "85", + "linter": "ansible-lint", + "message": "Use \`ansible.builtin.service\` or \`ansible.legacy.service\` instead.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "9", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "90", + "linter": "ansible-lint", + "message": "Task/Handler: deploy firewalld rules", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "3", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "91", + "linter": "ansible-lint", + "message": "Action \`firewalld\` is not FQCN.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "92", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "95", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "name[play]", + "column": "1", + "file": "jboss-standalone/site.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[play]", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "ansible-lint", + "message": "All plays should be named.", + "targetType": "yaml", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/site.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.13.0_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v6.13.0_FQCN.check.shot index 0d2e6bcc8..2fc859ed5 100644 --- a/linters/ansible-lint/test_data/ansible_lint_v6.13.0_FQCN.check.shot +++ b/linters/ansible-lint/test_data/ansible_lint_v6.13.0_FQCN.check.shot @@ -13,7 +13,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "28", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (wait_for).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -25,7 +25,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "5", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[play]", @@ -37,19 +37,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/java-app", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name java-app does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -61,7 +49,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (copy).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -73,7 +61,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "14", "linter": "ansible-lint", "message": "File permissions unset or incorrect.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -85,7 +73,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "19", "linter": "ansible-lint", "message": "Use FQCN for module actions, such \`community.general.jboss\`.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -97,7 +85,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (copy).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -109,7 +97,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "File permissions unset or incorrect.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -121,19 +109,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Use FQCN for module actions, such \`community.general.jboss\`.", - "targetType": "custom", - }, - { - "code": "role-name", - "column": "1", - "file": "jboss-standalone/roles/jboss-standalone", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#role-name", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "ansible-lint", - "message": "Role name jboss-standalone does not match \`\`^[a-z][a-z0-9_]*$\`\` pattern.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -145,7 +121,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (service).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -157,7 +133,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "2", "linter": "ansible-lint", "message": "All names should start with an uppercase letter.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -169,7 +145,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (service).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -181,7 +157,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "7", "linter": "ansible-lint", "message": "All names should start with an uppercase letter.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -193,7 +169,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (get_url).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -205,7 +181,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "File permissions unset or incorrect.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -217,19 +193,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "17", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (unarchive).", - "targetType": "custom", - }, - { - "code": "fqcn[action-core]", - "column": "1", - "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", - "level": "LEVEL_HIGH", - "line": "2", - "linter": "ansible-lint", - "message": "Use FQCN for builtin module actions (yum).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -241,7 +205,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "22", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -253,7 +217,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "25", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (command).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -265,7 +229,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (template).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -277,7 +241,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "31", "linter": "ansible-lint", "message": "File permissions unset or incorrect.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -289,7 +253,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "37", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (group).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -301,7 +265,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "41", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (user).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -313,7 +277,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "47", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (file).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -325,7 +289,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "53", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -337,7 +301,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "55", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (copy).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[octal-values]", @@ -349,7 +313,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "59", "linter": "ansible-lint", "message": "Forbidden implicit octal value "0755"", - "targetType": "custom", + "targetType": "yaml", }, { "code": "command-instead-of-module", @@ -361,7 +325,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "service used in place of service module", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -373,7 +337,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (shell).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "ignore-errors", @@ -385,7 +349,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Use failed_when and specify error conditions instead of using ignore_errors.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "no-changed-when", @@ -397,7 +361,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "61", "linter": "ansible-lint", "message": "Commands should not change things if nothing needs doing.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -409,7 +373,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "63", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -421,7 +385,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "65", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (service).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -433,7 +397,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "68", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -445,7 +409,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (template).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -457,7 +421,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "All names should start with an uppercase letter.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "risky-file-permissions", @@ -469,19 +433,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "71", "linter": "ansible-lint", "message": "File permissions unset or incorrect.", - "targetType": "custom", - }, - { - "code": "fqcn[action-core]", - "column": "1", - "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", - "level": "LEVEL_HIGH", - "line": "78", - "linter": "ansible-lint", - "message": "Use FQCN for builtin module actions (yum).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action-core]", @@ -493,7 +445,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "84", "linter": "ansible-lint", "message": "Use FQCN for builtin module actions (service).", - "targetType": "custom", + "targetType": "yaml", }, { "code": "fqcn[action]", @@ -505,7 +457,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "Use FQCN for module actions, such \`ansible.posix.firewalld\`.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[casing]", @@ -517,7 +469,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "90", "linter": "ansible-lint", "message": "All names should start with an uppercase letter.", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -529,7 +481,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "92", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "yaml[truthy]", @@ -541,7 +493,7 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "95", "linter": "ansible-lint", "message": "Truthy value should be one of [false, true]", - "targetType": "custom", + "targetType": "yaml", }, { "code": "name[play]", @@ -553,27 +505,62 @@ exports[`Testing linter ansible-lint test FQCN 1`] = ` "line": "4", "linter": "ansible-lint", "message": "All plays should be named.", - "targetType": "custom", + "targetType": "yaml", }, ], "lintActions": [ { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", ], "verb": "TRUNK_VERB_CHECK", }, { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/site.yml", ], - "upstream": true, "verb": "TRUNK_VERB_CHECK", }, ], diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.13.0_non_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v6.13.0_non_FQCN.check.shot index 8c4365b3b..b17ecea8b 100644 --- a/linters/ansible-lint/test_data/ansible_lint_v6.13.0_non_FQCN.check.shot +++ b/linters/ansible-lint/test_data/ansible_lint_v6.13.0_non_FQCN.check.shot @@ -13,27 +13,518 @@ exports[`Testing linter ansible-lint test non_FQCN 1`] = ` "line": "12", "linter": "ansible-lint", "message": "couldn't resolve module/action 'ec2'. This often indicates a misspelling, missing collection, or incorrect module path.", - "targetType": "custom", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (copy).", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ansible-lint", + "message": "File permissions unset or incorrect.", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "ansible-lint", + "message": "Use FQCN for module actions, such \`community.general.jboss\`.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (copy).", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "File permissions unset or incorrect.", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "1", + "file": "jboss-standalone/roles/java-app/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "ansible-lint", + "message": "Use FQCN for module actions, such \`community.general.jboss\`.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (service).", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ansible-lint", + "message": "All names should start with an uppercase letter.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (service).", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "ansible-lint", + "message": "All names should start with an uppercase letter.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (get_url).", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ansible-lint", + "message": "File permissions unset or incorrect.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "17", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (unarchive).", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "22", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "25", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (command).", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (template).", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ansible-lint", + "message": "File permissions unset or incorrect.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "37", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (group).", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "41", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (user).", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "47", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (file).", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "53", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "55", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (copy).", + "targetType": "yaml", + }, + { + "code": "yaml[octal-values]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[octal-values]", + "level": "LEVEL_HIGH", + "line": "59", + "linter": "ansible-lint", + "message": "Forbidden implicit octal value "0755"", + "targetType": "yaml", + }, + { + "code": "command-instead-of-module", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#command-instead-of-module", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "service used in place of service module", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (shell).", + "targetType": "yaml", + }, + { + "code": "ignore-errors", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#ignore-errors", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Use failed_when and specify error conditions instead of using ignore_errors.", + "targetType": "yaml", + }, + { + "code": "no-changed-when", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#no-changed-when", + "level": "LEVEL_HIGH", + "line": "61", + "linter": "ansible-lint", + "message": "Commands should not change things if nothing needs doing.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "63", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "65", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (service).", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "68", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (template).", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "All names should start with an uppercase letter.", + "targetType": "yaml", + }, + { + "code": "risky-file-permissions", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-file-permissions", + "level": "LEVEL_HIGH", + "line": "71", + "linter": "ansible-lint", + "message": "File permissions unset or incorrect.", + "targetType": "yaml", + }, + { + "code": "fqcn[action-core]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action-core]", + "level": "LEVEL_HIGH", + "line": "84", + "linter": "ansible-lint", + "message": "Use FQCN for builtin module actions (service).", + "targetType": "yaml", + }, + { + "code": "fqcn[action]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#fqcn[action]", + "level": "LEVEL_HIGH", + "line": "90", + "linter": "ansible-lint", + "message": "Use FQCN for module actions, such \`ansible.posix.firewalld\`.", + "targetType": "yaml", + }, + { + "code": "name[casing]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#name[casing]", + "level": "LEVEL_HIGH", + "line": "90", + "linter": "ansible-lint", + "message": "All names should start with an uppercase letter.", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "92", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", + }, + { + "code": "yaml[truthy]", + "column": "1", + "file": "jboss-standalone/roles/jboss-standalone/tasks/main.yml", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#yaml[truthy]", + "level": "LEVEL_HIGH", + "line": "95", + "linter": "ansible-lint", + "message": "Truthy value should be one of [false, true]", + "targetType": "yaml", }, ], "lintActions": [ { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/demo-aws-launch.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/deploy-application.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/java-app/tasks/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "ansible-lint", + "paths": [ + "jboss-standalone/roles/jboss-standalone/handlers/main.yml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/roles/jboss-standalone/tasks/main.yml", ], "verb": "TRUNK_VERB_CHECK", }, { "command": "lint", - "fileGroupName": "custom", + "fileGroupName": "yaml", "linter": "ansible-lint", "paths": [ - "jboss-standalone", + "jboss-standalone/site.yml", ], - "upstream": true, "verb": "TRUNK_VERB_CHECK", }, ], diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.14.3_non_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v6.14.3_non_FQCN.check.shot deleted file mode 100644 index 8c4365b3b..000000000 --- a/linters/ansible-lint/test_data/ansible_lint_v6.14.3_non_FQCN.check.shot +++ /dev/null @@ -1,43 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter ansible-lint test non_FQCN 1`] = ` -{ - "issues": [ - { - "code": "syntax-check[specific]", - "column": "7", - "file": "jboss-standalone/demo-aws-launch.yml", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#syntax-check[specific]", - "level": "LEVEL_HIGH", - "line": "12", - "linter": "ansible-lint", - "message": "couldn't resolve module/action 'ec2'. This often indicates a misspelling, missing collection, or incorrect module path.", - "targetType": "custom", - }, - ], - "lintActions": [ - { - "command": "lint", - "fileGroupName": "custom", - "linter": "ansible-lint", - "paths": [ - "jboss-standalone", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "custom", - "linter": "ansible-lint", - "paths": [ - "jboss-standalone", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [], -} -`; diff --git a/linters/ansible-lint/test_data/ansible_lint_v6.22.1_non_FQCN.check.shot b/linters/ansible-lint/test_data/ansible_lint_v6.22.1_non_FQCN.check.shot deleted file mode 100644 index 19d429497..000000000 --- a/linters/ansible-lint/test_data/ansible_lint_v6.22.1_non_FQCN.check.shot +++ /dev/null @@ -1,43 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter ansible-lint test non_FQCN 1`] = ` -{ - "issues": [ - { - "code": "syntax-check[unknown-module]", - "column": "7", - "file": "jboss-standalone/demo-aws-launch.yml", - "issueClass": "ISSUE_CLASS_NEW", - "issueUrl": "https://ansible-lint.readthedocs.io/en/latest/default_rules.html#syntax-check[unknown-module]", - "level": "LEVEL_HIGH", - "line": "12", - "linter": "ansible-lint", - "message": "couldn't resolve module/action 'ec2'. This often indicates a misspelling, missing collection, or incorrect module path.", - "targetType": "custom", - }, - ], - "lintActions": [ - { - "command": "lint", - "fileGroupName": "custom", - "linter": "ansible-lint", - "paths": [ - "jboss-standalone", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "custom", - "linter": "ansible-lint", - "paths": [ - "jboss-standalone", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [], -} -`; diff --git a/linters/autopep8/plugin.yaml b/linters/autopep8/plugin.yaml index 97bcffcbd..2ea2c6e61 100644 --- a/linters/autopep8/plugin.yaml +++ b/linters/autopep8/plugin.yaml @@ -11,6 +11,7 @@ lint: definitions: - name: autopep8 files: [python] + description: A python formatter commands: - name: format output: rewrite diff --git a/linters/bandit/plugin.yaml b/linters/bandit/plugin.yaml index 16ec14d7b..81a660d66 100644 --- a/linters/bandit/plugin.yaml +++ b/linters/bandit/plugin.yaml @@ -13,6 +13,7 @@ lint: tools: [bandit] suggest_if: files_present direct_configs: [.bandit] + description: A security linter for Python commands: - name: lint # Custom parser type defined in the trunk cli to handle bandit's JSON output. diff --git a/linters/biome/plugin.yaml b/linters/biome/plugin.yaml index 776da91cf..4176814b5 100644 --- a/linters/biome/plugin.yaml +++ b/linters/biome/plugin.yaml @@ -6,15 +6,19 @@ tools: runtime: node package: "@biomejs/biome" shims: [biome] - known_good_version: 1.4.1 + known_good_version: 1.9.4 lint: definitions: # Successor to the rome linter+formatter - name: biome files: - - typescript + - astro + - css + - graphql - javascript - json + - typescript + description: A static analyzer for web projects commands: - name: lint output: regex @@ -28,7 +32,7 @@ lint: read_output_from: stderr - name: fmt output: rewrite - run: biome format --write "${target}" + run: biome check --fix "${target}" success_codes: [0, 1] batch: true cache_results: true @@ -38,11 +42,12 @@ lint: suggest_if: config_present direct_configs: - biome.json + - biome.jsonc - rome.json # For backwards compatibility with rome affects_cache: - package.json - .editorconfig # Undocumented config file - known_good_version: 1.4.1 + known_good_version: 1.9.4 version_command: parse_regex: biome CLI version ${semver} run: biome --version diff --git a/linters/biome/test_data/biome_v1.4.1_basic_check.check.shot b/linters/biome/test_data/biome_v1.4.1_basic_check.check.shot deleted file mode 100644 index 2bde4ae46..000000000 --- a/linters/biome/test_data/biome_v1.4.1_basic_check.check.shot +++ /dev/null @@ -1,61 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter biome test basic_check 1`] = ` -{ - "issues": [ - { - "code": "lint/style/useEnumInitializers", - "column": "6", - "file": "test_data/basic_check.in.ts", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "4", - "linter": "biome", - "message": "This enum declaration contains members that are implicitly initialized.", - "targetType": "typescript", - }, - ], - "lintActions": [ - { - "command": "fmt", - "fileGroupName": "typescript", - "linter": "biome", - "paths": [ - "test_data/basic_check.in.ts", - ], - "verb": "TRUNK_VERB_FMT", - }, - { - "command": "lint", - "fileGroupName": "typescript", - "linter": "biome", - "paths": [ - "test_data/basic_check.in.ts", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "typescript", - "linter": "biome", - "paths": [ - "test_data/basic_check.in.ts", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [ - { - "column": "1", - "file": "test_data/basic_check.in.ts", - "issueClass": "ISSUE_CLASS_UNFORMATTED", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "biome", - "message": "Incorrect formatting, autoformat by running 'trunk fmt'", - }, - ], -} -`; diff --git a/linters/biome/test_data/biome_v1.6.0_basic_fmt.fmt.shot b/linters/biome/test_data/biome_v1.6.0_basic_fmt.fmt.shot deleted file mode 100644 index 0961c8a09..000000000 --- a/linters/biome/test_data/biome_v1.6.0_basic_fmt.fmt.shot +++ /dev/null @@ -1,23 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing formatter biome test basic_fmt 1`] = ` -"const foobar = () => {}; -const barfoo = () => {}; - -enum Bar { - Baz, -} - -const foo = (bar: Bar) => { - switch (bar) { - case Bar.Baz: - foobar(); - barfoo(); - break; - } - { - !foo ? null : 1; - } -}; -" -`; diff --git a/linters/biome/test_data/biome_v1.6.0_basic_json.fmt.shot b/linters/biome/test_data/biome_v1.6.0_basic_json.fmt.shot deleted file mode 100644 index 3b5af7e15..000000000 --- a/linters/biome/test_data/biome_v1.6.0_basic_json.fmt.shot +++ /dev/null @@ -1,6 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing formatter biome test basic_json 1`] = ` -"{ "a": "foo", "b": 1, "a": true } -" -`; diff --git a/linters/biome/test_data/biome_v1.6.0_basic_check.check.shot b/linters/biome/test_data/biome_v1.9.4_basic_check.check.shot similarity index 100% rename from linters/biome/test_data/biome_v1.6.0_basic_check.check.shot rename to linters/biome/test_data/biome_v1.9.4_basic_check.check.shot diff --git a/linters/biome/test_data/biome_v1.4.1_basic_fmt.fmt.shot b/linters/biome/test_data/biome_v1.9.4_basic_fmt.fmt.shot similarity index 89% rename from linters/biome/test_data/biome_v1.4.1_basic_fmt.fmt.shot rename to linters/biome/test_data/biome_v1.9.4_basic_fmt.fmt.shot index 0961c8a09..1e2f30ad4 100644 --- a/linters/biome/test_data/biome_v1.4.1_basic_fmt.fmt.shot +++ b/linters/biome/test_data/biome_v1.9.4_basic_fmt.fmt.shot @@ -5,7 +5,7 @@ exports[`Testing formatter biome test basic_fmt 1`] = ` const barfoo = () => {}; enum Bar { - Baz, + Baz = 0, } const foo = (bar: Bar) => { @@ -15,9 +15,7 @@ const foo = (bar: Bar) => { barfoo(); break; } - { - !foo ? null : 1; - } + !foo ? null : 1; }; " `; diff --git a/linters/biome/test_data/biome_v1.4.1_basic_json.fmt.shot b/linters/biome/test_data/biome_v1.9.4_basic_json.fmt.shot similarity index 100% rename from linters/biome/test_data/biome_v1.4.1_basic_json.fmt.shot rename to linters/biome/test_data/biome_v1.9.4_basic_json.fmt.shot diff --git a/linters/biome/test_data/biome_v1.9.4_error.check.shot b/linters/biome/test_data/biome_v1.9.4_error.check.shot new file mode 100644 index 000000000..e959c7ff4 --- /dev/null +++ b/linters/biome/test_data/biome_v1.9.4_error.check.shot @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter biome test error 1`] = ` +{ + "issues": [], + "lintActions": [ + { + "command": "fmt", + "fileGroupName": "typescript", + "linter": "biome", + "paths": [ + "test_data/basic_check.in.ts", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "lint", + "fileGroupName": "typescript", + "linter": "biome", + "paths": [ + "test_data/basic_check.in.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "typescript", + "linter": "biome", + "paths": [ + "test_data/basic_check.in.ts", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/black/plugin.yaml b/linters/black/plugin.yaml index 698e4b163..329fb2db1 100644 --- a/linters/black/plugin.yaml +++ b/linters/black/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: black files: [python, jupyter, python-interface] + description: Uncompromising python formatter commands: - name: format output: rewrite diff --git a/linters/brakeman/brakeman.test.ts b/linters/brakeman/brakeman.test.ts index 9912664ac..d3cef51a0 100644 --- a/linters/brakeman/brakeman.test.ts +++ b/linters/brakeman/brakeman.test.ts @@ -3,7 +3,7 @@ import { osTimeoutMultiplier, skipOS, TEST_DATA } from "tests/utils"; // Note that the ruby setup can sometimes take a while. // Ruby build is quite slow on Mac, so only run tests on linux for now -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); customLinterCheckTest({ linterName: "brakeman", diff --git a/linters/brakeman/plugin.yaml b/linters/brakeman/plugin.yaml index 452fb1eb4..ec97780f8 100644 --- a/linters/brakeman/plugin.yaml +++ b/linters/brakeman/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: brakeman files: [ruby] + description: A vulnerability scanner for Ruby commands: - name: lint # 5.0.0 introduced the sarif output format. diff --git a/linters/buf/plugin.yaml b/linters/buf/plugin.yaml index 492c2320d..813a3d97b 100644 --- a/linters/buf/plugin.yaml +++ b/linters/buf/plugin.yaml @@ -32,6 +32,7 @@ lint: files: [proto] download: buf suggest_if: never + description: Formatter for Protobuf commands: - name: format output: rewrite @@ -62,6 +63,7 @@ lint: - name: buf-lint files: [proto] download: buf + description: Accelerate Protobuf development with Buf commands: - name: lint output: buf @@ -90,6 +92,7 @@ lint: files: [proto] download: buf suggest_if: never + description: Check for breaking Protobuf API changes commands: - name: lint output: buf diff --git a/linters/buf/test_data/buf_breaking_v1.32.0_basic.check.shot b/linters/buf/test_data/buf_breaking_v1.32.0_basic.check.shot new file mode 100644 index 000000000..91b5e3bc0 --- /dev/null +++ b/linters/buf/test_data/buf_breaking_v1.32.0_basic.check.shot @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter buf-breaking test basic 1`] = ` +{ + "issues": [ + { + "code": "FIELD_NO_DELETE", + "column": "5", + "file": "test_data/buf_breaking.in.proto", + "issueUrl": "https://docs.buf.build/breaking/rules#field_no_delete", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "buf-breaking", + "message": "Previously present field "2" with name "world" on message "HelloWorld" was deleted.", + "targetType": "proto", + }, + { + "code": "FIELD_SAME_TYPE", + "column": "7", + "file": "test_data/buf_breaking.in.proto", + "issueUrl": "https://docs.buf.build/breaking/rules#field_same_type", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "buf-breaking", + "message": "Field "1" with name "hello" on message "HelloWorld" changed type from "string" to "int32".", + "targetType": "proto", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "proto", + "linter": "buf-breaking", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/buf/test_data/buf_breaking_v1.32.0_dupFile.check.shot b/linters/buf/test_data/buf_breaking_v1.32.0_dupFile.check.shot new file mode 100644 index 000000000..0a106332a --- /dev/null +++ b/linters/buf/test_data/buf_breaking_v1.32.0_dupFile.check.shot @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter buf-breaking test dupFile 1`] = ` +{ + "issues": [ + { + "code": "COMPILE", + "column": "13", + "file": "test_data/buf_breaking.in.proto", + "issueUrl": "https://docs.buf.build/breaking/rules#compile", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "buf-breaking", + "message": "symbol "trunk.HelloWorld" already defined at test_data/buf_breaking.in.proto:7:13", + "targetType": "proto", + }, + { + "code": "COMPILE", + "column": "13", + "file": "test_data/buf_breaking.in.proto", + "issueUrl": "https://docs.buf.build/breaking/rules#compile", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "buf-breaking", + "message": "symbol "trunk.HelloWorld.hello" already defined at test_data/buf_breaking.in.proto:8:13", + "targetType": "proto", + }, + { + "code": "COMPILE", + "column": "13", + "file": "test_data/buf_breaking.in.proto", + "issueUrl": "https://docs.buf.build/breaking/rules#compile", + "level": "LEVEL_HIGH", + "line": "9", + "linter": "buf-breaking", + "message": "symbol "trunk.HelloWorld.world" already defined at test_data/buf_breaking.in.proto:9:13", + "targetType": "proto", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "proto", + "linter": "buf-breaking", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/buf/test_data/buf_format_v1.32.0_buf_lint.fmt.shot b/linters/buf/test_data/buf_format_v1.32.0_buf_lint.fmt.shot new file mode 100644 index 000000000..1e403d81f --- /dev/null +++ b/linters/buf/test_data/buf_format_v1.32.0_buf_lint.fmt.shot @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buf-format test buf_lint 1`] = ` +"syntax = "proto3"; + +package trunk; + +enum GoodEnum { + lower_case_UNSPECIFIED = 0; + GOOD_ENUM_VALUE_1 = 1; +} +" +`; diff --git a/linters/buf/test_data/buf_lint_v1.32.0_buf_lint.check.shot b/linters/buf/test_data/buf_lint_v1.32.0_buf_lint.check.shot new file mode 100644 index 000000000..a9b747ee0 --- /dev/null +++ b/linters/buf/test_data/buf_lint_v1.32.0_buf_lint.check.shot @@ -0,0 +1,92 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter buf-lint test buf_lint 1`] = ` +{ + "issues": [ + { + "code": "FILE_LOWER_SNAKE_CASE", + "column": "1", + "file": "test_data/buf_lint.in.proto", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.buf.build/lint/rules#file_lower_snake_case", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buf-lint", + "message": "Filename "buf_lint.in.proto" should be lower_snake_case.proto, such as "buf_lint_in.proto".", + "targetType": "proto", + }, + { + "code": "PACKAGE_DIRECTORY_MATCH", + "column": "1", + "file": "test_data/buf_lint.in.proto", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.buf.build/lint/rules#package_directory_match", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "buf-lint", + "message": "Files with package "trunk" must be within a directory "trunk" relative to root but were in directory "test_data".", + "targetType": "proto", + }, + { + "code": "PACKAGE_VERSION_SUFFIX", + "column": "1", + "file": "test_data/buf_lint.in.proto", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.buf.build/lint/rules#package_version_suffix", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "buf-lint", + "message": "Package name "trunk" should be suffixed with a correctly formed version, such as "trunk.v1".", + "targetType": "proto", + }, + { + "code": "ENUM_VALUE_PREFIX", + "column": "3", + "file": "test_data/buf_lint.in.proto", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.buf.build/lint/rules#enum_value_prefix", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "buf-lint", + "message": "Enum value name "lower_case_UNSPECIFIED" should be prefixed with "GOOD_ENUM_".", + "targetType": "proto", + }, + { + "code": "ENUM_VALUE_UPPER_SNAKE_CASE", + "column": "3", + "file": "test_data/buf_lint.in.proto", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.buf.build/lint/rules#enum_value_upper_snake_case", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "buf-lint", + "message": "Enum value name "lower_case_UNSPECIFIED" should be UPPER_SNAKE_CASE, such as "LOWER_CASE_UNSPECIFIED".", + "targetType": "proto", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "proto", + "linter": "buf-lint", + "paths": [ + "test_data/buf_lint.in.proto", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "proto", + "linter": "buf-lint", + "paths": [ + "test_data/buf_lint.in.proto", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/buildifier/plugin.yaml b/linters/buildifier/plugin.yaml index 897faa943..ca8f596a4 100644 --- a/linters/buildifier/plugin.yaml +++ b/linters/buildifier/plugin.yaml @@ -41,8 +41,9 @@ tools: lint: definitions: - name: buildifier - files: [starlark, bazel-build, bazel-workspace] + files: [bazel, starlark] tools: [buildifier] + description: Formatter for Bazel files commands: - name: fix run: buildifier --lint=fix --warnings=all "${target}" diff --git a/linters/buildifier/test_data/buildifier_v7.1.0_basic_check.check.shot b/linters/buildifier/test_data/buildifier_v7.1.0_basic_check.check.shot new file mode 100644 index 000000000..b4e4ce520 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.1.0_basic_check.check.shot @@ -0,0 +1,134 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter buildifier test basic_check 1`] = ` +{ + "issues": [ + { + "code": "module-docstring", + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#module-docstring", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "The file has no module docstring. +A module docstring is a string literal (not a comment) which should be the first statement of a file (it may follow comment lines).", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Loaded symbol "a" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _a = "a", ...) + a = _a", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "buildifier", + "message": "Loaded symbol "b" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _b = "b", ...) + b = _b", + "targetType": "starlark", + }, + ], + "lintActions": [ + { + "command": "fix", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "fix", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [ + { + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + { + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + ], +} +`; diff --git a/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..e52dcc749 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter buildifier test no_config 1`] = ` +"foo_macro( + fizz = [ + ":lib2", + ":lib1", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.basic.bzl.fmt.shot b/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.basic.bzl.fmt.shot new file mode 100644 index 000000000..3ac3431cb --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.1.0_no_config.test_data.basic.bzl.fmt.shot @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter buildifier test no_config 1`] = ` +"# Misformatted file +def eponymous_name(): + name = native.package_name() + + return name[name.rfind("/") + 1:] +" +`; diff --git a/linters/buildifier/test_data/buildifier_v7.1.0_with_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v7.1.0_with_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..04d263ebe --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.1.0_with_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter buildifier test with_config 1`] = ` +"foo_macro( + fizz = [ + ":lib1", + ":lib2", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/buildifier/test_data/buildifier_v7.3.1_basic_check.check.shot b/linters/buildifier/test_data/buildifier_v7.3.1_basic_check.check.shot new file mode 100644 index 000000000..51223c11c --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.3.1_basic_check.check.shot @@ -0,0 +1,135 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter buildifier test basic_check 1`] = ` +{ + "issues": [ + { + "code": "module-docstring", + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#module-docstring", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "The file has no module docstring. +A module docstring is a string literal (not a comment) which should be the first statement of a file (it may follow comment lines).", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Loaded symbol "a" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _a = "a", ...) + a = _a", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "buildifier", + "message": "Loaded symbol "b" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _b = "b", ...) + b = _b", + "targetType": "starlark", + }, + ], + "lintActions": [ + { + "command": "fix", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "fix", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [ + { + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + { + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + ], +} +`; diff --git a/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..54e82961f --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,36 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test no_config 1`] = ` +"foo_macro( + fizz = [ + ":lib2", + ":lib1", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.basic.bzl.fmt.shot b/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.basic.bzl.fmt.shot new file mode 100644 index 000000000..0f9da3bb5 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.3.1_no_config.test_data.basic.bzl.fmt.shot @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test no_config 1`] = ` +"# Misformatted file +def eponymous_name(): + name = native.package_name() + + return name[name.rfind("/") + 1:] +" +`; diff --git a/linters/buildifier/test_data/buildifier_v7.3.1_with_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v7.3.1_with_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..e4ce11ada --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v7.3.1_with_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,36 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test with_config 1`] = ` +"foo_macro( + fizz = [ + ":lib1", + ":lib2", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/buildifier/test_data/buildifier_v8.0.3_basic_check.check.shot b/linters/buildifier/test_data/buildifier_v8.0.3_basic_check.check.shot new file mode 100644 index 000000000..730ef74be --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v8.0.3_basic_check.check.shot @@ -0,0 +1,171 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter buildifier test basic_check 1`] = ` +{ + "issues": [ + { + "code": "native-sh-library", + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#native-sh-library", + "level": "LEVEL_HIGH", + "line": "13", + "linter": "buildifier", + "message": "Function "sh_library" is not global anymore and needs to be loaded from "@rules_shell//shell:sh_library.bzl".", + "targetType": "bazel-build", + }, + { + "code": "native-sh-library", + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#native-sh-library", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "buildifier", + "message": "Function "sh_library" is not global anymore and needs to be loaded from "@rules_shell//shell:sh_library.bzl".", + "targetType": "bazel-build", + }, + { + "code": "native-sh-binary", + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#native-sh-binary", + "level": "LEVEL_HIGH", + "line": "23", + "linter": "buildifier", + "message": "Function "sh_binary" is not global anymore and needs to be loaded from "@rules_shell//shell:sh_binary.bzl".", + "targetType": "bazel-build", + }, + { + "code": "module-docstring", + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#module-docstring", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "The file has no module docstring. +A module docstring is a string literal (not a comment) which should be the first statement of a file (it may follow comment lines).", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Loaded symbol "a" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _a = "a", ...) + a = _a", + "targetType": "starlark", + }, + { + "code": "load", + "column": "26", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/bazelbuild/buildtools/blob/main/WARNINGS.md#load", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "buildifier", + "message": "Loaded symbol "b" is unused. Please remove it. +To disable the warning, add '@unused' in a comment. +If you want to re-export a symbol, use the following pattern: + + load(..., _b = "b", ...) + b = _b", + "targetType": "starlark", + }, + ], + "lintActions": [ + { + "command": "fix", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "fix", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "bazel-build", + "linter": "buildifier", + "paths": [ + "test_data/add_tables.BUILD", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "warn", + "fileGroupName": "starlark", + "linter": "buildifier", + "paths": [ + "test_data/basic.bzl", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [ + { + "column": "1", + "file": "test_data/add_tables.BUILD", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + { + "column": "1", + "file": "test_data/basic.bzl", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "buildifier", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + ], +} +`; diff --git a/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..5ee7d8e85 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test no_config 1`] = ` +"load("@rules_shell//shell:sh_binary.bzl", "sh_binary") +load("@rules_shell//shell:sh_library.bzl", "sh_library") + +foo_macro( + fizz = [ + ":lib2", + ":lib1", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.basic.bzl.fmt.shot b/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.basic.bzl.fmt.shot new file mode 100644 index 000000000..0f9da3bb5 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v8.0.3_no_config.test_data.basic.bzl.fmt.shot @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test no_config 1`] = ` +"# Misformatted file +def eponymous_name(): + name = native.package_name() + + return name[name.rfind("/") + 1:] +" +`; diff --git a/linters/buildifier/test_data/buildifier_v8.0.3_with_config.test_data.add_tables.BUILD.fmt.shot b/linters/buildifier/test_data/buildifier_v8.0.3_with_config.test_data.add_tables.BUILD.fmt.shot new file mode 100644 index 000000000..f0e17ff72 --- /dev/null +++ b/linters/buildifier/test_data/buildifier_v8.0.3_with_config.test_data.add_tables.BUILD.fmt.shot @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter buildifier test with_config 1`] = ` +"load("@rules_shell//shell:sh_binary.bzl", "sh_binary") +load("@rules_shell//shell:sh_library.bzl", "sh_library") + +foo_macro( + fizz = [ + ":lib1", + ":lib2", + ], +) + +filegroup( + name = "files", + srcs = glob(["**"]), +) + +sh_library( + name = "lib1", + srcs = ["src1.sh"], +) + +sh_library( + name = "lib2", + srcs = ["src1.sh"], +) + +sh_binary( + name = "foo", + srcs = ["foo.sh"], + deps = [ + ":lib1", + ":lib2", + ], +) +" +`; diff --git a/linters/cfnlint/plugin.yaml b/linters/cfnlint/plugin.yaml index 5def28df7..2259560be 100644 --- a/linters/cfnlint/plugin.yaml +++ b/linters/cfnlint/plugin.yaml @@ -5,11 +5,12 @@ tools: runtime: python package: cfn-lint shims: [cfn-lint] - known_good_version: 0.58.2 + known_good_version: 1.35.3 lint: definitions: - name: cfnlint files: [cloudformation] + description: Checks Cloudformation files commands: - name: lint # Custom parser type defined in the trunk cli to handle cfnlint's JSON output and triggers. @@ -21,7 +22,7 @@ lint: tools: [cfnlint] suggest_if: files_present issue_url_format: https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md - known_good_version: 0.58.2 + known_good_version: 1.35.3 version_command: parse_regex: ${semver} run: cfn-lint --version diff --git a/linters/cfnlint/test_data/cfnlint_v1.3.0_basic.check.shot b/linters/cfnlint/test_data/cfnlint_v1.3.0_basic.check.shot new file mode 100644 index 000000000..0612ccacb --- /dev/null +++ b/linters/cfnlint/test_data/cfnlint_v1.3.0_basic.check.shot @@ -0,0 +1,56 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter cfnlint test basic 1`] = ` +{ + "issues": [ + { + "code": "E3030", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "cfnlint", + "message": "'DNSS' is not one of ['EMAIL', 'DNS']", + "targetType": "cloudformation", + }, + { + "code": "E3012", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "21", + "linter": "cfnlint", + "message": "'*.test.io' is not of type 'array'", + "targetType": "cloudformation", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/cfnlint/test_data/cfnlint_v1.3.2_basic.check.shot b/linters/cfnlint/test_data/cfnlint_v1.3.2_basic.check.shot new file mode 100644 index 000000000..25be704c3 --- /dev/null +++ b/linters/cfnlint/test_data/cfnlint_v1.3.2_basic.check.shot @@ -0,0 +1,56 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter cfnlint test basic 1`] = ` +{ + "issues": [ + { + "code": "E3030", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "cfnlint", + "message": "'DNSS' is not one of ['DNS', 'EMAIL']", + "targetType": "cloudformation", + }, + { + "code": "E3012", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "21", + "linter": "cfnlint", + "message": "'*.test.io' is not of type 'array'", + "targetType": "cloudformation", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/cfnlint/test_data/cfnlint_v1.35.1_basic.check.shot b/linters/cfnlint/test_data/cfnlint_v1.35.1_basic.check.shot new file mode 100644 index 000000000..e6de935e3 --- /dev/null +++ b/linters/cfnlint/test_data/cfnlint_v1.35.1_basic.check.shot @@ -0,0 +1,56 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter cfnlint test basic 1`] = ` +{ + "issues": [ + { + "code": "E3030", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "cfnlint", + "message": "'DNSS' is not one of ['DNS', 'EMAIL', 'HTTP']", + "targetType": "cloudformation", + }, + { + "code": "E3012", + "column": "7", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/aws-cloudformation/cfn-lint/blob/main/docs/rules.md", + "level": "LEVEL_HIGH", + "line": "21", + "linter": "cfnlint", + "message": "'*.test.io' is not of type 'array'", + "targetType": "cloudformation", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "cloudformation", + "linter": "cfnlint", + "paths": [ + "test_data/basic.in.yaml", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/checkov/plugin.yaml b/linters/checkov/plugin.yaml index eadb751de..62c18cd7f 100644 --- a/linters/checkov/plugin.yaml +++ b/linters/checkov/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: checkov files: [terraform, cloudformation, docker, yaml, json] tools: [checkov] + description: Finds security issues in IaC files commands: - name: lint # on Windows, we need to make sure 'checkov' resolves to 'checkov.cmd' diff --git a/linters/circleci/plugin.yaml b/linters/circleci/plugin.yaml index 3b568aa73..4743e450c 100644 --- a/linters/circleci/plugin.yaml +++ b/linters/circleci/plugin.yaml @@ -11,6 +11,7 @@ lint: tools: [circleci] known_good_version: 0.1.28811 suggest_if: never + description: Validates CircleCI configuration files commands: - name: validate platforms: [windows] diff --git a/linters/circleci/test_data/circleci_v0.1.28811_CUSTOM.check.shot b/linters/circleci/test_data/circleci_v0.1.28811_CUSTOM.check.shot index 33f47efd1..1926e4d4d 100644 --- a/linters/circleci/test_data/circleci_v0.1.28811_CUSTOM.check.shot +++ b/linters/circleci/test_data/circleci_v0.1.28811_CUSTOM.check.shot @@ -35,8 +35,6 @@ exports[`Testing linter circleci test CUSTOM 1`] = ` - | | | | - environment - | | | | - aws_auth - | | | | - auth - - | | | | Passed keys: - - | | | | - foo - | | | 2. [#/jobs/install-node-example/docker/1] required key [image] not found - | | 2. [#/jobs/install-node-example/steps/3] 0 subschemas matched instead of one - | | | 1. [#/jobs/install-node-example/steps/3] expected type: String, found: Mapping @@ -51,8 +49,6 @@ exports[`Testing linter circleci test CUSTOM 1`] = ` - | | | | Permitted keys: - | | | | - when - | | | | - unless - - | | | | Passed keys: - - | | | | - rerun - | | | 3. [#/jobs/install-node-example/steps/3/rerun] no subschema matched out of the total 2 subschemas - | | | | 1. [#/jobs/install-node-example/steps/3/rerun] expected type: Mapping, found: Sequence - | | | | | SCHEMA: @@ -69,7 +65,8 @@ exports[`Testing linter circleci test CUSTOM 1`] = ` - | | | | | INPUT: - | | | | | - true - 2. [#/jobs/install-node-example] expected type: String, found: Mapping - - | Job may be a string reference to another job", + - | Job may be a string reference to another job + - 3. [#/jobs/install-node-example] required key [type] not found", "targetType": "circleci-config", }, ], diff --git a/linters/clang-format/plugin.yaml b/linters/clang-format/plugin.yaml index 52b213d56..518a4fa3d 100644 --- a/linters/clang-format/plugin.yaml +++ b/linters/clang-format/plugin.yaml @@ -33,7 +33,8 @@ lint: definitions: - name: clang-format supported_platforms: [linux, macos] - files: [c/c++, proto] + description: Formatter for C/C++ and Protobuf + files: [c/c++, cuda, proto] commands: - name: format output: rewrite diff --git a/linters/clang-format/test_data/clang_format_v16.0.3_cuda.fmt.shot b/linters/clang-format/test_data/clang_format_v16.0.3_cuda.fmt.shot new file mode 100644 index 000000000..76e6a8d69 --- /dev/null +++ b/linters/clang-format/test_data/clang_format_v16.0.3_cuda.fmt.shot @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter clang-format test cuda 1`] = ` +"__global__ void cuda_hello() { printf("Hello World from GPU!\\n"); } + +int main() { + cuda_hello<<<1, 1>>>(); + return 0; +} +" +`; diff --git a/linters/clang-format/test_data/cuda.in.cu b/linters/clang-format/test_data/cuda.in.cu new file mode 100644 index 000000000..bf6a375af --- /dev/null +++ b/linters/clang-format/test_data/cuda.in.cu @@ -0,0 +1,8 @@ +__global__ void cuda_hello(){ + printf("Hello World from GPU!\n"); +} + +int main() { + cuda_hello<<<1,1>>>( ); + return 0 ; +} diff --git a/linters/clang-tidy/plugin.yaml b/linters/clang-tidy/plugin.yaml index 65535d29f..80ac4e5e1 100644 --- a/linters/clang-tidy/plugin.yaml +++ b/linters/clang-tidy/plugin.yaml @@ -34,6 +34,7 @@ lint: - name: clang-tidy supported_platforms: [linux, macos] files: [c/c++-source] + description: Static Analyzer for C/C++ commands: - name: lint output: llvm diff --git a/linters/clippy/clippy.test.ts b/linters/clippy/clippy.test.ts index a2eedad9b..d3fa7b924 100644 --- a/linters/clippy/clippy.test.ts +++ b/linters/clippy/clippy.test.ts @@ -3,7 +3,6 @@ import { customLinterCheckTest } from "tests"; import { TrunkLintDriver } from "tests/driver"; import { TEST_DATA } from "tests/utils"; -// trunk-ignore-all(semgrep) // Ensure that the Cargo files are at the same level as the src/ directory. const moveCargoFiles = (dest: string) => (driver: TrunkLintDriver) => { ["Cargo.lock", "Cargo.toml"].forEach((file) => { diff --git a/linters/clippy/plugin.yaml b/linters/clippy/plugin.yaml index e1ee7469a..705fe9179 100644 --- a/linters/clippy/plugin.yaml +++ b/linters/clippy/plugin.yaml @@ -9,6 +9,7 @@ lint: - name: clippy files: [rust] download: rust + description: Catch common mistakes and improve your Rust code. commands: - name: lint # Custom parser type defined in the trunk cli to handle clippy's JSON output. diff --git a/linters/cmake-format/plugin.yaml b/linters/cmake-format/plugin.yaml index b7775bab8..0f420e744 100644 --- a/linters/cmake-format/plugin.yaml +++ b/linters/cmake-format/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: cmake-format files: [cmake] + description: A formatter for cmake files commands: - name: fix formatter: true diff --git a/linters/codespell/plugin.yaml b/linters/codespell/plugin.yaml index 178e9e27c..6aca0b572 100644 --- a/linters/codespell/plugin.yaml +++ b/linters/codespell/plugin.yaml @@ -12,6 +12,7 @@ lint: files: [ALL] direct_configs: [.codespellrc] suggest_if: config_present + description: Check for common misspellings in your code affects_cache: - pyproject.toml - setup.cfg diff --git a/linters/codespell/test_data/codespell_v2.3.0_basic.check.shot b/linters/codespell/test_data/codespell_v2.3.0_basic.check.shot new file mode 100644 index 000000000..99c03a06a --- /dev/null +++ b/linters/codespell/test_data/codespell_v2.3.0_basic.check.shot @@ -0,0 +1,169 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter codespell test basic 1`] = ` +{ + "issues": [ + { + "code": "misspelled", + "file": "test_data/basic_md.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "codespell", + "message": "reallly ==> really", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_md.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "codespell", + "message": "realy ==> really, relay", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_py.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "20", + "linter": "codespell", + "message": "callbak ==> callback", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_py.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "20", + "linter": "codespell", + "message": "lamda ==> lambda", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_py.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "22", + "linter": "codespell", + "message": "anme ==> name, anime", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_ts.in.ts", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "17", + "linter": "codespell", + "message": "callbakc ==> callback", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_ts.in.ts", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "codespell", + "message": "callbak ==> callback", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_ts.in.ts", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "codespell", + "message": "asnyc ==> async", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_md.in.md", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_py.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_ts.in.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/empty.in.txt", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_md.in.md", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_py.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_ts.in.ts", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/empty.in.txt", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/codespell/test_data/codespell_v2.3.0_dictionary.check.shot b/linters/codespell/test_data/codespell_v2.3.0_dictionary.check.shot new file mode 100644 index 000000000..b75a1b02f --- /dev/null +++ b/linters/codespell/test_data/codespell_v2.3.0_dictionary.check.shot @@ -0,0 +1,139 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter codespell test dictionary 1`] = ` +{ + "issues": [ + { + "code": "misspelled", + "file": "test_data/basic_md.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "codespell", + "message": "reallly ==> really", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_py.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "20", + "linter": "codespell", + "message": "lamda ==> lambda", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_py.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "22", + "linter": "codespell", + "message": "anme ==> name, anime", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_ts.in.ts", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "17", + "linter": "codespell", + "message": "callbakc ==> callback", + "targetType": "ALL", + }, + { + "code": "misspelled", + "file": "test_data/basic_ts.in.ts", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "19", + "linter": "codespell", + "message": "asnyc ==> async", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_md.in.md", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_py.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_ts.in.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/empty.in.txt", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_md.in.md", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_py.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/basic_ts.in.ts", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "codespell", + "paths": [ + "test_data/empty.in.txt", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/cspell/cspell.test.ts b/linters/cspell/cspell.test.ts index 0261a20c2..31106120e 100644 --- a/linters/cspell/cspell.test.ts +++ b/linters/cspell/cspell.test.ts @@ -49,7 +49,7 @@ const normalizeLandingState = (landingState: LandingState) => { const suggestions = issue.message.match(suggestionsRegex); const suggestionsContent = suggestions?.groups?.suggestions; if (suggestionsContent) { - const sortedSuggestions = suggestionsContent?.split(", ").sort().join(", "); + const sortedSuggestions = suggestionsContent.split(", ").sort().join(", "); issue.message = issue.message.replace(suggestionsContent, sortedSuggestions); } } diff --git a/linters/cspell/plugin.yaml b/linters/cspell/plugin.yaml index e4e9737e0..7c39aef41 100644 --- a/linters/cspell/plugin.yaml +++ b/linters/cspell/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: cspell files: [ALL] tools: [cspell] + description: Check for spelling mistakes in your code commands: - name: lint output: regex diff --git a/linters/cue-fmt/plugin.yaml b/linters/cue-fmt/plugin.yaml index 0d37ba982..bcb8b4933 100644 --- a/linters/cue-fmt/plugin.yaml +++ b/linters/cue-fmt/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: cue-fmt files: [cue] + description: A formatter for cue files commands: - name: format output: rewrite diff --git a/linters/dart/plugin.yaml b/linters/dart/plugin.yaml index 638db74f0..425990988 100644 --- a/linters/dart/plugin.yaml +++ b/linters/dart/plugin.yaml @@ -30,6 +30,7 @@ lint: files: [dart] known_good_version: 3.2.6 suggest_if: never + description: Lints and formats dart code affects_cache: - analysis_options.yaml - pubspec.yaml diff --git a/linters/deno/plugin.yaml b/linters/deno/plugin.yaml index 045a242c1..e94447cba 100644 --- a/linters/deno/plugin.yaml +++ b/linters/deno/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: deno files: [javascript, typescript, markdown, json] + description: A formatter for web framework code commands: - name: format output: rewrite diff --git a/linters/detekt/detekt.test.ts b/linters/detekt/detekt.test.ts index 7f492b426..2b818af41 100644 --- a/linters/detekt/detekt.test.ts +++ b/linters/detekt/detekt.test.ts @@ -32,7 +32,6 @@ linterCheckTest({ const gradlePreCheck: TestCallback = (driver) => { // Based on plugin.yaml, trunk invokes ${workspace}/gradlew and expects gradlew, etc. to exist at the workspace root. // However, we expect .trunk/trunk.yaml to exist at the workspace root as well, so we move each file up to the workspace. - // trunk-ignore-begin(semgrep): paths used here are safe fs.readdirSync(path.resolve(driver.getSandbox(), TEST_DATA, "detekt_gradle")).forEach((file) => { driver.moveFile(path.join(TEST_DATA, "detekt_gradle", file), file); }); @@ -46,7 +45,7 @@ const gradlePreCheck: TestCallback = (driver) => { driver.writeFile(trunkYamlPath, newContents); driver.runTrunkSync(["install"]); - const javaPath = recurseLevels(path.resolve(DOWNLOAD_CACHE, "jdk-13"), 1); + const javaPath = recurseLevels(path.resolve(DOWNLOAD_CACHE, "jdk-23"), 1); const finalContents = newContents.concat(` environment: - name: JAVA_HOME value: ${javaPath} @@ -55,7 +54,6 @@ const gradlePreCheck: TestCallback = (driver) => { list: ["\${env.PATH}"] `); driver.writeFile(trunkYamlPath, finalContents); - // trunk-ignore-end(semgrep) }; // TODO(Tyler): detekt-gradle has issues resolving stdin correctly on Windows. diff --git a/linters/detekt/plugin.yaml b/linters/detekt/plugin.yaml index 1e135aa5c..a4d4dc911 100644 --- a/linters/detekt/plugin.yaml +++ b/linters/detekt/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: detekt files: [kotlin] download: detekt + description: Static code analysis for Kotlin commands: - name: lint platforms: [windows] @@ -45,6 +46,7 @@ lint: - name: detekt-explicit files: [kotlin] download: detekt + description: Static code analysis for Kotlin commands: - name: lint platforms: [windows] @@ -75,6 +77,7 @@ lint: - name: detekt-gradle supported_platforms: [linux, macos] files: [kotlin] + description: Static code analysis for Kotlin commands: - name: lint # Custom parser/trigger type defined in the trunk cli. diff --git a/linters/djlint/plugin.yaml b/linters/djlint/plugin.yaml index 5d9552c6c..3de172114 100644 --- a/linters/djlint/plugin.yaml +++ b/linters/djlint/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: djlint files: [html] tools: [djlint] + description: HTML template linter and formatter commands: - name: lint output: regex diff --git a/linters/dotenv-linter/plugin.yaml b/linters/dotenv-linter/plugin.yaml index 0fe0b9116..cf8d04dec 100644 --- a/linters/dotenv-linter/plugin.yaml +++ b/linters/dotenv-linter/plugin.yaml @@ -33,6 +33,7 @@ lint: - name: dotenv-linter files: [dotenv] tools: [dotenv-linter] + description: Lightning-fast linter for .env files commands: - name: format output: rewrite diff --git a/linters/dotnet-format/plugin.yaml b/linters/dotnet-format/plugin.yaml index 9d9adb72a..789e8a39e 100644 --- a/linters/dotnet-format/plugin.yaml +++ b/linters/dotnet-format/plugin.yaml @@ -9,6 +9,7 @@ lint: # https://download.visualstudio.microsoft.com/download/pr/0f17575a-a6b0-4365-9b79-64db70022d23/56e0da10678e4b2cad0cba0a83a561af/dotnet-sdk-7.0.400-win-x86.zip, # but we don't support that yet. known_good_version: 7.0.400 + description: A formatter for dotnet files commands: - name: format run: dotnet format --no-restore --include ${target} diff --git a/linters/dustilock/plugin.yaml b/linters/dustilock/plugin.yaml index 8531043b4..6592c0a6d 100644 --- a/linters/dustilock/plugin.yaml +++ b/linters/dustilock/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: dustilock files: [dustilock] tools: [dustilock] + description: Finds security issues in dustilock files commands: - name: scan output: regex diff --git a/linters/eslint/README.md b/linters/eslint/README.md new file mode 100644 index 000000000..d876f9bcb --- /dev/null +++ b/linters/eslint/README.md @@ -0,0 +1,91 @@ +# eslint + +## Configuration Notice + +`eslint@9.x` requires a flat config format (see their +[migration guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0#flat-config)) in order to run. +Trunk will automatically detect which config file you have and by default will only enable a +compatible version. + +## Ignores + +Here is a conversion guide for +[ESLint-style ignores](https://eslint.org/docs/latest/use/configure/rules#disabling-rules) and +[trunk-ignores](https://docs.trunk.io/code-quality/linters/ignoring-issues-and-files): + +### Same Line + +```typescript +alert("foo"); // trunk-ignore(eslint) + +alert("foo"); // eslint-disable-line +``` + +### Next Line + +```typescript +// trunk-ignore(eslint) +alert("foo"); + +/* eslint-disable-next-line */ +alert("foo"); +``` + +### With Comments + +```typescript +// trunk-ignore(eslint): Expected alert +alert("foo"); + +/* eslint-disable-next-line -- Expected alert */ +alert("foo"); +``` + +### Specific Issue + +```typescript +// trunk-ignore(eslint/no-alert) +alert("foo"); + +/* eslint-disable-next-line no-alert */ +alert("foo"); +``` + +### Multiple Issues + +```typescript +// trunk-ignore(eslint/no-alert,eslint/quotes) +alert("foo"); + +/* eslint-disable-next-line no-alert, quotes */ +alert("foo"); +``` + +### Blocks + +```typescript +// trunk-ignore-begin(eslint/no-alert) +alert("foo"); +// trunk-ignore-end(eslint/no-alert) + +/* eslint-disable no-alert */ +alert("foo"); +/* eslint-enable no-alert */ +``` + +### Whole File + +```typescript +// trunk-ignore-all(eslint/no-alert) +alert("foo"); + +/* eslint-disable no-alert */ +alert("foo"); +``` + +### Notes + +Only `eslint-disable-line` and `eslint-disable-next-line` support `//` comments. All other +ESLint-style ignores must use `/* */` comments. The full set of rules and their applicable files can +be configured in an +[eslint config file](https://eslint.org/docs/latest/use/configure/rules#using-configuration-files). diff --git a/linters/eslint/eslint.test.ts b/linters/eslint/eslint.test.ts index afd88f330..fc5250081 100644 --- a/linters/eslint/eslint.test.ts +++ b/linters/eslint/eslint.test.ts @@ -1,21 +1,29 @@ import { spawnSync } from "child_process"; import fs from "fs"; import path from "path"; +import semver from "semver"; import { customLinterCheckTest } from "tests"; import { TrunkLintDriver } from "tests/driver"; import { osTimeoutMultiplier, TEST_DATA } from "tests/utils"; const INSTALL_TIMEOUT = 150000 * osTimeoutMultiplier; -const moveConfig = (driver: TrunkLintDriver) => { - [".eslintrc.yaml", "package.json", "package-lock.json"].forEach((file) => { - // trunk-ignore(semgrep): paths used here are safe - driver.moveFile(path.join(TEST_DATA, file), file); - }); +const preCheck = (driver: TrunkLintDriver) => { + const parsedVersion = semver.parse(driver.enabledVersion); + if (parsedVersion && parsedVersion.major >= 9) { + ["eslint.config.cjs", "package-new.json", "package-lock-new.json"].forEach((file) => { + driver.moveFile(path.join(TEST_DATA, file), file.replace("-new", "")); + }); + } else { + [".eslintrc.yaml", "package-old.json", "package-lock-old.json"].forEach((file) => { + driver.moveFile(path.join(TEST_DATA, file), file.replace("-old", "")); + }); + } }; -const preCheck = (driver: TrunkLintDriver) => { - moveConfig(driver); +const preCheckWithInstall = (driver: TrunkLintDriver) => { + preCheck(driver); + // TODO(Tyler): Cache node_modules between runs try { const trunkYamlPath = ".trunk/trunk.yaml"; @@ -31,7 +39,6 @@ const preCheck = (driver: TrunkLintDriver) => { driver.debug("About to install shims"); driver.runTrunkSync(["tools", "install"]); driver.debug("Done installing shims"); - // trunk-ignore-begin(semgrep): Safe paths const toolsPath = fs.existsSync(path.resolve(driver.getSandbox(), ".trunk/dev-tools")) ? "dev-tools" : "tools"; @@ -48,12 +55,12 @@ const preCheck = (driver: TrunkLintDriver) => { `.trunk/${toolsPath}`, process.platform == "win32" ? "npm.bat" : "npm", ), - // trunk-ignore-end(semgrep) ["ci"], { cwd: driver.getSandbox(), timeout: INSTALL_TIMEOUT, windowsHide: true, + shell: true, }, ); driver.debug(install); @@ -72,8 +79,8 @@ const preCheck = (driver: TrunkLintDriver) => { // Use upstream=false in order to supply autofixes for committed files. customLinterCheckTest({ linterName: "eslint", - args: `${TEST_DATA} -y --upstream=false`, - preCheck, + args: `${TEST_DATA} -y --upstream=false --ignore=**/eslint.config.cjs`, + preCheck: preCheckWithInstall, pathsToSnapshot: [ path.join(TEST_DATA, "non_ascii.ts"), path.join(TEST_DATA, "eof_autofix.ts"), @@ -84,6 +91,6 @@ customLinterCheckTest({ customLinterCheckTest({ linterName: "eslint", testName: "bad_install", - args: `${TEST_DATA} -y`, - preCheck: moveConfig, + args: `${TEST_DATA} -y --ignore=**/eslint.config.cjs`, + preCheck, }); diff --git a/linters/eslint/plugin.yaml b/linters/eslint/plugin.yaml index 29e21bc3f..c11551710 100644 --- a/linters/eslint/plugin.yaml +++ b/linters/eslint/plugin.yaml @@ -11,21 +11,34 @@ lint: - name: eslint files: [typescript, javascript] tools: [eslint] + description: Find and fix problems in your TS/JS code commands: - name: lint + version: ">=9.0.0" + direct_configs: + - eslint.config.js + - eslint.config.mjs + - eslint.config.cjs + output: eslint + run: eslint --output-file ${tmpfile} --format json ${target} + error_codes: [2] + read_output_from: tmp_file + batch: true + - name: lint + version: <=8.57.0 + direct_configs: + - .eslintrc + - .eslintrc.cjs + - .eslintrc.js + - .eslintrc.json + - .eslintrc.mjs + - .eslintrc.yaml + - .eslintrc.yml output: eslint run: eslint --output-file ${tmpfile} --format json ${target} error_codes: [2] read_output_from: tmp_file batch: true - direct_configs: - - .eslintrc - - .eslintrc.cjs - - .eslintrc.js - - .eslintrc.json - - .eslintrc.mjs - - .eslintrc.yaml - - .eslintrc.yml suggest_if: config_present affects_cache: - .eslintignore diff --git a/linters/eslint/test_data/eslint.config.cjs b/linters/eslint/test_data/eslint.config.cjs new file mode 100644 index 000000000..be83063ad --- /dev/null +++ b/linters/eslint/test_data/eslint.config.cjs @@ -0,0 +1,40 @@ +const eslint = require("@eslint/js"); +const typescriptEslint = require('typescript-eslint'); +const importPlugin = require('eslint-plugin-import-x'); +const parser = require("@typescript-eslint/parser"); +const nodeRecommended = require('eslint-plugin-n'); +const prettier = require('eslint-config-prettier'); + +module.exports = [ + eslint.configs.recommended, + ...typescriptEslint.configs.recommended, + prettier, + { + files: ["**/*.ts"], + languageOptions: { + ecmaVersion: 12, + parser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + ...importPlugin.configs.recommended.rules, + ...importPlugin.configs.typescript.rules, + ...nodeRecommended.configs.recommended.rules, + "import-x/first": "error", + }, + plugins: { + // TODO(Tyler): Use import, not import-x for this once there is official flat config support + "import-x": importPlugin, + "n": nodeRecommended, + }, + settings: { + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + }, + } +]; diff --git a/linters/eslint/test_data/eslint_v9.0.0_CUSTOM.check.shot b/linters/eslint/test_data/eslint_v9.0.0_CUSTOM.check.shot new file mode 100644 index 000000000..2ece8ba0c --- /dev/null +++ b/linters/eslint/test_data/eslint_v9.0.0_CUSTOM.check.shot @@ -0,0 +1,215 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter eslint test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "import/first", + "column": "1", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/import/first", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "eslint", + "message": "Definition for rule 'import/first' was not found.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-unused-vars", + "column": "10", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-unused-vars", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "eslint", + "message": "'zaphod' is defined but never used.", + "targetType": "typescript", + }, + { + "code": "import-x/no-unresolved", + "column": "24", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/import-x/no-unresolved", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "eslint", + "message": "Unable to resolve path to module 'beetlebrox'.", + "targetType": "typescript", + }, + { + "code": "n/no-missing-import", + "column": "24", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/n/no-missing-import", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "eslint", + "message": ""beetlebrox" is not found.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-unused-vars", + "column": "10", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-unused-vars", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "eslint", + "message": "'arthur' is defined but never used.", + "targetType": "typescript", + }, + { + "code": "import-x/no-unresolved", + "column": "24", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/import-x/no-unresolved", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "eslint", + "message": "Unable to resolve path to module 'dent'.", + "targetType": "typescript", + }, + { + "code": "n/no-missing-import", + "column": "24", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/n/no-missing-import", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "eslint", + "message": ""dent" is not found.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-unused-vars", + "column": "10", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-unused-vars", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "eslint", + "message": "'ford' is defined but never used.", + "targetType": "typescript", + }, + { + "code": "import-x/no-unresolved", + "column": "22", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/import-x/no-unresolved", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "eslint", + "message": "Unable to resolve path to module 'prefect'.", + "targetType": "typescript", + }, + { + "code": "n/no-missing-import", + "column": "22", + "file": "test_data/format_imports.ts", + "issueUrl": "https://eslint.org/docs/rules/n/no-missing-import", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "eslint", + "message": ""prefect" is not found.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "36", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "16", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "53", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "16", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "60", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "16", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "54", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "17", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "42", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + { + "code": "@typescript-eslint/no-explicit-any", + "column": "49", + "file": "test_data/null_rule_id.ts", + "issueUrl": "https://eslint.org/docs/rules/@typescript-eslint/no-explicit-any", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "eslint", + "message": "Unexpected any. Specify a different type.", + "targetType": "typescript", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "typescript", + "linter": "eslint", + "paths": [ + "test_data/eof_autofix.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "typescript", + "linter": "eslint", + "paths": [ + "test_data/format_imports.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "typescript", + "linter": "eslint", + "paths": [ + "test_data/non_ascii.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/eslint/test_data/eslint_v9.0.0_bad_install.check.shot b/linters/eslint/test_data/eslint_v9.0.0_bad_install.check.shot new file mode 100644 index 000000000..438aa0f6a --- /dev/null +++ b/linters/eslint/test_data/eslint_v9.0.0_bad_install.check.shot @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter eslint test bad_install 1`] = ` +{ + "issues": [], + "lintActions": [], + "taskFailures": [ + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/eof_autofix.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/eof_autofix.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/format_imports.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/format_imports.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/non_ascii.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/non_ascii.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/null_rule_id.ts", + "name": "eslint", + }, + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/null_rule_id.ts", + "name": "eslint", + }, + ], + "unformattedFiles": [], +} +`; diff --git a/linters/eslint/test_data/eslint_v9.0.0_test_data.eof_autofix.ts.check.shot b/linters/eslint/test_data/eslint_v9.0.0_test_data.eof_autofix.ts.check.shot new file mode 100644 index 000000000..62b32acd3 --- /dev/null +++ b/linters/eslint/test_data/eslint_v9.0.0_test_data.eof_autofix.ts.check.shot @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter eslint test CUSTOM 1`] = ` +"/* eslint "eol-last": "error" */ +"perfectly normal ascii string"; +" +`; diff --git a/linters/eslint/test_data/eslint_v9.0.0_test_data.format_imports.ts.check.shot b/linters/eslint/test_data/eslint_v9.0.0_test_data.format_imports.ts.check.shot new file mode 100644 index 000000000..9752d92df --- /dev/null +++ b/linters/eslint/test_data/eslint_v9.0.0_test_data.format_imports.ts.check.shot @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter eslint test CUSTOM 1`] = ` +"/* eslint "import/first": "error" */ +import { zaphod } from "beetlebrox"; +import { arthur } from "dent"; +import { ford } from "prefect"; + +export interface Marvin { + paranoid: boolean; +} +" +`; diff --git a/linters/eslint/test_data/eslint_v9.0.0_test_data.non_ascii.ts.check.shot b/linters/eslint/test_data/eslint_v9.0.0_test_data.non_ascii.ts.check.shot new file mode 100644 index 000000000..2a01c35bc --- /dev/null +++ b/linters/eslint/test_data/eslint_v9.0.0_test_data.non_ascii.ts.check.shot @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter eslint test CUSTOM 1`] = ` +"!false; +// some of these non-ascii chars (✔, », ✖) trigger wrong offsets +" +`; diff --git a/linters/eslint/test_data/package-lock-new.json b/linters/eslint/test_data/package-lock-new.json new file mode 100644 index 000000000..d4964d745 --- /dev/null +++ b/linters/eslint/test_data/package-lock-new.json @@ -0,0 +1,2075 @@ +{ + "name": "plugins_436bSh", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "typescript-eslint": "^7.6.0" + }, + "devDependencies": { + "@eslint/js": "^9.0.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.10.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import-x": "^0.5.0", + "eslint-plugin-n": "^17.1.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.8.0", + "tslib": "^2.6.2", + "typescript": "4.9.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", + "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + }, + "node_modules/@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==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", + "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", + "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", + "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-0.5.0.tgz", + "integrity": "sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^7.4.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.7.3", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "eslint": "^8.56.0 || ^9.0.0-0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.1.0.tgz", + "integrity": "sha512-+MTiTej3B07+8vS/RfSMD1w4O9VVR9BSJT9kSa9QUsBlXzKi5PZc+lB3w+iu/2eIS3drFU7zCikSrD8Yn8PEBQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "enhanced-resolve": "^5.15.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^14.0.0", + "ignore": "^5.2.4", + "minimatch": "^9.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typescript-eslint": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.6.0.tgz", + "integrity": "sha512-LY6vH6F1l5jpGqRtU+uK4+mOecIb4Cd4kaz1hAiJrgnNiHUA8wiw8BkJyYS+MRLM69F1QuSKwtGlQqnGl1Rc6w==", + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.6.0", + "@typescript-eslint/parser": "7.6.0", + "@typescript-eslint/utils": "7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", + "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/type-utils": "7.6.0", + "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", + "dependencies": { + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", + "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/utils": "7.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", + "dependencies": { + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/linters/eslint/test_data/package-lock.json b/linters/eslint/test_data/package-lock-old.json similarity index 100% rename from linters/eslint/test_data/package-lock.json rename to linters/eslint/test_data/package-lock-old.json diff --git a/linters/eslint/test_data/package-new.json b/linters/eslint/test_data/package-new.json new file mode 100644 index 000000000..52663af6a --- /dev/null +++ b/linters/eslint/test_data/package-new.json @@ -0,0 +1,18 @@ +{ + "private": true, + "devDependencies": { + "@eslint/js": "^9.0.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.10.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import-x": "^0.5.0", + "eslint-plugin-n": "^17.1.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.8.0", + "tslib": "^2.6.2", + "typescript": "4.9.5" + }, + "dependencies": { + "typescript-eslint": "^7.6.0" + } +} diff --git a/linters/eslint/test_data/package.json b/linters/eslint/test_data/package-old.json similarity index 100% rename from linters/eslint/test_data/package.json rename to linters/eslint/test_data/package-old.json diff --git a/linters/flake8/plugin.yaml b/linters/flake8/plugin.yaml index bfcaffd4b..0a21e615f 100644 --- a/linters/flake8/plugin.yaml +++ b/linters/flake8/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: flake8 files: [python] + description: Python style guide enforcement commands: - name: lint run: flake8 ${target} --output-file "${tmpfile}" --exit-zero diff --git a/linters/flake8/test_data/flake8_v4.0.1_basic.check.shot b/linters/flake8/test_data/flake8_v4.0.1_basic.check.shot index 829a6f99b..442584e5a 100644 --- a/linters/flake8/test_data/flake8_v4.0.1_basic.check.shot +++ b/linters/flake8/test_data/flake8_v4.0.1_basic.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter flake8 test basic 1`] = ` { @@ -28,11 +29,12 @@ exports[`Testing linter flake8 test basic 1`] = ` "targetType": "python", }, { + "belowThreshold": true, "code": "ignore-does-nothing", "column": "3", "file": "test_data/basic.in.py", "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_NOTE", "line": "9", "linter": "trunk", "message": "trunk-ignore(flake8/F401) is not suppressing a lint issue", diff --git a/linters/git-diff-check/plugin.yaml b/linters/git-diff-check/plugin.yaml index 64e325d9d..25d98a1be 100644 --- a/linters/git-diff-check/plugin.yaml +++ b/linters/git-diff-check/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: git-diff-check files: [ALL] + description: Checks for git conflicts commands: - output: regex name: lint diff --git a/linters/gitleaks/plugin.yaml b/linters/gitleaks/plugin.yaml index 61bef5fa2..d8b2b0753 100644 --- a/linters/gitleaks/plugin.yaml +++ b/linters/gitleaks/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: gitleaks files: [ALL] + description: Protect and discover secrets commands: - name: lint run: gitleaks detect --no-git --source=${target} --exit-code=101 -f sarif -r "${tmpfile}" diff --git a/linters/gitleaks/test_data/basic.py b/linters/gitleaks/test_data/basic.py index df29d6281..476a221a6 100644 --- a/linters/gitleaks/test_data/basic.py +++ b/linters/gitleaks/test_data/basic.py @@ -1,4 +1,11 @@ aws_access_key_id = "AKIAIO5FODNN7EXAMPLE" +aws_token = "AKIALALEMEL33243OLIA" -aws_access_key_id = "AKIAIO5FODNN7EXAMPLE" +private_key = """-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACA8YWKYztuuvxUIMomc3zv0OdXCT57Cc2cRYu3TMbX9XAAAAJDiKO3C4ijt +wgAAAAtzc2gtZWQyNTUxOQAAACA8YWKYztuuvxUIMomc3zv0OdXCT57Cc2cRYu3TMbX9XA +AAAECzmj8DGxg5YHtBK4AmBttMXDQHsPAaCyYHQjJ4YujRBTxhYpjO266/FQgyiZzfO/Q5 +1cJPnsJzZxFi7dMxtf1cAAAADHJvb3RAZGV2aG9zdAE= +-----END OPENSSH PRIVATE KEY-----""" diff --git a/linters/gitleaks/test_data/gitleaks_v8.1.3_basic.check.shot b/linters/gitleaks/test_data/gitleaks_v8.1.3_basic.check.shot index 3eaf2efc2..32d0d885a 100644 --- a/linters/gitleaks/test_data/gitleaks_v8.1.3_basic.check.shot +++ b/linters/gitleaks/test_data/gitleaks_v8.1.3_basic.check.shot @@ -23,18 +23,36 @@ exports[`Testing linter gitleaks test basic 1`] = ` }, { "code": "aws-access-token", - "column": "23", + "column": "15", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "level": "LEVEL_HIGH", - "line": "4", + "line": "3", "linter": "gitleaks", "message": "aws-access-token has detected secret for file test_data/basic.py.", "ranges": [ { "filePath": "test_data/basic.py", "length": "19", - "offset": "67", + "offset": "58", + }, + ], + "targetType": "ALL", + }, + { + "code": "OPENSSH-PK", + "column": "19", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "gitleaks", + "message": "OPENSSH-PK has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "34", + "offset": "98", }, ], "targetType": "ALL", diff --git a/linters/gitleaks/test_data/gitleaks_v8.21.2_basic.check.shot b/linters/gitleaks/test_data/gitleaks_v8.21.2_basic.check.shot new file mode 100644 index 000000000..0811d0681 --- /dev/null +++ b/linters/gitleaks/test_data/gitleaks_v8.21.2_basic.check.shot @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter gitleaks test basic 1`] = ` +{ + "issues": [ + { + "code": "aws-access-token", + "column": "15", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "gitleaks", + "message": "aws-access-token has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "20", + "offset": "58", + }, + ], + "targetType": "ALL", + }, + { + "code": "private-key", + "column": "19", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "gitleaks", + "message": "private-key has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "397", + "offset": "98", + }, + ], + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "gitleaks", + "paths": [ + "test_data/basic.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "gitleaks", + "paths": [ + "test_data/basic.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/gitleaks/test_data/gitleaks_v8.22.0_basic.check.shot b/linters/gitleaks/test_data/gitleaks_v8.22.0_basic.check.shot new file mode 100644 index 000000000..d9bc1f9cb --- /dev/null +++ b/linters/gitleaks/test_data/gitleaks_v8.22.0_basic.check.shot @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter gitleaks test basic 1`] = ` +{ + "issues": [ + { + "code": "aws-access-token", + "column": "15", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "gitleaks", + "message": "aws-access-token has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "19", + "offset": "58", + }, + ], + "targetType": "ALL", + }, + { + "code": "private-key", + "column": "19", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "gitleaks", + "message": "private-key has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "397", + "offset": "98", + }, + ], + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "gitleaks", + "paths": [ + "test_data/basic.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "gitleaks", + "paths": [ + "test_data/basic.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/gitleaks/test_data/gitleaks_v8.8.7_basic.check.shot b/linters/gitleaks/test_data/gitleaks_v8.8.7_basic.check.shot index 3eaf2efc2..828b35564 100644 --- a/linters/gitleaks/test_data/gitleaks_v8.8.7_basic.check.shot +++ b/linters/gitleaks/test_data/gitleaks_v8.8.7_basic.check.shot @@ -23,18 +23,36 @@ exports[`Testing linter gitleaks test basic 1`] = ` }, { "code": "aws-access-token", - "column": "23", + "column": "15", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "level": "LEVEL_HIGH", - "line": "4", + "line": "3", "linter": "gitleaks", "message": "aws-access-token has detected secret for file test_data/basic.py.", "ranges": [ { "filePath": "test_data/basic.py", "length": "19", - "offset": "67", + "offset": "58", + }, + ], + "targetType": "ALL", + }, + { + "code": "private-key", + "column": "19", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "gitleaks", + "message": "private-key has detected secret for file test_data/basic.py.", + "ranges": [ + { + "filePath": "test_data/basic.py", + "length": "396", + "offset": "98", }, ], "targetType": "ALL", diff --git a/linters/gofmt/plugin.yaml b/linters/gofmt/plugin.yaml index 59c1b15c6..573be13a1 100644 --- a/linters/gofmt/plugin.yaml +++ b/linters/gofmt/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: gofmt files: [go] + description: A formatter for Go code commands: - name: format output: rewrite diff --git a/linters/gofumpt/plugin.yaml b/linters/gofumpt/plugin.yaml index b5be10e46..f013fa267 100644 --- a/linters/gofumpt/plugin.yaml +++ b/linters/gofumpt/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: gofumpt tools: [gofumpt] files: [go] + description: An opinionated formatter for Go code commands: - name: format output: rewrite diff --git a/linters/goimports/plugin.yaml b/linters/goimports/plugin.yaml index 6fee30c74..8a39c5e02 100644 --- a/linters/goimports/plugin.yaml +++ b/linters/goimports/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: goimports files: [go] + description: Removes unused imports from Go code commands: - name: format output: rewrite diff --git a/linters/gokart/plugin.yaml b/linters/gokart/plugin.yaml index 07ea8bc6b..59468e821 100644 --- a/linters/gokart/plugin.yaml +++ b/linters/gokart/plugin.yaml @@ -12,6 +12,7 @@ lint: files: [go] tools: [gokart] suggest_if: config_present + description: Checks for security issues in Go code. environment: - name: PATH list: ["${linter}"] diff --git a/linters/golangci-lint/golangci_lint.test.ts b/linters/golangci-lint/golangci_lint.test.ts index 9a5ba201a..d0d4e7e69 100644 --- a/linters/golangci-lint/golangci_lint.test.ts +++ b/linters/golangci-lint/golangci_lint.test.ts @@ -1,11 +1,67 @@ import path from "path"; +import semver from "semver"; import { customLinterCheckTest } from "tests"; import { TrunkLintDriver } from "tests/driver"; import { skipOS, TEST_DATA } from "tests/utils"; +const testGenerator = ({ + args, + testName, + preCheck, + skipTestIf, +}: { + args: string; + testName: string; + preCheck?: (driver: TrunkLintDriver) => void; + skipTestIf?: (version?: string) => boolean; +}) => { + const skipTest = (v1: boolean) => (version?: string) => { + if (v1 && version === "Latest") { + return true; + } + + const parsedVersion = semver.parse(version); + if (!parsedVersion) { + return false; + } + if (v1 && parsedVersion.major >= 2) { + return true; + } else if (!v1 && parsedVersion.major < 2) { + return true; + } + + if (skipTestIf) { + return skipTestIf(version); + } + return false; + }; + + const preCheckV2 = (driver: TrunkLintDriver) => { + driver.moveFile(path.join(TEST_DATA, ".golangci.yml"), ".golangci2.yml"); + if (preCheck) { + preCheck(driver); + } + }; + + customLinterCheckTest({ + linterName: "golangci-lint", + args, + testName, + preCheck, + skipTestIf: skipTest(true), + }); + + customLinterCheckTest({ + linterName: "golangci-lint2", + args, + testName, + preCheck: preCheckV2, + skipTestIf: skipTest(false), + }); +}; + // Don't run on Windows since the typecheck errors are dependent on system libs, and the set of diagnostics seems to vary. -customLinterCheckTest({ - linterName: "golangci-lint", +testGenerator({ args: `${TEST_DATA} -y`, testName: "all", skipTestIf: skipOS(["win32"]), @@ -18,12 +74,11 @@ const addEmpty = (driver: TrunkLintDriver) => { // Don't run on Windows since the typecheck errors are dependent on system libs, and for the sake of these tests // it is easier to simply skip these tests than handle additional setup. -customLinterCheckTest({ - linterName: "golangci-lint", - testName: "empty", +testGenerator({ args: TEST_DATA, - preCheck: addEmpty, + testName: "empty", skipTestIf: skipOS(["win32"]), + preCheck: addEmpty, }); // Having an ignored file and no other files causes an error diagnostic to be surfaced. @@ -32,8 +87,7 @@ const setupUnbuildable = (driver: TrunkLintDriver) => { driver.deleteFile(TEST_DATA); }; -customLinterCheckTest({ - linterName: "golangci-lint", +testGenerator({ testName: "unbuildable", args: "unbuildable.go", preCheck: setupUnbuildable, diff --git a/linters/golangci-lint/plugin.yaml b/linters/golangci-lint/plugin.yaml index 8fd02ba83..b47df3812 100644 --- a/linters/golangci-lint/plugin.yaml +++ b/linters/golangci-lint/plugin.yaml @@ -7,12 +7,18 @@ tools: package: github.com/golangci/golangci-lint/cmd/golangci-lint shims: [golangci-lint] known_good_version: 1.46.2 + - name: golangci-lint2 + runtime: go + package: github.com/golangci/golangci-lint/v2/cmd/golangci-lint + shims: [golangci-lint] + known_good_version: 2.0.0 lint: definitions: - name: golangci-lint files: [go] tools: [golangci-lint] + description: A powerful Go linter runner environment: - name: GOLANGCI_LINT_CACHE value: ${cachedir} @@ -29,6 +35,8 @@ lint: - name: lint # Custom parser type defined in the trunk cli to handle golangci-lint's JSON output. output: golangci_lint + # We need to run golangci-lint on directories since running on files only works for --fast + # and can also produce false positives. target: ${parent} # Exclude go linters we already include. run: @@ -45,8 +53,9 @@ lint: # 7 - error logged success_codes: [0, 2, 7] run_from: ${root_or_parent_with(go.mod)} - disable_upstream: true # TODO(Sam): re-enable the upstream for golang (needs test coverage) - suggest_if: files_present + # TODO(Tyler): Audit golangci-lint running on upstream once sandboxing and relative path fix is landed. + disable_upstream: true + suggest_if: never direct_configs: - .golangci.json - .golangci.toml @@ -61,3 +70,57 @@ lint: parse_regex: ${semver} run: golangci-lint --version run_timeout: 10m + - name: golangci-lint2 + files: [go] + tools: [golangci-lint2] + description: A powerful Go linter runner + environment: + - name: GOLANGCI_LINT_CACHE + value: ${cachedir} + # Needs to use system `diff` and `git` + - name: PATH + list: ["${env.PATH}"] + - name: GO111MODULE + value: auto + # May need to git clone with ssh authentication for private packages. + - name: SSH_AUTH_SOCK + value: ${env.SSH_AUTH_SOCK} + optional: true + commands: + - name: lint + output: sarif + read_output_from: tmp_file + # We need to run golangci-lint on directories since running on files only works for --fast + # and can also produce false positives. + target: ${parent} + # Exclude go linters we already include. + run: + golangci-lint run --output.sarif.path ${tmpfile} --timeout 10m --concurrency 1 + --allow-parallel-runners --issues-exit-code 0 ${target} + # exit codes + # 0 - success + # 1 - issues found -> we override this to be 0 + # 2 - warning in test + # 3 - failure + # 4 - timeout + # 5 - no go files + # 6 - no config file detected + # 7 - error logged + success_codes: [0, 2, 7] + run_from: ${root_or_parent_with(go.mod)} + disable_upstream: true + suggest_if: files_present + direct_configs: + - .golangci.json + - .golangci.toml + - .golangci.yaml + - .golangci.yml + affects_cache: + - go.mod + - go.sum + issue_url_format: https://golangci-lint.run/usage/linters/ + known_good_version: 2.0.0 + version_command: + parse_regex: ${semver} + run: golangci-lint --version + run_timeout: 10m diff --git a/linters/golangci-lint/test_data/.golangci.yml b/linters/golangci-lint/test_data/.golangci.yml index 97b1d95c2..47d0bea54 100644 --- a/linters/golangci-lint/test_data/.golangci.yml +++ b/linters/golangci-lint/test_data/.golangci.yml @@ -6,7 +6,6 @@ linters: - govet - asciicheck - bodyclose - - deadcode - depguard - dogsled - errcheck @@ -25,12 +24,9 @@ linters: - nakedret - nolintlint - rowserrcheck - - scopelint - staticcheck - - structcheck - stylecheck - typecheck - unconvert - unused - - varcheck - whitespace diff --git a/linters/golangci-lint/test_data/.golangci2.yml b/linters/golangci-lint/test_data/.golangci2.yml new file mode 100644 index 000000000..9a10c7739 --- /dev/null +++ b/linters/golangci-lint/test_data/.golangci2.yml @@ -0,0 +1,24 @@ +version: "2" +linters: + enable: + - govet + - asciicheck + - bodyclose + - depguard + - dogsled + - errcheck + - gochecknoinits + - godot + - goheader + - goprintffuncname + - gosec + - govet + - ineffassign + - misspell + - nakedret + - nolintlint + - rowserrcheck + - staticcheck + - unconvert + - unused + - whitespace diff --git a/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_all.check.shot b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_all.check.shot new file mode 100644 index 000000000..11b1a0385 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_all.check.shot @@ -0,0 +1,67 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter golangci-lint2 test all 1`] = ` +{ + "issues": [ + { + "code": "errcheck", + "column": "12", + "file": "test_data/basic.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "golangci-lint2", + "message": "Error return value of \`time.Parse\` is not checked", + "targetType": "go", + }, + { + "code": "unused", + "column": "6", + "file": "test_data/unused_func.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "golangci-lint2", + "message": "func helper is unused", + "targetType": "go", + }, + { + "code": "typecheck", + "column": "1", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint2", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint2", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint2", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_empty.check.shot b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_empty.check.shot new file mode 100644 index 000000000..756736b45 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_empty.check.shot @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter golangci-lint2 test empty 1`] = ` +{ + "issues": [ + { + "code": "typecheck", + "column": "1", + "file": "test_data/empty.go", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint2", + "message": "expected 'package', found 'EOF'", + "targetType": "go", + }, + { + "code": "typecheck", + "column": "1", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint2", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint2", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint2", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_unbuildable.check.shot b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_unbuildable.check.shot new file mode 100644 index 000000000..dceb23821 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint2_v2.0.0_unbuildable.check.shot @@ -0,0 +1,20 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter golangci-lint2 test unbuildable 1`] = ` +{ + "issues": [], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint2", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.49.0_all.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.49.0_all.check.shot index 920a5f43c..f41914e81 100644 --- a/linters/golangci-lint/test_data/golangci_lint_v1.49.0_all.check.shot +++ b/linters/golangci-lint/test_data/golangci_lint_v1.49.0_all.check.shot @@ -41,7 +41,7 @@ exports[`Testing linter golangci-lint test all 1`] = ` "targetType": "go", }, { - "code": "deadcode", + "code": "unused", "column": "6", "file": "test_data/unused_func.go", "issueClass": "ISSUE_CLASS_EXISTING", @@ -49,7 +49,7 @@ exports[`Testing linter golangci-lint test all 1`] = ` "level": "LEVEL_HIGH", "line": "5", "linter": "golangci-lint", - "message": "\`helper\` is unused", + "message": "func \`helper\` is unused", "targetType": "go", }, { diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_all.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_all.check.shot index 897738f10..f41914e81 100644 --- a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_all.check.shot +++ b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_all.check.shot @@ -1,5 +1,4 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -// trunk-upgrade-validation:RELEASE exports[`Testing linter golangci-lint test all 1`] = ` { diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_empty.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_empty.check.shot index 08f295adc..6e0e756ca 100644 --- a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_empty.check.shot +++ b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_empty.check.shot @@ -1,5 +1,4 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -// trunk-upgrade-validation:RELEASE exports[`Testing linter golangci-lint test empty 1`] = ` { diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_unbuildable.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_unbuildable.check.shot index 5e14a0891..5853ba59e 100644 --- a/linters/golangci-lint/test_data/golangci_lint_v1.57.0_unbuildable.check.shot +++ b/linters/golangci-lint/test_data/golangci_lint_v1.57.0_unbuildable.check.shot @@ -1,5 +1,4 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -// trunk-upgrade-validation:RELEASE exports[`Testing linter golangci-lint test unbuildable 1`] = ` { diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.63.4_all.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_all.check.shot new file mode 100644 index 000000000..4cfb4238c --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_all.check.shot @@ -0,0 +1,79 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test all 1`] = ` +{ + "issues": [ + { + "code": "godot", + "column": "1", + "file": "test_data/basic.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "golangci-lint", + "message": "Comment should end in a period", + "targetType": "go", + }, + { + "code": "errcheck", + "column": "12", + "file": "test_data/basic.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "golangci-lint", + "message": "Error return value of \`time.Parse\` is not checked", + "targetType": "go", + }, + { + "code": "unused", + "column": "6", + "file": "test_data/unused_func.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "golangci-lint", + "message": "func \`helper\` is unused", + "targetType": "go", + }, + { + "code": "typecheck", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.63.4_empty.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_empty.check.shot new file mode 100644 index 000000000..08f295adc --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_empty.check.shot @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test empty 1`] = ` +{ + "issues": [ + { + "code": "typecheck", + "column": "1", + "file": "test_data/empty.go", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": "expected 'package', found 'EOF'", + "targetType": "go", + }, + { + "code": "typecheck", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.63.4_unbuildable.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_unbuildable.check.shot new file mode 100644 index 000000000..5e14a0891 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.63.4_unbuildable.check.shot @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test unbuildable 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": ".", + "issueClass": "ISSUE_CLASS_NEW", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "typechecking error: build constraints exclude all Go files in /tmp/plugins_", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.64.4_all.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_all.check.shot new file mode 100644 index 000000000..cddddc14c --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_all.check.shot @@ -0,0 +1,97 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test all 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": "test_data", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "exportloopref: This linter is fully inactivated: it will not produce any reports.", + "targetType": "go", + }, + { + "code": "godot", + "column": "1", + "file": "test_data/basic.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "golangci-lint", + "message": "Comment should end in a period", + "targetType": "go", + }, + { + "code": "errcheck", + "column": "12", + "file": "test_data/basic.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "golangci-lint", + "message": "Error return value of \`time.Parse\` is not checked", + "targetType": "go", + }, + { + "code": "unused", + "column": "6", + "file": "test_data/unused_func.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "golangci-lint", + "message": "func \`helper\` is unused", + "targetType": "go", + }, + { + "code": "error", + "file": "test_data/wrapper", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "exportloopref: This linter is fully inactivated: it will not produce any reports.", + "targetType": "go", + }, + { + "code": "typecheck", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.64.4_empty.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_empty.check.shot new file mode 100644 index 000000000..715447f29 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_empty.check.shot @@ -0,0 +1,73 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test empty 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": "test_data", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "exportloopref: This linter is fully inactivated: it will not produce any reports.", + "targetType": "go", + }, + { + "code": "typecheck", + "column": "1", + "file": "test_data/empty.go", + "issueClass": "ISSUE_CLASS_NEW", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": "expected 'package', found 'EOF'", + "targetType": "go", + }, + { + "code": "error", + "file": "test_data/wrapper", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "exportloopref: This linter is fully inactivated: it will not produce any reports.", + "targetType": "go", + }, + { + "code": "typecheck", + "file": "test_data/wrapper/printer.go", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://golangci-lint.run/usage/linters/", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "golangci-lint", + "message": ": # golangcilint_linter_test/wrapper +wrapper/printer.go:12:23: undefined: Wrapper2", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + "test_data/wrapper", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golangci-lint/test_data/golangci_lint_v1.64.4_unbuildable.check.shot b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_unbuildable.check.shot new file mode 100644 index 000000000..5e14a0891 --- /dev/null +++ b/linters/golangci-lint/test_data/golangci_lint_v1.64.4_unbuildable.check.shot @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter golangci-lint test unbuildable 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": ".", + "issueClass": "ISSUE_CLASS_NEW", + "level": "LEVEL_HIGH", + "linter": "golangci-lint", + "message": "typechecking error: build constraints exclude all Go files in /tmp/plugins_", + "targetType": "go", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "go", + "linter": "golangci-lint", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/golines/plugin.yaml b/linters/golines/plugin.yaml index 5070024da..1c087ce2d 100644 --- a/linters/golines/plugin.yaml +++ b/linters/golines/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: golines files: [go] tools: [golines] + description: Enforces line limits in Go commands: - name: format output: rewrite diff --git a/linters/google-java-format/plugin.yaml b/linters/google-java-format/plugin.yaml index b9902fad4..ca27a5e26 100644 --- a/linters/google-java-format/plugin.yaml +++ b/linters/google-java-format/plugin.yaml @@ -9,6 +9,7 @@ lint: - name: google-java-format files: [java] download: google-java-format.jar + description: A formatter for Java files commands: - name: format platforms: [windows] diff --git a/linters/graphql-schema-linter/plugin.yaml b/linters/graphql-schema-linter/plugin.yaml index 624dc3f56..32fee08b8 100644 --- a/linters/graphql-schema-linter/plugin.yaml +++ b/linters/graphql-schema-linter/plugin.yaml @@ -14,6 +14,7 @@ lint: tools: [graphql-schema-linter] known_good_version: 3.0.1 files: [graphql-schema] + description: Validate GraphQL Schema definitions commands: - name: lint # on Windows, we need to make sure the binary resolves to the cmd form diff --git a/linters/hadolint/hadolint.test.ts b/linters/hadolint/hadolint.test.ts index 166239e36..5c1873dcf 100644 --- a/linters/hadolint/hadolint.test.ts +++ b/linters/hadolint/hadolint.test.ts @@ -1,5 +1,15 @@ import { customLinterCheckTest } from "tests"; import { TEST_DATA } from "tests/utils"; +const manualVersionReplacer = (version: string) => { + if (version === "2.12.0") { + // This version may segfault on certain versions on macOS. + // The beta version is identical except with upx compression disabled on the binary. + // See https://github.com/hadolint/hadolint/issues/919#issuecomment-1672031271 + return "2.12.1-beta"; + } + return version; +}; + // We have a number of different files to determine which are valid Dockerfiles, validated by lint actions in the snapshot -customLinterCheckTest({ linterName: "hadolint", args: TEST_DATA }); +customLinterCheckTest({ linterName: "hadolint", args: TEST_DATA, manualVersionReplacer }); diff --git a/linters/hadolint/plugin.yaml b/linters/hadolint/plugin.yaml index b13fe7340..e462ac52e 100644 --- a/linters/hadolint/plugin.yaml +++ b/linters/hadolint/plugin.yaml @@ -31,6 +31,7 @@ lint: - name: hadolint files: [docker] tools: [hadolint] + description: Helps you build best practice Docker images commands: - name: lint # Custom parser type defined in the trunk cli to handle hadolint's JSON output. diff --git a/linters/hadolint/test_data/hadolint_v2.12.1-beta_CUSTOM.check.shot b/linters/hadolint/test_data/hadolint_v2.12.1-beta_CUSTOM.check.shot new file mode 100644 index 000000000..e5b0d64c0 --- /dev/null +++ b/linters/hadolint/test_data/hadolint_v2.12.1-beta_CUSTOM.check.shot @@ -0,0 +1,157 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter hadolint test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "DL3059", + "column": "1", + "file": "test_data/basic.Dockerfile", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/hadolint/hadolint/wiki/DL3059", + "level": "LEVEL_LOW", + "line": "4", + "linter": "hadolint", + "message": "Multiple consecutive \`RUN\` instructions. Consider consolidation.", + "targetType": "docker", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/Dockerfile", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/Dockerfile.empty", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/basic.Dockerfile", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/empty.Dockerfile", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/Dockerfile.debug", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/dockerfile", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/prefix.Dockerfile", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/Dockerfile", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/Dockerfile.empty", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/basic.Dockerfile", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/empty.Dockerfile", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/Dockerfile.debug", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/dockerfile", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "docker", + "linter": "hadolint", + "paths": [ + "test_data/nested/prefix.Dockerfile", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/haml-lint/haml_lint.test.ts b/linters/haml-lint/haml_lint.test.ts index 1864aabea..ccc83613a 100644 --- a/linters/haml-lint/haml_lint.test.ts +++ b/linters/haml-lint/haml_lint.test.ts @@ -3,7 +3,7 @@ import { osTimeoutMultiplier, skipOS, TEST_DATA } from "tests/utils"; // Note that the first-time ruby/rufo download can sometimes take a while. // Ruby build is quite slow on Mac, so only run tests on linux for now -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); // Ruby build is quite slow on Mac, so only run tests on linux for now customLinterCheckTest({ diff --git a/linters/haml-lint/plugin.yaml b/linters/haml-lint/plugin.yaml index 213f94d2d..175ee9b7f 100644 --- a/linters/haml-lint/plugin.yaml +++ b/linters/haml-lint/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: haml-lint files: [haml] + description: Keeps HAML files clean and readable commands: - name: lint # Custom parser type defined in the trunk cli to handle haml_lint's JSON output. diff --git a/linters/isort/plugin.yaml b/linters/isort/plugin.yaml index 26d8a9e1e..a630862ba 100644 --- a/linters/isort/plugin.yaml +++ b/linters/isort/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: isort files: [python] + description: Sorts your Python imports commands: - name: format output: rewrite diff --git a/linters/iwyu/iwyu.test.ts b/linters/iwyu/iwyu.test.ts index 2b96c45c2..5b6d152ef 100644 --- a/linters/iwyu/iwyu.test.ts +++ b/linters/iwyu/iwyu.test.ts @@ -31,7 +31,7 @@ const preCheck = (driver: TrunkLintDriver) => { const oldCompileContents = driver.readFile(compileCommandsPath); const newCompileContents = oldCompileContents.replace( /\$\{EXECUTION_ROOT\}/g, - `${path.resolve(driver.getSandbox(), TEST_DATA)}`, + path.resolve(driver.getSandbox(), TEST_DATA), ); driver.writeFile(compileCommandsPath, newCompileContents); }; diff --git a/linters/iwyu/plugin.yaml b/linters/iwyu/plugin.yaml index ffa837a27..383de6554 100644 --- a/linters/iwyu/plugin.yaml +++ b/linters/iwyu/plugin.yaml @@ -30,6 +30,7 @@ lint: - name: include-what-you-use files: [c/c++-source] tools: [include-what-you-use] + description: Removes unused includes from C/C++ code. commands: - name: lint run_from: ${compile_command} diff --git a/linters/ktlint/ktlint.test.ts b/linters/ktlint/ktlint.test.ts index 2f8b213e3..4afc857ee 100644 --- a/linters/ktlint/ktlint.test.ts +++ b/linters/ktlint/ktlint.test.ts @@ -4,6 +4,16 @@ import { TrunkLintDriver } from "tests/driver"; // Grab the root .editorconfig const preCheck = (driver: TrunkLintDriver) => { driver.copyFileFromRoot(".editorconfig"); + + // Older versions of ktlint require an older jdk + const trunkYamlPath = ".trunk/trunk.yaml"; + const currentContents = driver.readFile(trunkYamlPath); + const newContents = currentContents.concat(`runtimes: + definitions: + - type: java + download: jdk-13 +`); + driver.writeFile(trunkYamlPath, newContents); }; linterFmtTest({ linterName: "ktlint", preCheck }); diff --git a/linters/ktlint/plugin.yaml b/linters/ktlint/plugin.yaml index 0d4711dcd..371398932 100644 --- a/linters/ktlint/plugin.yaml +++ b/linters/ktlint/plugin.yaml @@ -12,6 +12,7 @@ lint: files: [kotlin] download: ktlint runtime: java + description: An anti-bikeshedding Kotlin linter and formatter commands: - name: format platforms: [windows] diff --git a/linters/kube-linter/kube_linter.test.ts b/linters/kube-linter/kube_linter.test.ts index f26e59447..37a1027d5 100644 --- a/linters/kube-linter/kube_linter.test.ts +++ b/linters/kube-linter/kube_linter.test.ts @@ -1,7 +1,7 @@ import { linterCheckTest } from "tests"; import { osTimeoutMultiplier } from "tests/utils"; -jest.setTimeout(900000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(900000 * osTimeoutMultiplier); // TODO(Tyler): We will eventually need to add a couple more test cases involving failure modes. linterCheckTest({ linterName: "kube-linter" }); diff --git a/linters/kube-linter/plugin.yaml b/linters/kube-linter/plugin.yaml index 1a6b3c81b..35d39188d 100644 --- a/linters/kube-linter/plugin.yaml +++ b/linters/kube-linter/plugin.yaml @@ -5,11 +5,12 @@ tools: runtime: go package: golang.stackrox.io/kube-linter/cmd/kube-linter shims: [kube-linter] - known_good_version: 0.6.4 + known_good_version: 0.7.2 lint: definitions: - name: kube-linter tools: [kube-linter] + description: A static analyzer for Kubernetes files: - yaml commands: @@ -19,5 +20,5 @@ lint: environment: - name: PATH list: ["${linter}"] - known_good_version: 0.6.4 + known_good_version: 0.7.2 suggest_if: never diff --git a/linters/kube-linter/test_data/kube_linter_v0.7.2_basic.check.shot b/linters/kube-linter/test_data/kube_linter_v0.7.2_basic.check.shot new file mode 100644 index 000000000..20279574e --- /dev/null +++ b/linters/kube-linter/test_data/kube_linter_v0.7.2_basic.check.shot @@ -0,0 +1,67 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter kube-linter test basic 1`] = ` +{ + "issues": [ + { + "code": "latest-tag", + "column": "1", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "kube-linter", + "message": "The container "sec-ctx-demo" is using an invalid container image, "busybox". Please use images that are not blocked by the \`BlockList\` criteria : [".*:(latest)$" "^[^:]*$" "(.*/[^:]+)$"] +object: /security-context-demo /v1, Kind=Pod", + "targetType": "yaml", + }, + { + "code": "no-read-only-root-fs", + "column": "1", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "kube-linter", + "message": "container "sec-ctx-demo" does not have a read-only root file system +object: /security-context-demo /v1, Kind=Pod", + "targetType": "yaml", + }, + { + "code": "unset-memory-requirements", + "column": "1", + "file": "test_data/basic.in.yaml", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "kube-linter", + "message": "container "sec-ctx-demo" has memory limit 0 +object: /security-context-demo /v1, Kind=Pod", + "targetType": "yaml", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "kube-linter", + "paths": [ + "test_data/basic.in.yaml", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "yaml", + "linter": "kube-linter", + "paths": [ + "test_data/basic.in.yaml", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/markdown-link-check/plugin.yaml b/linters/markdown-link-check/plugin.yaml index 57507bd01..06263a2df 100644 --- a/linters/markdown-link-check/plugin.yaml +++ b/linters/markdown-link-check/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: markdown-link-check files: [markdown] tools: [markdown-link-check] + description: Checks markdown files for broken links commands: - name: lint # Custom parser type defined in the trunk cli to handle markdownlint's JSON output. diff --git a/linters/markdown-table-prettify/plugin.yaml b/linters/markdown-table-prettify/plugin.yaml index 415ac73f8..a380b0a6b 100644 --- a/linters/markdown-table-prettify/plugin.yaml +++ b/linters/markdown-table-prettify/plugin.yaml @@ -9,6 +9,7 @@ tools: lint: definitions: - name: markdown-table-prettify + description: Prettify markdown tables files: [markdown] main_tool: markdown-table-prettify known_good_version: 3.6.0 diff --git a/linters/markdownlint-cli2/markdownlint.test.ts b/linters/markdownlint-cli2/markdownlint.test.ts new file mode 100644 index 000000000..91b33f474 --- /dev/null +++ b/linters/markdownlint-cli2/markdownlint.test.ts @@ -0,0 +1,3 @@ +import { linterCheckTest } from "tests"; + +linterCheckTest({ linterName: "markdownlint-cli2" }); diff --git a/linters/markdownlint-cli2/plugin.yaml b/linters/markdownlint-cli2/plugin.yaml new file mode 100644 index 000000000..1b662a8d4 --- /dev/null +++ b/linters/markdownlint-cli2/plugin.yaml @@ -0,0 +1,46 @@ +version: 0.1 +tools: + definitions: + - name: markdownlint-cli2 + runtime: node + package: markdownlint-cli2 + shims: [markdownlint-cli2] + known_good_version: 0.14.0 + +lint: + definitions: + - name: markdownlint-cli2 + files: [markdown] + tools: [markdownlint-cli2] + description: A style checker and lint tool for markdown files + commands: + - name: lint + # Custom parser type defined in the trunk cli to handle markdownlint's JSON output. + output: regex + read_output_from: stderr + parse_regex: + "(?P[^:]+):(?P[\\d+]+)(?::(?P[\\d+]+))? (?P[^ ]+) + (?P.*)\n" + run: markdownlint-cli2 ${target} --json + success_codes: [0, 1] + batch: true + cache_results: true + suggest_if: config_present + direct_configs: + - .markdownlint-cli2.jsonc + - .markdownlint-cli2.yaml + - .markdownlint-cli2.cjs + - .markdownlint-cli2.mjs + affects_cache: + - package.json + - .markdownlint.jsonc + - .markdownlint.json + - .markdownlint.yaml + - .markdownlint.yml + - .markdownlint.cjs + - .markdownlint.mjs + issue_url_format: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#{} + known_good_version: 0.14.0 + version_command: + parse_regex: ${semver} + run: markdownlint --version diff --git a/linters/markdownlint-cli2/test_data/.markdownlint-cli2.jsonc b/linters/markdownlint-cli2/test_data/.markdownlint-cli2.jsonc new file mode 100644 index 000000000..5ecf259c3 --- /dev/null +++ b/linters/markdownlint-cli2/test_data/.markdownlint-cli2.jsonc @@ -0,0 +1,5 @@ +{ + "config": { + "extends": "markdownlint/style/prettier" + } +} diff --git a/linters/markdownlint-cli2/test_data/basic.in.md b/linters/markdownlint-cli2/test_data/basic.in.md new file mode 100644 index 000000000..9163e8372 --- /dev/null +++ b/linters/markdownlint-cli2/test_data/basic.in.md @@ -0,0 +1,11 @@ +# bad.md + +# This file fails some rules + +Line is OK- Make a realy long line that breaks the layout rules completely. Make a realy long line +that breaks +But this should be ignored because of config + + +Line is too long (over 120) A B C D E F G A B C D E F G A B C D E F G A B C D E F G A B C D E F G A +B C D E F G A B C D E F G A B C D E F G diff --git a/linters/markdownlint-cli2/test_data/markdownlint_cli2_v0.14.0_basic.check.shot b/linters/markdownlint-cli2/test_data/markdownlint_cli2_v0.14.0_basic.check.shot new file mode 100644 index 000000000..a0471cf50 --- /dev/null +++ b/linters/markdownlint-cli2/test_data/markdownlint_cli2_v0.14.0_basic.check.shot @@ -0,0 +1,43 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter markdownlint-cli2 test basic 1`] = ` +{ + "issues": [ + { + "code": "MD025/single-title/single-h1", + "column": "1", + "file": "test_data/basic.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#MD025/single-title/single-h1", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "markdownlint-cli2", + "message": "Multiple top-level headings in the same document [Context: "This file fails some rules"]", + "targetType": "markdown", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "markdown", + "linter": "markdownlint-cli2", + "paths": [ + "test_data/basic.in.md", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "markdown", + "linter": "markdownlint-cli2", + "paths": [ + "test_data/basic.in.md", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/markdownlint/README.md b/linters/markdownlint/README.md new file mode 100644 index 000000000..4555d5de4 --- /dev/null +++ b/linters/markdownlint/README.md @@ -0,0 +1,91 @@ +# markdownlint + +## Ignores + +Here is a conversion guide for +[markdownlint-style ignores](https://github.com/DavidAnson/markdownlint/blob/main/README.md#configuration) +and [trunk-ignores](https://docs.trunk.io/code-quality/linters/ignoring-issues-and-files): + +### Same Line + +```markdown +# (name)[link] + +# (name)[link] +``` + +### Next Line + +```markdown + +# (name)[link] + + +# (name)[link] +``` + +### With Comments + +```markdown + +# (name)[link] + + +# (name)[link] +``` + +### Specific Issue + +```markdown + +# (name)[link] + + +# (name)[link] +``` + +### Multiple Issues + +```markdown + +# (name)[link] + + +# (name)[link] +``` + +### Blocks + +```markdown + + +# (name)[link] + + + + + +# (name)[link] + + +``` + +### Whole File + +```markdown + + +# (name)[link] + + + +# (name)[link] +``` + +### Notes + +By default, prettier will add empty lines between markdown content and comments. +For this reason, we recommend using next-line ignores with [prettier ignores](https://prettier.io/docs/ignore/#range-ignore) or using ignore bocks. + +Specific rules and multi-file ignores can be specified in a +[markdownlint config file](https://github.com/DavidAnson/markdownlint#optionsconfig). diff --git a/linters/markdownlint/plugin.yaml b/linters/markdownlint/plugin.yaml index 4de8b135c..1aa1515d5 100644 --- a/linters/markdownlint/plugin.yaml +++ b/linters/markdownlint/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: markdownlint files: [markdown] tools: [markdownlint] + description: A style checker and lint tool for markdown files commands: - name: lint # Custom parser type defined in the trunk cli to handle markdownlint's JSON output. @@ -25,9 +26,6 @@ lint: - .markdownlint.yaml - .markdownlint.yml - .markdownlintrc - - .markdownlint-cli2.json - - .markdownlint-cli2.yaml - - .markdownlint-cli2.jsonc issue_url_format: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#{} known_good_version: 0.33.0 version_command: diff --git a/linters/markdownlint/test_data/markdownlint_v0.33.0_basic.check.shot b/linters/markdownlint/test_data/markdownlint_v0.33.0_basic.check.shot index 2dad159fc..23278620e 100644 --- a/linters/markdownlint/test_data/markdownlint_v0.33.0_basic.check.shot +++ b/linters/markdownlint/test_data/markdownlint_v0.33.0_basic.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter markdownlint test basic 1`] = ` { @@ -7,7 +8,7 @@ exports[`Testing linter markdownlint test basic 1`] = ` "code": "MD025", "file": "test_data/basic.in.md", "issueClass": "ISSUE_CLASS_EXISTING", - "issueUrl": "https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#MD025", + "issueUrl": "https://github.com/DavidAnson/markdownlint/blob/vx.x.x/doc/md025.md", "level": "LEVEL_LOW", "line": "3", "linter": "markdownlint", diff --git a/linters/mypy/README.md b/linters/mypy/README.md new file mode 100644 index 000000000..dcaf70946 --- /dev/null +++ b/linters/mypy/README.md @@ -0,0 +1,75 @@ +# mypy + +## Ignores + +Here is a conversion guide for +[mypy-style ignores](https://mypy.readthedocs.io/en/stable/common_issues.html#spurious-errors-and-locally-silencing-the-checker) +and [trunk-ignores](https://docs.trunk.io/code-quality/linters/ignoring-issues-and-files): + +### Same Line + +```python +x: str = 1 # trunk-ignore(mypy) + +x: str = 1 # type: ignore +``` + +### Next Line + +```python +# trunk-ignore(mypy) +x: str = 1 + +# Unsupported in mypy +x: str = 1 +``` + +### With Comments + +```python +x: str = 1 # trunk-ignore(mypy): Expected type + +x: str = 1 # Unsupported in mypy +``` + +### Specific Issue + +```python +x: str = 1 # trunk-ignore(mypy/assignment) + +x: str = 1 # type: ignore[assignment] +``` + +### Multiple Issues + +```python +x: str = 1 # trunk-ignore(mypy/assignment,mypy/note) + +x: str = 1 # type: ignore[assignment, note] +``` + +### Blocks + +```python +# trunk-ignore-begin(mypy/assigment) +x: str = 1 +# trunk-ignore-end(mypy/assigment) + +# Unsupported in mypy +x: str = 1 +``` + +### Whole File + +```python +# trunk-ignore-all(mypy/assigment) +x: str = 1 + +# mypy: disable-error-code="assignment" +x: str = 1 +``` + +### Notes + +The applied linter rules can be specified in a +[mypy config file](https://mypy.readthedocs.io/en/stable/config_file.html#example-mypy-ini). diff --git a/linters/mypy/plugin.yaml b/linters/mypy/plugin.yaml index db319f832..e301908b2 100644 --- a/linters/mypy/plugin.yaml +++ b/linters/mypy/plugin.yaml @@ -9,6 +9,7 @@ tools: lint: definitions: - name: mypy + description: Static type checker for Python files: [python, python-interface] commands: - name: lint diff --git a/linters/mypy/test_data/mypy_v0.931_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v0.931_CUSTOM.check.shot index f4da0157c..37f0e4cfc 100644 --- a/linters/mypy/test_data/mypy_v0.931_CUSTOM.check.shot +++ b/linters/mypy/test_data/mypy_v0.931_CUSTOM.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter mypy test CUSTOM 1`] = ` { @@ -28,12 +29,13 @@ exports[`Testing linter mypy test CUSTOM 1`] = ` "targetType": "python", }, { + "belowThreshold": true, "code": "note", "column": "1", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", - "level": "LEVEL_HIGH", + "level": "LEVEL_NOTE", "line": "1", "linter": "mypy", "message": "Hint: "python3 -m pip install types-protobuf". (or run "mypy --install-types" to install all missing stub packages). See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports", diff --git a/linters/mypy/test_data/mypy_v0.990_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v0.990_CUSTOM.check.shot index 4a3da162b..f934d8d42 100644 --- a/linters/mypy/test_data/mypy_v0.990_CUSTOM.check.shot +++ b/linters/mypy/test_data/mypy_v0.990_CUSTOM.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter mypy test CUSTOM 1`] = ` { @@ -28,12 +29,13 @@ exports[`Testing linter mypy test CUSTOM 1`] = ` "targetType": "python", }, { + "belowThreshold": true, "code": "note", "column": "1", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", - "level": "LEVEL_HIGH", + "level": "LEVEL_NOTE", "line": "1", "linter": "mypy", "message": "Hint: "python3 -m pip install types-protobuf". (or run "mypy --install-types" to install all missing stub packages). See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports", diff --git a/linters/mypy/test_data/mypy_v1.10.0_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v1.10.0_CUSTOM.check.shot new file mode 100644 index 000000000..4600e4dfa --- /dev/null +++ b/linters/mypy/test_data/mypy_v1.10.0_CUSTOM.check.shot @@ -0,0 +1,179 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter mypy test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "import-untyped", + "column": "1", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "mypy", + "message": "Library stubs not installed for "google.protobuf"", + "targetType": "python", + }, + { + "code": "import-untyped", + "column": "1", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "mypy", + "message": "Library stubs not installed for "google.protobuf.descriptor_pb2"", + "targetType": "python", + }, + { + "belowThreshold": true, + "code": "note", + "column": "1", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_NOTE", + "line": "1", + "linter": "mypy", + "message": "Hint: "python3 -m pip install types-protobuf". (or run "mypy --install-types" to install all missing stub packages). See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports", + "targetType": "python", + }, + { + "code": "arg-type", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "13", + "linter": "mypy", + "message": "Argument 1 to "greeting" has incompatible type "int"; expected "str"", + "targetType": "python", + }, + { + "code": "arg-type", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "mypy", + "message": "Argument 1 to "greeting" has incompatible type "bytes"; expected "str"", + "targetType": "python", + }, + { + "code": "func-returns-value", + "column": "5", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "15", + "linter": "mypy", + "message": ""printer" does not return a value (it only ever returns None)", + "targetType": "python", + }, + { + "code": "assignment", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "16", + "linter": "mypy", + "message": "Incompatible types in assignment (expression has type "int", variable has type "str")", + "targetType": "python", + }, + { + "code": "attr-defined", + "column": "1", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "mypy", + "message": "Module "test_data" has no attribute "mypy_import2"", + "targetType": "python", + }, + { + "code": "return", + "column": "1", + "file": "test_data/source.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "mypy", + "message": "Missing return statement", + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/__init__.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/basic.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/source.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/__init__.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/basic.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/source.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/mypy/test_data/mypy_v1.13.0_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v1.13.0_CUSTOM.check.shot new file mode 100644 index 000000000..2472079b1 --- /dev/null +++ b/linters/mypy/test_data/mypy_v1.13.0_CUSTOM.check.shot @@ -0,0 +1,142 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter mypy test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "arg-type", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "13", + "linter": "mypy", + "message": "Argument 1 to "greeting" has incompatible type "int"; expected "str"", + "targetType": "python", + }, + { + "code": "arg-type", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "mypy", + "message": "Argument 1 to "greeting" has incompatible type "bytes"; expected "str"", + "targetType": "python", + }, + { + "code": "func-returns-value", + "column": "5", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "15", + "linter": "mypy", + "message": ""printer" does not return a value (it only ever returns None)", + "targetType": "python", + }, + { + "code": "assignment", + "column": "10", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "16", + "linter": "mypy", + "message": "Incompatible types in assignment (expression has type "int", variable has type "str")", + "targetType": "python", + }, + { + "code": "attr-defined", + "column": "1", + "file": "test_data/basic.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "mypy", + "message": "Module "test_data" has no attribute "mypy_import2"", + "targetType": "python", + }, + { + "code": "return", + "column": "1", + "file": "test_data/source.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "mypy", + "message": "Missing return statement", + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/__init__.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/basic.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/source.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/__init__.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/basic.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "mypy", + "paths": [ + "test_data/source.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/mypy/test_data/mypy_v1.6.0_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v1.6.0_CUSTOM.check.shot index 8664e9612..8a4d90713 100644 --- a/linters/mypy/test_data/mypy_v1.6.0_CUSTOM.check.shot +++ b/linters/mypy/test_data/mypy_v1.6.0_CUSTOM.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter mypy test CUSTOM 1`] = ` { @@ -28,12 +29,13 @@ exports[`Testing linter mypy test CUSTOM 1`] = ` "targetType": "python", }, { + "belowThreshold": true, "code": "note", "column": "1", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", - "level": "LEVEL_HIGH", + "level": "LEVEL_NOTE", "line": "1", "linter": "mypy", "message": "Hint: "python3 -m pip install types-protobuf". (or run "mypy --install-types" to install all missing stub packages). See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports", diff --git a/linters/mypy/test_data/mypy_v1.7.0_CUSTOM.check.shot b/linters/mypy/test_data/mypy_v1.7.0_CUSTOM.check.shot index 8e50c461f..4600e4dfa 100644 --- a/linters/mypy/test_data/mypy_v1.7.0_CUSTOM.check.shot +++ b/linters/mypy/test_data/mypy_v1.7.0_CUSTOM.check.shot @@ -1,4 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE exports[`Testing linter mypy test CUSTOM 1`] = ` { @@ -28,12 +29,13 @@ exports[`Testing linter mypy test CUSTOM 1`] = ` "targetType": "python", }, { + "belowThreshold": true, "code": "note", "column": "1", "file": "test_data/basic.py", "issueClass": "ISSUE_CLASS_EXISTING", "issueUrl": "https://mypy.readthedocs.io/en/stable/error_code_list.html", - "level": "LEVEL_HIGH", + "level": "LEVEL_NOTE", "line": "1", "linter": "mypy", "message": "Hint: "python3 -m pip install types-protobuf". (or run "mypy --install-types" to install all missing stub packages). See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports", diff --git a/linters/nancy/nancy.test.ts b/linters/nancy/nancy.test.ts index 9289c51a8..ae6867010 100644 --- a/linters/nancy/nancy.test.ts +++ b/linters/nancy/nancy.test.ts @@ -7,11 +7,9 @@ import { TEST_DATA } from "tests/utils"; import { createFuzzyMatcher } from "tests/utils/landing_state"; const preCheck = (driver: TrunkLintDriver) => { - // trunk-ignore-begin(semgrep): driver.getSandbox() is generated during testing and is safe fs.readdirSync(path.resolve(driver.getSandbox(), TEST_DATA)).forEach((file) => { driver.moveFile(path.join(TEST_DATA, file), file); }); - // trunk-ignore-end(semgrep) }; // trunk-ignore(eslint/@typescript-eslint/no-unsafe-assignment) diff --git a/linters/nancy/plugin.yaml b/linters/nancy/plugin.yaml index f212c2e74..0b16031a4 100644 --- a/linters/nancy/plugin.yaml +++ b/linters/nancy/plugin.yaml @@ -21,6 +21,7 @@ lint: files: [go-lockfile] download: nancy runtime: go + description: Checks for vulnerabilities in your Go dependencies commands: - output: sarif run: sh ${plugin}/linters/nancy/run.sh diff --git a/linters/nixpkgs-fmt/nixpkgs_fmt.test.ts b/linters/nixpkgs-fmt/nixpkgs_fmt.test.ts index fb68b786d..b72b5e68f 100644 --- a/linters/nixpkgs-fmt/nixpkgs_fmt.test.ts +++ b/linters/nixpkgs-fmt/nixpkgs_fmt.test.ts @@ -1,18 +1,6 @@ -import { linterFmtTest, TestCallback } from "tests"; +import { linterFmtTest } from "tests"; import { osTimeoutMultiplier, skipOS } from "tests/utils"; -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); -// Earlier nixpkgs-fmt transitive dependencies are no longer -// supported through older rust runtime installs. -const preCheck: TestCallback = (driver) => { - const trunkYamlPath = ".trunk/trunk.yaml"; - const currentContents = driver.readFile(trunkYamlPath); - const newContents = currentContents.concat(`runtimes: - enabled: - - rust@1.71.1 -`); - driver.writeFile(trunkYamlPath, newContents); -}; - -linterFmtTest({ linterName: "nixpkgs-fmt", preCheck, skipTestIf: skipOS(["win32"]) }); +linterFmtTest({ linterName: "nixpkgs-fmt", skipTestIf: skipOS(["win32"]) }); diff --git a/linters/nixpkgs-fmt/plugin.yaml b/linters/nixpkgs-fmt/plugin.yaml index 6749db7ae..b5536eadf 100644 --- a/linters/nixpkgs-fmt/plugin.yaml +++ b/linters/nixpkgs-fmt/plugin.yaml @@ -6,6 +6,7 @@ lint: package: nixpkgs-fmt runtime: rust files: [nix] + description: Formatter for Nix commands: - output: rewrite run: nixpkgs-fmt ${target} diff --git a/linters/opa/plugin.yaml b/linters/opa/plugin.yaml index 56677076d..50380473e 100644 --- a/linters/opa/plugin.yaml +++ b/linters/opa/plugin.yaml @@ -27,6 +27,7 @@ lint: files: [rego] main_tool: opa known_good_version: 0.62.1 + description: Formatter for OPA files suggest_if: never commands: # TODO(Tyler): Add support for opa check command. diff --git a/linters/opa/test_data/opa_v1.0.0_basic.fmt.shot b/linters/opa/test_data/opa_v1.0.0_basic.fmt.shot new file mode 100644 index 000000000..f63e8ba9e --- /dev/null +++ b/linters/opa/test_data/opa_v1.0.0_basic.fmt.shot @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter opa test basic 1`] = ` +"package authz + +import rego.v1 + +default allow := false + +allow if { + isEmployee + "developer" in input.user.roles +} + +isEmployee if regex.match("@acmecorp\\\\.com$", input.user.email) +" +`; diff --git a/linters/osv-scanner/expected_issues.json b/linters/osv-scanner/expected_issues.json index 90f75897c..367c09831 100644 --- a/linters/osv-scanner/expected_issues.json +++ b/linters/osv-scanner/expected_issues.json @@ -120,6 +120,28 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/Gemfile.lock", + "line": "97", + "message": "Use-after-free in libxml2 via Nokogiri::XML::Reader. Current version of 'nokogiri' is vulnerable: 1.14.1. Patch available: upgrade to 1.15.6 or higher.", + "code": "GHSA-vcc3-rw6f-jv97", + "level": "LEVEL_MEDIUM", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-vcc3-rw6f-jv97", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "97", + "message": "'Nokogiri' updates packaged libxml2 to v2.12.7 to resolve CVE-2024-34459. Current version of 'nokogiri' is vulnerable: 1.14.1. Patch available: upgrade to 1.16.5 or higher.", + "code": "GHSA-r95h-9x8f-r3f7", + "level": "LEVEL_LOW", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-r95h-9x8f-r3f7", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/Gemfile.lock", "line": "97", @@ -202,7 +224,7 @@ "line": "102", "message": "'Rack' vulnerable to ReDoS in content type parsing (2nd degree polynomial). Current version of 'rack' is vulnerable: 2.2.6.2. Patch available: upgrade to 3.0.9.1 or higher.", "code": "GHSA-22f2-v57c-j9cx", - "level": "LEVEL_LOW", + "level": "LEVEL_MEDIUM", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-22f2-v57c-j9cx", "targetType": "lockfile", @@ -210,11 +232,11 @@ }, { "file": "test_data/go.mod", - "message": "Panic on inputs with large exponents in math/big. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-33198", + "message": "Comments in display names are incorrectly handled in net/mail. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24784", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-33198", + "issueUrl": "https://osv.dev/CVE-2024-24784", "targetType": "lockfile", "isSecurity": true }, @@ -230,131 +252,231 @@ }, { "file": "test_data/go.mod", - "message": "Incorrect computation for some invalid field elements in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-23806", + "message": "Unsafe behavior in setuid/setgid binaries in runtime. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-29403", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-23806", + "issueUrl": "https://osv.dev/CVE-2023-29403", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion when compiling deeply nested expressions in regexp. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-24921", + "message": "Improper handling of empty HTML attributes in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-29400", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-24921", + "issueUrl": "https://osv.dev/CVE-2023-29400", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper handling of HTML-like comments in script contexts in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-39318", + "message": "Improper handling of JavaScript whitespace in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-24540", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-39318", + "issueUrl": "https://osv.dev/CVE-2023-24540", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Large RSA keys can cause high CPU usage in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-29409", + "message": "Improper sanitization of CSS values in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-24539", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-29409", + "issueUrl": "https://osv.dev/CVE-2023-24539", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Insufficient sanitization of Host header in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-29406", + "message": "Backticks not treated as string delimiters in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-24538", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-29406", + "issueUrl": "https://osv.dev/CVE-2023-24538", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Unsafe behavior in setuid/setgid binaries in runtime. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-29403", + "message": "Stack exhaustion on crafted paths in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30632", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-29403", + "issueUrl": "https://osv.dev/CVE-2022-30632", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Excessive memory growth in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-xrjj-mj9h-534m", + "message": "Stack exhaustion when reading certain archives in compress/gzip. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30631", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-xrjj-mj9h-534m", + "issueUrl": "https://osv.dev/CVE-2022-30631", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Denial of service via crafted HTTP/2 stream in net/http and golang.org/x/net. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-vvpx-j8f3-3w6h", + "message": "Stack exhaustion in Glob on certain paths in io/fs. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30630", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-vvpx-j8f3-3w6h", + "issueUrl": "https://osv.dev/CVE-2022-30630", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Unbounded memory growth in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-vc3p-29h2-gpcp", + "message": "Session tickets lack random ticket_age_add in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30629", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-vc3p-29h2-gpcp", + "issueUrl": "https://osv.dev/CVE-2022-30629", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper handling of empty HTML attributes in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-29400", + "message": "Empty Cmd.Path can trigger unintended binary in os/exec on Windows. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30580", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-29400", + "issueUrl": "https://osv.dev/CVE-2022-30580", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper handling of JavaScript whitespace in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-24540", + "message": "Path traversal via Clean on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-29804", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-24540", + "issueUrl": "https://osv.dev/CVE-2022-29804", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper sanitization of CSS values in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-24539", + "message": "Incorrect sanitization of forwarded query parameters in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-2880", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-24539", + "issueUrl": "https://osv.dev/CVE-2022-2880", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Backticks not treated as string delimiters in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-24538", + "message": "Unbounded memory consumption when reading headers in archive/tar. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-2879", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-24538", + "issueUrl": "https://osv.dev/CVE-2022-2879", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Panic due to large inputs affecting P-256 curves in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-28327", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-28327", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Stack exhaustion from deeply nested XML documents in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-28131", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-28131", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Stack exhaustion when compiling deeply nested expressions in regexp. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-24921", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-24921", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Stack overflow from a large amount of PEM data in encoding/pem. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-24675", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-24675", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Incorrect computation for some invalid field elements in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-23806", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-23806", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Uncontrolled memory consumption in math/big. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-23772", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-23772", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Stack exhaustion due to deeply nested types in go/parser. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-1962", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-1962", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Improper sanitization of Transfer-Encoding headers in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-1705", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-1705", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Misdirected I/O in syscall. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-44717", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2021-44717", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Indefinite hang with large buffers on Windows in crypto/rand. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30634", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2022-30634", "targetType": "lockfile", "isSecurity": true }, @@ -400,541 +522,558 @@ }, { "file": "test_data/go.mod", - "message": "Incorrect privilege reporting in syscall and golang.org/x/sys/unix. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-p782-xgp4-8hr8", + "message": "Excessive resource consumption in mime/multipart. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41725", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-p782-xgp4-8hr8", + "issueUrl": "https://osv.dev/CVE-2022-41725", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic due to large headers in net/http and golang.org/x/net/http/httpguts. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-h86h-8ppg-mxmh", + "message": "Excessive memory growth in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-xrjj-mj9h-534m", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-h86h-8ppg-mxmh", + "issueUrl": "https://osv.dev/GHSA-xrjj-mj9h-534m", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Denial of service in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-69cg-p879-7622", + "message": "Denial of service via crafted HTTP/2 stream in net/http and golang.org/x/net. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-vvpx-j8f3-3w6h", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-69cg-p879-7622", + "issueUrl": "https://osv.dev/GHSA-vvpx-j8f3-3w6h", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "HTTP/2 rapid reset can cause excessive work in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "GHSA-4374-p667-p6c8", + "message": "Unbounded memory growth in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-vc3p-29h2-gpcp", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-4374-p667-p6c8", + "issueUrl": "https://osv.dev/GHSA-vc3p-29h2-gpcp", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Errors returned from JSON marshaling may break template escaping in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2024-24785", + "message": "Incorrect privilege reporting in syscall and golang.org/x/sys/unix. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-p782-xgp4-8hr8", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2024-24785", + "issueUrl": "https://osv.dev/GHSA-p782-xgp4-8hr8", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Comments in display names are incorrectly handled in net/mail. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2024-24784", + "message": "Panic due to large headers in net/http and golang.org/x/net/http/httpguts. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-h86h-8ppg-mxmh", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2024-24784", + "issueUrl": "https://osv.dev/GHSA-h86h-8ppg-mxmh", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Verify panics on certificates with an unknown public key algorithm in crypto/x509. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2024-24783", + "message": "Denial of service in net/http and golang.org/x/net/http2. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-69cg-p879-7622", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2024-24783", + "issueUrl": "https://osv.dev/GHSA-69cg-p879-7622", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Memory exhaustion in multipart form parsing in net/textproto and net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-45290", + "message": "HTTP/2 CONTINUATION flood in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-4v7x-pqxf-cx7m", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-45290", + "issueUrl": "https://osv.dev/GHSA-4v7x-pqxf-cx7m", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Incorrect forwarding of sensitive headers and cookies on HTTP redirect in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-45289", + "message": "HTTP/2 rapid reset can cause excessive work in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "GHSA-4374-p667-p6c8", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-45289", + "issueUrl": "https://osv.dev/GHSA-4374-p667-p6c8", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Excessive resource consumption in mime/multipart. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41725", + "message": "Denial of service due to improper 100-continue handling in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24791", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41725", + "issueUrl": "https://osv.dev/CVE-2024-24791", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic on large handshake records in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41724", + "message": "Unexpected behavior from Is methods for IPv4-mapped IPv6 addresses in net/netip. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24790", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41724", + "issueUrl": "https://osv.dev/CVE-2024-24790", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Path traversal on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41722", + "message": "Panic on invalid symbol tables in debug/macho. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-41771", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41722", + "issueUrl": "https://osv.dev/CVE-2021-41771", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Restricted file access on Windows in os and net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41720", + "message": "Panic on large handshake records in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41724", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41720", + "issueUrl": "https://osv.dev/CVE-2022-41724", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Unsanitized NUL in environment variables on Windows in syscall and os/exec. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41716", + "message": "Path traversal on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41722", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41716", + "issueUrl": "https://osv.dev/CVE-2022-41722", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Memory exhaustion when compiling regular expressions in regexp/syntax. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-41715", + "message": "Mishandling of corrupt central directory record in archive/zip. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24789", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-41715", + "issueUrl": "https://osv.dev/CVE-2024-24789", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic when decoding Float and Rat types in math/big. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-32189", + "message": "Restricted file access on Windows in os and net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41720", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-32189", + "issueUrl": "https://osv.dev/CVE-2022-41720", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Exposure of client IP addresses in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-32148", + "message": "Errors returned from JSON marshaling may break template escaping in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24785", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-32148", + "issueUrl": "https://osv.dev/CVE-2024-24785", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion when decoding certain messages in encoding/gob. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30635", + "message": "Large RSA keys can cause high CPU usage in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-29409", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30635", + "issueUrl": "https://osv.dev/CVE-2023-29409", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Indefinite hang with large buffers on Windows in crypto/rand. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30634", + "message": "Verify panics on certificates with an unknown public key algorithm in crypto/x509. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2024-24783", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30634", + "issueUrl": "https://osv.dev/CVE-2024-24783", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion when unmarshaling certain documents in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30633", + "message": "Memory exhaustion in multipart form parsing in net/textproto and net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-45290", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30633", + "issueUrl": "https://osv.dev/CVE-2023-45290", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "message": "Incorrect forwarding of sensitive headers and cookies on HTTP redirect in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-45289", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/CVE-2023-45289", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion on crafted paths in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30632", + "message": "Before Go 1.20, the RSA based key exchange methods in crypto/tls may exhibit a timing side channel. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-45287", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30632", + "issueUrl": "https://osv.dev/CVE-2023-45287", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion when reading certain archives in compress/gzip. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30631", + "message": "Incorrect detection of reserved device names on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-45284", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30631", + "issueUrl": "https://osv.dev/CVE-2023-45284", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion in Glob on certain paths in io/fs. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30630", + "message": "Insecure parsing of Windows paths with a \\??\\ prefix in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-45283", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30630", + "issueUrl": "https://osv.dev/CVE-2023-45283", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Session tickets lack random ticket_age_add in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30629", + "message": "Denial of service via chunk extensions in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-39326", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30629", + "issueUrl": "https://osv.dev/CVE-2023-39326", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Empty Cmd.Path can trigger unintended binary in os/exec on Windows. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-30580", + "message": "Unsanitized NUL in environment variables on Windows in syscall and os/exec. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41716", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-30580", + "issueUrl": "https://osv.dev/CVE-2022-41716", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Before Go 1.20, the RSA based key exchange methods in crypto/tls may exhibit a timing side channel. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-45287", + "message": "Memory exhaustion when compiling regular expressions in regexp/syntax. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-41715", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-45287", + "issueUrl": "https://osv.dev/CVE-2022-41715", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Incorrect detection of reserved device names on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-45284", + "message": "Panic when opening certain archives in archive/zip. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-41772", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-45284", + "issueUrl": "https://osv.dev/CVE-2021-41772", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Path traversal via Clean on Windows in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-29804", + "message": "Insufficient sanitization of Host header in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-29406", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-29804", + "issueUrl": "https://osv.dev/CVE-2023-29406", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Incorrect sanitization of forwarded query parameters in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-2880", + "message": "Panic when decoding Float and Rat types in math/big. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-32189", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-2880", + "issueUrl": "https://osv.dev/CVE-2022-32189", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Unbounded memory consumption when reading headers in archive/tar. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-2879", + "message": "Exposure of client IP addresses in net/http. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-32148", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-2879", + "issueUrl": "https://osv.dev/CVE-2022-32148", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic due to large inputs affecting P-256 curves in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-28327", + "message": "Improper handling of special tags within script contexts in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-39319", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-28327", + "issueUrl": "https://osv.dev/CVE-2023-39319", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion from deeply nested XML documents in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-28131", + "message": "Stack exhaustion when decoding certain messages in encoding/gob. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30635", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-28131", + "issueUrl": "https://osv.dev/CVE-2022-30635", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Insecure parsing of Windows paths with a \\??\\ prefix in path/filepath. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-45283", + "message": "Improper handling of HTML-like comments in script contexts in html/template. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2023-39318", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-45283", + "issueUrl": "https://osv.dev/CVE-2023-39318", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack overflow from a large amount of PEM data in encoding/pem. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-24675", + "message": "Cross-site scripting in net/http/cgi and net/http/fcgi. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2020-24553", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-24675", + "issueUrl": "https://osv.dev/CVE-2020-24553", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic on certain certificates in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-34558", + "message": "Infinite loop when decoding inputs in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-27918", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-34558", + "issueUrl": "https://osv.dev/CVE-2021-27918", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Uncontrolled memory consumption in math/big. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-23772", + "message": "Incorrect operations on the P-224 curve in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-3114", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-23772", + "issueUrl": "https://osv.dev/CVE-2021-3114", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Stack exhaustion due to deeply nested types in go/parser. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-1962", + "message": "Improper sanitization when resolving values from DNS in net. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-33195", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-1962", + "issueUrl": "https://osv.dev/CVE-2021-33195", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Denial of service via chunk extensions in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-39326", + "message": "Panic when reading certain archives in archive/zip. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-33196", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-39326", + "issueUrl": "https://osv.dev/CVE-2021-33196", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper sanitization of Transfer-Encoding headers in net/http. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2022-1705", + "message": "Attacker can drop certain headers in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-33197", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2022-1705", + "issueUrl": "https://osv.dev/CVE-2021-33197", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Misdirected I/O in syscall. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-44717", + "message": "Panic on inputs with large exponents in math/big. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-33198", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-44717", + "issueUrl": "https://osv.dev/CVE-2021-33198", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Cross-site scripting in net/http/cgi and net/http/fcgi. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2020-24553", + "message": "Panic on certain certificates in crypto/tls. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-34558", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2020-24553", + "issueUrl": "https://osv.dev/CVE-2021-34558", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Infinite loop when decoding inputs in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-27918", + "message": "Panic in ReverseProxy in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2021-36221", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-27918", + "issueUrl": "https://osv.dev/CVE-2021-36221", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Incorrect operations on the P-224 curve in crypto/elliptic. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-3114", + "message": "Stack exhaustion when unmarshaling certain documents in encoding/xml. Current version of 'stdlib' is vulnerable: 1.13.", + "code": "CVE-2022-30633", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-3114", + "issueUrl": "https://osv.dev/CVE-2022-30633", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper sanitization when resolving values from DNS in net. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-33195", + "line": "7", + "message": "Gitea vulnerable to Argument Injection in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-w8xw-7crf-h23x", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-33195", + "issueUrl": "https://osv.dev/GHSA-w8xw-7crf-h23x", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic when reading certain archives in archive/zip. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-33196", + "line": "7", + "message": "Stored Cross-site Scripting in gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-ph3w-2843-72mx", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-33196", + "issueUrl": "https://osv.dev/GHSA-ph3w-2843-72mx", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Attacker can drop certain headers in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-33197", + "line": "7", + "message": "Shell command injection in gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-p5f9-c9j9-g8qx", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-33197", + "issueUrl": "https://osv.dev/GHSA-p5f9-c9j9-g8qx", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic when opening certain archives in archive/zip. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-41772", + "line": "7", + "message": "Capture-replay in Gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-jrpg-35hw-m4p9", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-41772", + "issueUrl": "https://osv.dev/GHSA-jrpg-35hw-m4p9", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic on invalid symbol tables in debug/macho. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-41771", + "line": "7", + "message": "Gitea Missing Authorization vulnerability in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-jr9c-h74f-2v28", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-41771", + "issueUrl": "https://osv.dev/GHSA-jr9c-h74f-2v28", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Panic in ReverseProxy in net/http/httputil. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2021-36221", + "line": "7", + "message": "Path Traversal in Gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-h3q4-vmw4-cpr5", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2021-36221", + "issueUrl": "https://osv.dev/GHSA-h3q4-vmw4-cpr5", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "message": "Improper handling of special tags within script contexts in html/template. Current version of 'stdlib' is vulnerable: 1.13.", - "code": "CVE-2023-39319", + "line": "7", + "message": "Cross-site Scripting in Gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-g95p-88p4-76cm", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2023-39319", + "issueUrl": "https://osv.dev/GHSA-g95p-88p4-76cm", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Stored Cross-site Scripting in gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-ph3w-2843-72mx", - "level": "LEVEL_MEDIUM", + "message": "Arbitrary file deletion in gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-g7p7-x6w7-w6qg", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-ph3w-2843-72mx", + "issueUrl": "https://osv.dev/GHSA-g7p7-x6w7-w6qg", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Gitea erroneous repo clones. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-8j3v-68w3-3848", - "level": "LEVEL_MEDIUM", + "message": "Denial of Service in Gitea in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-g2qx-6ghw-67hm", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-8j3v-68w3-3848", + "issueUrl": "https://osv.dev/GHSA-g2qx-6ghw-67hm", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "'code.gitea.io/gitea' Open Redirect vulnerability. Current version is vulnerable: 1.9.0-dev.", - "code": "GHSA-cf6v-9j57-v6r6", - "level": "LEVEL_LOW", + "message": "Gitea allowed assignment of private issues in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-fhv8-m4j4-cww2", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-cf6v-9j57-v6r6", + "issueUrl": "https://osv.dev/GHSA-fhv8-m4j4-cww2", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Gogs and Gitea SSRF Vulnerability. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", + "message": "Gogs and Gitea SSRF Vulnerability in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", "code": "GHSA-fg3x-rwq9-74cw", "level": "LEVEL_HIGH", "linter": "osv-scanner", @@ -945,55 +1084,55 @@ { "file": "test_data/go.mod", "line": "7", - "message": "Arbitrary file deletion in gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-g7p7-x6w7-w6qg", + "message": "'code.gitea.io/gitea' Open Redirect vulnerability. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-cf6v-9j57-v6r6", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-g7p7-x6w7-w6qg", + "issueUrl": "https://osv.dev/GHSA-cf6v-9j57-v6r6", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Cross-site Scripting in Gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-g95p-88p4-76cm", - "level": "LEVEL_MEDIUM", + "message": "Gitea erroneous repo clones in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-8j3v-68w3-3848", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-g95p-88p4-76cm", + "issueUrl": "https://osv.dev/GHSA-8j3v-68w3-3848", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Path Traversal in Gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-h3q4-vmw4-cpr5", - "level": "LEVEL_MEDIUM", + "message": "Gitea Open Redirect in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-4rqq-rxvc-v2rc", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-h3q4-vmw4-cpr5", + "issueUrl": "https://osv.dev/GHSA-4rqq-rxvc-v2rc", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Gitea Missing Authorization vulnerability. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-jr9c-h74f-2v28", + "message": "Gitea Cross-site Scripting Vulnerability in 'code.gitea.io/gitea'. Current version is vulnerable: 1.9.0-dev.", + "code": "GHSA-4h4p-553m-46qh", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-jr9c-h74f-2v28", + "issueUrl": "https://osv.dev/GHSA-4h4p-553m-46qh", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "7", - "message": "Shell command injection in gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", - "code": "GHSA-p5f9-c9j9-g8qx", + "message": "Arbitrary Code Execution in Gitea. Current version of 'code.gitea.io/gitea' is vulnerable: 1.9.0-dev.", + "code": "GHSA-3h6c-c475-jm7v", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-p5f9-c9j9-g8qx", + "issueUrl": "https://osv.dev/GHSA-3h6c-c475-jm7v", "targetType": "lockfile", "isSecurity": true }, @@ -1033,7 +1172,18 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Cross Site Request Forgery in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "message": "Gitea Improper Input Validation in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", + "code": "GHSA-q47x-6mqq-4w92", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-q47x-6mqq-4w92", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "58", + "message": "Cross Site Request Forgery in Gitea in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", "code": "GHSA-4wp3-8q92-mh8w", "level": "LEVEL_HIGH", "linter": "osv-scanner", @@ -1044,9 +1194,9 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Open redirect in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "message": "Open redirect in Gitea in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", "code": "GHSA-36h2-95gj-w488", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-36h2-95gj-w488", "targetType": "lockfile", @@ -1055,9 +1205,9 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Gitea displaying raw OpenID error in UI. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "message": "Gitea displaying raw OpenID error in UI in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", "code": "GHSA-8h8p-x289-vvqr", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-8h8p-x289-vvqr", "targetType": "lockfile", @@ -1066,9 +1216,9 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Gitea Exposes Private Email Addresses. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "message": "Gitea Exposes Private Email Addresses in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", "code": "GHSA-f5fj-7265-jxhj", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-f5fj-7265-jxhj", "targetType": "lockfile", @@ -1088,42 +1238,31 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Gitea Remote Code Execution. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", - "code": "GHSA-hpmr-prr2-cqc4", - "level": "LEVEL_HIGH", - "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-hpmr-prr2-cqc4", - "targetType": "lockfile", - "isSecurity": true - }, - { - "file": "test_data/go.mod", - "line": "58", - "message": "Capture-replay in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", - "code": "GHSA-jrpg-35hw-m4p9", + "message": "Gitea vulnerable to Argument Injection. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "code": "GHSA-w8xw-7crf-h23x", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-jrpg-35hw-m4p9", + "issueUrl": "https://osv.dev/GHSA-w8xw-7crf-h23x", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "58", - "message": "Gitea Improper Input Validation. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", - "code": "GHSA-q47x-6mqq-4w92", + "message": "Improper Access Control in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "code": "GHSA-r7h7-chh4-5rvm", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-q47x-6mqq-4w92", + "issueUrl": "https://osv.dev/GHSA-r7h7-chh4-5rvm", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "58", - "message": "Cross-site Scripting in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "message": "Cross-site Scripting in Gitea in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", "code": "GHSA-r3gq-wxqf-q4gh", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-r3gq-wxqf-q4gh", "targetType": "lockfile", @@ -1132,31 +1271,31 @@ { "file": "test_data/go.mod", "line": "58", - "message": "Gitea vulnerable to Argument Injection. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", - "code": "GHSA-w8xw-7crf-h23x", + "message": "Gitea Remote Code Execution in 'github.com/go-gitea/gitea'. Current version is vulnerable: 1.2.3.", + "code": "GHSA-hpmr-prr2-cqc4", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-w8xw-7crf-h23x", + "issueUrl": "https://osv.dev/GHSA-hpmr-prr2-cqc4", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", - "line": "84", - "message": "Gophish vulnerable to Cross-site Scripting via crafted landing page. Current version of 'github.com/gophish/gophish' is vulnerable: 0.1.2.", - "code": "GHSA-55m9-hm92-xm8j", - "level": "LEVEL_MEDIUM", + "line": "58", + "message": "Capture-replay in Gitea. Current version of 'github.com/go-gitea/gitea' is vulnerable: 1.2.3.", + "code": "GHSA-jrpg-35hw-m4p9", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-55m9-hm92-xm8j", + "issueUrl": "https://osv.dev/GHSA-jrpg-35hw-m4p9", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "84", - "message": "Gophish before 0.12.0 vulnerable to Open Redirect. Current version of 'github.com/gophish/gophish' is vulnerable: 0.1.2.", + "message": "Gophish before 0.12.0 vulnerable to Open Redirect in 'github.com/gophish/gophish'. Current version is vulnerable: 0.1.2.", "code": "GHSA-hvw3-p9px-gpc9", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-hvw3-p9px-gpc9", "targetType": "lockfile", @@ -1165,9 +1304,9 @@ { "file": "test_data/go.mod", "line": "84", - "message": "Gophish XSS Vulnerability. Current version of 'github.com/gophish/gophish' is vulnerable: 0.1.2.", + "message": "Gophish XSS Vulnerability in 'github.com/gophish/gophish'. Current version is vulnerable: 0.1.2.", "code": "GHSA-9h9f-9q8g-6764", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-9h9f-9q8g-6764", "targetType": "lockfile", @@ -1176,9 +1315,9 @@ { "file": "test_data/go.mod", "line": "84", - "message": "Gophish vulnerable to Server-Side Request Forgery. Current version of 'github.com/gophish/gophish' is vulnerable: 0.1.2.", + "message": "Gophish vulnerable to Server-Side Request Forgery in 'github.com/gophish/gophish'. Current version is vulnerable: 0.1.2.", "code": "GHSA-9c9w-9pq7-f35h", - "level": "LEVEL_MEDIUM", + "level": "LEVEL_HIGH", "linter": "osv-scanner", "issueUrl": "https://osv.dev/GHSA-9c9w-9pq7-f35h", "targetType": "lockfile", @@ -1195,6 +1334,17 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/go.mod", + "line": "84", + "message": "Gophish vulnerable to Cross-site Scripting via crafted landing page. Current version of 'github.com/gophish/gophish' is vulnerable: 0.1.2.", + "code": "GHSA-55m9-hm92-xm8j", + "level": "LEVEL_MEDIUM", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-55m9-hm92-xm8j", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/go.mod", "line": "91", @@ -1210,32 +1360,32 @@ "file": "test_data/go.mod", "line": "91", "message": "pgx SQL Injection via Protocol Message Size Overflow. Current version of 'github.com/jackc/pgx' is vulnerable: 3.6.0+incompatible.", - "code": "GHSA-mrww-27vc-gghv", + "code": "GHSA-7jwh-3vrq-q3m8", "level": "LEVEL_MEDIUM", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-mrww-27vc-gghv", + "issueUrl": "https://osv.dev/GHSA-7jwh-3vrq-q3m8", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "116", - "message": "Cross-site scripting due to incorrect sanitization in 'github.com/microcosm-cc/bluemonday'. Current version is vulnerable: 0.0.0-20161012083705-f77f16ffc87a.", - "code": "GHSA-3x58-xr87-2fcj", + "message": "Cross-site scripting via leaked style elements in 'github.com/microcosm-cc/bluemonday'. Current version is vulnerable: 0.0.0-20161012083705-f77f16ffc87a.", + "code": "GHSA-x95h-979x-cf3j", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-3x58-xr87-2fcj", + "issueUrl": "https://osv.dev/GHSA-x95h-979x-cf3j", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "116", - "message": "Cross-site scripting via leaked style elements in 'github.com/microcosm-cc/bluemonday'. Current version is vulnerable: 0.0.0-20161012083705-f77f16ffc87a.", - "code": "GHSA-x95h-979x-cf3j", + "message": "Cross-site scripting due to incorrect sanitization in 'github.com/microcosm-cc/bluemonday'. Current version is vulnerable: 0.0.0-20161012083705-f77f16ffc87a.", + "code": "GHSA-3x58-xr87-2fcj", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-x95h-979x-cf3j", + "issueUrl": "https://osv.dev/GHSA-3x58-xr87-2fcj", "targetType": "lockfile", "isSecurity": true }, @@ -1253,22 +1403,22 @@ { "file": "test_data/go.mod", "line": "161", - "message": "Path traversal in 'github.com/unknwon/cae'. Current version is vulnerable: 1.0.0.", - "code": "GHSA-vpx7-vm66-qx8r", + "message": "Path Traversal in 'github.com/unknwon/cae'. Current version is vulnerable: 1.0.0.", + "code": "GHSA-88jf-7rch-32qc", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-vpx7-vm66-qx8r", + "issueUrl": "https://osv.dev/GHSA-88jf-7rch-32qc", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "161", - "message": "Path Traversal in 'github.com/unknwon/cae'. Current version is vulnerable: 1.0.0.", - "code": "GHSA-88jf-7rch-32qc", + "message": "Path traversal in 'github.com/unknwon/cae'. Current version is vulnerable: 1.0.0.", + "code": "GHSA-vpx7-vm66-qx8r", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-88jf-7rch-32qc", + "issueUrl": "https://osv.dev/GHSA-vpx7-vm66-qx8r", "targetType": "lockfile", "isSecurity": true }, @@ -1373,12 +1523,12 @@ }, { "file": "test_data/go.mod", - "line": "173", - "message": "Denial of service via crafted TIFF image in golang.org/x/image/tiff. Current version is vulnerable: 0.0.0-20190802002840-cff245a6509b.", - "code": "GHSA-qgc7-mgm3-q253", + "line": "172", + "message": "Limited directory traversal vulnerability on Windows in 'golang.org/x/crypto'. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2.", + "code": "CVE-2022-30636", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-qgc7-mgm3-q253", + "issueUrl": "https://osv.dev/CVE-2022-30636", "targetType": "lockfile", "isSecurity": true }, @@ -1393,6 +1543,17 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/go.mod", + "line": "173", + "message": "Panic when parsing invalid palette-color images in 'golang.org/x/image'. Current version is vulnerable: 0.0.0-20190802002840-cff245a6509b.", + "code": "GHSA-9phm-fm57-rhg8", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-9phm-fm57-rhg8", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/go.mod", "line": "173", @@ -1406,23 +1567,23 @@ }, { "file": "test_data/go.mod", - "line": "174", - "message": "Excessive memory growth in net/http and golang.org/x/net/http2. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", - "code": "GHSA-xrjj-mj9h-534m", + "line": "173", + "message": "Denial of service via crafted TIFF image in golang.org/x/image/tiff. Current version is vulnerable: 0.0.0-20190802002840-cff245a6509b.", + "code": "GHSA-qgc7-mgm3-q253", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-xrjj-mj9h-534m", + "issueUrl": "https://osv.dev/GHSA-qgc7-mgm3-q253", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/go.mod", "line": "174", - "message": "Denial of service via crafted HTTP/2 stream in net/http and 'golang.org/x/net'. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", - "code": "GHSA-vvpx-j8f3-3w6h", + "message": "Excessive memory growth in net/http and golang.org/x/net/http2. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", + "code": "GHSA-xrjj-mj9h-534m", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-vvpx-j8f3-3w6h", + "issueUrl": "https://osv.dev/GHSA-xrjj-mj9h-534m", "targetType": "lockfile", "isSecurity": true }, @@ -1437,6 +1598,17 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "HTTP/2 Stream Cancellation Attack. Current version of 'golang.org/x/net' is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", + "code": "GHSA-qppj-fm5r-hxr3", + "level": "LEVEL_MEDIUM", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-qppj-fm5r-hxr3", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/go.mod", "line": "174", @@ -1470,6 +1642,17 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "HTTP/2 CONTINUATION flood in net/http. Current version of 'golang.org/x/net' is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", + "code": "GHSA-4v7x-pqxf-cx7m", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-4v7x-pqxf-cx7m", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/go.mod", "line": "174", @@ -1495,11 +1678,11 @@ { "file": "test_data/go.mod", "line": "174", - "message": "HTTP/2 Stream Cancellation Attack. Current version of 'golang.org/x/net' is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", - "code": "GHSA-2m7v-gc89-fjqf", - "level": "LEVEL_MEDIUM", + "message": "Denial of service via crafted HTTP/2 stream in net/http and 'golang.org/x/net'. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e.", + "code": "GHSA-vvpx-j8f3-3w6h", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-2m7v-gc89-fjqf", + "issueUrl": "https://osv.dev/GHSA-vvpx-j8f3-3w6h", "targetType": "lockfile", "isSecurity": true }, @@ -1514,6 +1697,17 @@ "targetType": "lockfile", "isSecurity": true }, + { + "file": "test_data/go.mod", + "line": "179", + "message": "HTTP/2 Stream Cancellation Attack. Current version of 'google.golang.org/grpc' is vulnerable: 1.23.0.", + "code": "GHSA-qppj-fm5r-hxr3", + "level": "LEVEL_MEDIUM", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-qppj-fm5r-hxr3", + "targetType": "lockfile", + "isSecurity": true + }, { "file": "test_data/go.mod", "line": "179", @@ -1527,12 +1721,12 @@ }, { "file": "test_data/go.mod", - "line": "179", - "message": "HTTP/2 Stream Cancellation Attack. Current version of 'google.golang.org/grpc' is vulnerable: 1.23.0.", - "code": "GHSA-2m7v-gc89-fjqf", - "level": "LEVEL_MEDIUM", + "line": "186", + "message": "Decompression bomb vulnerability in github.com/go-jose/go-jose. Current version of 'gopkg.in/square/go-jose.v2' is vulnerable: 2.3.1.", + "code": "GHSA-c5q2-7r4c-mv6g", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-2m7v-gc89-fjqf", + "issueUrl": "https://osv.dev/GHSA-c5q2-7r4c-mv6g", "targetType": "lockfile", "isSecurity": true }, @@ -1561,22 +1755,44 @@ { "file": "test_data/requirements.txt", "line": "1", - "message": "Invalid-free in _dealloc. Current version of 'pillow' is vulnerable: 9.1.1.", - "code": "OSV-2022-1074", + "message": "Arbitrary Code Execution in 'Pillow'. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.2.0 or higher.", + "code": "GHSA-3f63-hfp8-52jq", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/OSV-2022-1074", + "issueUrl": "https://osv.dev/GHSA-3f63-hfp8-52jq", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "1", - "message": "Segv on unknown address in jpeg_read_scanlines. Current version of 'pillow' is vulnerable: 9.1.1.", - "code": "OSV-2022-715", + "message": "'Pillow' versions before v10.0.1 bundled libwebp binaries in wheels that are vulnerable to CVE-2023-5129 (previously CVE-2023-4863). 'Pillow' v10.0.1 upgrades the bundled libwebp binary to v1.3.2. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "PYSEC-2023-175", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/OSV-2022-715", + "issueUrl": "https://osv.dev/PYSEC-2023-175", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "'Pillow' buffer overflow vulnerability. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.3.0 or higher.", + "code": "GHSA-44wm-f244-xhp3", + "level": "LEVEL_MEDIUM", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-44wm-f244-xhp3", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Bundled libwebp in 'Pillow' vulnerable. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "GHSA-56pw-mpj4-fxww", + "level": "LEVEL_HIGH", + "linter": "osv-scanner", + "issueUrl": "https://osv.dev/GHSA-56pw-mpj4-fxww", "targetType": "lockfile", "isSecurity": true }, @@ -1605,44 +1821,44 @@ { "file": "test_data/requirements.txt", "line": "1", - "message": "'Pillow' versions before v10.0.1 bundled libwebp binaries in wheels that are vulnerable to CVE-2023-5129 (previously CVE-2023-4863). 'Pillow' v10.0.1 upgrades the bundled libwebp binary to v1.3.2. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", - "code": "PYSEC-2023-175", + "message": "'Pillow' before 9.2.0 performs Improper Handling of Highly Compressed GIF Data (Data Amplification). Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 9.2.0 or higher.", + "code": "GHSA-m2vv-5vj5-2hm7", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/PYSEC-2023-175", + "issueUrl": "https://osv.dev/GHSA-m2vv-5vj5-2hm7", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "1", - "message": "Bundled libwebp in 'Pillow' vulnerable. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", - "code": "GHSA-56pw-mpj4-fxww", + "message": "Invalid-free in _dealloc. Current version of 'pillow' is vulnerable: 9.1.1.", + "code": "OSV-2022-1074", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-56pw-mpj4-fxww", + "issueUrl": "https://osv.dev/OSV-2022-1074", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "1", - "message": "Arbitrary Code Execution in 'Pillow'. Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 10.2.0 or higher.", - "code": "GHSA-3f63-hfp8-52jq", + "message": "Segv on unknown address in jpeg_read_scanlines. Current version of 'pillow' is vulnerable: 9.1.1.", + "code": "OSV-2022-715", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-3f63-hfp8-52jq", + "issueUrl": "https://osv.dev/OSV-2022-715", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", - "line": "1", - "message": "'Pillow' before 9.2.0 performs Improper Handling of Highly Compressed GIF Data (Data Amplification). Current version of 'pillow' is vulnerable: 9.1.1. Patch available: upgrade to 9.2.0 or higher.", - "code": "GHSA-m2vv-5vj5-2hm7", - "level": "LEVEL_HIGH", + "line": "2", + "message": "'langchain' vulnerable to path traversal. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.353 or higher.", + "code": "GHSA-rgp8-pm28-3759", + "level": "LEVEL_MEDIUM", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-m2vv-5vj5-2hm7", + "issueUrl": "https://osv.dev/GHSA-rgp8-pm28-3759", "targetType": "lockfile", "isSecurity": true }, @@ -1660,154 +1876,154 @@ { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in 'langchain' langchain-ai v.0.0.232 and before allows a remote attacker to execute arbitrary code via a crafted script to the PythonAstREPLTool._run component. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.233 or higher.", - "code": "GHSA-prgp-w7vf-ch62", + "message": "'Langchain' Server-Side Request Forgery vulnerability. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.329 or higher.", + "code": "GHSA-6h8p-4hx9-w66c", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-prgp-w7vf-ch62", + "issueUrl": "https://osv.dev/GHSA-6h8p-4hx9-w66c", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'langchain' Server-Side Request Forgery vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.1.0 or higher.", - "code": "GHSA-h9j7-5xvc-qhg5", - "level": "LEVEL_LOW", + "message": "'Langchain' 0.0.171 is vulnerable to Arbitrary code execution in load_prompt. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "GHSA-6643-h7h5-x9wh", + "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-h9j7-5xvc-qhg5", + "issueUrl": "https://osv.dev/GHSA-6643-h7h5-x9wh", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in Harrison Chase 'langchain' v.0.0.194 allows an attacker to execute arbitrary code via the python exec calls in the PALChain, affected functions include from_math_prompt and from_colored_object_prompt. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.236 or higher.", - "code": "GHSA-gwqq-6vq7-5j86", + "message": "'LangChain' before 0.0.317 allows SSRF via document_loaders/recursive_url_loader.py because crawling can proceed from an external server to an internal server. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.317 or higher.", + "code": "GHSA-655w-fm8m-m478", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-gwqq-6vq7-5j86", + "issueUrl": "https://osv.dev/GHSA-655w-fm8m-m478", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in 'LangChain' v.0.0.231 allows a remote attacker to execute arbitrary code via the prompt parameter. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", - "code": "GHSA-fj32-q626-pjjc", + "message": "An issue in 'langchain' v.0.0.64 allows a remote attacker to execute arbitrary code via the PALChain parameter in the Python exec method. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "GHSA-57fc-8q82-gfp3", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-fj32-q626-pjjc", + "issueUrl": "https://osv.dev/GHSA-57fc-8q82-gfp3", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in LanChain-ai 'Langchain' v.0.0.245 allows a remote attacker to execute arbitrary code via the evaluate function in the numexpr library. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.308 or higher.", - "code": "GHSA-f73w-4m7g-ch9x", + "message": "An issue in 'langchain' v.0.0.199 allows an attacker to execute arbitrary code via the PALChain in the python exec method. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "GHSA-2qmj-7962-cjq8", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-f73w-4m7g-ch9x", + "issueUrl": "https://osv.dev/GHSA-2qmj-7962-cjq8", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in Harrison Chase 'langchain' v.0.0.194 and before allows a remote attacker to execute arbitrary code via the from_math_prompt and from_colored_object_prompt functions. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.195 or higher.", - "code": "GHSA-92j5-3459-qgp4", + "message": "SQL injection vulnerability in 'langchain' v.0.0.64 allows a remote attacker to obtain sensitive information via the SQLDatabaseChain component. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "GHSA-7q94-qpjr-xpgm", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-92j5-3459-qgp4", + "issueUrl": "https://osv.dev/GHSA-7q94-qpjr-xpgm", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "SQL injection vulnerability in 'langchain' v.0.0.64 allows a remote attacker to obtain sensitive information via the SQLDatabaseChain component. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", - "code": "GHSA-7q94-qpjr-xpgm", + "message": "An issue in Harrison Chase 'langchain' v.0.0.194 and before allows a remote attacker to execute arbitrary code via the from_math_prompt and from_colored_object_prompt functions. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.195 or higher.", + "code": "GHSA-92j5-3459-qgp4", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-7q94-qpjr-xpgm", + "issueUrl": "https://osv.dev/GHSA-92j5-3459-qgp4", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'langchain' vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.312 or higher.", - "code": "GHSA-7gfq-f96f-g85j", + "message": "An issue in LanChain-ai 'Langchain' v.0.0.245 allows a remote attacker to execute arbitrary code via the evaluate function in the numexpr library. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.308 or higher.", + "code": "GHSA-f73w-4m7g-ch9x", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-7gfq-f96f-g85j", + "issueUrl": "https://osv.dev/GHSA-f73w-4m7g-ch9x", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'Langchain' Server-Side Request Forgery vulnerability. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.329 or higher.", - "code": "GHSA-6h8p-4hx9-w66c", + "message": "An issue in 'LangChain' v.0.0.231 allows a remote attacker to execute arbitrary code via the prompt parameter. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "GHSA-fj32-q626-pjjc", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-6h8p-4hx9-w66c", + "issueUrl": "https://osv.dev/GHSA-fj32-q626-pjjc", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'Langchain' 0.0.171 is vulnerable to Arbitrary code execution in load_prompt. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", - "code": "GHSA-6643-h7h5-x9wh", + "message": "An issue in Harrison Chase 'langchain' v.0.0.194 allows an attacker to execute arbitrary code via the python exec calls in the PALChain, affected functions include from_math_prompt and from_colored_object_prompt. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.236 or higher.", + "code": "GHSA-gwqq-6vq7-5j86", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-6643-h7h5-x9wh", + "issueUrl": "https://osv.dev/GHSA-gwqq-6vq7-5j86", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'LangChain' before 0.0.317 allows SSRF via document_loaders/recursive_url_loader.py because crawling can proceed from an external server to an internal server. Current version of 'langchain' is vulnerable: 0.0.171. Patch available: upgrade to 0.0.317 or higher.", - "code": "GHSA-655w-fm8m-m478", + "message": "'LangChain' through 0.1.10 allows ../ directory traversal by an actor who is able to control the final part of the path parameter in a load_chain call. This bypasses the intended behavior of loading configurations only from the hwchase17/langchain-hub GitHub repository. The outcome can be disclosure of an API key for a large language model online service, or remote code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.1.11 or higher.", + "code": "GHSA-h59x-p739-982c", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-655w-fm8m-m478", + "issueUrl": "https://osv.dev/GHSA-h59x-p739-982c", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in 'langchain' v.0.0.64 allows a remote attacker to execute arbitrary code via the PALChain parameter in the Python exec method. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", - "code": "GHSA-57fc-8q82-gfp3", - "level": "LEVEL_HIGH", + "message": "'langchain' Server-Side Request Forgery vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.1.0 or higher.", + "code": "GHSA-h9j7-5xvc-qhg5", + "level": "LEVEL_LOW", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-57fc-8q82-gfp3", + "issueUrl": "https://osv.dev/GHSA-h9j7-5xvc-qhg5", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "An issue in 'langchain' v.0.0.199 allows an attacker to execute arbitrary code via the PALChain in the python exec method. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", - "code": "GHSA-2qmj-7962-cjq8", + "message": "An issue in 'langchain' langchain-ai v.0.0.232 and before allows a remote attacker to execute arbitrary code via a crafted script to the PythonAstREPLTool._run component. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.233 or higher.", + "code": "GHSA-prgp-w7vf-ch62", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/GHSA-2qmj-7962-cjq8", + "issueUrl": "https://osv.dev/GHSA-prgp-w7vf-ch62", "targetType": "lockfile", "isSecurity": true }, { "file": "test_data/requirements.txt", "line": "2", - "message": "'LangChain' through 0.1.10 allows ../ directory traversal by an actor who is able to control the final part of the path parameter in a load_chain call. This bypasses the intended behavior of loading configurations only from the hwchase17/langchain-hub GitHub repository. The outcome can be disclosure of an API key for a large language model online service, or remote code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.1.11 or higher.", - "code": "CVE-2024-28088", + "message": "'langchain' vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.312 or higher.", + "code": "GHSA-7gfq-f96f-g85j", "level": "LEVEL_HIGH", "linter": "osv-scanner", - "issueUrl": "https://osv.dev/CVE-2024-28088", + "issueUrl": "https://osv.dev/GHSA-7gfq-f96f-g85j", "targetType": "lockfile", "isSecurity": true } diff --git a/linters/osv-scanner/plugin.yaml b/linters/osv-scanner/plugin.yaml index 1a414a095..5624aecfe 100644 --- a/linters/osv-scanner/plugin.yaml +++ b/linters/osv-scanner/plugin.yaml @@ -1,7 +1,7 @@ version: 0.1 downloads: - name: osv-scanner - version: 1.3.6 + version: 2.0.1 executable: true downloads: - os: @@ -35,13 +35,14 @@ tools: - name: osv-scanner download: osv-scanner shims: [osv-scanner] - known_good_version: 1.3.6 + known_good_version: 2.0.1 lint: definitions: - name: osv-scanner files: [lockfile] tools: [osv-scanner] - known_good_version: 1.3.6 + known_good_version: 2.0.1 + description: Checks for known vulnerabilities in your dependencies commands: - name: scan output: sarif diff --git a/linters/osv-scanner/test_data/bun.lock b/linters/osv-scanner/test_data/bun.lock new file mode 100644 index 000000000..369edc44a --- /dev/null +++ b/linters/osv-scanner/test_data/bun.lock @@ -0,0 +1,17 @@ +{ + "version": 2, + "dependencies": { + "chalk@5.2.0": { + "integrity": "sha512-abc123...", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" + }, + "react@18.2.0": { + "integrity": "sha512-def456...", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + }, + "react-dom@18.2.0": { + "integrity": "sha512-ghi789...", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + } + } +} diff --git a/linters/osv-scanner/test_data/osv_scanner_v2.0.1_CUSTOM.check.shot b/linters/osv-scanner/test_data/osv_scanner_v2.0.1_CUSTOM.check.shot new file mode 100644 index 000000000..da5a08abb --- /dev/null +++ b/linters/osv-scanner/test_data/osv_scanner_v2.0.1_CUSTOM.check.shot @@ -0,0 +1,74 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter osv-scanner test CUSTOM 1`] = ` +{ + "issues": [], + "lintActions": [ + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/Cargo.lock", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/Gemfile.lock", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/bun.lock", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/composer.lock", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/go.mod", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/requirements.txt", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "scan", + "fileGroupName": "lockfile", + "linter": "osv-scanner", + "paths": [ + "test_data/yarn.lock", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/oxipng/oxipng.test.ts b/linters/oxipng/oxipng.test.ts index e3da0d5d4..32b28d3cb 100644 --- a/linters/oxipng/oxipng.test.ts +++ b/linters/oxipng/oxipng.test.ts @@ -19,10 +19,8 @@ const preCheck = (driver: TrunkLintDriver) => { const postCheck = (driver: TrunkLintDriver) => { const originalSize = fs.statSync( - // trunk-ignore(semgrep): paths used here are safe path.resolve(driver.getSandbox(), TEST_DATA, "good.png.bak"), ).size; - // trunk-ignore(semgrep): paths used here are safe const compressedSize = fs.statSync(path.resolve(driver.getSandbox(), TEST_DATA, "good.png")).size; expect(compressedSize).toBeLessThan(originalSize); }; diff --git a/linters/oxipng/plugin.yaml b/linters/oxipng/plugin.yaml index 37fd0ac50..06d173bcd 100644 --- a/linters/oxipng/plugin.yaml +++ b/linters/oxipng/plugin.yaml @@ -23,6 +23,7 @@ lint: - name: oxipng files: [png] download: oxipng + description: Optimize PNG images commands: - name: fmt output: rewrite diff --git a/linters/perlcritic/plugin.yaml b/linters/perlcritic/plugin.yaml index 2599f92cf..ec478155e 100644 --- a/linters/perlcritic/plugin.yaml +++ b/linters/perlcritic/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: perlcritic supported_platforms: [linux, macos] + description: Static analysis tool for Perl commands: - output: regex success_codes: diff --git a/linters/perltidy/plugin.yaml b/linters/perltidy/plugin.yaml index d5ddf7053..bdbd6f331 100644 --- a/linters/perltidy/plugin.yaml +++ b/linters/perltidy/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: perltidy supported_platforms: [linux, macos] + description: Formatter for Perl commands: - output: rewrite success_codes: diff --git a/linters/php-cs-fixer/php-cs-fixer.test.ts b/linters/php-cs-fixer/php-cs-fixer.test.ts new file mode 100644 index 000000000..44d3f1008 --- /dev/null +++ b/linters/php-cs-fixer/php-cs-fixer.test.ts @@ -0,0 +1,9 @@ +import { linterFmtTest } from "tests"; + +linterFmtTest({ + linterName: "php-cs-fixer", + // Next release will include support for php@8.4 + // https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/releases/tag/v3.65.0 + skipTestIf: () => true, + // skipTestIf: skipOS(["win32"]), +}); diff --git a/linters/php-cs-fixer/plugin.yaml b/linters/php-cs-fixer/plugin.yaml new file mode 100644 index 000000000..c809cd798 --- /dev/null +++ b/linters/php-cs-fixer/plugin.yaml @@ -0,0 +1,36 @@ +version: 0.1 +tools: + definitions: + - name: php-cs-fixer + runtime: php + package: friendsofphp/php-cs-fixer + known_good_version: 3.54.0 + shims: [php-cs-fixer] + environment: + - name: PATH + list: ["${tool}/vendor/bin"] + health_checks: + - command: php-cs-fixer --version + parse_regex: PHP CS Fixer ${semver} +lint: + definitions: + - name: php-cs-fixer + description: Keeps PHP code up to standards + tools: [php-cs-fixer] + known_good_version: 3.54.0 + files: [php] + commands: + # TODO(Tyler): Do we want to define a lint command here? + - name: format + output: rewrite + success_codes: [0] + formatter: true + batch: true + in_place: true + run: php-cs-fixer fix --using-cache=no --show-progress=none ${target} + direct_configs: + # uses ruleset @PSR12 when a config is not present. + - .php-cs-fixer.dist.php + affects_cache: + - .php-cs-fixer.php + suggest_if: config_present diff --git a/linters/php-cs-fixer/test_data/basic.in.php b/linters/php-cs-fixer/test_data/basic.in.php new file mode 100644 index 000000000..103f07dc4 --- /dev/null +++ b/linters/php-cs-fixer/test_data/basic.in.php @@ -0,0 +1,15 @@ +format('j. n. Y'); + } +} diff --git a/linters/php-cs-fixer/test_data/php_cs_fixer_v3.54.0_basic.fmt.shot b/linters/php-cs-fixer/test_data/php_cs_fixer_v3.54.0_basic.fmt.shot new file mode 100644 index 000000000..8807a2082 --- /dev/null +++ b/linters/php-cs-fixer/test_data/php_cs_fixer_v3.54.0_basic.fmt.shot @@ -0,0 +1,22 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter php-cs-fixer test basic 1`] = ` +"format('j. n. Y'); + } +} +" +`; diff --git a/linters/phpstan/phpstan.test.ts b/linters/phpstan/phpstan.test.ts new file mode 100644 index 000000000..cd5626d05 --- /dev/null +++ b/linters/phpstan/phpstan.test.ts @@ -0,0 +1,4 @@ +import { linterCheckTest } from "tests"; +import { skipOS } from "tests/utils"; + +linterCheckTest({ linterName: "phpstan", skipTestIf: skipOS(["win32"]) }); diff --git a/linters/phpstan/phpstan_parser.py b/linters/phpstan/phpstan_parser.py new file mode 100755 index 000000000..32a7133e4 --- /dev/null +++ b/linters/phpstan/phpstan_parser.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +import json +import sys + + +def main(): + phpstan_json = json.loads(sys.stdin.read()) + + results = [] + for file_name in phpstan_json["files"]: + file_result = phpstan_json["files"][file_name] + for result in file_result["messages"]: + result = { + # We do not have a ruleId + "message": { + "text": result["message"], + }, + "ruleId": "phpstan", + "level": "error", + "locations": [ + { + "physicalLocation": { + "artifactLocation": {"uri": file_name}, + "region": { + "startLine": result["line"], + "startColumn": 0, # Output column is not available in phpstan + }, + } + }, + ], + } + results.append(result) + + sarif = { + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "version": "2.1.0", + "runs": [{"results": results}], + } + + print(json.dumps(sarif, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/linters/phpstan/plugin.yaml b/linters/phpstan/plugin.yaml new file mode 100644 index 000000000..197664e8b --- /dev/null +++ b/linters/phpstan/plugin.yaml @@ -0,0 +1,37 @@ +version: 0.1 +tools: + definitions: + - name: phpstan + runtime: php + package: phpstan/phpstan + known_good_version: 2.0.3 + shims: [phpstan] + environment: + - name: PATH + list: ["${tool}/vendor/bin"] + health_checks: + - command: phpstan --version + parse_regex: PHP Static Analysis Tool ${semver} +lint: + definitions: + - name: phpstan + main_tool: phpstan + known_good_version: 2.0.3 + description: PHP Static Analysis Tool + suggest_if: never + commands: + - run: phpstan analyze "${target}" --error-format=json --level=9 + output: sarif + success_codes: [0, 1] + files: [php] + batch: true + cache_results: true + read_output_from: stdout + parser: + runtime: python + run: python3 ${plugin}/linters/phpstan/phpstan_parser.py + + direct_configs: + - phpstan.neon + - phpstan.neon.dist + - phpstan.dist.neon diff --git a/linters/phpstan/test_data/basic.in.php b/linters/phpstan/test_data/basic.in.php new file mode 100644 index 000000000..749995fbe --- /dev/null +++ b/linters/phpstan/test_data/basic.in.php @@ -0,0 +1,9 @@ +format('j. n. Y'); + } +} diff --git a/linters/phpstan/test_data/phpstan_v2.0.3_basic.check.shot b/linters/phpstan/test_data/phpstan_v2.0.3_basic.check.shot new file mode 100644 index 000000000..abf9957a7 --- /dev/null +++ b/linters/phpstan/test_data/phpstan_v2.0.3_basic.check.shot @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter phpstan test basic 1`] = ` +{ + "issues": [ + { + "code": "phpstan", + "file": "test_data/basic.in.php", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "phpstan", + "message": "Parameter $date of method HelloWorld::sayHello() has invalid type DateTimeImutable.", + "targetType": "php", + }, + { + "code": "phpstan", + "file": "test_data/basic.in.php", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "phpstan", + "message": "Call to method format() on an unknown class DateTimeImutable.", + "targetType": "php", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "php", + "linter": "phpstan", + "paths": [ + "test_data/basic.in.php", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "php", + "linter": "phpstan", + "paths": [ + "test_data/basic.in.php", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/plugin.yaml b/linters/plugin.yaml index 5552fccc0..4b00387cd 100644 --- a/linters/plugin.yaml +++ b/linters/plugin.yaml @@ -5,6 +5,14 @@ lint: leading_delimiter: "{-" trailing_delimiter: "-}" + - name: brace-slashes-block + leading_delimiter: "{/*" + trailing_delimiter: "*/}" + + - name: brace-slashes-block-spaced + leading_delimiter: "{ /*" + trailing_delimiter: "*/ }" + - name: dashes-block leading_delimiter: --[[ trailing_delimiter: --]] @@ -53,6 +61,13 @@ lint: - slashes-block - slashes-inline + - name: astro + extensions: + - astro + comments: + - html-tag + - brace-slashes-block + - name: bazel-build extensions: - BUILD @@ -69,6 +84,18 @@ lint: comments: - hash + - name: bazel-module + filenames: + - MODULE.bazel + comments: + - hash + + - name: bazel + inherit: + - bazel-build + - bazel-workspace + - bazel-module + - name: c inherit: - c-header @@ -149,6 +176,25 @@ lint: comments: - slashes-block + - name: cuda + inherit: + - cuda-header + - cuda-source + + - name: cuda-header + extensions: + - cuh + comments: + - slashes-block + - slashes-inline + + - name: cuda-source + extensions: + - cu + comments: + - slashes-block + - slashes-inline + - name: cue extensions: - cue @@ -275,12 +321,22 @@ lint: extensions: - cjs - js - - jsx - mjs + inherit: + - javascript-xml comments: - slashes-block - slashes-inline + - name: javascript-xml + extensions: + - jsx + comments: + - slashes-block + - slashes-inline + - brace-slashes-block + - brace-slashes-block-spaced + - name: json extensions: - json @@ -322,6 +378,10 @@ lint: # Conan (C++) - conan.lock + # csharp + - deps.json + - packages.config + # Golang - go.mod - go.sum @@ -330,6 +390,10 @@ lint: - buildscript-gradle.lockfile - gradle.lockfile + # Haskell + - cabal.project.freeze + - stack.yaml.lock + # Maven - pom.xml @@ -340,6 +404,7 @@ lint: - package-lock.json - pnpm-lock.yaml - yarn.lock + - bun.lock # NuGet (.NET) - packages.lock.json @@ -352,10 +417,14 @@ lint: - requirements.txt - Pipfile.lock - poetry.lock + - pdm.lock # Ruby - Gemfile.lock + # R + - renv.lock + - name: lua extensions: - lua @@ -412,6 +481,11 @@ lint: extensions: - png + - name: postcss + extensions: + - pcss + - postcss + - name: powershell extensions: - ps1 @@ -527,6 +601,12 @@ lint: - strings - stringsdict + - name: svelte + extensions: + - svelte + comments: + - html-tag + - name: svg extensions: - svg @@ -540,15 +620,25 @@ lint: - name: terraform extensions: - tf - - tf.json + comments: + - hash + - slashes-inline + - slashes-block - name: textproto extensions: + - pbtxt - textpb - textproto + - txtpb comments: - hash + - name: tfvars + extensions: + # terraform/tofu can't format .tfvars.json files + - tfvars + - name: toml extensions: - toml @@ -559,10 +649,20 @@ lint: extensions: - mts - ts + inherit: + - typescript-xml + comments: + - slashes-block + - slashes-inline + + - name: typescript-xml + extensions: - tsx comments: - slashes-block - slashes-inline + - brace-slashes-block + - brace-slashes-block-spaced - name: xib extensions: @@ -615,3 +715,6 @@ lint: - linters: [osv-scanner] paths: ["**/go.sum"] + + - linters: [checkov, hadolint, snyk, terrascan, trivy] + paths: ["**/*.dockerignore"] diff --git a/linters/pmd/plugin.yaml b/linters/pmd/plugin.yaml index 4884c145f..236284698 100644 --- a/linters/pmd/plugin.yaml +++ b/linters/pmd/plugin.yaml @@ -2,52 +2,70 @@ version: 0.1 lint: downloads: - name: pmd + args: + semver: ${version}=>(pmd_releases\/)*(?P.*) downloads: + - url: https://github.com/pmd/pmd/releases/download/pmd_releases%2F${semver}/pmd-dist-${semver}-bin.zip + version: ">=7.0.0" + strip_components: 1 - url: https://github.com/pmd/pmd/releases/download/pmd_releases%2F${semver}/pmd-bin-${semver}.zip strip_components: 1 - args: - semver: ${version}=>(pmd_releases\/)*(?P.*) definitions: - name: pmd download: pmd + description: Static code analysis for Java and Apex commands: + - name: lint-apex + version: ">=7.0.0" + output: sarif + # Override this in your repo if you have custom rulesets + run: pmd check -R rulesets/apex/quickstart.xml -f sarif -d ${target} + success_codes: [0, 4] + read_output_from: stdout + files: [apex] - name: lint-apex platforms: [windows] output: sarif - # Override this in your repo if you have a custom rulesets + # Override this in your repo if you have custom rulesets run: pmd.bat -R rulesets/apex/quickstart.xml -f sarif -d ${target} success_codes: [0, 4] read_output_from: stdout - files: - - apex + files: [apex] - name: lint-apex + # 6.55.0 uses run.sh in place of pmd for non-Windows output: sarif - # Override this in your repo if you have a custom rulesets + # Override this in your repo if you have custom rulesets run: run.sh pmd -R rulesets/apex/quickstart.xml -f sarif -d ${target} success_codes: [0, 4] read_output_from: stdout - files: - - apex + files: [apex] + - name: lint-java + version: ">=7.0.0" + output: sarif + # Override this in your repo if you have custom rulesets + run: pmd check -R rulesets/java/quickstart.xml -f sarif -d ${target} + success_codes: [0, 4] + read_output_from: stdout + files: [java] - name: lint-java platforms: [windows] output: sarif - # Override this in your repo if you have a custom rulesets + # Override this in your repo if you have custom rulesets run: pmd.bat -R rulesets/java/quickstart.xml -f sarif -d ${target} success_codes: [0, 4] read_output_from: stdout - files: - - java + files: [java] - name: lint-java + # 6.55.0 uses run.sh in place of pmd output: sarif - # Override this in your repo if you have a custom rulesets + # Override this in your repo if you have custom rulesets run: run.sh pmd -R rulesets/java/quickstart.xml -f sarif -d ${target} success_codes: [0, 4] read_output_from: stdout - files: - - java + files: [java] runtime: java suggest_if: never - known_good_version: 6.55.0 + known_good_version: 7.13.0 known_bad_versions: - pmd_releases/7.0.0-rc4 - pmd_releases/7.0.0-rc3 diff --git a/linters/pmd/pmd.test.ts b/linters/pmd/pmd.test.ts index 5ccf58c6a..7b56e8f1a 100644 --- a/linters/pmd/pmd.test.ts +++ b/linters/pmd/pmd.test.ts @@ -1,5 +1,15 @@ -import { linterCheckTest } from "tests"; +import semver from "semver"; +import { customLinterCheckTest } from "tests"; +import { TEST_DATA } from "tests/utils"; -linterCheckTest({ +const versionGreaterThanOrEqual = (a: string, b: string) => { + const normalizedA = a.replace("pmd_releases/", ""); + const normalizedB = b.replace("pmd_releases/", ""); + return semver.gte(normalizedA, normalizedB); +}; + +customLinterCheckTest({ linterName: "pmd", + args: TEST_DATA, + versionGreaterThanOrEqual, }); diff --git a/linters/pmd/test_data/pmd_v6.55.0_apex.check.shot b/linters/pmd/test_data/pmd_v6.55.0_CUSTOM.check.shot similarity index 54% rename from linters/pmd/test_data/pmd_v6.55.0_apex.check.shot rename to linters/pmd/test_data/pmd_v6.55.0_CUSTOM.check.shot index 33cad54e7..14056c099 100644 --- a/linters/pmd/test_data/pmd_v6.55.0_apex.check.shot +++ b/linters/pmd/test_data/pmd_v6.55.0_CUSTOM.check.shot @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Testing linter pmd test apex 1`] = ` +exports[`Testing linter pmd test CUSTOM 1`] = ` { "issues": [ { @@ -57,6 +57,42 @@ exports[`Testing linter pmd test apex 1`] = ` ], "targetType": "apex", }, + { + "code": "NoPackage", + "column": "1", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "pmd", + "message": "All classes, interfaces, enums and annotations must belong to a named package", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "116", + "offset": "23", + }, + ], + "targetType": "java", + }, + { + "code": "UseUtilityClass", + "column": "18", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "pmd", + "message": "All methods are static. Consider using a utility class instead. Alternatively, you could add a private constructor or make the class abstract to silence this warning.", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "99", + "offset": "40", + }, + ], + "targetType": "java", + }, ], "lintActions": [ { @@ -78,6 +114,25 @@ exports[`Testing linter pmd test apex 1`] = ` "upstream": true, "verb": "TRUNK_VERB_CHECK", }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, ], "taskFailures": [], "unformattedFiles": [], diff --git a/linters/pmd/test_data/pmd_v6.55.0_hello.check.shot b/linters/pmd/test_data/pmd_v6.55.0_hello.check.shot deleted file mode 100644 index 49509de8a..000000000 --- a/linters/pmd/test_data/pmd_v6.55.0_hello.check.shot +++ /dev/null @@ -1,67 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter pmd test hello 1`] = ` -{ - "issues": [ - { - "code": "NoPackage", - "column": "1", - "file": "test_data/hello.in.java", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "3", - "linter": "pmd", - "message": "All classes, interfaces, enums and annotations must belong to a named package", - "ranges": [ - { - "filePath": "test_data/hello.in.java", - "length": "116", - "offset": "23", - }, - ], - "targetType": "java", - }, - { - "code": "UseUtilityClass", - "column": "18", - "file": "test_data/hello.in.java", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "3", - "linter": "pmd", - "message": "All methods are static. Consider using a utility class instead. Alternatively, you could add a private constructor or make the class abstract to silence this warning.", - "ranges": [ - { - "filePath": "test_data/hello.in.java", - "length": "99", - "offset": "40", - }, - ], - "targetType": "java", - }, - ], - "lintActions": [ - { - "command": "lint-java", - "fileGroupName": "java", - "linter": "pmd", - "paths": [ - "test_data/hello.in.java", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint-java", - "fileGroupName": "java", - "linter": "pmd", - "paths": [ - "test_data/hello.in.java", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [], -} -`; diff --git a/linters/pmd/test_data/pmd_v7.0.0_CUSTOM.check.shot b/linters/pmd/test_data/pmd_v7.0.0_CUSTOM.check.shot new file mode 100644 index 000000000..f80987865 --- /dev/null +++ b/linters/pmd/test_data/pmd_v7.0.0_CUSTOM.check.shot @@ -0,0 +1,140 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter pmd test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "ApexDoc", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "1", + "linter": "pmd", + "message": "Missing ApexDoc comment", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "69", + "offset": "7", + }, + ], + "targetType": "apex", + }, + { + "code": "AvoidGlobalModifier", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "1", + "linter": "pmd", + "message": "Avoid using global modifier", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "69", + "offset": "7", + }, + ], + "targetType": "apex", + }, + { + "code": "ApexDoc", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "2", + "linter": "pmd", + "message": "Missing ApexDoc comment", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "41", + "offset": "33", + }, + ], + "targetType": "apex", + }, + { + "code": "NoPackage", + "column": "1", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "3", + "linter": "pmd", + "message": "All classes, interfaces, enums and annotations must belong to a named package", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "5", + "offset": "23", + }, + ], + "targetType": "java", + }, + { + "code": "UseUtilityClass", + "column": "1", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "3", + "linter": "pmd", + "message": "This utility class has a non-private constructor", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "5", + "offset": "23", + }, + ], + "targetType": "java", + }, + ], + "lintActions": [ + { + "command": "lint-apex", + "fileGroupName": "apex", + "linter": "pmd", + "paths": [ + "test_data/apex.in.cls", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-apex", + "fileGroupName": "apex", + "linter": "pmd", + "paths": [ + "test_data/apex.in.cls", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/pmd/test_data/pmd_v7.13.0_CUSTOM.check.shot b/linters/pmd/test_data/pmd_v7.13.0_CUSTOM.check.shot new file mode 100644 index 000000000..985d42e2c --- /dev/null +++ b/linters/pmd/test_data/pmd_v7.13.0_CUSTOM.check.shot @@ -0,0 +1,141 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter pmd test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "ApexDoc", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "1", + "linter": "pmd", + "message": "Missing ApexDoc comment", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "69", + "offset": "7", + }, + ], + "targetType": "apex", + }, + { + "code": "AvoidGlobalModifier", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "1", + "linter": "pmd", + "message": "Avoid using global modifier", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "69", + "offset": "7", + }, + ], + "targetType": "apex", + }, + { + "code": "ApexDoc", + "column": "8", + "file": "test_data/apex.in.cls", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "2", + "linter": "pmd", + "message": "Missing ApexDoc comment", + "ranges": [ + { + "filePath": "test_data/apex.in.cls", + "length": "41", + "offset": "33", + }, + ], + "targetType": "apex", + }, + { + "code": "NoPackage", + "column": "1", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "3", + "linter": "pmd", + "message": "All classes, interfaces, enums and annotations must belong to a named package", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "5", + "offset": "23", + }, + ], + "targetType": "java", + }, + { + "code": "UseUtilityClass", + "column": "1", + "file": "test_data/hello.in.java", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "3", + "linter": "pmd", + "message": "This utility class has a non-private constructor", + "ranges": [ + { + "filePath": "test_data/hello.in.java", + "length": "5", + "offset": "23", + }, + ], + "targetType": "java", + }, + ], + "lintActions": [ + { + "command": "lint-apex", + "fileGroupName": "apex", + "linter": "pmd", + "paths": [ + "test_data/apex.in.cls", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-apex", + "fileGroupName": "apex", + "linter": "pmd", + "paths": [ + "test_data/apex.in.cls", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint-java", + "fileGroupName": "java", + "linter": "pmd", + "paths": [ + "test_data/hello.in.java", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/pragma-once/plugin.yaml b/linters/pragma-once/plugin.yaml index 249af1a37..b4e65c0c5 100644 --- a/linters/pragma-once/plugin.yaml +++ b/linters/pragma-once/plugin.yaml @@ -4,6 +4,7 @@ lint: # Inserts "#pragma once" if it wasn't there - name: pragma-once files: [c-header, c++-header] + description: Enforces "#pragma once" in header files commands: - name: format platforms: [windows] diff --git a/linters/pragma-once/pragma_once.test.ts b/linters/pragma-once/pragma_once.test.ts index 2d5dfd16e..c339a2131 100644 --- a/linters/pragma-once/pragma_once.test.ts +++ b/linters/pragma-once/pragma_once.test.ts @@ -1,4 +1,4 @@ import { linterFmtTest } from "tests"; -// TODO(Tyler): We will eventually need to add a couple more test cases involving failure modes and other autofixes. +// A simple formatter test to run 'pragma-once' on 'test_data/basic.in.hh' linterFmtTest({ linterName: "pragma-once" }); diff --git a/linters/pre-commit-hooks/plugin.yaml b/linters/pre-commit-hooks/plugin.yaml index 1dcc86fd7..49b60027c 100644 --- a/linters/pre-commit-hooks/plugin.yaml +++ b/linters/pre-commit-hooks/plugin.yaml @@ -5,6 +5,7 @@ lint: known_good_version: 4.4.0 runtime: python package: pre-commit-hooks + description: A collection of pre-commit tools for Python suggest_if: never environment: - name: PATH diff --git a/linters/prettier/plugin.yaml b/linters/prettier/plugin.yaml index f0507aede..f01f16da8 100644 --- a/linters/prettier/plugin.yaml +++ b/linters/prettier/plugin.yaml @@ -13,6 +13,7 @@ lint: - typescript - yaml - css + - postcss - sass - html - markdown @@ -20,6 +21,7 @@ lint: - javascript - graphql - prettier_supported_configs + description: A universal formatter commands: - name: format output: sarif diff --git a/linters/prisma/plugin.yaml b/linters/prisma/plugin.yaml index 1aceb385f..1b1ee5a48 100644 --- a/linters/prisma/plugin.yaml +++ b/linters/prisma/plugin.yaml @@ -6,6 +6,7 @@ lint: files: [prisma] known_good_version: 4.16.1 suggest_if: never + description: A Prisma formatter commands: - name: format platforms: [windows] diff --git a/linters/psscriptanalyzer/plugin.yaml b/linters/psscriptanalyzer/plugin.yaml index 3b47d1091..78585b1a1 100644 --- a/linters/psscriptanalyzer/plugin.yaml +++ b/linters/psscriptanalyzer/plugin.yaml @@ -2,6 +2,18 @@ version: 0.1 downloads: - name: psscriptanalyzer downloads: + - os: + linux: linux + windows: windows + macos: macos + version: <=1.22.0 + url: https://github.com/PowerShell/PSScriptAnalyzer/releases/download/${version}/PSScriptAnalyzer.${version}.nupkg + - os: + linux: linux + windows: windows + macos: macos + version: <=1.23.0 + url: https://github.com/PowerShell/PSScriptAnalyzer/releases/download/v${version}/PSScriptAnalyzer.${version}.nupkg - os: linux: linux windows: windows @@ -30,6 +42,7 @@ lint: files: [powershell] main_tool: psscriptanalyzer tools: [converttosarif, pwsh] + description: Linter for PowerShell scripts commands: - name: Invoke-ScriptAnalyzer run: pwsh -f ${cwd}/lint.ps1 -FilePath ${target} -OutputPath ${tmpfile} diff --git a/linters/pylint/plugin.yaml b/linters/pylint/plugin.yaml index fa6163105..def3cfe4b 100644 --- a/linters/pylint/plugin.yaml +++ b/linters/pylint/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: pylint files: [python] + description: Static code analysis for Python commands: - name: lint # Custom parser type defined in the trunk cli to handle pylint's JSON output. diff --git a/linters/pyright/plugin.yaml b/linters/pyright/plugin.yaml index c317b4fba..9625a550f 100644 --- a/linters/pyright/plugin.yaml +++ b/linters/pyright/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: pyright files: [python] suggest_if: config_present + description: Static type checker for Python commands: - name: lint output: sarif @@ -18,7 +19,7 @@ lint: success_codes: [0, 1] read_output_from: stdout batch: true - cache_results: true + cache_results: false parser: runtime: python run: python3 ${plugin}/linters/pyright/pyright_to_sarif.py diff --git a/linters/pyright/test_data/pyright_v1.1.359_basic.check.shot b/linters/pyright/test_data/pyright_v1.1.359_basic.check.shot new file mode 100644 index 000000000..a2f529712 --- /dev/null +++ b/linters/pyright/test_data/pyright_v1.1.359_basic.check.shot @@ -0,0 +1,225 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter pyright test basic 1`] = ` +{ + "issues": [ + { + "code": "reportAttributeAccessIssue", + "column": "57", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "pyright", + "message": ""Enum" is unknown import symbol", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "4", + "offset": "56", + }, + ], + "targetType": "python", + }, + { + "column": "13", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "15", + "linter": "pyright", + "message": "Type of "a.x" is "int | str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "384", + }, + ], + "targetType": "python", + }, + { + "code": "reportAttributeAccessIssue", + "column": "3", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "pyright", + "message": "Cannot assign to attribute "x" for class "A" +  Expression of type "float" cannot be assigned to attribute "x" of class "A" +    Type "float" is incompatible with type "int | str" +      "float" is incompatible with "int" +      "float" is incompatible with "str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "462", + }, + ], + "targetType": "python", + }, + { + "code": "reportUndefinedVariable", + "column": "8", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportUndefinedVariable", + "level": "LEVEL_HIGH", + "line": "24", + "linter": "pyright", + "message": ""ClassVar" is not defined", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "8", + "offset": "602", + }, + ], + "targetType": "python", + }, + { + "code": "reportAttributeAccessIssue", + "column": "9", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "pyright", + "message": "Cannot access attribute "z" for class "type[A]" +  Attribute "z" is unknown", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "742", + }, + ], + "targetType": "python", + }, + { + "code": "reportReturnType", + "column": "29", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportReturnType", + "level": "LEVEL_HIGH", + "line": "39", + "linter": "pyright", + "message": "Function with declared return type "bool" must return value on all code paths +  "None" is incompatible with "bool"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "4", + "offset": "864", + }, + ], + "targetType": "python", + }, + { + "code": "reportReturnType", + "column": "12", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportReturnType", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "pyright", + "message": "Expression of type "int" is incompatible with return type "str" +  "int" is incompatible with "str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "105", + }, + ], + "targetType": "python", + }, + { + "column": "25", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "51", + "linter": "pyright", + "message": "Type of "val" is "int"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "1128", + }, + ], + "targetType": "python", + }, + { + "column": "39", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "54", + "linter": "pyright", + "message": "Type of "val" is "int"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "1244", + }, + ], + "targetType": "python", + }, + { + "code": "reportRedeclaration", + "column": "7", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportRedeclaration", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "pyright", + "message": "Class declaration "A" is obscured by a declaration of the same name", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "183", + }, + ], + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python", + "linter": "pyright", + "paths": [ + "test_data/basic.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "pyright", + "paths": [ + "test_data/basic.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/pyright/test_data/pyright_v1.1.378_basic.check.shot b/linters/pyright/test_data/pyright_v1.1.378_basic.check.shot new file mode 100644 index 000000000..1d230608a --- /dev/null +++ b/linters/pyright/test_data/pyright_v1.1.378_basic.check.shot @@ -0,0 +1,226 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter pyright test basic 1`] = ` +{ + "issues": [ + { + "code": "reportAttributeAccessIssue", + "column": "57", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "pyright", + "message": ""Enum" is unknown import symbol", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "4", + "offset": "56", + }, + ], + "targetType": "python", + }, + { + "column": "13", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "15", + "linter": "pyright", + "message": "Type of "a.x" is "int | str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "384", + }, + ], + "targetType": "python", + }, + { + "code": "reportAttributeAccessIssue", + "column": "3", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "18", + "linter": "pyright", + "message": "Cannot assign to attribute "x" for class "A" +  Expression of type "float" cannot be assigned to attribute "x" of class "A" +    Type "float" is not assignable to type "int | str" +      "float" is not assignable to "int" +      "float" is not assignable to "str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "462", + }, + ], + "targetType": "python", + }, + { + "code": "reportUndefinedVariable", + "column": "8", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportUndefinedVariable", + "level": "LEVEL_HIGH", + "line": "24", + "linter": "pyright", + "message": ""ClassVar" is not defined", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "8", + "offset": "602", + }, + ], + "targetType": "python", + }, + { + "code": "reportAttributeAccessIssue", + "column": "9", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportAttributeAccessIssue", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "pyright", + "message": "Cannot access attribute "z" for class "type[A]" +  Attribute "z" is unknown", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "742", + }, + ], + "targetType": "python", + }, + { + "code": "reportReturnType", + "column": "29", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportReturnType", + "level": "LEVEL_HIGH", + "line": "39", + "linter": "pyright", + "message": "Function with declared return type "bool" must return value on all code paths +  "None" is not assignable to "bool"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "4", + "offset": "864", + }, + ], + "targetType": "python", + }, + { + "code": "reportReturnType", + "column": "12", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportReturnType", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "pyright", + "message": "Type "int" is not assignable to return type "str" +  "int" is not assignable to "str"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "105", + }, + ], + "targetType": "python", + }, + { + "column": "25", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "51", + "linter": "pyright", + "message": "Type of "val" is "int"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "1128", + }, + ], + "targetType": "python", + }, + { + "column": "39", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#", + "level": "LEVEL_LOW", + "line": "54", + "linter": "pyright", + "message": "Type of "val" is "int"", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "3", + "offset": "1244", + }, + ], + "targetType": "python", + }, + { + "code": "reportRedeclaration", + "column": "7", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://github.com/microsoft/pyright/blob/main/docs/configuration.md#reportRedeclaration", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "pyright", + "message": "Class declaration "A" is obscured by a declaration of the same name", + "ranges": [ + { + "filePath": "test_data/basic.in.py", + "length": "1", + "offset": "183", + }, + ], + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python", + "linter": "pyright", + "paths": [ + "test_data/basic.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "pyright", + "paths": [ + "test_data/basic.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/regal/plugin.yaml b/linters/regal/plugin.yaml index 767f9c10d..ff0dfc4f1 100644 --- a/linters/regal/plugin.yaml +++ b/linters/regal/plugin.yaml @@ -27,6 +27,7 @@ lint: main_tool: regal known_good_version: 0.18.0 suggest_if: config_present + description: Linter for Rego files direct_configs: - .regal/config.yaml commands: diff --git a/linters/regal/test_data/regal_v0.21.0_basic.check.shot b/linters/regal/test_data/regal_v0.21.0_basic.check.shot new file mode 100644 index 000000000..1eeb83fbf --- /dev/null +++ b/linters/regal/test_data/regal_v0.21.0_basic.check.shot @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter regal test basic 1`] = ` +{ + "issues": [ + { + "code": "opa-fmt", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "File should be formatted with \`opa fmt\`", + "targetType": "rego", + }, + { + "code": "prefer-snake-case", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Prefer snake_case for names", + "targetType": "rego", + }, + { + "code": "non-raw-regex-pattern", + "column": "27", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Use raw strings for regex patterns", + "targetType": "rego", + }, + { + "code": "use-assignment-operator", + "column": "15", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "regal", + "message": "Prefer := over = for assignment", + "targetType": "rego", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/regal/test_data/regal_v0.25.0_basic.check.shot b/linters/regal/test_data/regal_v0.25.0_basic.check.shot new file mode 100644 index 000000000..f5b1fda65 --- /dev/null +++ b/linters/regal/test_data/regal_v0.25.0_basic.check.shot @@ -0,0 +1,90 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter regal test basic 1`] = ` +{ + "issues": [ + { + "code": "opa-fmt", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "File should be formatted with \`opa fmt\`", + "targetType": "rego", + }, + { + "code": "prefer-snake-case", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Prefer snake_case for names", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "10", + "offset": "119", + }, + ], + "targetType": "rego", + }, + { + "code": "non-raw-regex-pattern", + "column": "27", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Use raw strings for regex patterns", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "18", + "offset": "145", + }, + ], + "targetType": "rego", + }, + { + "code": "use-assignment-operator", + "column": "15", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "regal", + "message": "Prefer := over = for assignment", + "targetType": "rego", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/regal/test_data/regal_v0.26.0_basic.check.shot b/linters/regal/test_data/regal_v0.26.0_basic.check.shot new file mode 100644 index 000000000..f848c5b2b --- /dev/null +++ b/linters/regal/test_data/regal_v0.26.0_basic.check.shot @@ -0,0 +1,101 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter regal test basic 1`] = ` +{ + "issues": [ + { + "code": "opa-fmt", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "File should be formatted with \`opa fmt\`", + "targetType": "rego", + }, + { + "code": "directory-package-mismatch", + "column": "9", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "Directory structure should mirror package", + "targetType": "rego", + }, + { + "code": "prefer-snake-case", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Prefer snake_case for names", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "10", + "offset": "119", + }, + ], + "targetType": "rego", + }, + { + "code": "non-raw-regex-pattern", + "column": "27", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Use raw strings for regex patterns", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "18", + "offset": "145", + }, + ], + "targetType": "rego", + }, + { + "code": "use-assignment-operator", + "column": "15", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "regal", + "message": "Prefer := over = for assignment", + "targetType": "rego", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/regal/test_data/regal_v0.28.0_basic.check.shot b/linters/regal/test_data/regal_v0.28.0_basic.check.shot new file mode 100644 index 000000000..9f2a88448 --- /dev/null +++ b/linters/regal/test_data/regal_v0.28.0_basic.check.shot @@ -0,0 +1,115 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter regal test basic 1`] = ` +{ + "issues": [ + { + "code": "opa-fmt", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "File should be formatted with \`opa fmt\`", + "targetType": "rego", + }, + { + "code": "directory-package-mismatch", + "column": "9", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "regal", + "message": "Directory structure should mirror package", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "5", + "offset": "8", + }, + ], + "targetType": "rego", + }, + { + "code": "prefer-snake-case", + "column": "1", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Prefer snake_case for names", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "10", + "offset": "119", + }, + ], + "targetType": "rego", + }, + { + "code": "non-raw-regex-pattern", + "column": "27", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "regal", + "message": "Use raw strings for regex patterns", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "18", + "offset": "145", + }, + ], + "targetType": "rego", + }, + { + "code": "use-assignment-operator", + "column": "15", + "file": "test_data/basic.in.rego", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "regal", + "message": "Prefer := over = for assignment", + "ranges": [ + { + "filePath": "test_data/basic.in.rego", + "length": "1", + "offset": "45", + }, + ], + "targetType": "rego", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "rego", + "linter": "regal", + "paths": [ + "test_data/basic.in.rego", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/remark-lint/plugin.yaml b/linters/remark-lint/plugin.yaml index 250cbd66e..3f91593e4 100644 --- a/linters/remark-lint/plugin.yaml +++ b/linters/remark-lint/plugin.yaml @@ -4,6 +4,7 @@ lint: - name: remark-lint supported_platforms: [linux, macos] files: [markdown] + description: A markdown linter and formatter package: remark-cli extra_packages: - remark-preset-lint-consistent diff --git a/linters/remark-lint/test_data/remark_lint_v11.0.0_basic.check.shot b/linters/remark-lint/test_data/remark_lint_v11.0.0_basic.check.shot index 61d64ba93..77a9f4921 100644 --- a/linters/remark-lint/test_data/remark_lint_v11.0.0_basic.check.shot +++ b/linters/remark-lint/test_data/remark_lint_v11.0.0_basic.check.shot @@ -5,13 +5,24 @@ exports[`Testing linter remark-lint test basic 1`] = ` "issues": [ { "code": "list-item-indent", - "column": "4", + "column": "1", + "file": "test_data/basic.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "remark-lint", + "message": "Unexpected \`2\` spaces between list item marker and content, expected \`1\` space, remove \`1\` space", + "targetType": "markdown", + }, + { + "code": "list-item-indent", + "column": "1", "file": "test_data/basic.in.md", "issueClass": "ISSUE_CLASS_EXISTING", "level": "LEVEL_HIGH", "line": "1", "linter": "remark-lint", - "message": "Incorrect list-item indent: add 1 space", + "message": "Unexpected \`3\` spaces between list item marker and content, expected \`1\` space, remove \`2\` spaces", "targetType": "markdown", }, ], diff --git a/linters/remark-lint/test_data/remark_lint_v12.0.0_basic.check.shot b/linters/remark-lint/test_data/remark_lint_v12.0.0_basic.check.shot index 61d64ba93..ecff80f23 100644 --- a/linters/remark-lint/test_data/remark_lint_v12.0.0_basic.check.shot +++ b/linters/remark-lint/test_data/remark_lint_v12.0.0_basic.check.shot @@ -11,7 +11,18 @@ exports[`Testing linter remark-lint test basic 1`] = ` "level": "LEVEL_HIGH", "line": "1", "linter": "remark-lint", - "message": "Incorrect list-item indent: add 1 space", + "message": "Unexpected \`2\` spaces between list item marker and content, expected \`1\` space, remove \`1\` space", + "targetType": "markdown", + }, + { + "code": "list-item-indent", + "column": "5", + "file": "test_data/basic.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "remark-lint", + "message": "Unexpected \`3\` spaces between list item marker and content, expected \`1\` space, remove \`2\` spaces", "targetType": "markdown", }, ], diff --git a/linters/renovate/plugin.yaml b/linters/renovate/plugin.yaml index d61bbcefb..f3b7d5b62 100644 --- a/linters/renovate/plugin.yaml +++ b/linters/renovate/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: renovate files: [renovate-config] tools: [renovate] + description: Validates Renovate configuration files commands: - name: validate platforms: [windows] diff --git a/linters/renovate/renovate.test.ts b/linters/renovate/renovate.test.ts index 5ec5f1d94..d64ff51df 100644 --- a/linters/renovate/renovate.test.ts +++ b/linters/renovate/renovate.test.ts @@ -1,7 +1,7 @@ import { customLinterCheckTest } from "tests"; import { osTimeoutMultiplier, TEST_DATA } from "tests/utils"; -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); customLinterCheckTest({ linterName: "renovate", diff --git a/linters/rome/plugin.yaml b/linters/rome/plugin.yaml index 6b7b6baa3..46ece471b 100644 --- a/linters/rome/plugin.yaml +++ b/linters/rome/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: # No longer maintained. Succeeded by the biome linter+formatter - name: rome + description: A static analyzer for web projects files: - typescript - javascript diff --git a/linters/rubocop/plugin.yaml b/linters/rubocop/plugin.yaml index 430a444af..5c449bbd1 100644 --- a/linters/rubocop/plugin.yaml +++ b/linters/rubocop/plugin.yaml @@ -2,6 +2,7 @@ version: 0.1 lint: definitions: - name: rubocop + description: A Ruby static code analyzer and formatter files: [ruby, gemspec] direct_configs: [.rubocop.yml] suggest_if: config_present diff --git a/linters/rubocop/rubocop.test.ts b/linters/rubocop/rubocop.test.ts index 5a417b719..861f59784 100644 --- a/linters/rubocop/rubocop.test.ts +++ b/linters/rubocop/rubocop.test.ts @@ -5,7 +5,7 @@ import { osTimeoutMultiplier, skipOS, TEST_DATA } from "tests/utils"; // Note that the first-time ruby/rufo download can sometimes take a while. // Ruby build is quite slow on Mac, so only run tests on linux for now -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); const preCheck = (driver: TrunkLintDriver) => { if (process.platform == "win32") { diff --git a/linters/ruff/README.md b/linters/ruff/README.md new file mode 100644 index 000000000..fc5556747 --- /dev/null +++ b/linters/ruff/README.md @@ -0,0 +1,75 @@ +# ruff + +## Ignores + +Here is a conversion guide for +[ruff-style ignores](https://docs.astral.sh/ruff/linter/#disabling-fixes) and +[trunk-ignores](https://docs.trunk.io/code-quality/linters/ignoring-issues-and-files): + +### Same Line + +```python +x = 1 # trunk-ignore(ruff) + +x = 1 # noqa +``` + +### Next Line + +```python +# trunk-ignore(ruff) +x = 1 + +# Unsupported in ruff +x = 1 +``` + +### With Comments + +```python +x = 1 # trunk-ignore(ruff): Expected var + +x = 1 # noqa Expected var +``` + +### Specific Issue + +```python +x = 1 # trunk-ignore(ruff/F841) + +x = 1 # noqa: F841 +``` + +### Multiple Issues + +```python +x = 1 # trunk-ignore(ruff/E741,ruff/F841) + +x = 1 # noqa: E741, F841 +``` + +### Blocks + +```python +# trunk-ignore-begin(ruff/F841) +x = 1 +# trunk-ignore-end(ruff/F841) + +# Unsupported in ruff +x = 1 +``` + +### Whole File + +```python +# trunk-ignore-all(ruff/F841) +x = 1 + +# ruff: noqa: F841 +x = 1 +``` + +### Notes + +You can also configure which rules to use and which files to apply them to using +[ruff config files](https://docs.astral.sh/ruff/settings/#lint_per-file-ignores). diff --git a/linters/ruff/plugin.yaml b/linters/ruff/plugin.yaml index e74775f4b..3d6988a2d 100644 --- a/linters/ruff/plugin.yaml +++ b/linters/ruff/plugin.yaml @@ -9,11 +9,23 @@ tools: lint: definitions: - name: ruff - files: [python] + description: A Python linter and formatter commands: + - name: lint + # As of ruff v0.6.0, ruff runs by default on jupyter notebooks + version: ">=0.6.0" + files: [python, python-interface, jupyter] + run: ruff check --cache-dir ${cachedir} --output-format json ${target} + output: sarif + parser: + runtime: python + run: python3 ${cwd}/ruff_to_sarif.py 0 + batch: true + success_codes: [0, 1] - name: lint # As of ruff v0.1.0, --format is replaced with --output-format version: ">=0.1.0" + files: [python, python-interface] run: ruff check --cache-dir ${cachedir} --output-format json ${target} output: sarif parser: @@ -24,6 +36,7 @@ lint: - name: lint # As of ruff v0.0.266, column edits are 1-indexed version: ">=0.0.266" + files: [python, python-interface] run: ruff check --cache-dir ${cachedir} --format json ${target} output: sarif parser: @@ -32,6 +45,7 @@ lint: batch: true success_codes: [0, 1] - name: lint + files: [python, python-interface] run: ruff check --cache-dir ${cachedir} --format json ${target} output: sarif parser: @@ -40,6 +54,7 @@ lint: batch: true success_codes: [0, 1] - name: format + files: [python, python-interface] output: rewrite run: ruff format ${target} success_codes: [0] @@ -62,17 +77,19 @@ lint: parse_regex: ruff ${semver} run: ruff --version + # Not necessary if ruff>=0.6.0 - name: ruff-nbqa + description: A Python linter for Jupyter notebooks files: [jupyter] commands: - name: lint - run: nbqa ruff --cache-dir=${cachedir} ${target} + run: nbqa 'ruff check --cache-dir=${cachedir} --quiet' ${target} output: pass_fail batch: true success_codes: [0, 1] runtime: python package: ruff - extra_packages: [nbqa==1.6.3] + extra_packages: [nbqa==1.8.5] direct_configs: [ruff.toml] affects_cache: - pyproject.toml diff --git a/linters/ruff/ruff.test.ts b/linters/ruff/ruff.test.ts index bd322b90f..4427e030a 100644 --- a/linters/ruff/ruff.test.ts +++ b/linters/ruff/ruff.test.ts @@ -1,8 +1,23 @@ +import semver from "semver"; import { linterCheckTest, linterFmtTest } from "tests"; import { TrunkLintDriver } from "tests/driver"; import { skipOS } from "tests/utils"; -linterCheckTest({ linterName: "ruff", namedTestPrefixes: ["basic"] }); +linterCheckTest({ linterName: "ruff", namedTestPrefixes: ["basic", "interface", "syntax"] }); + +const skipJupyterTestIf = (version?: string) => { + if (!version || !semver.valid(version)) { + // Run if version is KGV or a string, or error loudly if malformed. + return false; + } + return semver.lt(version, "0.6.0"); +}; + +linterCheckTest({ + linterName: "ruff", + namedTestPrefixes: ["basic_nb"], + skipTestIf: skipJupyterTestIf, +}); // ruff-nbqa still runs correctly on Windows, but the diagnostics are slightly different from the assertions. linterCheckTest({ diff --git a/linters/ruff/ruff_to_sarif.py b/linters/ruff/ruff_to_sarif.py index 20a81ace9..73e2afefc 100755 --- a/linters/ruff/ruff_to_sarif.py +++ b/linters/ruff/ruff_to_sarif.py @@ -30,7 +30,8 @@ def get_region(entry, column_offset=0): continue filepath = result["filename"] - rule_id = result["code"] + # Ruff will set code to null for syntax errors + rule_id = result["code"] or "E999" message = result["message"] sarif_result = { diff --git a/linters/ruff/test_data/interface.in.pyi b/linters/ruff/test_data/interface.in.pyi new file mode 100644 index 000000000..ac27d5d56 --- /dev/null +++ b/linters/ruff/test_data/interface.in.pyi @@ -0,0 +1,51 @@ +# Based on test file input from astral-sh/ruff +import json + +from typing import Any, Sequence + +class MissingCommand(TypeError): ... +class AnoherClass: ... + +def a(): ... + +@overload +def a(arg: int): ... + +@overload +def a(arg: int, name: str): ... + + +def grouped1(): ... +def grouped2(): ... +def grouped3( ): ... + + +class BackendProxy: + backend_module: str + backend_object: str | None + backend: Any + + def grouped1(): ... + def grouped2(): ... + def grouped3( ): ... + @decorated + + def with_blank_line(): ... + + + def ungrouped(): ... +a = "test" + +def function_def(): + pass +b = "test" + + +def outer(): + def inner(): + pass + def inner2(): + pass + +class Foo: ... +class Bar: ... diff --git a/linters/ruff/test_data/ruff_nbqa_v0.0.250_basic_nb.check.shot b/linters/ruff/test_data/ruff_nbqa_v0.0.250_basic_nb.check.shot index a777a1de5..dbbfc7fac 100644 --- a/linters/ruff/test_data/ruff_nbqa_v0.0.250_basic_nb.check.shot +++ b/linters/ruff/test_data/ruff_nbqa_v0.0.250_basic_nb.check.shot @@ -9,9 +9,7 @@ exports[`Testing linter ruff-nbqa test basic_nb 1`] = ` "issueClass": "ISSUE_CLASS_EXISTING", "level": "LEVEL_HIGH", "linter": "ruff-nbqa", - "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused -Found 1 error. -[*] 1 potentially fixable with the --fix option.", + "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused", "targetType": "jupyter", }, ], diff --git a/linters/ruff/test_data/ruff_nbqa_v0.1.0_basic_nb.check.shot b/linters/ruff/test_data/ruff_nbqa_v0.1.0_basic_nb.check.shot index 699819205..dbbfc7fac 100644 --- a/linters/ruff/test_data/ruff_nbqa_v0.1.0_basic_nb.check.shot +++ b/linters/ruff/test_data/ruff_nbqa_v0.1.0_basic_nb.check.shot @@ -9,9 +9,7 @@ exports[`Testing linter ruff-nbqa test basic_nb 1`] = ` "issueClass": "ISSUE_CLASS_EXISTING", "level": "LEVEL_HIGH", "linter": "ruff-nbqa", - "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused -Found 1 error. -[*] 1 fixable with the \`--fix\` option.", + "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused", "targetType": "jupyter", }, ], diff --git a/linters/ruff/test_data/ruff_nbqa_v0.5.0_basic_nb.check.shot b/linters/ruff/test_data/ruff_nbqa_v0.5.0_basic_nb.check.shot new file mode 100644 index 000000000..a7a64099f --- /dev/null +++ b/linters/ruff/test_data/ruff_nbqa_v0.5.0_basic_nb.check.shot @@ -0,0 +1,48 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ruff-nbqa test basic_nb 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": "test_data/basic_nb.in.ipynb", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "ruff-nbqa", + "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused + | +1 | # %%NBQA-CELL-SEP +2 | import os + | ^^ F401 +3 | +4 | print("Hello World!") + | + = help: Remove unused import: \`os\`", + "targetType": "jupyter", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff-nbqa", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff-nbqa", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/ruff_nbqa_v0.9.2_basic_nb.check.shot b/linters/ruff/test_data/ruff_nbqa_v0.9.2_basic_nb.check.shot new file mode 100644 index 000000000..339a109c5 --- /dev/null +++ b/linters/ruff/test_data/ruff_nbqa_v0.9.2_basic_nb.check.shot @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter ruff-nbqa test basic_nb 1`] = ` +{ + "issues": [ + { + "code": "error", + "file": "test_data/basic_nb.in.ipynb", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "ruff-nbqa", + "message": "/tmp/plugins_/test_data/basic_nb.in.ipynb:cell_1:1:8: F401 [*] \`os\` imported but unused + | +1 | # %%NBQA-CELL-SEP +2 | import os + | ^^ F401 +3 | +4 | print("Hello World!") + | + = help: Remove unused import: \`os\`", + "targetType": "jupyter", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff-nbqa", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff-nbqa", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/ruff_v0.0.250_interface.check.shot b/linters/ruff/test_data/ruff_v0.0.250_interface.check.shot new file mode 100644 index 000000000..2df3cf57b --- /dev/null +++ b/linters/ruff/test_data/ruff_v0.0.250_interface.check.shot @@ -0,0 +1,208 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ruff test interface 1`] = ` +{ + "issues": [ + { + "code": "F821", + "column": "2", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F821", + "level": "LEVEL_HIGH", + "line": "11", + "linter": "ruff", + "message": "Undefined name \`overload\`", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "8", + "offset": "170", + }, + ], + "targetType": "python-interface", + }, + { + "code": "F811", + "column": "5", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F811", + "level": "LEVEL_HIGH", + "line": "12", + "linter": "ruff", + "message": "Redefinition of unused \`a\` from line 9", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "1", + "offset": "183", + }, + ], + "targetType": "python-interface", + }, + { + "code": "F821", + "column": "2", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F821", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ruff", + "message": "Undefined name \`overload\`", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "8", + "offset": "202", + }, + ], + "targetType": "python-interface", + }, + { + "code": "F811", + "column": "5", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F811", + "level": "LEVEL_HIGH", + "line": "15", + "linter": "ruff", + "message": "Redefinition of unused \`a\` from line 12", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "1", + "offset": "215", + }, + ], + "targetType": "python-interface", + }, + { + "autofixOptions": [ + { + "message": "Remove unused import: \`json\`", + "replacements": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "12", + "offset": "47", + }, + ], + }, + ], + "code": "F401", + "column": "8", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F401", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ruff", + "message": "\`json\` imported but unused", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "4", + "offset": "54", + }, + ], + "targetType": "python-interface", + }, + { + "code": "F821", + "column": "6", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F821", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ruff", + "message": "Undefined name \`decorated\`", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "9", + "offset": "479", + }, + ], + "targetType": "python-interface", + }, + { + "code": "F811", + "column": "1", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F811", + "level": "LEVEL_HIGH", + "line": "37", + "linter": "ruff", + "message": "Redefinition of unused \`a\` from line 15", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "1", + "offset": "548", + }, + ], + "targetType": "python-interface", + }, + { + "autofixOptions": [ + { + "message": "Remove unused import: \`typing.Sequence\`", + "replacements": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "32", + "offset": "60", + "replacementText": "from typing import Any", + }, + ], + }, + ], + "code": "F401", + "column": "25", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F401", + "level": "LEVEL_HIGH", + "line": "4", + "linter": "ruff", + "message": "\`typing.Sequence\` imported but unused", + "ranges": [ + { + "filePath": "test_data/interface.in.pyi", + "length": "8", + "offset": "84", + }, + ], + "targetType": "python-interface", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python-interface", + "linter": "ruff", + "paths": [ + "test_data/interface.in.pyi", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python-interface", + "linter": "ruff", + "paths": [ + "test_data/interface.in.pyi", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/ruff_v0.2.1_basic_nb.check.shot b/linters/ruff/test_data/ruff_v0.2.1_basic_nb.check.shot new file mode 100644 index 000000000..3fbd50f47 --- /dev/null +++ b/linters/ruff/test_data/ruff_v0.2.1_basic_nb.check.shot @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ruff test basic_nb 1`] = ` +{ + "issues": [], + "lintActions": [], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/ruff_v0.2.1_syntax.check.shot b/linters/ruff/test_data/ruff_v0.2.1_syntax.check.shot new file mode 100644 index 000000000..8a963657f --- /dev/null +++ b/linters/ruff/test_data/ruff_v0.2.1_syntax.check.shot @@ -0,0 +1,43 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ruff test syntax 1`] = ` +{ + "issues": [ + { + "code": "E999", + "column": "1", + "file": "test_data/syntax.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#E999", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "ruff", + "message": "SyntaxError: unexpected EOF while parsing", + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "python", + "linter": "ruff", + "paths": [ + "test_data/syntax.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "python", + "linter": "ruff", + "paths": [ + "test_data/syntax.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/ruff_v0.6.0_basic_nb.check.shot b/linters/ruff/test_data/ruff_v0.6.0_basic_nb.check.shot new file mode 100644 index 000000000..74225b28f --- /dev/null +++ b/linters/ruff/test_data/ruff_v0.6.0_basic_nb.check.shot @@ -0,0 +1,54 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ruff test basic_nb 1`] = ` +{ + "issues": [ + { + "autofixOptions": [ + { + "message": "Remove unused import: \`os\`", + "replacements": [ + { + "filePath": "test_data/basic_nb.in.ipynb", + "length": "2", + }, + ], + }, + ], + "code": "F401", + "column": "1", + "file": "test_data/basic_nb.in.ipynb", + "issueClass": "ISSUE_CLASS_EXISTING", + "issueUrl": "https://docs.astral.sh/ruff/rules/#F401", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "ruff", + "message": "\`os\` imported but unused", + "targetType": "jupyter", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "jupyter", + "linter": "ruff", + "paths": [ + "test_data/basic_nb.in.ipynb", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ruff/test_data/syntax.in.py b/linters/ruff/test_data/syntax.in.py new file mode 100644 index 000000000..4314b3c57 --- /dev/null +++ b/linters/ruff/test_data/syntax.in.py @@ -0,0 +1 @@ +def f(): { diff --git a/linters/rufo/plugin.yaml b/linters/rufo/plugin.yaml index 9fb8a3875..053810ab4 100644 --- a/linters/rufo/plugin.yaml +++ b/linters/rufo/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: rufo files: [ruby] + description: A Ruby formatter commands: - name: format output: rewrite diff --git a/linters/rufo/rufo.test.ts b/linters/rufo/rufo.test.ts index ab5e1e8fb..dc5b57c94 100644 --- a/linters/rufo/rufo.test.ts +++ b/linters/rufo/rufo.test.ts @@ -4,7 +4,7 @@ import { osTimeoutMultiplier, skipOS, TEST_DATA } from "tests/utils"; // Note that the first-time ruby/rufo download can sometimes take a while. // Ruby build is quite slow on Mac, so only run tests on linux for now -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); // Rufo succeeds on empty files customLinterCheckTest({ diff --git a/linters/rustfmt/plugin.yaml b/linters/rustfmt/plugin.yaml index b3408ebde..dca9105b1 100644 --- a/linters/rustfmt/plugin.yaml +++ b/linters/rustfmt/plugin.yaml @@ -4,6 +4,7 @@ lint: - name: rustfmt files: [rust] download: rust + description: A Rust formatter commands: - name: format output: rewrite diff --git a/linters/scalafmt/plugin.yaml b/linters/scalafmt/plugin.yaml index 2f4c47a0e..ca6c2656b 100644 --- a/linters/scalafmt/plugin.yaml +++ b/linters/scalafmt/plugin.yaml @@ -28,6 +28,7 @@ lint: tools: [scalafmt] direct_configs: [.scalafmt.conf] suggest_if: config_present + description: A Scala formatter commands: - name: format output: rewrite @@ -45,3 +46,5 @@ lint: parse_regex: scalafmt ${semver} run: scalafmt --version known_good_version: 3.4.3 + # We don't support this semver format, and it's a prerelease + known_bad_versions: [3.8.4-RC1, 3.9.0] diff --git a/linters/scalafmt/test_data/scalafmt_v3.9.1_basic.fmt.shot b/linters/scalafmt/test_data/scalafmt_v3.9.1_basic.fmt.shot new file mode 100644 index 000000000..1816be293 --- /dev/null +++ b/linters/scalafmt/test_data/scalafmt_v3.9.1_basic.fmt.shot @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing formatter scalafmt test basic 1`] = ` +"case class Demo(a: String, b: Int, c: Char) +" +`; diff --git a/linters/scalafmt/test_data/scalafmt_v3.9.1_empty.check.shot b/linters/scalafmt/test_data/scalafmt_v3.9.1_empty.check.shot new file mode 100644 index 000000000..180d1aacc --- /dev/null +++ b/linters/scalafmt/test_data/scalafmt_v3.9.1_empty.check.shot @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter scalafmt test empty 1`] = ` +{ + "issues": [], + "lintActions": [ + { + "command": "format", + "fileGroupName": "scala", + "linter": "scalafmt", + "paths": [ + "test_data/empty.in.scala", + ], + "verb": "TRUNK_VERB_FMT", + }, + ], + "taskFailures": [], + "unformattedFiles": [ + { + "column": "1", + "file": "test_data/empty.in.scala", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "scalafmt", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + ], +} +`; diff --git a/linters/semgrep/plugin.yaml b/linters/semgrep/plugin.yaml index cd752a03d..cbb048d68 100644 --- a/linters/semgrep/plugin.yaml +++ b/linters/semgrep/plugin.yaml @@ -5,10 +5,11 @@ tools: runtime: python package: semgrep shims: [semgrep] - known_good_version: 1.33.2 + known_good_version: 1.222.0 lint: definitions: - name: semgrep + description: Find bugs and enforce code standards supported_platforms: [linux, macos] files: [ALL] tools: [semgrep] diff --git a/linters/semgrep/semgrep.test.ts b/linters/semgrep/semgrep.test.ts index f96727f06..7c8e8dbbc 100644 --- a/linters/semgrep/semgrep.test.ts +++ b/linters/semgrep/semgrep.test.ts @@ -1,5 +1,31 @@ import { customLinterCheckTest } from "tests"; +import { type TrunkLintDriver } from "tests/driver"; import { skipOS, TEST_DATA } from "tests/utils"; +// NOTE(Tyler): As of semgrep 1.117.0 the first (and only the first) semgrep run may end up excluding the --include paths +const preCheck = (driver: TrunkLintDriver) => { + const trunkYamlPath = ".trunk/trunk.yaml"; + const currentContents = driver.readFile(trunkYamlPath); + const lintRegex = /\nlint:/; + const newContents = currentContents.replace( + lintRegex, + ` +lint: + definitions: + - name: semgrep + commands: + - name: check + run: semgrep --config=auto --sarif --output=\${tmpfile} --include=* --include=\${target} + +`, + ); + driver.writeFile(trunkYamlPath, newContents); +}; + // Note semgrep runs can take a while since they require downloading rulesets each time. -customLinterCheckTest({ linterName: "semgrep", args: TEST_DATA, skipTestIf: skipOS(["win32"]) }); +customLinterCheckTest({ + linterName: "semgrep", + preCheck, + args: `${TEST_DATA} --cache=false`, + skipTestIf: skipOS(["win32"]), +}); diff --git a/linters/semgrep/test_data/basic.go b/linters/semgrep/test_data/basic.go index a125c0d81..3d78ee9f3 100644 --- a/linters/semgrep/test_data/basic.go +++ b/linters/semgrep/test_data/basic.go @@ -8,3 +8,11 @@ func Md5Sum(text string) string { hasher := md5.New() return "" } + +func foo() { + // Note that the Go parser parses this to a Cast of a ParenExpr + x := f([]int("foo")) + + // ruleid: cast-symbol-prop + sink(x) +} diff --git a/linters/shellcheck/plugin.yaml b/linters/shellcheck/plugin.yaml index fea586b63..712e96ccf 100644 --- a/linters/shellcheck/plugin.yaml +++ b/linters/shellcheck/plugin.yaml @@ -31,6 +31,7 @@ lint: - name: shellcheck files: [shell] tools: [shellcheck] + description: Finds bugs in your shell scripts commands: - name: lint # Custom parser type defined in the trunk cli to handle rubocop's JSON output. diff --git a/linters/shfmt/plugin.yaml b/linters/shfmt/plugin.yaml index f0004aba8..efbb30e64 100644 --- a/linters/shfmt/plugin.yaml +++ b/linters/shfmt/plugin.yaml @@ -11,6 +11,7 @@ lint: definitions: - name: shfmt files: [shell] + description: A shell formatter commands: - name: format output: shfmt diff --git a/linters/snyk/plugin.yaml b/linters/snyk/plugin.yaml new file mode 100644 index 000000000..4849c5c64 --- /dev/null +++ b/linters/snyk/plugin.yaml @@ -0,0 +1,66 @@ +version: 0.1 +downloads: + - name: snyk + downloads: + - url: https://downloads.snyk.io/cli/v${version}/snyk-${os}-arm64 + cpu: arm_64 + os: + macos: macos + linux: linux + - url: https://downloads.snyk.io/cli/v${version}/snyk-${os} + cpu: x86_64 + os: + macos: macos + linux: linux + - url: https://downloads.snyk.io/cli/v${version}/snyk-win.exe + os: windows +tools: + definitions: + - name: snyk + download: snyk + known_good_version: 1.1295.0 + shims: [snyk] + health_checks: + - command: snyk --version + parse_regex: ${semver} +lint: + definitions: + - name: snyk + tools: [snyk] + suggest_if: config_present + description: Security scanning tool for code, dependencies and containers + known_good_version: 1.1295.0 + commands: + - name: test + files: [lockfile] + output: sarif + run: snyk test --sarif --skip-unresolved --file=${target} + success_codes: [0, 1] # Snyk returns 1 when vulnerabilities are found + read_output_from: stdout + batch: false + is_security: true + - name: code + files: [javascript, typescript, java, python] + output: sarif + run: snyk code test --sarif . + run_from: ${parent} + success_codes: [0, 1] + read_output_from: stdout + sandbox_type: copy_targets + batch: true + is_security: true + - name: container + files: [docker] + output: sarif + run: snyk container test --sarif ${target} + success_codes: [0, 1] + read_output_from: stdout + batch: true + is_security: true + direct_configs: [.snyk] + environment: + - name: SNYK_TOKEN + optional: true + value: ${env.SNYK_TOKEN} + - name: PATH + list: ["${linter}", "${env.PATH}"] diff --git a/linters/snyk/snyk.test.ts b/linters/snyk/snyk.test.ts new file mode 100644 index 000000000..91fa6a531 --- /dev/null +++ b/linters/snyk/snyk.test.ts @@ -0,0 +1,4 @@ +import { linterCheckTest } from "tests"; + +// Requires SNYK_TOKEN to run +linterCheckTest({ linterName: "snyk" }); diff --git a/linters/snyk/test_data/java.in.java b/linters/snyk/test_data/java.in.java new file mode 100644 index 000000000..dafab92fd --- /dev/null +++ b/linters/snyk/test_data/java.in.java @@ -0,0 +1,77 @@ + +/* + * This file is part of WebGoat, an Open Web Application Security Project utility. For details, please see http://www.owasp.org/ + * + * Copyright (c) 2002 - 2019 Bruce Mayhew + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if + * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Getting Source ============== + * + * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software projects. + */ + + package org.owasp.webgoat.sql_injection.introduction; + + import org.owasp.webgoat.assignments.AssignmentEndpoint; + import org.owasp.webgoat.assignments.AssignmentHints; + import org.owasp.webgoat.assignments.AttackResult; + import org.springframework.web.bind.annotation.PostMapping; + import org.springframework.web.bind.annotation.RequestParam; + import org.springframework.web.bind.annotation.ResponseBody; + import org.springframework.web.bind.annotation.RestController; + + import javax.sql.DataSource; + import java.sql.*; + + import static java.sql.ResultSet.*; + + + @RestController + @AssignmentHints(value = {"SqlStringInjectionHint4-1", "SqlStringInjectionHint4-2", "SqlStringInjectionHint4-3"}) + public class SqlInjectionLesson4 extends AssignmentEndpoint { + + private final DataSource dataSource; + + public SqlInjectionLesson4(DataSource dataSource) { + this.dataSource = dataSource; + } + + @PostMapping("/SqlInjection/attack4") + @ResponseBody + public AttackResult completed(@RequestParam String query) { + return injectableQuery(query); + } + + protected AttackResult injectableQuery(String query) { + try (Connection connection = dataSource.getConnection()) { + try (Statement statement = connection.createStatement(TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY)) { + statement.executeUpdate(query); + connection.commit(); + ResultSet results = statement.executeQuery("SELECT phone from employees;"); + StringBuffer output = new StringBuffer(); + // user completes lesson if column phone exists + if (results.first()) { + output.append(""); + return success(this).output(output.toString()).build(); + } else { + return failed(this).output(output.toString()).build(); + } + } catch (SQLException sqle) { + return failed(this).output(sqle.getMessage()).build(); + } + } catch (Exception e) { + return failed(this).output(this.getClass().getName() + " : " + e.getMessage()).build(); + } + } + } diff --git a/linters/snyk/test_data/js.in.js b/linters/snyk/test_data/js.in.js new file mode 100644 index 000000000..e01b12544 --- /dev/null +++ b/linters/snyk/test_data/js.in.js @@ -0,0 +1,291 @@ +var utils = require('../utils'); +var mongoose = require('mongoose'); +var Todo = mongoose.model('Todo'); +var User = mongoose.model('User'); +// TODO: +var hms = require('humanize-ms'); +var ms = require('ms'); +var streamBuffers = require('stream-buffers'); +var readline = require('readline'); +var moment = require('moment'); +var exec = require('child_process').exec; + +// zip-slip +var fileType = require('file-type'); +var AdmZip = require('adm-zip'); +var fs = require('fs'); + +// prototype-pollution +var _ = require('lodash'); + +exports.index = function (req, res, next) { + Todo. + find({}). + sort('-updated_at'). + exec(function (err, todos) { + if (err) return next(err); + + res.render('index', { + title: 'Goof TODO', + subhead: 'Vulnerabilities at their best', + todos: todos, + }); + }); +}; + + +exports.admin = function (req, res, next) { + console.log(req.body); + User.find({ username: req.body.username, password: req.body.password }, function (err, users) { + if (users.length > 0) { + return res.render('admin', { + title: 'Admin Access Granted', + granted: true, + }); + } else { + return res.render('admin', { + title: 'Admin Access', + granted: false, + }); + } + }); + +}; + +function parse(todo) { + var t = todo; + + var remindToken = ' in '; + var reminder = t.toString().indexOf(remindToken); + if (reminder > 0) { + var time = t.slice(reminder + remindToken.length); + time = time.replace(/\n$/, ''); + + var period = hms(time); + + console.log('period: ' + period); + + // remove it + t = t.slice(0, reminder); + if (typeof period != 'undefined') { + t += ' [' + ms(period) + ']'; + } + } + return t; +} + +exports.create = function (req, res, next) { + // console.log('req.body: ' + JSON.stringify(req.body)); + + var item = req.body.content; + var imgRegex = /\!\[alt text\]\((http.*)\s\".*/; + if (typeof(item) == 'string' && item.match(imgRegex)) { + var url = item.match(imgRegex)[1]; + console.log('found img: ' + url); + + exec('identify ' + url, function (err, stdout, stderr) { + console.log(err); + if (err !== null) { + console.log('Error (' + err + '):' + stderr); + } + }); + + } else { + item = parse(item); + } + + new Todo({ + content: item, + updated_at: Date.now(), + }).save(function (err, todo, count) { + if (err) return next(err); + + /* + res.setHeader('Data', todo.content.toString('base64')); + res.redirect('/'); + */ + + res.setHeader('Location', '/'); + res.status(302).send(todo.content.toString('base64')); + + // res.redirect('/#' + todo.content.toString('base64')); + }); +}; + +exports.destroy = function (req, res, next) { + Todo.findById(req.params.id, function (err, todo) { + + try { + todo.remove(function (err, todo) { + if (err) return next(err); + res.redirect('/'); + }); + } catch(e) { + } + }); +}; + +exports.edit = function(req, res, next) { + Todo. + find({}). + sort('-updated_at'). + exec(function (err, todos) { + if (err) return next(err); + + res.render('edit', { + title : 'TODO', + todos : todos, + current : req.params.id + }); + }); +}; + +exports.update = function(req, res, next) { + Todo.findById(req.params.id, function (err, todo) { + + todo.content = req.body.content; + todo.updated_at = Date.now(); + todo.save(function (err, todo, count) { + if(err) return next(err); + + res.redirect('/'); + }); + }); +}; + +// ** express turns the cookie key to lowercase ** +exports.current_user = function (req, res, next) { + + next(); +}; + +function isBlank(str) { + return (!str || /^\s*$/.test(str)); +} + +exports.import = function (req, res, next) { + if (!req.files) { + res.send('No files were uploaded.'); + return; + } + + var importFile = req.files.importFile; + var data; + var importedFileType = fileType(importFile.data); + var zipFileExt = { ext: "zip", mime: "application/zip" }; + if (importedFileType === null) { + importedFileType = { ext: "txt", mime: "text/plain" }; + } + if (importedFileType["mime"] === zipFileExt["mime"]) { + var zip = AdmZip(importFile.data); + var extracted_path = "/tmp/extracted_files"; + zip.extractAllTo(extracted_path, true); + data = "No backup.txt file found"; + fs.readFile('backup.txt', 'ascii', function(err, data) { + if (!err) { + data = data; + }}); + } else { + data = importFile.data.toString('ascii'); + } + var lines = data.split('\n'); + lines.forEach(function (line) { + var parts = line.split(','); + var what = parts[0]; + console.log('importing ' + what); + var when = parts[1]; + var locale = parts[2]; + var format = parts[3]; + var item = what; + if (!isBlank(what)) { + if (!isBlank(when) && !isBlank(locale) && !isBlank(format)) { + console.log('setting locale ' + parts[1]); + moment.locale(locale); + var d = moment(when); + console.log('formatting ' + d); + item += ' [' + d.format(format) + ']'; + } + + new Todo({ + content: item, + updated_at: Date.now(), + }).save(function (err, todo, count) { + if (err) return next(err); + console.log('added ' + todo); + }); + } + }); + + res.redirect('/'); +}; + +exports.about_new = function (req, res, next) { + console.log(JSON.stringify(req.query)); + return res.render("about_new.dust", + { + title: 'Goof TODO', + subhead: 'Vulnerabilities at their best', + device: req.query.device + }); +}; + +// Prototype Pollution + +/////////////////////////////////////////////////////////////////////////////// +// In order of simplicity we are not using any database. But you can write the +// same logic using MongoDB. +const users = [ + // You know password for the user. + {name: 'user', password: 'pwd'}, + // You don't know password for the admin. + {name: 'admin', password: Math.random().toString(32), canDelete: true}, +]; + +let messages = []; +let lastId = 1; + +function findUser(auth) { + return users.find((u) => + u.name === auth.name && + u.password === auth.password); +} +/////////////////////////////////////////////////////////////////////////////// + +exports.chat = { + get(req, res) { + res.send(messages); + }, + add(req, res) { + const user = findUser(req.body.auth || {}); + + if (!user) { + res.status(403).send({ok: false, error: 'Access denied'}); + return; + } + + const message = { + // Default message icon. Cen be overwritten by user. + icon: '👋', + }; + + _.merge(message, req.body.message, { + id: lastId++, + timestamp: Date.now(), + userName: user.name, + }); + + messages.push(message); + res.send({ok: true}); + }, + delete(req, res) { + const user = findUser(req.body.auth || {}); + + if (!user || !user.canDelete) { + res.status(403).send({ok: false, error: 'Access denied'}); + return; + } + + messages = messages.filter((m) => m.id !== req.body.messageId); + res.send({ok: true}); + } +}; diff --git a/linters/snyk/test_data/snyk_v1.1295.0_java.check.shot b/linters/snyk/test_data/snyk_v1.1295.0_java.check.shot new file mode 100644 index 000000000..390821ea6 --- /dev/null +++ b/linters/snyk/test_data/snyk_v1.1295.0_java.check.shot @@ -0,0 +1,46 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter snyk test java 1`] = ` +{ + "issues": [ + { + "code": "java/Sqli", + "column": "18", + "file": "test_data/java.in.java", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "59", + "linter": "snyk", + "message": "Unsanitized input from an HTTP parameter flows into executeUpdate, where it is used in an SQL query. This may result in an SQL Injection vulnerability.", + "ranges": [ + { + "filePath": "test_data/java.in.java", + "length": "23", + "offset": "2394", + }, + ], + "targetType": "java", + }, + ], + "lintActions": [ + { + "command": "code", + "fileGroupName": "java", + "linter": "snyk", + "paths": [ + "test_data/java.in.java", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [ + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/java.in.java", + "name": "snyk", + }, + ], + "unformattedFiles": [], +} +`; diff --git a/linters/snyk/test_data/snyk_v1.1295.0_js.check.shot b/linters/snyk/test_data/snyk_v1.1295.0_js.check.shot new file mode 100644 index 000000000..02ca7cb1e --- /dev/null +++ b/linters/snyk/test_data/snyk_v1.1295.0_js.check.shot @@ -0,0 +1,103 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter snyk test js 1`] = ` +{ + "issues": [ + { + "code": "javascript/NoRateLimitingForExpensiveWebOperation", + "column": "18", + "file": "test_data/js.in.js", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "166", + "linter": "snyk", + "message": "Expensive operation (a file system operation) is performed by an endpoint handler which does not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit.", + "ranges": [ + { + "filePath": "test_data/js.in.js", + "length": "1567", + "offset": "3702", + }, + ], + "targetType": "javascript", + }, + { + "code": "javascript/NoRateLimitingForExpensiveWebOperation", + "column": "21", + "file": "test_data/js.in.js", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "222", + "linter": "snyk", + "message": "Expensive operation (a file system operation) is performed by an endpoint handler which does not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit.", + "ranges": [ + { + "filePath": "test_data/js.in.js", + "length": "242", + "offset": "5292", + }, + ], + "targetType": "javascript", + }, + { + "code": "javascript/NoSqli", + "column": "8", + "file": "test_data/js.in.js", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "39", + "linter": "snyk", + "message": "Unsanitized input from the HTTP request body flows into find, where it is used in an NoSQL query. This may result in an NoSQL Injection vulnerability.", + "ranges": [ + { + "filePath": "test_data/js.in.js", + "length": "4", + "offset": "918", + }, + ], + "targetType": "javascript", + }, + { + "code": "javascript/NoRateLimitingForExpensiveWebOperation", + "column": "18", + "file": "test_data/js.in.js", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "77", + "linter": "snyk", + "message": "Expensive operation (a system command execution) is performed by an endpoint handler which does not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit.", + "ranges": [ + { + "filePath": "test_data/js.in.js", + "length": "928", + "offset": "1741", + }, + ], + "targetType": "javascript", + }, + ], + "lintActions": [ + { + "command": "code", + "fileGroupName": "javascript", + "linter": "snyk", + "paths": [ + "test_data/js.in.js", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [ + { + "details": StringMatching /\\.\\*\\$/m, + "message": "test_data/js.in.js", + "name": "snyk", + }, + ], + "unformattedFiles": [], +} +`; diff --git a/linters/sort-package-json/plugin.yaml b/linters/sort-package-json/plugin.yaml index e660659fd..dbfbda8d1 100644 --- a/linters/sort-package-json/plugin.yaml +++ b/linters/sort-package-json/plugin.yaml @@ -13,6 +13,7 @@ lint: definitions: - name: sort-package-json + description: Sorts package.json keys files: [package-json] commands: - name: format diff --git a/linters/sourcery/plugin.yaml b/linters/sourcery/plugin.yaml index cd0646c2e..6a46d26dc 100644 --- a/linters/sourcery/plugin.yaml +++ b/linters/sourcery/plugin.yaml @@ -3,6 +3,7 @@ lint: definitions: - name: sourcery files: [python] + description: Static analyzer for Python commands: - name: lint platforms: [linux, macos] @@ -38,7 +39,7 @@ lint: - pyproject.toml - setup.cfg issue_url_format: https://docs.sourcery.ai/Reference/Python/Default-Rules/{} - known_good_version: 1.2.0 + known_good_version: 1.37.0 version_command: parse_regex: sourcery ${semver} run: sourcery --version diff --git a/linters/sourcery/sourcery.test.ts b/linters/sourcery/sourcery.test.ts index 3001a750b..40bfd3d3d 100644 --- a/linters/sourcery/sourcery.test.ts +++ b/linters/sourcery/sourcery.test.ts @@ -4,7 +4,7 @@ import { customLinterCheckTest } from "tests"; import { TrunkLintDriver } from "tests/driver"; import { REPO_ROOT, skipCPUOS, TEST_DATA } from "tests/utils"; -// // You must login in order to use sourcery +// You must login in order to use sourcery const preCheck = (driver: TrunkLintDriver) => { driver.moveFile(path.join(TEST_DATA, "_plugin.yaml"), path.join(TEST_DATA, "plugin.yaml")); @@ -23,7 +23,6 @@ lint:`, // NOTE(Tyler): Sourcery relies on checking if the repo is open source for its pricing model. // The sandbox tests run on a subset of the main repo, and it needs access to the repo root .git folder in order to run. driver.deleteFile(".git"); - // trunk-ignore(semgrep): This path is safe. fs.symlinkSync(path.join(REPO_ROOT, ".git"), path.join(driver.getSandbox(), ".git")); }; diff --git a/linters/sourcery/test_data/sourcery_v1.2.0_CUSTOM.check.shot b/linters/sourcery/test_data/sourcery_v1.2.0_CUSTOM.check.shot deleted file mode 100644 index efccd7fff..000000000 --- a/linters/sourcery/test_data/sourcery_v1.2.0_CUSTOM.check.shot +++ /dev/null @@ -1,73 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter sourcery test CUSTOM 1`] = ` -{ - "issues": [ - { - "code": "raise-specific-error", - "column": "1", - "file": "test_data/basic.in.py", - "issueUrl": "https://docs.sourcery.ai/Reference/Python/Default-Rules/raise-specific-error", - "level": "LEVEL_HIGH", - "line": "10", - "linter": "sourcery", - "message": "Raise a specific error instead of the general Exception", - "targetType": "python", - }, - { - "code": "replace-interpolation-with-fstring", - "column": "1", - "file": "test_data/basic.in.py", - "issueUrl": "https://docs.sourcery.ai/Reference/Python/Default-Rules/replace-interpolation-with-fstring", - "level": "LEVEL_HIGH", - "line": "4", - "linter": "sourcery", - "message": "Replace interpolated string formatting with f-string", - "targetType": "python", - }, - { - "code": "raise-from-previous-error", - "column": "1", - "file": "test_data/basic.in.py", - "issueUrl": "https://docs.sourcery.ai/Reference/Python/Default-Rules/raise-from-previous-error", - "level": "LEVEL_HIGH", - "line": "7", - "linter": "sourcery", - "message": "Explicitly raise from a previous error", - "targetType": "python", - }, - ], - "lintActions": [ - { - "command": "fix", - "fileGroupName": "python", - "linter": "sourcery", - "paths": [ - "test_data/basic.in.py", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "python", - "linter": "sourcery", - "paths": [ - "test_data/basic.in.py", - ], - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [ - { - "column": "1", - "file": "test_data/basic.in.py", - "issueClass": "ISSUE_CLASS_UNFORMATTED", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sourcery", - "message": "Incorrect formatting, autoformat by running 'trunk fmt'", - }, - ], -} -`; diff --git a/linters/sourcery/test_data/sourcery_v1.10.1_CUSTOM.check.shot b/linters/sourcery/test_data/sourcery_v1.37.0_CUSTOM.check.shot similarity index 100% rename from linters/sourcery/test_data/sourcery_v1.10.1_CUSTOM.check.shot rename to linters/sourcery/test_data/sourcery_v1.37.0_CUSTOM.check.shot diff --git a/linters/sql-formatter/plugin.yaml b/linters/sql-formatter/plugin.yaml index ec5de1e85..0c7424b09 100644 --- a/linters/sql-formatter/plugin.yaml +++ b/linters/sql-formatter/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: sql-formatter files: [sql] + description: A SQL formatter commands: - output: rewrite # sql-formatter does not autodetect dialect, so this may not be sufficient for all setups diff --git a/linters/sqlfluff/plugin.yaml b/linters/sqlfluff/plugin.yaml index f4a7a12d3..c52121a91 100644 --- a/linters/sqlfluff/plugin.yaml +++ b/linters/sqlfluff/plugin.yaml @@ -5,13 +5,14 @@ tools: runtime: python package: sqlfluff shims: [sqlfluff] - known_good_version: 1.4.5 + known_good_version: 3.0.0 lint: definitions: - name: sqlfluff files: [sql, sql-j2, dml, ddl] tools: [sqlfluff] - known_good_version: 1.4.5 + description: A dialect-flexible and configurable SQL linter + known_good_version: 3.0.0 direct_configs: - .sqlfluff affects_cache: @@ -26,11 +27,20 @@ lint: parser: runtime: python run: python3 ${plugin}/linters/sqlfluff/sqlfluff_to_sarif.py + - name: fix + version: ">=3.0.0" + run: sqlfluff fix ${target} --disable-progress-bar + output: rewrite + formatter: true + in_place: true + success_codes: [0, 1] + enabled: false + batch: true - name: fix run: sqlfluff fix ${target} --disable-progress-bar --force output: rewrite formatter: true in_place: true - success_codes: [0] + success_codes: [0, 1] enabled: false batch: true diff --git a/linters/sqlfluff/sqlfluff.test.ts b/linters/sqlfluff/sqlfluff.test.ts index 1019e9593..9d5076d23 100644 --- a/linters/sqlfluff/sqlfluff.test.ts +++ b/linters/sqlfluff/sqlfluff.test.ts @@ -1,5 +1,6 @@ import { linterCheckTest, linterFmtTest, TestCallback } from "tests"; +// A simple test to run 'sqlfluff lint' // basic_check.out.json is the result of running: // trunk check linters/sqlfluff/test/basic_check.in.sql --force --filter=sqlfluff --output=json linterCheckTest({ linterName: "sqlfluff", namedTestPrefixes: ["basic_check"] }); @@ -11,10 +12,14 @@ const fmtCallbacks: TestCallback = (driver) => { const sqlfluffRegex = /- sqlfluff@(.+)\n/; const newContents = currentContents.replace( sqlfluffRegex, - "- sqlfluff@$1:\n commands: [lint, fix]\n" + "- sqlfluff@$1:\n commands: [lint, fix]\n", ); driver.writeFile(trunkYamlPath, newContents); }; -// TODO(Tyler): We will eventually need to add a couple more test cases involving failure modes. -linterFmtTest({ linterName: "sqlfluff", namedTestPrefixes: ["basic_fmt"], preCheck: fmtCallbacks }); +// An additional test to run 'sqlfluff fmt' with some additional test setup. +linterFmtTest({ + linterName: "sqlfluff", + namedTestPrefixes: ["basic_fmt", "basic_check"], + preCheck: fmtCallbacks, +}); diff --git a/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_check.check.shot b/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_check.check.shot deleted file mode 100644 index 9eb06a2ba..000000000 --- a/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_check.check.shot +++ /dev/null @@ -1,163 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter sqlfluff test basic_check 1`] = ` -{ - "issues": [ - { - "code": "L010", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L036", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Select targets should be on a new line unless there is only one select target.", - "targetType": "sql", - }, - { - "code": "L044", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Query produces an unknown number of result columns.", - "targetType": "sql", - }, - { - "code": "L013", - "column": "12", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Column expression without alias. Use explicit \`AS\` clause.", - "targetType": "sql", - }, - { - "code": "L010", - "column": "20", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "22", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unnecessary whitespace found.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "24", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "27", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unnecessary whitespace found.", - "targetType": "sql", - }, - { - "code": "L010", - "column": "29", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "34", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "43", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "7", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unnecessary whitespace found.", - "targetType": "sql", - }, - ], - "lintActions": [ - { - "command": "lint", - "fileGroupName": "sql", - "linter": "sqlfluff", - "paths": [ - "test_data/basic_check.in.sql", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "sql", - "linter": "sqlfluff", - "paths": [ - "test_data/basic_check.in.sql", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [], -} -`; diff --git a/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_fmt.fmt.shot b/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_fmt.fmt.shot deleted file mode 100644 index c29cb0da2..000000000 --- a/linters/sqlfluff/test_data/sqlfluff_v1.4.2_basic_fmt.fmt.shot +++ /dev/null @@ -1,15 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing formatter sqlfluff test basic_fmt 1`] = ` -"SELECT - col_a, - col_b, - COUNT(*) AS num, - SUM(num) OVER ( - PARTITION BY col_a - ORDER BY col_b - ) AS an_aggregate_function -FROM tbl_a -GROUP BY 1, 2 -" -`; diff --git a/linters/sqlfluff/test_data/sqlfluff_v1.4.4_basic_check.check.shot b/linters/sqlfluff/test_data/sqlfluff_v1.4.4_basic_check.check.shot deleted file mode 100644 index fe4a9190b..000000000 --- a/linters/sqlfluff/test_data/sqlfluff_v1.4.4_basic_check.check.shot +++ /dev/null @@ -1,163 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Testing linter sqlfluff test basic_check 1`] = ` -{ - "issues": [ - { - "code": "L010", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L036", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Select targets should be on a new line unless there is only one select target.", - "targetType": "sql", - }, - { - "code": "L044", - "column": "1", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Query produces an unknown number of result columns.", - "targetType": "sql", - }, - { - "code": "L013", - "column": "12", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Column expression without alias. Use explicit \`AS\` clause.", - "targetType": "sql", - }, - { - "code": "L010", - "column": "20", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "22", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Expected only single space before naked identifier. Found ' '.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "24", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "27", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Expected only single space before 'from' keyword. Found ' '.", - "targetType": "sql", - }, - { - "code": "L010", - "column": "29", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Keywords must be consistently upper case.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "34", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L014", - "column": "43", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Unquoted identifiers must be consistently lower case.", - "targetType": "sql", - }, - { - "code": "L039", - "column": "7", - "file": "test_data/basic_check.in.sql", - "issueClass": "ISSUE_CLASS_EXISTING", - "level": "LEVEL_HIGH", - "line": "1", - "linter": "sqlfluff", - "message": "Expected only single space before star '*'. Found ' '.", - "targetType": "sql", - }, - ], - "lintActions": [ - { - "command": "lint", - "fileGroupName": "sql", - "linter": "sqlfluff", - "paths": [ - "test_data/basic_check.in.sql", - ], - "verb": "TRUNK_VERB_CHECK", - }, - { - "command": "lint", - "fileGroupName": "sql", - "linter": "sqlfluff", - "paths": [ - "test_data/basic_check.in.sql", - ], - "upstream": true, - "verb": "TRUNK_VERB_CHECK", - }, - ], - "taskFailures": [], - "unformattedFiles": [], -} -`; diff --git a/linters/sqlfluff/test_data/sqlfluff_v2.0.0_basic_check.fmt.shot b/linters/sqlfluff/test_data/sqlfluff_v2.0.0_basic_check.fmt.shot new file mode 100644 index 000000000..0932f952c --- /dev/null +++ b/linters/sqlfluff/test_data/sqlfluff_v2.0.0_basic_check.fmt.shot @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter sqlfluff test basic_check 1`] = ` +"SELECT + *, + 1, + blah AS foo +FROM myschema.mytable +" +`; diff --git a/linters/sqlfluff/test_data/sqlfluff_v3.0.0_basic_check.fmt.shot b/linters/sqlfluff/test_data/sqlfluff_v3.0.0_basic_check.fmt.shot new file mode 100644 index 000000000..0932f952c --- /dev/null +++ b/linters/sqlfluff/test_data/sqlfluff_v3.0.0_basic_check.fmt.shot @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter sqlfluff test basic_check 1`] = ` +"SELECT + *, + 1, + blah AS foo +FROM myschema.mytable +" +`; diff --git a/linters/sqlfmt/plugin.yaml b/linters/sqlfmt/plugin.yaml index a3cffcaac..8a62627e0 100644 --- a/linters/sqlfmt/plugin.yaml +++ b/linters/sqlfmt/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: sqlfmt files: [sql, sql-j2] tools: [sqlfmt] + description: A SQL formatter known_good_version: 0.16.0 # trunk-ignore(yamllint/quoted-strings): see https://github.com/adrienverge/yamllint/issues/516 extra_packages: ["shandy-sqlfmt[jinjafmt]"] diff --git a/linters/squawk/plugin.yaml b/linters/squawk/plugin.yaml new file mode 100644 index 000000000..767fb764e --- /dev/null +++ b/linters/squawk/plugin.yaml @@ -0,0 +1,37 @@ +version: 0.1 +tools: + definitions: + - name: squawk + runtime: node + package: squawk-cli + known_good_version: 2.8.0 + shims: [squawk] +lint: + definitions: + - name: squawk + description: A linter for Postgres migrations + files: [sql] + tools: [squawk] + known_good_version: 2.8.0 + suggest_if: config_present + direct_configs: [.squawk.toml] + commands: + - name: lint + platforms: [windows] + run: ${linter}/node_modules/squawk-cli/js/binaries/squawk --reporter Gcc ${target} + output: regex + success_codes: [0, 1] + batch: true + cache_results: true + parse_regex: + "(?P.*):(?P\\d+):(?P\\d+): (?P\\S*) (?P\\S*) + (?P.*)" + - name: lint + run: squawk --reporter Gcc ${target} + output: regex + success_codes: [0, 1] + batch: true + cache_results: true + parse_regex: + "(?P.*):(?P\\d+):(?P\\d+): (?P\\S*) (?P\\S*) + (?P.*)" diff --git a/linters/squawk/squawk.test.ts b/linters/squawk/squawk.test.ts new file mode 100644 index 000000000..f279b9c19 --- /dev/null +++ b/linters/squawk/squawk.test.ts @@ -0,0 +1,12 @@ +import semver from "semver"; +import { linterCheckTest } from "tests"; + +// Squawk first supported linux arm in 1.4.0 https://github.com/sbdchd/squawk/issues/372 +linterCheckTest({ + linterName: "squawk", + skipTestIf: (version) => + process.arch === "arm64" && + process.platform === "linux" && + version !== undefined && + semver.lt(version, "1.4.0"), +}); diff --git a/linters/squawk/test_data/basic.in.sql b/linters/squawk/test_data/basic.in.sql new file mode 100644 index 000000000..2476e616d --- /dev/null +++ b/linters/squawk/test_data/basic.in.sql @@ -0,0 +1,8 @@ +CREATE TABLE "core_bar" ( + "id" serial NOT NULL PRIMARY KEY, + "alpha" varchar(100) NOT NULL +); + +CREATE INDEX "field_name_idx" ON "table_name" ("field_name"); + +ALTER TABLE table_name ADD CONSTRAINT field_name_constraint UNIQUE (field_name); diff --git a/linters/squawk/test_data/squawk_v1.4.0_basic.check.shot b/linters/squawk/test_data/squawk_v1.4.0_basic.check.shot new file mode 100644 index 000000000..16e369f92 --- /dev/null +++ b/linters/squawk/test_data/squawk_v1.4.0_basic.check.shot @@ -0,0 +1,125 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter squawk test basic 1`] = ` +{ + "issues": [ + { + "code": "prefer-big-int", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Hitting the max 32 bit integer is possible and may break your application. Use 64bit integer values instead to prevent hitting this limit.", + "targetType": "sql", + }, + { + "code": "prefer-bigint-over-int", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Hitting the max 32 bit integer is possible and may break your application. Use 64bit integer values instead to prevent hitting this limit.", + "targetType": "sql", + }, + { + "code": "prefer-identity", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Serial types have confusing behaviors that make schema management difficult. Use identity columns instead for more features and better usability.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + { + "code": "prefer-text-field", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Changing the size of a varchar field requires an ACCESS EXCLUSIVE lock. Use a text field with a check constraint.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + { + "code": "require-concurrent-index-creation", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Creating an index blocks writes. Create the index CONCURRENTLY.", + "targetType": "sql", + }, + { + "code": "disallowed-unique-constraint", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Adding a UNIQUE constraint requires an ACCESS EXCLUSIVE lock which blocks reads. Create an index CONCURRENTLY and create the constraint using the index.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/squawk/test_data/squawk_v1.5.3_basic.check.shot b/linters/squawk/test_data/squawk_v1.5.3_basic.check.shot new file mode 100644 index 000000000..48d34ba0a --- /dev/null +++ b/linters/squawk/test_data/squawk_v1.5.3_basic.check.shot @@ -0,0 +1,125 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter squawk test basic 1`] = ` +{ + "issues": [ + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + { + "code": "prefer-big-int", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "squawk", + "message": "Hitting the max 32 bit integer is possible and may break your application. Use 64bit integer values instead to prevent hitting this limit.", + "targetType": "sql", + }, + { + "code": "prefer-bigint-over-int", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "squawk", + "message": "Hitting the max 32 bit integer is possible and may break your application. Use 64bit integer values instead to prevent hitting this limit.", + "targetType": "sql", + }, + { + "code": "prefer-identity", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "squawk", + "message": "Serial types have confusing behaviors that make schema management difficult. Use identity columns instead for more features and better usability.", + "targetType": "sql", + }, + { + "code": "prefer-text-field", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "squawk", + "message": "Changing the size of a varchar field requires an ACCESS EXCLUSIVE lock. Use a text field with a check constraint.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + { + "code": "require-concurrent-index-creation", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Creating an index blocks writes. Create the index CONCURRENTLY.", + "targetType": "sql", + }, + { + "code": "disallowed-unique-constraint", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Adding a UNIQUE constraint requires an ACCESS EXCLUSIVE lock which blocks reads. Create an index CONCURRENTLY and create the constraint using the index.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "2", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Consider wrapping in a transaction or adding a IF NOT EXISTS clause if the statement supports it.", + "targetType": "sql", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/squawk/test_data/squawk_v2.4.0_basic.check.shot b/linters/squawk/test_data/squawk_v2.4.0_basic.check.shot new file mode 100644 index 000000000..875ab175c --- /dev/null +++ b/linters/squawk/test_data/squawk_v2.4.0_basic.check.shot @@ -0,0 +1,127 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter squawk test basic 1`] = ` +{ + "issues": [ + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "squawk", + "message": "Missing \`IF NOT EXISTS\`, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "prefer-bigint-over-int", + "column": "7", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Using 32-bit integer fields can result in hitting the max \`int\` limit.", + "targetType": "sql", + }, + { + "code": "prefer-identity", + "column": "7", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Serial types make schema, dependency, and permission management difficult.", + "targetType": "sql", + }, + { + "code": "prefer-text-field", + "column": "10", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "squawk", + "message": "Changing the size of a \`varchar\` field requires an \`ACCESS EXCLUSIVE\` lock, that will prevent all reads and writes to the table.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Missing \`IF NOT EXISTS\`, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "require-concurrent-index-creation", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "During normal index creation, table updates are blocked, but reads are still allowed.", + "targetType": "sql", + }, + { + "code": "constraint-missing-not-valid", + "column": "23", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "By default new constraints require a table scan and block writes to the table while that scan occurs.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "23", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Missing transaction, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "disallowed-unique-constraint", + "column": "27", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Adding a \`UNIQUE\` constraint requires an \`ACCESS EXCLUSIVE\` lock which blocks reads and writes to the table while the index is built.", + "targetType": "sql", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/squawk/test_data/squawk_v2.8.0_basic.check.shot b/linters/squawk/test_data/squawk_v2.8.0_basic.check.shot new file mode 100644 index 000000000..239f98a51 --- /dev/null +++ b/linters/squawk/test_data/squawk_v2.8.0_basic.check.shot @@ -0,0 +1,126 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter squawk test basic 1`] = ` +{ + "issues": [ + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "linter": "squawk", + "message": "Missing \`IF NOT EXISTS\`, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "prefer-bigint-over-int", + "column": "7", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Using 32-bit integer fields can result in hitting the max \`int\` limit.", + "targetType": "sql", + }, + { + "code": "prefer-identity", + "column": "7", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "squawk", + "message": "Serial types make schema, dependency, and permission management difficult.", + "targetType": "sql", + }, + { + "code": "prefer-text-field", + "column": "10", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "squawk", + "message": "Changing the size of a \`varchar\` field requires an \`ACCESS EXCLUSIVE\` lock, that will prevent all reads and writes to the table.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "Missing \`IF NOT EXISTS\`, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "require-concurrent-index-creation", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "squawk", + "message": "During normal index creation, table updates are blocked, but reads are still allowed.", + "targetType": "sql", + }, + { + "code": "constraint-missing-not-valid", + "column": "23", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "By default new constraints require a table scan and block writes to the table while that scan occurs.", + "targetType": "sql", + }, + { + "code": "prefer-robust-stmts", + "column": "23", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Missing transaction, the migration can't be rerun if it fails part way through.", + "targetType": "sql", + }, + { + "code": "disallowed-unique-constraint", + "column": "27", + "file": "test_data/basic.in.sql", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "7", + "linter": "squawk", + "message": "Adding a \`UNIQUE\` constraint requires an \`ACCESS EXCLUSIVE\` lock which blocks reads and writes to the table while the index is built.", + "targetType": "sql", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "sql", + "linter": "squawk", + "paths": [ + "test_data/basic.in.sql", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/standardrb/plugin.yaml b/linters/standardrb/plugin.yaml index e6ba71d25..d1efd3723 100644 --- a/linters/standardrb/plugin.yaml +++ b/linters/standardrb/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: standardrb files: [ruby, gemspec] + description: Ruby's bikeshed-proof linter and formatter commands: - name: lint # Custom parser type defined in the trunk cli to handle rubocop's JSON output. diff --git a/linters/standardrb/standardrb.test.ts b/linters/standardrb/standardrb.test.ts index 6d6abc5e4..bf5069d1f 100644 --- a/linters/standardrb/standardrb.test.ts +++ b/linters/standardrb/standardrb.test.ts @@ -4,7 +4,7 @@ import { osTimeoutMultiplier, skipOS } from "tests/utils"; // Note that the first-time ruby/rufo download can sometimes take a while. // Ruby build is quite slow on Mac, so only run tests on linux for now -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); const preCheck = (driver: TrunkLintDriver) => { if (process.platform == "win32") { diff --git a/linters/stringslint/plugin.yaml b/linters/stringslint/plugin.yaml index 2bcdb5fd2..3262defe7 100644 --- a/linters/stringslint/plugin.yaml +++ b/linters/stringslint/plugin.yaml @@ -23,6 +23,7 @@ lint: - xib - storyboard tools: [stringslint] + description: Ensures localized strings are complete and never unused commands: - name: lint output: regex @@ -43,4 +44,4 @@ lint: known_good_version: 0.1.1 version_command: parse_regex: ${semver} - run: swiftlint --version + run: stringslint --version diff --git a/linters/stylelint/plugin.yaml b/linters/stylelint/plugin.yaml index a1c18ab6e..d33e7640d 100644 --- a/linters/stylelint/plugin.yaml +++ b/linters/stylelint/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: stylelint files: [css, sass] tools: [stylelint] + description: Over 100 built-in rules for modern CSS commands: - name: lint version: ">=16.0.0" diff --git a/linters/stylelint/stylelint.test.ts b/linters/stylelint/stylelint.test.ts index fc2db68a3..3f70eea79 100644 --- a/linters/stylelint/stylelint.test.ts +++ b/linters/stylelint/stylelint.test.ts @@ -12,6 +12,7 @@ const preCheck = (driver: TrunkLintDriver) => { driver.writeFile(".trunk/configs/.stylelintrc", stylelintContents); + // trunk-ignore(eslint/@typescript-eslint/no-non-null-assertion) const configVersion = semver.gte(driver.enabledVersion!, "16.0.0") ? "stylelint-config-standard@35.0.0" : "stylelint-config-standard@25.0.0"; diff --git a/linters/stylua/plugin.yaml b/linters/stylua/plugin.yaml index 5089789eb..9e84c4cae 100644 --- a/linters/stylua/plugin.yaml +++ b/linters/stylua/plugin.yaml @@ -22,6 +22,7 @@ lint: - name: stylua files: [lua] tools: [stylua] + description: An opinionated Lua formatter commands: - name: format output: rewrite diff --git a/linters/svgo/plugin.yaml b/linters/svgo/plugin.yaml index 7f9f2aa8f..e735fd124 100644 --- a/linters/svgo/plugin.yaml +++ b/linters/svgo/plugin.yaml @@ -11,6 +11,7 @@ lint: # while svgo could be a formatter, it is optimizing, not formatting, so it's more intuitive to run on `trunk check` - name: svgo files: [svg] + description: Optimize SVG files commands: - name: fmt output: rewrite diff --git a/linters/svgo/svgo.config.js b/linters/svgo/svgo.config.mjs similarity index 93% rename from linters/svgo/svgo.config.js rename to linters/svgo/svgo.config.mjs index b257d1349..55b4a7a11 100644 --- a/linters/svgo/svgo.config.js +++ b/linters/svgo/svgo.config.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { plugins: [ { name: "preset-default", diff --git a/linters/swiftformat/plugin.yaml b/linters/swiftformat/plugin.yaml index 0277ae183..0b42f6429 100644 --- a/linters/swiftformat/plugin.yaml +++ b/linters/swiftformat/plugin.yaml @@ -17,6 +17,7 @@ lint: - name: swiftformat files: [swift] tools: [swiftformat] + description: Formatter for Swift commands: - name: format output: rewrite diff --git a/linters/swiftlint/plugin.yaml b/linters/swiftlint/plugin.yaml index a5b462798..4191c696f 100644 --- a/linters/swiftlint/plugin.yaml +++ b/linters/swiftlint/plugin.yaml @@ -15,6 +15,7 @@ tools: lint: definitions: - name: swiftlint + description: Enforces Swift style and conventions files: - swift tools: [swiftlint] diff --git a/linters/swiftlint/test_data/swiftlint_v0.55.0_basic.check.shot b/linters/swiftlint/test_data/swiftlint_v0.55.0_basic.check.shot new file mode 100644 index 000000000..ed72c2f8e --- /dev/null +++ b/linters/swiftlint/test_data/swiftlint_v0.55.0_basic.check.shot @@ -0,0 +1,76 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter swiftlint test basic 1`] = ` +{ + "issues": [ + { + "code": "type_name", + "column": "8", + "file": "test_data/basic.swift", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "swiftlint", + "message": "Type Name Violation: Type name 'a' should start with an uppercase character", + "targetType": "swift", + }, + { + "code": "line_length", + "column": "1", + "file": "test_data/basic.swift", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "3", + "linter": "swiftlint", + "message": "Line Length Violation: Line should be 120 characters or less; currently it has 139 characters", + "targetType": "swift", + }, + { + "code": "vertical_whitespace", + "column": "1", + "file": "test_data/basic.swift", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "5", + "linter": "swiftlint", + "message": "Vertical Whitespace Violation: Limit vertical whitespace to a single empty line; currently 2", + "targetType": "swift", + }, + { + "code": "identifier_name", + "column": "6", + "file": "test_data/basic.swift", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "6", + "linter": "swiftlint", + "message": "Identifier Name Violation: Function name 'Bar()' should start with a lowercase character", + "targetType": "swift", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "swift", + "linter": "swiftlint", + "paths": [ + "test_data/basic.swift", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "swift", + "linter": "swiftlint", + "paths": [ + "test_data/basic.swift", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/swiftlint/test_data/swiftlint_v0.55.0_nested_configs.check.shot b/linters/swiftlint/test_data/swiftlint_v0.55.0_nested_configs.check.shot new file mode 100644 index 000000000..ee95a000c --- /dev/null +++ b/linters/swiftlint/test_data/swiftlint_v0.55.0_nested_configs.check.shot @@ -0,0 +1,80 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter swiftlint test nested_configs 1`] = ` +{ + "issues": [ + { + "code": "type_name", + "column": "8", + "file": "basic.swift", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "swiftlint", + "message": "Type Name Violation: Type name 'a' should start with an uppercase character", + "targetType": "swift", + }, + { + "code": "vertical_whitespace", + "column": "1", + "file": "basic.swift", + "level": "LEVEL_MEDIUM", + "line": "5", + "linter": "swiftlint", + "message": "Vertical Whitespace Violation: Limit vertical whitespace to a single empty line; currently 2", + "targetType": "swift", + }, + { + "code": "vertical_whitespace", + "column": "1", + "file": "test_data/basic.swift", + "level": "LEVEL_MEDIUM", + "line": "5", + "linter": "swiftlint", + "message": "Vertical Whitespace Violation: Limit vertical whitespace to a single empty line; currently 2", + "targetType": "swift", + }, + { + "code": "type_name", + "column": "8", + "file": "test_data/subdir/basic.swift", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "swiftlint", + "message": "Type Name Violation: Type name 'a' should start with an uppercase character", + "targetType": "swift", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "swift", + "linter": "swiftlint", + "paths": [ + "basic.swift", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "swift", + "linter": "swiftlint", + "paths": [ + "test_data/basic.swift", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "swift", + "linter": "swiftlint", + "paths": [ + "test_data/subdir/basic.swift", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/taplo/plugin.yaml b/linters/taplo/plugin.yaml index 389fa5b86..06742af7a 100644 --- a/linters/taplo/plugin.yaml +++ b/linters/taplo/plugin.yaml @@ -79,6 +79,7 @@ lint: - name: taplo files: [toml] tools: [taplo] + description: Validate and format TOML files commands: - name: lint # Custom parser type defined in the trunk cli to handle taplo's output. diff --git a/linters/terraform/plugin.yaml b/linters/terraform/plugin.yaml index 20bbf4add..ebfd9ef95 100644 --- a/linters/terraform/plugin.yaml +++ b/linters/terraform/plugin.yaml @@ -2,8 +2,9 @@ version: 0.1 lint: definitions: - name: terraform - files: [terraform] + files: [terraform, tfvars] tools: [terraform] + description: Validate and format terraform files commands: - name: validate # Custom parser type defined in the trunk cli to handle terraform's JSON output. diff --git a/linters/terragrunt/plugin.yaml b/linters/terragrunt/plugin.yaml index ff7c032c0..6aab17a1f 100644 --- a/linters/terragrunt/plugin.yaml +++ b/linters/terragrunt/plugin.yaml @@ -24,6 +24,7 @@ lint: definitions: - name: terragrunt tools: [terragrunt] + description: Maintain HCL files in a canonical format known_good_version: 0.45.8 files: [hcl] suggest_if: never diff --git a/linters/terrascan/plugin.yaml b/linters/terrascan/plugin.yaml index b11b9db38..30c4c8b98 100644 --- a/linters/terrascan/plugin.yaml +++ b/linters/terrascan/plugin.yaml @@ -22,7 +22,9 @@ lint: - name: terrascan tools: [terrascan] known_good_version: 1.18.1 - suggest_if: files_present + description: A static code analyzer for IaC + # terrascan does not support some modern terraform syntax. Don't auto-recommend. + suggest_if: never commands: - name: lint output: sarif diff --git a/linters/terrascan/terrascan.test.ts b/linters/terrascan/terrascan.test.ts index 8089ac57c..5aadbec40 100644 --- a/linters/terrascan/terrascan.test.ts +++ b/linters/terrascan/terrascan.test.ts @@ -20,4 +20,5 @@ const preCheck = (driver: TrunkLintDriver) => { driver.writeFile(trunkYamlPath, newContents); }; -linterCheckTest({ linterName: "terrascan", preCheck }); +// TODO(Tyler): Fix flakiness with this test. +linterCheckTest({ linterName: "terrascan", preCheck, skipTestIf: () => true }); diff --git a/linters/tflint/plugin.yaml b/linters/tflint/plugin.yaml index e6a163d20..b2c91731e 100644 --- a/linters/tflint/plugin.yaml +++ b/linters/tflint/plugin.yaml @@ -25,6 +25,7 @@ lint: definitions: - name: tflint files: [terraform] + description: A pluggable Terraform linter commands: - name: lint output: sarif diff --git a/linters/tfsec/plugin.yaml b/linters/tfsec/plugin.yaml index 4c764ed9e..cd4287bd9 100644 --- a/linters/tfsec/plugin.yaml +++ b/linters/tfsec/plugin.yaml @@ -29,6 +29,7 @@ lint: tools: [tfsec] known_good_version: 1.28.1 suggest_if: never + description: Security scanner for your Terraform code commands: - name: lint output: sarif diff --git a/linters/tofu/plugin.yaml b/linters/tofu/plugin.yaml new file mode 100644 index 000000000..fffce9a0d --- /dev/null +++ b/linters/tofu/plugin.yaml @@ -0,0 +1,40 @@ +version: 0.1 +lint: + definitions: + - name: tofu + files: [terraform, tfvars] + tools: [tofu] + description: A Terraform validator and formatter + commands: + - name: validate + # Custom parser type defined in the trunk cli to handle tofu's JSON output. + output: terraform_validate + target: ${parent} + run: tofu validate -json + run_from: ${target_directory} + success_codes: [0, 1] + enabled: false + - name: fmt + output: rewrite + formatter: true + run: tofu fmt -no-color - + stdin: true + success_codes: [0] + cache_results: true + suggest_if: never + environment: + - name: PATH + list: ["${linter}"] + - name: GITHUB_APP_ID + value: ${env.GITHUB_APP_ID} + optional: true + - name: GITHUB_APP_INSTALLATION_ID + value: ${env.GITHUB_APP_INSTALLATION_ID} + optional: true + - name: GITHUB_APP_PEM_FILE + value: ${env.GITHUB_APP_PEM_FILE} + optional: true + known_good_version: 1.6.2 + version_command: + parse_regex: ${semver} + run: tofu --version diff --git a/linters/tofu/test_data/tofu_v1.6.2_variables.check.shot b/linters/tofu/test_data/tofu_v1.6.2_variables.check.shot new file mode 100644 index 000000000..bc325d35a --- /dev/null +++ b/linters/tofu/test_data/tofu_v1.6.2_variables.check.shot @@ -0,0 +1,60 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter tofu test variables 1`] = ` +{ + "issues": [ + { + "code": "Invalid quoted type constraints", + "file": "test_data/variables.in.tf", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "tofu", + "message": "OpenTofu 0.11 and earlier required type constraints to be given in quotes, but that form is now deprecated and will be removed in a future version of OpenTofu. Remove the quotes around "map" and write map(string) instead to explicitly indicate that the map elements are strings.", + "targetType": "terraform", + }, + ], + "lintActions": [ + { + "command": "fmt", + "fileGroupName": "terraform", + "linter": "tofu", + "paths": [ + "test_data/variables.in.tf", + ], + "verb": "TRUNK_VERB_FMT", + }, + { + "command": "validate", + "fileGroupName": "terraform", + "linter": "tofu", + "paths": [ + "test_data", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "validate", + "fileGroupName": "terraform", + "linter": "tofu", + "paths": [ + "test_data", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [ + { + "column": "1", + "file": "test_data/variables.in.tf", + "issueClass": "ISSUE_CLASS_UNFORMATTED", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "tofu", + "message": "Incorrect formatting, autoformat by running 'trunk fmt'", + }, + ], +} +`; diff --git a/linters/tofu/test_data/tofu_v1.6.2_variables.fmt.shot b/linters/tofu/test_data/tofu_v1.6.2_variables.fmt.shot new file mode 100644 index 000000000..7ead6f5f8 --- /dev/null +++ b/linters/tofu/test_data/tofu_v1.6.2_variables.fmt.shot @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter tofu test variables 1`] = ` +"variable "ssl_certificates" { + type = map(string) + default = { + lorem-elb-us-west-3 = "lorem" + ipsum-elb-us-east-1 = "ipsum" + dolor-elb-us-east-2 = "dolor" + } +} +" +`; diff --git a/linters/tofu/test_data/variables.in.tf b/linters/tofu/test_data/variables.in.tf new file mode 100644 index 000000000..3743a3fef --- /dev/null +++ b/linters/tofu/test_data/variables.in.tf @@ -0,0 +1,8 @@ + variable "ssl_certificates" { + type = "map" + default = { + lorem-elb-us-west-3 = "lorem" + ipsum-elb-us-east-1 = "ipsum" + dolor-elb-us-east-2 = "dolor" + } +} diff --git a/linters/tofu/tofu.test.ts b/linters/tofu/tofu.test.ts new file mode 100644 index 000000000..616f4a3b5 --- /dev/null +++ b/linters/tofu/tofu.test.ts @@ -0,0 +1,18 @@ +import { linterCheckTest, linterFmtTest } from "tests"; +import { TrunkLintDriver } from "tests/driver"; + +// Due to tofu's validate subcommand being disabled by default, we need to manually enable it in our test's trunk.yaml. +const preCheck = (driver: TrunkLintDriver) => { + const trunkYamlPath = ".trunk/trunk.yaml"; + const currentContents = driver.readFile(trunkYamlPath); + const sqlfluffRegex = /- tofu@(.+)\n/; + const newContents = currentContents.replace( + sqlfluffRegex, + "- tofu@$1:\n commands: [validate, fmt]\n", + ); + driver.writeFile(trunkYamlPath, newContents); +}; + +linterCheckTest({ linterName: "tofu", preCheck }); + +linterFmtTest({ linterName: "tofu" }); diff --git a/linters/trivy/config_expected_issues.json b/linters/trivy/config_expected_issues.json index 3146e2434..42cd243ec 100644 --- a/linters/trivy/config_expected_issues.json +++ b/linters/trivy/config_expected_issues.json @@ -1,158 +1,169 @@ [ { + "file": "test_data/aws.tf", "line": "1", + "message": "Instance does not require IMDS access to require a token", "code": "AVD-AWS-0028", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "terraform", - "isSecurity": true, - "message": "Instance does not require IMDS access to require a token", - "file": "test_data/aws.tf" + "isSecurity": true }, { + "file": "test_data/aws.tf", "line": "1", + "message": "Root block device is not encrypted.", "code": "AVD-AWS-0131", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "terraform", - "isSecurity": true, - "message": "Root block device is not encrypted.", - "file": "test_data/aws.tf" + "isSecurity": true }, { - "code": "DS026", + "file": "test_data/basic.Dockerfile", + "message": "Specify at least 1 USER command in Dockerfile with non-root user as argument", + "code": "DS002", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "docker", - "isSecurity": true, - "message": "Add HEALTHCHECK instruction in your Dockerfile", - "file": "test_data/basic.Dockerfile" + "isSecurity": true }, { - "code": "DS002", + "file": "test_data/basic.Dockerfile", + "message": "Add HEALTHCHECK instruction in your Dockerfile", + "code": "DS026", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "docker", - "isSecurity": true, - "message": "Specify at least 1 USER command in Dockerfile with non-root user as argument", - "file": "test_data/basic.Dockerfile" + "isSecurity": true }, { - "code": "KSV116", + "file": "test_data/basic.yaml", + "message": "container \"sec-ctx-demo\" of pod \"security-context-demo\" in \"default\" namespace should specify a seccomp profile", + "code": "KSV104", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "pod security-context-demo in default namespace should set spec.securityContext.runAsGroup, spec.securityContext.supplementalGroups[*] and spec.securityContext.fsGroup to integer greater than 0", - "file": "test_data/basic.yaml" + "isSecurity": true }, { - "code": "KSV104", + "file": "test_data/basic.yaml", + "line": "14", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should add 'ALL' to 'securityContext.capabilities.drop'", + "code": "KSV003", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "container sec-ctx-demo of pod security-context-demo in default namespace should specify a seccomp profile", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV106", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'resources.limits.cpu'", + "code": "KSV011", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "container should drop all", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV020", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsNonRoot' to true", + "code": "KSV012", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsUser' > 10000", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV003", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should specify an image tag", + "code": "KSV013", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should add 'ALL' to 'securityContext.capabilities.drop'", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV013", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.readOnlyRootFilesystem' to true", + "code": "KSV014", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should specify an image tag", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV021", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'resources.limits.memory'", + "code": "KSV018", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsGroup' > 10000", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV014", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsUser' > 10000", + "code": "KSV020", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.readOnlyRootFilesystem' to true", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV030", + "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsGroup' > 10000", + "code": "KSV021", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Either Pod or Container should set 'securityContext.seccompProfile.type' to 'RuntimeDefault'", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV011", + "message": "Either Pod or Container should set 'securityContext.seccompProfile.type' to 'RuntimeDefault'", + "code": "KSV030", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'resources.limits.cpu'", - "file": "test_data/basic.yaml" + "isSecurity": true }, { + "file": "test_data/basic.yaml", "line": "14", - "code": "KSV012", + "message": "container should drop all", + "code": "KSV106", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'securityContext.runAsNonRoot' to true", - "file": "test_data/basic.yaml" + "isSecurity": true }, { - "line": "14", - "code": "KSV018", + "file": "test_data/main.tf", + "line": "17", + "message": "IAM policy document uses sensitive action 'logs:CreateLogGroup' on wildcarded resource '34c9c025-d988-4bcc-9d4a-4581749e7576:*'", + "code": "AVD-AWS-0057", "level": "LEVEL_HIGH", "linter": "trivy", - "targetType": "yaml", - "isSecurity": true, - "message": "Container 'sec-ctx-demo' of Pod 'security-context-demo' should set 'resources.limits.memory'", - "file": "test_data/basic.yaml" + "targetType": "terraform", + "isSecurity": true + }, + { + "file": "test_data/main.tf", + "line": "17", + "message": "Function does not have tracing enabled.", + "code": "AVD-AWS-0066", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "terraform", + "isSecurity": true } ] diff --git a/linters/trivy/plugin.yaml b/linters/trivy/plugin.yaml index 9af9f4278..abf3e5ef1 100644 --- a/linters/trivy/plugin.yaml +++ b/linters/trivy/plugin.yaml @@ -27,8 +27,10 @@ lint: definitions: - name: trivy tools: [trivy] - suggest_if: files_present + suggest_if: config_present + description: A comprehensive and versatile security scanner known_good_version: 0.44.1 + # trivy supports --format template --template "@contrib/sarif.tpl", but it reports the wrong filepaths. commands: - name: fs-vuln files: [lockfile] @@ -72,7 +74,8 @@ lint: parser: runtime: python run: python3 ${plugin}/linters/trivy/trivy_config_to_sarif.py - direct_configs: [trivy-secret.yaml] + # trivy-secret.yaml is old config file https://aquasecurity.github.io/trivy/v0.27.1/docs/secret/configuration/ + direct_configs: [trivy.yaml, .trivyignore, .trivyignore.yaml, trivy-secret.yaml] version_command: parse_regex: Version ${semver} run: trivy --version diff --git a/linters/trivy/test_data/main.tf b/linters/trivy/test_data/main.tf new file mode 100644 index 000000000..66d9016c6 --- /dev/null +++ b/linters/trivy/test_data/main.tf @@ -0,0 +1,34 @@ +terraform { + required_version = ">= 1.4.6" + backend "local" { + path = "terraform.tfstate" + } + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.47.0" + } + } +} + +# AWS Provider +provider "aws" {} + +module "lambda_function" { + source = "terraform-aws-modules/lambda/aws" + version = "7.4.0" + function_name = "LambdaFunction" + handler = "lambda_handler.lambda_handler" + runtime = "python3.12" + local_existing_package = "lambda_package.zip" + create_package = false + create_current_version_allowed_triggers = false + attach_policy_json = false + timeout = 900 + ignore_source_code_hash = true + maximum_retry_attempts = 0 + # Because tc-db is private, this lambda function must run within the VPC + vpc_subnet_ids = ["subnet-1", "subnet-2", "subnet-3"] + vpc_security_group_ids = ["security-group-1", "security-group-2"] + attach_network_policy = true +} diff --git a/linters/trivy/test_data/trivy_v0.44.1_config.check.shot b/linters/trivy/test_data/trivy_v0.44.1_config.check.shot index 91efaf296..bcf500d03 100644 --- a/linters/trivy/test_data/trivy_v0.44.1_config.check.shot +++ b/linters/trivy/test_data/trivy_v0.44.1_config.check.shot @@ -49,6 +49,15 @@ exports[`Testing linter trivy test config 1`] = ` ], "verb": "TRUNK_VERB_CHECK", }, + { + "command": "config", + "fileGroupName": "terraform", + "linter": "trivy", + "paths": [ + "test_data/main.tf", + ], + "verb": "TRUNK_VERB_CHECK", + }, ], "taskFailures": [], "unformattedFiles": [], diff --git a/linters/trivy/test_data/trivy_v0.44.1_fs-secret.check.shot b/linters/trivy/test_data/trivy_v0.44.1_fs-secret.check.shot index 07f0019fd..c5a910f63 100644 --- a/linters/trivy/test_data/trivy_v0.44.1_fs-secret.check.shot +++ b/linters/trivy/test_data/trivy_v0.44.1_fs-secret.check.shot @@ -96,6 +96,15 @@ exports[`Testing linter trivy test fs-secret 1`] = ` ], "verb": "TRUNK_VERB_CHECK", }, + { + "command": "fs-secret", + "fileGroupName": "ALL", + "linter": "trivy", + "paths": [ + "test_data/main.tf", + ], + "verb": "TRUNK_VERB_CHECK", + }, { "command": "fs-secret", "fileGroupName": "ALL", diff --git a/linters/trivy/trivy.test.ts b/linters/trivy/trivy.test.ts index a7616be51..874f36a1f 100644 --- a/linters/trivy/trivy.test.ts +++ b/linters/trivy/trivy.test.ts @@ -12,9 +12,20 @@ const callbackGenerator = const trunkYamlPath = ".trunk/trunk.yaml"; const currentContents = driver.readFile(trunkYamlPath); const trivyRegex = /- trivy@(.+)\n/; + + // fs-vuln, config sometimes fail in CI to query DB concurrently. + const extraContents = ` + definitions: + - name: trivy + commands: + - name: fs-vuln + max_concurrency: 1 + - name: config + max_concurrency: 1 +`; const newContents = currentContents.replace( trivyRegex, - `- trivy@$1:\n commands: [${command}]\n`, + `- trivy@$1:\n commands: [${command}]\n${extraContents}`, ); driver.writeFile(trunkYamlPath, newContents); if (otherPreCheck) { @@ -42,7 +53,7 @@ fuzzyLinterCheckTest({ linterName: "trivy", testName: "fs-vuln", args: "-a", - fileIssueAssertionCallback: createFuzzyMatcher(() => vulnExpectedFileIssues, 30), + fileIssueAssertionCallback: createFuzzyMatcher(() => vulnExpectedFileIssues, 40), preCheck: callbackGenerator("fs-vuln"), }); diff --git a/linters/trivy/trivy_config_to_sarif.py b/linters/trivy/trivy_config_to_sarif.py index 281d9a704..1bfa6d7f5 100755 --- a/linters/trivy/trivy_config_to_sarif.py +++ b/linters/trivy/trivy_config_to_sarif.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import json +import os import sys @@ -29,6 +30,7 @@ def to_result_sarif(path: str, vuln_id: str, description: str, line: int = 0): def main(argv): trivy_json = json.load(sys.stdin) + path = trivy_json["ArtifactName"] results = [] for result in trivy_json.get("Results", []): @@ -37,11 +39,15 @@ def main(argv): for vuln in result["Misconfigurations"]: vuln_id = vuln["ID"] message = vuln["Message"] - line_num = vuln.get("CauseMetadata", {}).get("StartLine", 0) - - results.append( - to_result_sarif(trivy_json["ArtifactName"], vuln_id, message, line_num) - ) + location_info = vuln.get("CauseMetadata", {}) + line_num = location_info.get("StartLine", 0) + for occurrence in location_info.get("Occurrences", []): + # Sometimes the original StartLine will reference a resource file + if occurrence.get("Filename") == os.path.basename(path): + line_num = occurrence["Location"]["StartLine"] + break + + results.append(to_result_sarif(path, vuln_id, message, line_num)) sarif = { "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", diff --git a/linters/trivy/vuln_expected_issues.json b/linters/trivy/vuln_expected_issues.json index 901231bd8..cd8958803 100644 --- a/linters/trivy/vuln_expected_issues.json +++ b/linters/trivy/vuln_expected_issues.json @@ -1,502 +1,1122 @@ [ { + "file": "test_data/Gemfile.lock", "line": "5", + "message": "Vulnerability in 'actionpack': rubygem-actionpack: Denial of Service in Action Dispatch. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", "code": "CVE-2023-22792", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'actionpack': Denial of Service in Action Dispatch. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "5", + "message": "Vulnerability in 'actionpack': rubygem-actionpack: Denial of Service in Action Dispatch. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", "code": "CVE-2023-22795", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'actionpack': Denial of Service in Action Dispatch. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "5", + "message": "Vulnerability in 'actionpack': actionpack: Possible XSS via User Supplied Values to redirect_to. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.4, >= 7.0.5.1 or higher.", "code": "CVE-2023-28362", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'actionpack': Possible XSS via User Supplied Values to redirect_to. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.4, >= 7.0.5.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", + "line": "5", + "message": "Vulnerability in 'actionpack': rubygem-actionpack: Possible ReDoS vulnerability in query parameter filtering in Action Dispatch. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.9, ~> 7.0.8.5, ~> 7.1.4, >= 7.1.4.1, >= 7.2.1.1 or higher.", + "code": "CVE-2024-41128", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "5", + "message": "Vulnerability in 'actionpack': rubygem-actionpack: Possible ReDoS vulnerability in HTTP Token authentication in Action Controller. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.9, ~> 7.0.8.5, ~> 7.1.4, >= 7.1.4.1, >= 7.2.1.1 or higher.", + "code": "CVE-2024-47887", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "8", + "message": "Vulnerability in 'actionmailer': rubygem-actionmailer: Possible ReDoS vulnerability in block_format in Action Mailer. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.9, ~> 7.0.8.5, ~> 7.1.4, >= 7.1.4.1, >= 7.2.1.1 or higher.", + "code": "CVE-2024-47889", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", "line": "10", + "message": "Vulnerability in 'actionview': rails: DOM Based Cross-site Scripting in rails-ujs for contenteditable HTML Elements. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.3, >= 7.0.4.3 or higher.", "code": "CVE-2023-23913", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'actionview': DOM Based Cross-site Scripting in rails-ujs for contenteditable HTML Elements. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7.3, >= 7.0.4.3 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "16", - "code": "CVE-2023-22796", - "level": "LEVEL_HIGH", + "message": "Vulnerability in 'activesupport': rubygem-activesupport: File Disclosure of Locally Encrypted Files. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7, >= 6.1.7.5, >= 7.0.7.1 or higher.", + "code": "CVE-2023-38037", + "level": "LEVEL_LOW", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'activesupport': Regular Expression Denial of Service. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "16", + "message": "Vulnerability in 'activesupport': rubygem-activesupport: Possible XSS in SafeBuffer#bytesplice. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7, >= 6.1.7.3, >= 7.0.4.3 or higher.", "code": "CVE-2023-28120", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'activesupport': Possible XSS in SafeBuffer#bytesplice. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7, >= 6.1.7.3, >= 7.0.4.3 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "16", + "message": "Vulnerability in 'activesupport': rubygem-activesupport: Regular Expression Denial of Service. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", + "code": "CVE-2023-22796", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "34", + "message": "Vulnerability in 'activerecord': rubygem-activerecord: Denial of Service. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", "code": "CVE-2022-44566", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'activerecord': Denial of Service. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 5.2.8, >= 5.2.8.15, ~> 6.1.7, >= 6.1.7.1, >= 7.0.4.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", + "line": "38", + "message": "Vulnerability in 'activestorage': rubygem-activestorage: Possible Sensitive Session Information Leak in Active Storage. Current version is vulnerable: 5.2.8.1. Patch available: upgrade to ~> 6.1.7, >= 6.1.7.7, >= 7.0.8.1 or higher.", + "code": "CVE-2024-26144", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", "line": "97", - "code": "GHSA-pxvg-2qj5-37jq", + "message": "Vulnerability in 'nokogiri': Use-after-free in libxml2 via Nokogiri::XML::Reader. Current version is vulnerable: 1.14.1. Patch available: upgrade to ~> 1.15.6, >= 1.16.2 or higher.", + "code": "GHSA-xc9x-jj77-9p9j", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "97", + "message": "Vulnerability in 'nokogiri': Use-after-free in libxml2 via Nokogiri::XML::Reader. Current version is vulnerable: 1.14.1. Patch available: upgrade to 1.15.6, 1.16.2 or higher.", + "code": "GHSA-vcc3-rw6f-jv97", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "97", + "message": "Vulnerability in 'nokogiri': Nokogiri updates packaged libxml2 to v2.12.7 to resolve CVE-2024-34459. Current version is vulnerable: 1.14.1. Patch available: upgrade to >= 1.16.5 or higher.", + "code": "GHSA-r95h-9x8f-r3f7", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "97", "message": "Vulnerability in 'nokogiri': Update packaged libxml2 to v2.10.4 to resolve multiple CVEs. Current version is vulnerable: 1.14.1. Patch available: upgrade to >= 1.14.3 or higher.", - "file": "test_data/Gemfile.lock" + "code": "GHSA-pxvg-2qj5-37jq", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", + "line": "99", + "message": "Vulnerability in 'puma': rubygem-puma: Header normalization allows for client to clobber proxy set headers. Current version is vulnerable: 4.3.12. Patch available: upgrade to ~> 5.6.9, >= 6.4.3 or higher.", + "code": "CVE-2024-45614", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "99", + "message": "Vulnerability in 'puma': rubygem-puma: HTTP request smuggling when parsing chunked Transfer-Encoding Bodies. Current version is vulnerable: 4.3.12. Patch available: upgrade to ~> 5.6.8, >= 6.4.2 or higher.", + "code": "CVE-2024-21647", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "99", + "message": "Vulnerability in 'puma': rubygem-puma: HTTP request smuggling when parsing chunked transfer encoding bodies and zero-length content-length headers. Current version is vulnerable: 4.3.12. Patch available: upgrade to ~> 5.6.7, >= 6.3.1 or higher.", + "code": "CVE-2023-40175", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", "line": "102", + "message": "Vulnerability in 'rack': rubygem-rack: Denial of service in Multipart MIME parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.0.9, >= 2.0.9.3, ~> 2.1.4, >= 2.1.4.3, ~> 2.2.6, >= 2.2.6.3, >= 3.0.4.2 or higher.", "code": "CVE-2023-27530", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'rack': Denial of service in Multipart MIME parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.0.9, >= 2.0.9.3, ~> 2.1.4, >= 2.1.4.3, ~> 2.2.6, >= 2.2.6.3, >= 3.0.4.2 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", "line": "102", + "message": "Vulnerability in 'rack': rubygem-rack: Possible Denial of Service Vulnerability in Rack Header Parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.0.9, >= 2.0.9.4, ~> 2.1.4, >= 2.1.4.4, ~> 2.2.8, >= 2.2.8.1, >= 3.0.9.1 or higher.", + "code": "CVE-2024-26146", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/Gemfile.lock", + "line": "102", + "message": "Vulnerability in 'rack': rubygem-rack: denial of service in header parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.0, >= 2.2.6.4, >= 3.0.6.1 or higher.", "code": "CVE-2023-27539", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'rack': denial of service in header parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.0, >= 2.2.6.4, >= 3.0.6.1 or higher.", - "file": "test_data/Gemfile.lock" + "isSecurity": true }, { - "line": "7", - "code": "CVE-2022-30781", - "level": "LEVEL_HIGH", + "file": "test_data/Gemfile.lock", + "line": "102", + "message": "Vulnerability in 'rack': rubygem-rack: Possible DoS Vulnerability with Range Header in Rack. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.2.8, >= 2.2.8.1, >= 3.0.9.1 or higher.", + "code": "CVE-2024-26141", + "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Shell command injection in gitea. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.16.7 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/Gemfile.lock", + "line": "102", + "message": "Vulnerability in 'rack': rubygem-rack: Denial of Service Vulnerability in Rack Content-Type Parsing. Current version is vulnerable: 2.2.6.2. Patch available: upgrade to ~> 2.2.8, >= 2.2.8.1, >= 3.0.9.1 or higher.", + "code": "CVE-2024-25126", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': code.gitea.io/gitea Open Redirect vulnerability. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.19.4 or higher.", "code": "CVE-2023-3515", "level": "LEVEL_LOW", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': code.gitea.io/gitea Open Redirect vulnerability. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.19.4 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "7", - "code": "CVE-2021-28378", + "message": "Vulnerability in 'code.gitea.io/gitea': Gitea erroneous repo clones. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.17.2 or higher.", + "code": "CVE-2022-38795", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Gitea: Stored XSS due to improper sanitization. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.22.1 or higher.", + "code": "CVE-2024-6886", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Gitea allowed assignment of private issues. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.9 or higher.", + "code": "CVE-2022-38183", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Cross-site Scripting in Gitea. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.13.4 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Shell command injection in gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.7 or higher.", + "code": "CVE-2022-30781", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Arbitrary file deletion in gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.4 or higher.", "code": "CVE-2022-27313", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Arbitrary file deletion in gitea. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.16.4 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Stored Cross-site Scripting in gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.9 or higher.", "code": "CVE-2022-1928", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Stored Cross-site Scripting in gitea. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.16.9 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "7", - "code": "CVE-2022-0905", + "message": "Vulnerability in 'code.gitea.io/gitea': Gogs and Gitea SSRF Vulnerability. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.0-rc1 or higher.", + "code": "CVE-2018-15192", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Gitea Missing Authorization vulnerability. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.16.4 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Arbitrary Code Execution in Gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.12.6 or higher.", + "code": "CVE-2020-14144", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Cross-site Scripting in Gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.13.4 or higher.", + "code": "CVE-2021-28378", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Path Traversal in Gitea. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.13.6 or higher.", "code": "CVE-2021-29134", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'code.gitea.io/gitea': Path Traversal in Gitea. Current version is vulnerable: 1.9.0-dev. Patch available: upgrade to 1.13.6 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Gitea Missing Authorization vulnerability. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.4 or higher.", + "code": "CVE-2022-0905", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "7", + "message": "Vulnerability in 'code.gitea.io/gitea': Gitea Open Redirect. Current version is vulnerable: v1.9.0-dev. Patch available: upgrade to 1.16.5 or higher.", + "code": "CVE-2022-1058", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", "line": "40", + "message": "Vulnerability in 'github.com/dgrijalva/jwt-go': jwt-go: access restriction bypass vulnerability. Current version is vulnerable: v3.2.0+incompatible.", "code": "CVE-2020-26160", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/dgrijalva/jwt-go': jwt-go: access restriction bypass vulnerability. Current version is vulnerable: 3.2.0+incompatible.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': gitea: Sanitize and Escape refs in git backend. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.17.3 or higher.", + "code": "CVE-2022-42968", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Cross-site Scripting in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.5.1 or higher.", "code": "CVE-2021-45329", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Cross-site Scripting in Gitea. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.5.1 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", - "code": "CVE-2022-42968", - "level": "LEVEL_HIGH", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Open redirect in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.4.3 or higher.", + "code": "CVE-2021-45328", + "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Sanitize and Escape refs in git backend. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.17.3 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Capture-replay in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.11.2 or higher.", "code": "CVE-2021-45327", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Capture-replay in Gitea. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.11.2 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Cross Site Request Forgery in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.5.2 or higher.", "code": "CVE-2021-45326", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Cross Site Request Forgery in Gitea. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.5.2 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Gitea displaying raw OpenID error in UI. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.7.0 or higher.", "code": "CVE-2021-45325", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Gitea displaying raw OpenID error in UI. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.7.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Improper Access Control in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.12.6 or higher.", + "code": "CVE-2020-28991", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Denial of Service in Gitea. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.12.0 or higher.", "code": "CVE-2020-13246", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Denial of Service in Gitea. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.12.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "58", - "code": "CVE-2021-45328", - "level": "LEVEL_MEDIUM", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Gitea Remote Code Execution. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.7.6 or higher.", + "code": "CVE-2019-11229", + "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/go-gitea/gitea': Open redirect in Gitea. Current version is vulnerable: 1.2.3. Patch available: upgrade to 1.4.3 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { - "line": "84", - "code": "CVE-2022-45004", + "file": "test_data/go.mod", + "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Gitea Improper Input Validation. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.7.6 or higher.", + "code": "CVE-2019-11228", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "58", + "message": "Vulnerability in 'github.com/go-gitea/gitea': Gitea Exposes Private Email Addresses. Current version is vulnerable: v1.2.3. Patch available: upgrade to 1.5.1 or higher.", + "code": "CVE-2018-1000803", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Cross-site Scripting via crafted landing page. Current version is vulnerable: 0.1.2.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "84", - "code": "CVE-2022-25295", + "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Server-Side Request Forgery. Current version is vulnerable: v0.1.2. Patch available: upgrade to 0.11.0 or higher.", + "code": "CVE-2020-24710", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/gophish/gophish': Gophish before 0.12.0 vulnerable to Open Redirect. Current version is vulnerable: 0.1.2. Patch available: upgrade to 0.12.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "84", - "code": "CVE-2019-16146", + "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Cross-site Scripting via crafted landing page. Current version is vulnerable: v0.1.2.", + "code": "CVE-2022-45004", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/gophish/gophish': Gophish XSS Vulnerability. Current version is vulnerable: 0.1.2. Patch available: upgrade to 0.9.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "84", + "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Denial of Service via crafted payload involving autofocus. Current version is vulnerable: v0.1.2.", "code": "CVE-2022-45003", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Denial of Service via crafted payload involving autofocus. Current version is vulnerable: 0.1.2.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "84", - "code": "CVE-2020-24710", + "message": "Vulnerability in 'github.com/gophish/gophish': Gophish before 0.12.0 vulnerable to Open Redirect. Current version is vulnerable: v0.1.2. Patch available: upgrade to 0.12.0 or higher.", + "code": "CVE-2022-25295", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "84", + "message": "Vulnerability in 'github.com/gophish/gophish': Gophish XSS Vulnerability. Current version is vulnerable: v0.1.2. Patch available: upgrade to 0.9.0 or higher.", + "code": "CVE-2019-16146", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/gophish/gophish': Gophish vulnerable to Server-Side Request Forgery. Current version is vulnerable: 0.1.2. Patch available: upgrade to 0.11.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "161", + "message": "Vulnerability in 'github.com/unknwon/cae': github.com/unknwon/cae Path Traversal vulnerability. Current version is vulnerable: v1.0.0. Patch available: upgrade to 1.0.1 or higher.", "code": "CVE-2020-7668", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/unknwon/cae': Path Traversal in github.com/unknwon/cae/tz. Current version is vulnerable: 1.0.0. Patch available: upgrade to 1.0.1 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "161", + "message": "Vulnerability in 'github.com/unknwon/cae': Path Traversal in github.com/unknwon/cae/zip. Current version is vulnerable: v1.0.0. Patch available: upgrade to 1.0.1 or higher.", "code": "CVE-2020-7664", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'github.com/unknwon/cae': Path Traversal in github.com/unknwon/cae/zip. Current version is vulnerable: 1.0.0. Patch available: upgrade to 1.0.1 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", - "code": "CVE-2022-27191", + "message": "Vulnerability in 'golang.org/x/crypto': A message-forgery issue was discovered in crypto/openpgp/clearsign/cle ... Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20190424203555-c05e17bb3b2d or higher.", + "code": "CVE-2019-11841", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "172", + "message": "Vulnerability in 'golang.org/x/crypto': golang.org/x/crypto: Keystream loop in amd64 assembly when overflowing 32-bit counter. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20190320223903-b7391e95e576 or higher.", + "code": "CVE-2019-11840", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "172", + "message": "Vulnerability in 'golang.org/x/crypto': golang: crypto/ssh: crafted authentication request can lead to nil pointer dereference. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20201216223049-8b5274cf687f or higher.", + "code": "CVE-2020-29652", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': crash in a golang.org/x/crypto/ssh server. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20220314234659-1baeb1ce4c0b or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", - "code": "CVE-2021-43565", + "message": "Vulnerability in 'golang.org/x/crypto': golang: Integer overflow on 32bit architectures via crafted certificate allows for denial of service. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20200124225646-8b5121be2f68 or higher.", + "code": "CVE-2020-7919", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': empty plaintext packet causes panic. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20211202192323-5770296d904e or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", + "message": "Vulnerability in 'golang.org/x/crypto': golang.org/x/crypto: Processing of crafted ssh-ed25519 public keys allows for panic. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20200220183623-bac4c82f6975 or higher.", "code": "CVE-2020-9283", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': golang.org/x/crypto: Processing of crafted ssh-ed25519 public keys allows for panic. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20200220183623-bac4c82f6975 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", - "code": "CVE-2020-7919", + "message": "Vulnerability in 'golang.org/x/crypto': golang.org/x/crypto: empty plaintext packet causes panic. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20211202192323-5770296d904e or higher.", + "code": "CVE-2021-43565", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': golang: Integer overflow on 32bit architectures via crafted certificate allows for denial of service. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20200124225646-8b5121be2f68 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", - "code": "CVE-2019-11840", - "level": "LEVEL_MEDIUM", + "message": "Vulnerability in 'golang.org/x/crypto': golang: crash in a golang.org/x/crypto/ssh server. Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20220314234659-1baeb1ce4c0b or higher.", + "code": "CVE-2022-27191", + "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': golang.org/x/crypto: Keystream loop in amd64 assembly when overflowing 32-bit counter. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20190320223903-b7391e95e576 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "172", - "code": "CVE-2020-29652", - "level": "LEVEL_HIGH", + "message": "Vulnerability in 'golang.org/x/crypto': ssh: Prefix truncation attack on Binary Packet Protocol (BPP). Current version is vulnerable: v0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.17.0 or higher.", + "code": "CVE-2023-48795", + "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/crypto': golang: crypto/ssh: crafted authentication request can lead to nil pointer dereference. Current version is vulnerable: 0.0.0-20190308221718-c2843e01d9a2. Patch available: upgrade to 0.0.0-20201216223049-8b5274cf687f or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "174", - "code": "CVE-2021-33194", - "level": "LEVEL_HIGH", + "message": "Vulnerability in 'golang.org/x/net': HTTP/2: Multiple HTTP/2 enabled web servers are vulnerable to a DDoS attack (Rapid Reset Attack). Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.17.0 or higher.", + "code": "CVE-2023-44487", + "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/net': golang: x/net/html: infinite loop in ParseFragment. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20210520170846-37e1c6afe023 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang: net/http: excessive memory growth in a Go server accepting HTTP/2 requests. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.4.0 or higher.", + "code": "CVE-2022-41717", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang.org/x/net/http2: avoid quadratic complexity in HPACK decoding. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.7.0 or higher.", "code": "CVE-2022-41723", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/net': avoid quadratic complexity in HPACK decoding. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.7.0 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "174", + "message": "Vulnerability in 'golang.org/x/net': A malicious HTTP/2 client which rapidly creates requests and immediate ... Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.17.0 or higher.", + "code": "CVE-2023-39325", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang.org/x/net/html: Cross site scripting. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.13.0 or higher.", + "code": "CVE-2023-3978", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang: net/http: handle server errors after sending GOAWAY. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20220906165146-f3363e06e74c or higher.", "code": "CVE-2022-27664", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/net': handle server errors after sending GOAWAY. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20220906165146-f3363e06e74c or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang: net/http, x/net/http2: unlimited number of CONTINUATION frames causes DoS. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.23.0 or higher.", + "code": "CVE-2023-45288", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang: x/net/html: infinite loop in ParseFragment. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20210520170846-37e1c6afe023 or higher.", + "code": "CVE-2021-33194", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "174", + "message": "Vulnerability in 'golang.org/x/net': golang: net/http: panic in ReadRequest and ReadResponse when reading a very large header. Current version is vulnerable: v0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20210428140749-89ef3d95e781 or higher.", "code": "CVE-2021-31525", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/net': golang: net/http: panic in ReadRequest and ReadResponse when reading a very large header. Current version is vulnerable: 0.0.0-20200324143707-d3edc9973b7e. Patch available: upgrade to 0.0.0-20210428140749-89ef3d95e781 or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", "line": "175", + "message": "Vulnerability in 'golang.org/x/sys': golang: syscall: faccessat checks wrong group. Current version is vulnerable: v0.0.0-20200331124033-c3d80250170d. Patch available: upgrade to 0.0.0-20220412211240-33da011f77ad or higher.", "code": "CVE-2022-29526", "level": "LEVEL_MEDIUM", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'golang.org/x/sys': faccessat checks wrong group. Current version is vulnerable: 0.0.0-20200331124033-c3d80250170d. Patch available: upgrade to 0.0.0-20220412211240-33da011f77ad or higher.", - "file": "test_data/go.mod" + "isSecurity": true }, { + "file": "test_data/go.mod", + "line": "189", + "message": "Vulnerability in 'gopkg.in/src-d/go-git.v4': go-git: Maliciously crafted Git server replies can lead to path traversal and RCE on go-git clients. Current version is vulnerable: v4.11.0.", + "code": "CVE-2023-49569", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/go.mod", + "line": "189", + "message": "Vulnerability in 'gopkg.in/src-d/go-git.v4': go-git: Maliciously crafted Git server replies can cause DoS on go-git clients. Current version is vulnerable: v4.11.0.", + "code": "CVE-2023-49568", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/nested/requirements.txt", "line": "1", + "message": "Vulnerability in 'pillow': Pillow before 9.2.0 performs Improper Handling of Highly Compressed GI ... Current version is vulnerable: 9.1.1. Patch available: upgrade to 9.2.0 or higher.", "code": "CVE-2022-45198", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'pillow': Pillow before 9.2.0 performs Improper Handling of Highly Compressed GI ... Current version is vulnerable: 9.1.1. Patch available: upgrade to 9.2.0 or higher.", - "file": "test_data/nested/requirements.txt" + "isSecurity": true }, { + "file": "test_data/nested/requirements.txt", "line": "1", - "code": "CVE-2022-45198", + "message": "Vulnerability in 'pillow': python-pillow: uncontrolled resource consumption when textlength in an ImageDraw instance operates on a long text argument. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.0 or higher.", + "code": "CVE-2023-44271", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/nested/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': libwebp: Heap buffer overflow in WebP Codec. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "CVE-2023-4863", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/nested/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': pillow: Arbitrary Code Execution via the environment parameter. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.2.0 or higher.", + "code": "CVE-2023-50447", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/nested/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': python-pillow: buffer overflow in _imagingcms.c. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.3.0 or higher.", + "code": "CVE-2024-28219", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/nested/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': Bundled libwebp in Pillow vulnerable. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "GHSA-56pw-mpj4-fxww", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/no_errors/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': Bundled libwebp in Pillow vulnerable. Current version is vulnerable: 9.3.0. Patch available: upgrade to 10.0.1 or higher.", + "code": "GHSA-56pw-mpj4-fxww", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, + "isSecurity": true + }, + { + "file": "test_data/no_errors/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': python-pillow: buffer overflow in _imagingcms.c. Current version is vulnerable: 9.3.0. Patch available: upgrade to 10.3.0 or higher.", + "code": "CVE-2024-28219", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/no_errors/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': pillow: Arbitrary Code Execution via the environment parameter. Current version is vulnerable: 9.3.0. Patch available: upgrade to 10.2.0 or higher.", + "code": "CVE-2023-50447", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/no_errors/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': libwebp: Heap buffer overflow in WebP Codec. Current version is vulnerable: 9.3.0. Patch available: upgrade to 10.0.1 or higher.", + "code": "CVE-2023-4863", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/no_errors/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': python-pillow: uncontrolled resource consumption when textlength in an ImageDraw instance operates on a long text argument. Current version is vulnerable: 9.3.0. Patch available: upgrade to 10.0.0 or higher.", + "code": "CVE-2023-44271", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", "message": "Vulnerability in 'pillow': Pillow before 9.2.0 performs Improper Handling of Highly Compressed GI ... Current version is vulnerable: 9.1.1. Patch available: upgrade to 9.2.0 or higher.", - "file": "test_data/requirements.txt" + "code": "CVE-2022-45198", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': python-pillow: uncontrolled resource consumption when textlength in an ImageDraw instance operates on a long text argument. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.0 or higher.", + "code": "CVE-2023-44271", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': libwebp: Heap buffer overflow in WebP Codec. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "CVE-2023-4863", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true }, { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': pillow: Arbitrary Code Execution via the environment parameter. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.2.0 or higher.", + "code": "CVE-2023-50447", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': python-pillow: buffer overflow in _imagingcms.c. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.3.0 or higher.", + "code": "CVE-2024-28219", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "1", + "message": "Vulnerability in 'pillow': Bundled libwebp in Pillow vulnerable. Current version is vulnerable: 9.1.1. Patch available: upgrade to 10.0.1 or higher.", + "code": "GHSA-56pw-mpj4-fxww", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", "line": "2", + "message": "Vulnerability in 'langchain': langchain Code Injection vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.236 or higher.", + "code": "CVE-2023-36095", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain arbitrary code execution vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "CVE-2023-36258", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain SQL Injection vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", "code": "CVE-2023-36189", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'langchain': langchain SQL Injection vulnerability. Current version is vulnerable: 0.0.171.", - "file": "test_data/requirements.txt" + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.236 or higher.", + "code": "CVE-2023-36188", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.312 or higher.", + "code": "CVE-2023-36281", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true }, { + "file": "test_data/requirements.txt", "line": "2", + "message": "Vulnerability in 'langchain': Langchain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", "code": "CVE-2023-34541", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'langchain': Langchain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171.", - "file": "test_data/requirements.txt" + "isSecurity": true }, { + "file": "test_data/requirements.txt", "line": "2", + "message": "Vulnerability in 'langchain': Langchain OS Command Injection vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.225 or higher.", "code": "CVE-2023-34540", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'langchain': Langchain OS Command Injection vulnerability. Current version is vulnerable: 0.0.171.", - "file": "test_data/requirements.txt" + "isSecurity": true }, { + "file": "test_data/requirements.txt", "line": "2", - "code": "CVE-2023-36188", + "message": "Vulnerability in 'langchain': Langchain Server-Side Request Forgery vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.329 or higher.", + "code": "CVE-2023-32786", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'langchain': langchain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171.", - "file": "test_data/requirements.txt" + "isSecurity": true }, { + "file": "test_data/requirements.txt", "line": "2", - "code": "CVE-2023-36258", + "message": "Vulnerability in 'langchain': Langchain SQL Injection vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "CVE-2023-32785", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': LangChain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.247 or higher.", + "code": "CVE-2023-38860", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': LangChain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.236 or higher.", + "code": "CVE-2023-38896", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': Langchain vulnerable to arbitrary code execution via the evaluate function in the numexpr library. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.308 or higher.", + "code": "CVE-2023-39631", "level": "LEVEL_HIGH", "linter": "trivy", "targetType": "lockfile", - "isSecurity": true, - "message": "Vulnerability in 'langchain': langchain arbitrary code execution vulnerability. Current version is vulnerable: 0.0.171.", - "file": "test_data/requirements.txt" + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': LangChain vulnerable to arbitrary code execution. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.325 or higher.", + "code": "CVE-2023-39659", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': LangChain Server Side Request Forgery vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.317 or higher.", + "code": "CVE-2023-46229", + "level": "LEVEL_HIGH", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain Server-Side Request Forgery vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.1.0 or higher.", + "code": "CVE-2024-0243", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': LangChain directory traversal vulnerability. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.339 or higher.", + "code": "CVE-2024-28088", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': Denial of service in langchain-community. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.2.5 or higher.", + "code": "CVE-2024-2965", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain vulnerable to path traversal. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.0.353 or higher.", + "code": "CVE-2024-3571", + "level": "LEVEL_MEDIUM", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true + }, + { + "file": "test_data/requirements.txt", + "line": "2", + "message": "Vulnerability in 'langchain': langchain: SQL Injection in langchain-ai/langchain. Current version is vulnerable: 0.0.171. Patch available: upgrade to 0.2.0 or higher.", + "code": "CVE-2024-8309", + "level": "LEVEL_LOW", + "linter": "trivy", + "targetType": "lockfile", + "isSecurity": true } ] diff --git a/linters/trufflehog/plugin.yaml b/linters/trufflehog/plugin.yaml index 4ff554d74..1a293e212 100644 --- a/linters/trufflehog/plugin.yaml +++ b/linters/trufflehog/plugin.yaml @@ -21,6 +21,7 @@ lint: - name: trufflehog files: [ALL] tools: [trufflehog] + description: Validated and versatile secrets scanner known_good_version: 3.59.0 known_bad_versions: [3.41.0, 3.45.0, 3.60.1, 3.60.2] commands: @@ -31,7 +32,10 @@ lint: success_codes: [0, 183] is_security: true batch: true + cache_results: true cache_ttl: 1h + # trufflehog 3.71.1 stopped linting symlinks + sandbox_type: copy_targets parser: runtime: python run: python3 ${plugin}/linters/trufflehog/trufflehog_to_sarif.py @@ -45,6 +49,7 @@ lint: # Variant of trufflehog that scans git history. - name: trufflehog-git + description: Scan git history for secrets files: [ALL] download: trufflehog known_good_version: 3.59.0 diff --git a/linters/trufflehog/test_data/trufflehog_git_v3.88.3_CUSTOM.check.shot b/linters/trufflehog/test_data/trufflehog_git_v3.88.3_CUSTOM.check.shot new file mode 100644 index 000000000..e09657b97 --- /dev/null +++ b/linters/trufflehog/test_data/trufflehog_git_v3.88.3_CUSTOM.check.shot @@ -0,0 +1,43 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter trufflehog-git test CUSTOM 1`] = ` +{ + "issues": [ + { + "code": "URI", + "file": ".", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_NEW", + "level": "LEVEL_HIGH", + "linter": "trufflehog-git", + "message": "secrets.in.py:8: Secret detected: https://admin:********@the-internet.herokuapp.com/basic_auth on commit (file since deleted)", + "targetType": "ALL", + }, + { + "code": "URI", + "file": "secrets2.in.py", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_NEW", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "trufflehog-git", + "message": "Secret detected: https://admin:********@the-internet.herokuapp.com/basic_auth on commit ", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog-git", + "paths": [ + ".", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/trufflehog/test_data/trufflehog_v3.88.3_buff_size.check.shot b/linters/trufflehog/test_data/trufflehog_v3.88.3_buff_size.check.shot new file mode 100644 index 000000000..da6cc9615 --- /dev/null +++ b/linters/trufflehog/test_data/trufflehog_v3.88.3_buff_size.check.shot @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter trufflehog test buff_size 1`] = ` +{ + "issues": [], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/buff_size.in.cc", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/buff_size.in.cc", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/trufflehog/test_data/trufflehog_v3.88.3_secrets.check.shot b/linters/trufflehog/test_data/trufflehog_v3.88.3_secrets.check.shot new file mode 100644 index 000000000..48b3993e9 --- /dev/null +++ b/linters/trufflehog/test_data/trufflehog_v3.88.3_secrets.check.shot @@ -0,0 +1,43 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter trufflehog test secrets 1`] = ` +{ + "issues": [ + { + "code": "URI", + "file": "test_data/secrets.in.py", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "8", + "linter": "trufflehog", + "message": "Secret detected: https://admin:********@the-internet.herokuapp.com/basic_auth", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/secrets.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/secrets.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/trufflehog/test_data/trufflehog_v3.88.3_wrong_line_number.check.shot b/linters/trufflehog/test_data/trufflehog_v3.88.3_wrong_line_number.check.shot new file mode 100644 index 000000000..265e27257 --- /dev/null +++ b/linters/trufflehog/test_data/trufflehog_v3.88.3_wrong_line_number.check.shot @@ -0,0 +1,54 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP +// trunk-upgrade-validation:RELEASE + +exports[`Testing linter trufflehog test wrong_line_number 1`] = ` +{ + "issues": [ + { + "code": "URI", + "file": "test_data/wrong_line_number.in.ts", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "587", + "linter": "trufflehog", + "message": "Secret detected: https://admin:********@the-internet.herokuapp.com/basic_auth", + "targetType": "ALL", + }, + { + "code": "URI", + "file": "test_data/wrong_line_number.in.ts", + "isSecurity": true, + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "592", + "linter": "trufflehog", + "message": "Secret detected: https://admin:********@the-internet.herokuapp.com/basic_auth", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/wrong_line_number.in.ts", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trufflehog", + "paths": [ + "test_data/wrong_line_number.in.ts", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/trufflehog/trufflehog.test.ts b/linters/trufflehog/trufflehog.test.ts index 35cc3a065..a7639e655 100644 --- a/linters/trufflehog/trufflehog.test.ts +++ b/linters/trufflehog/trufflehog.test.ts @@ -13,6 +13,8 @@ const preCheck = async (driver: TrunkLintDriver) => { await driver.gitDriver.add("secrets.in.py").add("secrets2.in.py").commit("Add secrets"); driver.deleteFile("secrets.in.py"); await driver.gitDriver.add("secrets.in.py").commit("Remove secrets"); + } else { + driver.debug("Error: failed to initialize git driver"); } }; diff --git a/linters/trunk-toolbox/plugin.yaml b/linters/trunk-toolbox/plugin.yaml index b5ca64718..25726eadd 100644 --- a/linters/trunk-toolbox/plugin.yaml +++ b/linters/trunk-toolbox/plugin.yaml @@ -2,7 +2,7 @@ version: 0.1 downloads: - name: trunk-toolbox - version: 0.3.1 + version: 0.5.3 downloads: - os: linux: unknown-linux-gnu @@ -17,20 +17,48 @@ tools: - name: trunk-toolbox download: trunk-toolbox shims: [trunk-toolbox] - known_good_version: 0.3.1 + known_good_version: 0.5.3 lint: definitions: - name: trunk-toolbox + description: Repository level linting tools main_tool: trunk-toolbox files: [ALL] + affects_cache: [toolbox.toml, log4rs.yaml] + known_good_version: 0.5.3 commands: - name: lint - run: trunk-toolbox --upstream=${upstream-ref} --results=${tmpfile} ${target} + version: ">=0.5.3" + run: + trunk-toolbox --upstream=${upstream-ref} --cache-dir=${cachedir} --results=${tmpfile} + ${target} + output: sarif + batch: true + success_codes: [0] + read_output_from: tmp_file + cache_results: true + disable_upstream: false + direct_configs: [toolbox.toml] + max_concurrency: 1 + - name: lint + version: ">=0.4.1" + run: + trunk-toolbox --upstream=${upstream-ref} --cache-dir=${cachedir} --results=${tmpfile} + ${target} output: sarif batch: true success_codes: [0] read_output_from: tmp_file disable_upstream: true + direct_configs: [toolbox.toml] + max_concurrency: 1 + - name: lint + run: trunk-toolbox --upstream=${upstream-ref} --results=${tmpfile} ${target} + output: sarif + batch: true + success_codes: [0] + disable_upstream: true + read_output_from: tmp_file suggest_if: never version_command: parse_regex: ${semver} diff --git a/linters/trunk-toolbox/test_data/trunk_toolbox_v0.4.1_do_not_land.check.shot b/linters/trunk-toolbox/test_data/trunk_toolbox_v0.4.1_do_not_land.check.shot new file mode 100644 index 000000000..eaf35b016 --- /dev/null +++ b/linters/trunk-toolbox/test_data/trunk_toolbox_v0.4.1_do_not_land.check.shot @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter trunk-toolbox test do_not_land 1`] = ` +{ + "issues": [ + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "trunk-toolbox", + "message": "Found 'DONOTLAND'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "9", + "offset": "2", + }, + ], + "targetType": "ALL", + }, + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "trunk-toolbox", + "message": "Found 'do-not-land'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "11", + "offset": "14", + }, + ], + "targetType": "ALL", + }, + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "trunk-toolbox", + "message": "Found 'do_not_land'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "11", + "offset": "28", + }, + ], + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trunk-toolbox", + "paths": [ + "test_data/do_not_land.in.txt", + ], + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/trunk-toolbox/test_data/trunk_toolbox_v0.5.3_do_not_land.check.shot b/linters/trunk-toolbox/test_data/trunk_toolbox_v0.5.3_do_not_land.check.shot new file mode 100644 index 000000000..293b5fc21 --- /dev/null +++ b/linters/trunk-toolbox/test_data/trunk_toolbox_v0.5.3_do_not_land.check.shot @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter trunk-toolbox test do_not_land 1`] = ` +{ + "issues": [ + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "trunk-toolbox", + "message": "Found 'DONOTLAND'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "9", + "offset": "2", + }, + ], + "targetType": "ALL", + }, + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "trunk-toolbox", + "message": "Found 'do-not-land'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "11", + "offset": "14", + }, + ], + "targetType": "ALL", + }, + { + "code": "do-not-land", + "column": "3", + "file": "test_data/do_not_land.in.txt", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "3", + "linter": "trunk-toolbox", + "message": "Found 'do_not_land'", + "ranges": [ + { + "filePath": "test_data/do_not_land.in.txt", + "length": "11", + "offset": "28", + }, + ], + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trunk-toolbox", + "paths": [ + "test_data/do_not_land.in.txt", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "trunk-toolbox", + "paths": [ + "test_data/do_not_land.in.txt", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/txtpbfmt/plugin.yaml b/linters/txtpbfmt/plugin.yaml index 2e065a221..a6eb25cbb 100644 --- a/linters/txtpbfmt/plugin.yaml +++ b/linters/txtpbfmt/plugin.yaml @@ -11,6 +11,7 @@ lint: - name: txtpbfmt files: [textproto] tools: [txtpbfmt] + description: A formatter for textproto files commands: - name: format output: rewrite diff --git a/linters/ty/plugin.yaml b/linters/ty/plugin.yaml new file mode 100644 index 000000000..264421a14 --- /dev/null +++ b/linters/ty/plugin.yaml @@ -0,0 +1,45 @@ +version: 0.1 +downloads: + - name: ty + version: 0.0.1-alpha.1 + downloads: + - os: + linux: unknown-linux-gnu + macos: apple-darwin + cpu: + x86_64: x86_64 + arm_64: aarch64 + url: https://github.com/astral-sh/ty/releases/download/${version}/ty-${cpu}-${os}.tar.gz + strip_components: 1 + - os: + windows: windows + cpu: + x86_64: x86_64 + url: https://github.com/astral-sh/ty/releases/download/${version}/ty-x86_64-pc-windows-msvc.zip + strip_components: 1 +tools: + definitions: + - name: ty + download: ty + known_good_version: 0.0.1-alpha.1 + shims: [ty] + health_checks: + - command: ty --version + parse_regex: ${semver} +lint: + definitions: + - name: ty + description: A Python type checker + files: [python, python-interface] + tools: [ty] + known_good_version: 0.0.1-alpha.1 + suggest_if: never + commands: + - name: check + output: regex + parse_regex: + ((?P.+)\[(?P.+)\] + (?P.+):(?P\d+):(?P\d+):\s*(?P.*)) + run: ty check --output-format=concise ${target} + success_codes: [0, 1] + batch: true diff --git a/linters/ty/test_data/basic.in.py b/linters/ty/test_data/basic.in.py new file mode 100644 index 000000000..65d12645d --- /dev/null +++ b/linters/ty/test_data/basic.in.py @@ -0,0 +1,56 @@ +from typing import Callable, Iterator, Union, Optional, Enum + + +def wrong_type(x: int) -> str: + return x # error: Incompatible return value type (got "int", expected "str") + +class A: + def method1(self) -> None: + self.x = 1 + + def method2(self) -> None: + self.x = "" + +a = A() +reveal_type(a.x) + +a.x = "" +a.x = 3.0 + + + +class A: + x: int = 0 # Regular class variable + y: ClassVar[int] = 0 # Pure class variable + + def __init__(self): + self.z = 0 # Pure instance variable + +print(A.x) +print(A.y) +print(A.z) + + + +class Color(Enum): + RED = 1 + BLUE = 2 + +def is_red(color: Color) -> bool: + if color == Color.RED: + return True + elif color == Color.BLUE: + return False + + +def func(val: int | None): + if val is not None: + + def inner_1() -> None: + reveal_type(val) + print(val + 1) + + inner_2 = lambda: reveal_type(val) + 1 + + inner_1() + inner_2() diff --git a/linters/ty/test_data/interface.in.pyi b/linters/ty/test_data/interface.in.pyi new file mode 100644 index 000000000..ac27d5d56 --- /dev/null +++ b/linters/ty/test_data/interface.in.pyi @@ -0,0 +1,51 @@ +# Based on test file input from astral-sh/ruff +import json + +from typing import Any, Sequence + +class MissingCommand(TypeError): ... +class AnoherClass: ... + +def a(): ... + +@overload +def a(arg: int): ... + +@overload +def a(arg: int, name: str): ... + + +def grouped1(): ... +def grouped2(): ... +def grouped3( ): ... + + +class BackendProxy: + backend_module: str + backend_object: str | None + backend: Any + + def grouped1(): ... + def grouped2(): ... + def grouped3( ): ... + @decorated + + def with_blank_line(): ... + + + def ungrouped(): ... +a = "test" + +def function_def(): + pass +b = "test" + + +def outer(): + def inner(): + pass + def inner2(): + pass + +class Foo: ... +class Bar: ... diff --git a/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot b/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot new file mode 100644 index 000000000..3cab03982 --- /dev/null +++ b/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot @@ -0,0 +1,174 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ty test basic 1`] = ` +{ + "issues": [ + { + "code": "unresolved-import", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "1", + "linter": "ty", + "message": "Module \`typing\` has no member \`Enum\`", + "targetType": "python", + }, + { + "code": "revealed-type", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_LOW", + "line": "15", + "linter": "ty", + "message": "Revealed type: \`Unknown | Literal[1, ""]\`", + "targetType": "python", + }, + { + "code": "undefined-reveal", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "15", + "linter": "ty", + "message": "\`reveal_type\` used without importing it", + "targetType": "python", + }, + { + "code": "unresolved-reference", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "24", + "linter": "ty", + "message": "Name \`ClassVar\` used when not defined", + "targetType": "python", + }, + { + "code": "unresolved-attribute", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ty", + "message": "Attribute \`z\` can only be accessed on instances, not on the class object \`\` itself.", + "targetType": "python", + }, + { + "code": "invalid-return-type", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "39", + "linter": "ty", + "message": "Function can implicitly return \`None\`, which is not assignable to return type \`bool\`", + "targetType": "python", + }, + { + "code": "invalid-return-type", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "5", + "linter": "ty", + "message": "Return type does not match returned value: Expected \`str\`, found \`int\`", + "targetType": "python", + }, + { + "code": "revealed-type", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_LOW", + "line": "50", + "linter": "ty", + "message": "Revealed type: \`int | None\`", + "targetType": "python", + }, + { + "code": "undefined-reveal", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "50", + "linter": "ty", + "message": "\`reveal_type\` used without importing it", + "targetType": "python", + }, + { + "code": "unsupported-operator", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "51", + "linter": "ty", + "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`", + "targetType": "python", + }, + { + "code": "revealed-type", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_LOW", + "line": "53", + "linter": "ty", + "message": "Revealed type: \`int | None\`", + "targetType": "python", + }, + { + "code": "undefined-reveal", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_MEDIUM", + "line": "53", + "linter": "ty", + "message": "\`reveal_type\` used without importing it", + "targetType": "python", + }, + { + "code": "unsupported-operator", + "column": "1", + "file": "test_data/basic.in.py", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "53", + "linter": "ty", + "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`", + "targetType": "python", + }, + ], + "lintActions": [ + { + "command": "check", + "fileGroupName": "python", + "linter": "ty", + "paths": [ + "test_data/basic.in.py", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "check", + "fileGroupName": "python", + "linter": "ty", + "paths": [ + "test_data/basic.in.py", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot b/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot new file mode 100644 index 000000000..8a10c0ddf --- /dev/null +++ b/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot @@ -0,0 +1,64 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter ty test interface 1`] = ` +{ + "issues": [ + { + "code": "unresolved-reference", + "column": "1", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "11", + "linter": "ty", + "message": "Name \`overload\` used when not defined", + "targetType": "python-interface", + }, + { + "code": "unresolved-reference", + "column": "1", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "14", + "linter": "ty", + "message": "Name \`overload\` used when not defined", + "targetType": "python-interface", + }, + { + "code": "unresolved-reference", + "column": "1", + "file": "test_data/interface.in.pyi", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "31", + "linter": "ty", + "message": "Name \`decorated\` used when not defined", + "targetType": "python-interface", + }, + ], + "lintActions": [ + { + "command": "check", + "fileGroupName": "python-interface", + "linter": "ty", + "paths": [ + "test_data/interface.in.pyi", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "check", + "fileGroupName": "python-interface", + "linter": "ty", + "paths": [ + "test_data/interface.in.pyi", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/ty/ty.test.ts b/linters/ty/ty.test.ts new file mode 100644 index 000000000..2c45bb5e7 --- /dev/null +++ b/linters/ty/ty.test.ts @@ -0,0 +1,3 @@ +import { linterCheckTest } from "tests"; + +linterCheckTest({ linterName: "ty" }); diff --git a/linters/vale/.vale.ini b/linters/vale/.vale.ini new file mode 100644 index 000000000..ee11cf249 --- /dev/null +++ b/linters/vale/.vale.ini @@ -0,0 +1,5 @@ +[formats] +markdoc = md + +[*.md] +BasedOnStyles = Vale diff --git a/linters/vale/plugin.yaml b/linters/vale/plugin.yaml new file mode 100644 index 000000000..a96504be5 --- /dev/null +++ b/linters/vale/plugin.yaml @@ -0,0 +1,47 @@ +version: 0.1 + +downloads: + - name: vale + downloads: + - os: + linux: Linux + macos: macOS + cpu: + x86_64: 64-bit + arm_64: arm64 + url: https://github.com/errata-ai/vale/releases/download/v${version}/vale_${version}_${os}_${cpu}.tar.gz + - os: + windows: Windows + cpu: + x86_64: 64-bit + arm_64: arm64 + url: https://github.com/errata-ai/vale/releases/download/v${version}/vale_${version}_Windows_${cpu}.zip + +tools: + definitions: + - name: vale + download: vale + shims: [vale] + known_good_version: 3.4.1 + environment: + - name: PATH + # Needs access to shared libraries on Windows. + list: ["${tool}", "${env.PATH}"] + +lint: + definitions: + - name: vale + files: [ALL] + description: Enforce editorial standards in your text documents + commands: + - name: lint + output: regex + parse_regex: (?P.*):(?P\d+):(?P\d+):(?P[^:]+):(?P.+) + run: vale --output=line ${target} + success_codes: [0, 1] + read_output_from: stdout + batch: true + suggest_if: config_present + tools: [vale] + known_good_version: 3.4.1 + direct_configs: [.vale.ini] diff --git a/linters/vale/test_data/basic.in.md b/linters/vale/test_data/basic.in.md new file mode 100644 index 000000000..a9354fa9b --- /dev/null +++ b/linters/vale/test_data/basic.in.md @@ -0,0 +1,2 @@ +Hello world! +Hallo, wurld? diff --git a/linters/vale/test_data/vale_v3.4.1_basic.check.shot b/linters/vale/test_data/vale_v3.4.1_basic.check.shot new file mode 100644 index 000000000..36c4a858f --- /dev/null +++ b/linters/vale/test_data/vale_v3.4.1_basic.check.shot @@ -0,0 +1,53 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing linter vale test basic 1`] = ` +{ + "issues": [ + { + "code": "error", + "column": "1", + "file": "test_data/basic.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "vale", + "message": "Did you really mean 'Hallo'?", + "targetType": "ALL", + }, + { + "code": "error", + "column": "8", + "file": "test_data/basic.in.md", + "issueClass": "ISSUE_CLASS_EXISTING", + "level": "LEVEL_HIGH", + "line": "2", + "linter": "vale", + "message": "Did you really mean 'wurld'?", + "targetType": "ALL", + }, + ], + "lintActions": [ + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "vale", + "paths": [ + "test_data/basic.in.md", + ], + "verb": "TRUNK_VERB_CHECK", + }, + { + "command": "lint", + "fileGroupName": "ALL", + "linter": "vale", + "paths": [ + "test_data/basic.in.md", + ], + "upstream": true, + "verb": "TRUNK_VERB_CHECK", + }, + ], + "taskFailures": [], + "unformattedFiles": [], +} +`; diff --git a/linters/vale/vale.test.ts b/linters/vale/vale.test.ts new file mode 100644 index 000000000..ff7a73ac6 --- /dev/null +++ b/linters/vale/vale.test.ts @@ -0,0 +1,3 @@ +import { linterCheckTest } from "tests"; + +linterCheckTest({ linterName: "vale" }); diff --git a/linters/yamlfmt/plugin.yaml b/linters/yamlfmt/plugin.yaml new file mode 100644 index 000000000..0989899c1 --- /dev/null +++ b/linters/yamlfmt/plugin.yaml @@ -0,0 +1,45 @@ +version: 0.1 +downloads: + - name: yamlfmt + downloads: + - os: + linux: Linux + macos: Darwin + windows: Windows + cpu: + x86_64: x86_64 + arm_64: arm64 + url: https://github.com/google/yamlfmt/releases/download/v${version}/yamlfmt_${version}_${os}_${cpu}.tar.gz +tools: + definitions: + - name: yamlfmt + download: yamlfmt + known_good_version: 0.1.0 + shims: [yamlfmt] +lint: + definitions: + - name: yamlfmt + files: [yaml] + description: Formats yaml files + commands: + - name: format + output: rewrite + run: yamlfmt ${target} + run_from: ${parent} + success_codes: [0, 1] + cache_results: true + formatter: true + in_place: true + batch: true + tools: [yamlfmt] + direct_configs: + - .yamlfmt + - .yamlfmt.yaml + - .yamlfmt.yml + - yamlfmt.yaml + - yamlfmt.yml + suggest_if: config_present + version_command: + parse_regex: ${semver} + run: yamlfmt -version + known_good_version: 0.1.0 diff --git a/linters/yamlfmt/test_data/basic.in.yaml b/linters/yamlfmt/test_data/basic.in.yaml new file mode 100644 index 000000000..88c1b4568 --- /dev/null +++ b/linters/yamlfmt/test_data/basic.in.yaml @@ -0,0 +1,3 @@ +yaml: + array: + - item \ No newline at end of file diff --git a/linters/yamlfmt/test_data/yamlfmt_v0.1.0_basic.fmt.shot b/linters/yamlfmt/test_data/yamlfmt_v0.1.0_basic.fmt.shot new file mode 100644 index 000000000..42c058492 --- /dev/null +++ b/linters/yamlfmt/test_data/yamlfmt_v0.1.0_basic.fmt.shot @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Testing formatter yamlfmt test basic 1`] = ` +"yaml: + array: + - item +" +`; diff --git a/linters/yamlfmt/yamlfmt.test.ts b/linters/yamlfmt/yamlfmt.test.ts new file mode 100644 index 000000000..405a4d1af --- /dev/null +++ b/linters/yamlfmt/yamlfmt.test.ts @@ -0,0 +1,9 @@ +import { linterCheckTest, linterFmtTest } from "tests"; +import { osTimeoutMultiplier } from "tests/utils"; + +// This install is quite slow on some Linux machines. +jest.setTimeout(600000 * osTimeoutMultiplier); + +linterCheckTest({ linterName: "yamlfmt", namedTestPrefixes: ["empty"] }); + +linterFmtTest({ linterName: "yamlfmt", namedTestPrefixes: ["basic"] }); diff --git a/linters/yamllint/plugin.yaml b/linters/yamllint/plugin.yaml index 98a4a5a7e..449d067ff 100644 --- a/linters/yamllint/plugin.yaml +++ b/linters/yamllint/plugin.yaml @@ -10,6 +10,7 @@ lint: definitions: - name: yamllint files: [yaml] + description: Validate, Verify and Reformat your YAML documents commands: - output: regex parse_regex: diff --git a/linters/yapf/plugin.yaml b/linters/yapf/plugin.yaml index e51d016a2..d89891fd5 100644 --- a/linters/yapf/plugin.yaml +++ b/linters/yapf/plugin.yaml @@ -11,6 +11,7 @@ lint: definitions: - name: yapf files: [python] + description: A formatter for Python files commands: - name: format output: rewrite diff --git a/package-lock.json b/package-lock.json index d15824484..6285d0c0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "plugins", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -8,57 +8,58 @@ "tests" ], "devDependencies": { - "@jest/console": "^29.4.1", - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@trunkio/launcher": "^1.3.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@trunkio/launcher": "^1.3.4", "@types/caller": "^1.0.2", "@types/debug": "^4.1.12", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.14", "@types/jest-specific-snapshot": "^0.5.9", - "@types/node": "^20.11.28", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@types/node": "^22.15.21", + "@types/semver": "^7.7.0", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", "caller": "^1.1.0", - "debug": "^4.3.4", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prefer-arrow-functions": "^3.3.2", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-simple-import-sort": "^12.0.0", - "fast-sort": "^3.2.0", - "jest": "^29.3.1", + "debug": "^4.4.1", + "eslint": "9.27.0", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-import-x": "^4.13.3", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-n": "^17.18.0", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "fast-sort": "^3.4.1", + "jest": "^29.7.0", + "jest-junit": "^16.0.0", "jest-specific-snapshot": "^8.0.0", - "semver": "^7.6.0", - "simple-git": "^3.23.0", - "ts-jest": "^29.1.2", + "semver": "^7.7.2", + "simple-git": "^3.27.0", + "ts-jest": "^29.3.4", "ts-node": "^10.9.2", - "tsconfig-paths": "^4.1.2", - "typescript": "^5.4.2", - "yaml": "^2.4.1" + "tsconfig-paths": "^4.2.0", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.1", + "yaml": "^2.8.0" }, "engines": { - "node": ">=16" + "node": ">=22" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -68,12 +69,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -81,18 +84,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -120,42 +121,43 @@ }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -163,9 +165,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", @@ -181,9 +182,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -191,43 +192,16 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -237,9 +211,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", @@ -256,18 +229,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.2" }, @@ -277,9 +248,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -288,18 +258,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "engines": { "node": ">=6.9.0" @@ -307,108 +277,33 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.27.1" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -418,9 +313,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -430,9 +324,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -442,9 +335,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -454,9 +346,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -466,9 +357,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -478,9 +368,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -493,9 +382,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -505,9 +393,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -517,9 +404,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -529,9 +415,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -541,9 +426,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -553,9 +437,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -565,9 +448,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -580,9 +462,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, @@ -594,34 +475,31 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -630,22 +508,20 @@ }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -653,15 +529,13 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -671,48 +545,86 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -720,40 +632,85 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", + "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -762,17 +719,23 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -786,18 +749,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -808,9 +769,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -821,9 +781,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -833,9 +792,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -848,9 +806,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -860,27 +817,24 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -895,9 +849,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -942,9 +895,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -957,9 +909,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -970,9 +921,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -982,9 +932,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -999,9 +948,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1014,9 +962,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1057,9 +1004,8 @@ }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -1073,9 +1019,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1085,9 +1030,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1099,9 +1043,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1114,9 +1057,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1129,9 +1071,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1155,9 +1096,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1172,9 +1112,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1185,17 +1124,16 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1203,40 +1141,36 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1" } }, "node_modules/@kwsites/promise-deferred": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@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==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1247,18 +1181,16 @@ }, "node_modules/@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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@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==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1268,10 +1200,11 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", - "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.2.tgz", + "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -1279,34 +1212,37 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@trunkio/launcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trunkio/launcher/-/launcher-1.3.0.tgz", - "integrity": "sha512-CIehTfjiB905y9SuSMIRKkMv7qV+2jOALau7f1w0kjD14aHZIerT+eSeIzfrp2CTgRTTPAz2MZh+euNmh2Goxg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@trunkio/launcher/-/launcher-1.3.4.tgz", + "integrity": "sha512-4LCsFVvZtKht7EkbOq5gDsRLIBOH05ycNxm1Vrv+YzY+uOK2HueLBcLU8oejV9v01LTtWjfLJxonIgTSo7lwng==", "dev": true, "dependencies": { "semver": "^7.5.4", @@ -1314,8 +1250,7 @@ "yaml": "^2.2.0" }, "bin": { - "trunk": "trunk.js", - "trunk_bash": "trunk" + "trunk": "trunk.js" }, "engines": { "node": ">=18.0.0" @@ -1323,33 +1258,28 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1360,18 +1290,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1379,65 +1307,64 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/caller": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/caller/-/caller-1.0.2.tgz", - "integrity": "sha512-NRXTeF8nnjSAHFxHKMnqpUWY1gTyAHLMhPTKeeHWTZdPilcFiCvlfvpVB8bOMfHbWYIxiPwZDwrYwMsRFkeh7A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1446,9 +1373,8 @@ }, "node_modules/@types/jest-specific-snapshot": { "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@types/jest-specific-snapshot/-/jest-specific-snapshot-0.5.9.tgz", - "integrity": "sha512-NPcItjVhJq3x6MWR6QNi92n5orOkcTvuQ0E8nqK2WZN18a7O93D2dcNL0x+eSNxmNSIbgfgCJ5eUScjACPCWsg==", "dev": true, + "license": "MIT", "dependencies": { "@types/jest": "*" } @@ -1461,201 +1387,212 @@ }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", - "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/stack-utils": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "node_modules/@typescript-eslint/types": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, + "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1666,394 +1603,93 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "node_modules/@typescript-eslint/utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "8.32.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", + "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", + "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2073,9 +1709,8 @@ }, "node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2098,9 +1733,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -2113,9 +1747,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2125,18 +1758,16 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2149,9 +1780,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2162,9 +1792,8 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", @@ -2173,28 +1802,32 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2204,26 +1837,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2234,9 +1859,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2252,9 +1876,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2269,16 +1892,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2288,11 +1913,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2302,9 +1936,8 @@ }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -2323,9 +1956,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -2339,9 +1971,8 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -2354,9 +1985,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -2377,9 +2007,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -2393,27 +2022,25 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2421,8 +2048,6 @@ }, "node_modules/browserslist": { "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { @@ -2434,6 +2059,7 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", @@ -2449,9 +2075,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -2461,27 +2086,31 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2489,32 +2118,27 @@ }, "node_modules/caller": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/caller/-/caller-1.1.0.tgz", - "integrity": "sha512-n+21IZC3j06YpCWaxmUy5AnVqhmCIM2bQtqQyy00HJlmStRt6kwDX5F9Z97pqwAB+G/tgSz6q/kUBbNyQzIubw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", "dev": true, "funding": [ { @@ -2525,13 +2149,13 @@ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2545,42 +2169,37 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/ci-info": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/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==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2592,9 +2211,8 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -2602,15 +2220,13 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2620,27 +2236,33 @@ }, "node_modules/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==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -2659,14 +2281,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -2677,13 +2298,65 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2696,9 +2369,8 @@ }, "node_modules/dedent": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -2710,25 +2382,41 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2741,66 +2429,52 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "jake": "^10.8.5" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2810,14 +2484,13 @@ }, "node_modules/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2829,58 +2502,64 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -2889,34 +2568,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2931,18 +2642,16 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2951,77 +2660,125 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", + "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, + "node_modules/eslint-import-context": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.5.tgz", + "integrity": "sha512-jalO1mLiEvTv0io0koz1AE4LwkHQxDBFLaSXWweWtJR0y/NC1yyxvU61Z54bghIFNeM1M4TvwRwVRhLunQJ3gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash": "^0.0.5" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -3030,42 +2787,50 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.1.tgz", + "integrity": "sha512-KHQnjMAn/Hbs1AcMs2YfJTeNoWsaOoMRvJUKr77Y2dv7jNOaT8/IJYlvfN/ZIwTxUsv2B6amwv7u9bt2Vl9lZg==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" + "debug": "^4.4.1", + "eslint-import-context": "^0.1.5", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.2" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^16.17.0 || >=18.6.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -3081,58 +2846,130 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.13.3.tgz", + "integrity": "sha512-CDewJDEeYQhm94KGCDYiuwU1SdaWc/vh+SziSKkF7kichAqAFnQYtSYUvSwSBbiBjYLxV5uUxocxxQobRI9YXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^8.32.1", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.5", + "eslint-import-resolver-node": "^0.3.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash": "^0.0.5", + "tslib": "^2.8.1", + "unrs-resolver": "^1.7.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3142,9 +2979,8 @@ }, "node_modules/eslint-plugin-import/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -3154,27 +2990,24 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-import/node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -3183,19 +3016,19 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "version": "28.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz", + "integrity": "sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^5.10.0" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, "peerDependenciesMeta": { @@ -3207,96 +3040,78 @@ } } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "node_modules/eslint-plugin-n": { + "version": "17.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.18.0.tgz", + "integrity": "sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" }, "engines": { - "node": ">=8.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": ">=5.16.0" + "eslint": ">=8.23.0" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, "engines": { - "node": ">=8.10.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-plugin-prettier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", + "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-prefer-arrow-functions": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow-functions/-/eslint-plugin-prefer-arrow-functions-3.3.2.tgz", - "integrity": "sha512-XRGsga9cK6pZ48IA2PM2PABBlWshRYhkofkQxcWzCM0YlDnal2hrQKsuz0FqtBHimJpgEXGgHUko3KrOayxlOQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - }, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.0" + }, "engines": { "node": "^14.18.0 || >=16.0.0" }, @@ -3306,7 +3121,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -3319,32 +3134,34 @@ } }, "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.0.0.tgz", - "integrity": "sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, "peerDependencies": { "eslint": ">=5.0.0" } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3352,43 +3169,42 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3396,9 +3212,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3409,9 +3224,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3419,15 +3233,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3440,7 +3245,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3449,29 +3254,18 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -3492,8 +3286,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -3501,9 +3293,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -3523,14 +3314,13 @@ }, "node_modules/fast-diff": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3545,9 +3335,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3557,56 +3346,83 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-sort": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.0.tgz", - "integrity": "sha512-c/cMBGA5mH3OYjaXedtLIM3hQjv+KuZuiD2QEH5GofNOZeQVDIYIN7Okc2AW1KPhk44g5PTZnXp8t2lOMl8qhQ==", - "dev": true + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.1.tgz", + "integrity": "sha512-76uvGPsF6So53sZAqenP9UVT3p5l7cyTHkLWVCMinh41Y8NDrK1IYXJgaBMfc1gk7nJiSRZp676kddFG2Aa5+A==", + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=10" } }, "node_modules/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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -3617,9 +3433,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3632,22 +3447,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/for-each": { @@ -3661,9 +3476,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3673,9 +3487,8 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3685,49 +3498,32 @@ }, "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -3747,32 +3543,34 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/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==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3780,18 +3578,16 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3800,13 +3596,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -3816,19 +3613,21 @@ } }, "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3846,9 +3645,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3857,15 +3655,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3873,9 +3668,8 @@ }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -3886,26 +3680,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -3920,62 +3694,38 @@ }, "node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "license": "MIT" }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -3986,9 +3736,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3997,12 +3746,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4012,9 +3761,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -4025,32 +3774,30 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/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==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -4065,9 +3812,8 @@ }, "node_modules/import-local": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -4084,18 +3830,16 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4103,18 +3847,17 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -4122,14 +3865,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4137,15 +3882,13 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -4155,9 +3898,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4169,11 +3911,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4182,12 +3933,30 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4195,9 +3964,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4210,36 +3978,32 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4248,9 +4012,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -4270,9 +4034,8 @@ }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4283,15 +4046,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4309,12 +4063,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4322,9 +4079,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4334,9 +4090,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4349,9 +4104,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -4363,12 +4117,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -4379,9 +4133,8 @@ }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -4397,24 +4150,21 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -4427,9 +4177,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4437,9 +4187,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -4451,9 +4200,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -4465,9 +4213,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -4476,11 +4223,30 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -4504,9 +4270,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -4518,9 +4283,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -4549,9 +4313,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -4582,9 +4345,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -4627,9 +4389,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -4642,9 +4403,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -4654,9 +4414,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -4670,9 +4429,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -4687,18 +4445,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -4719,11 +4475,26 @@ "fsevents": "^2.3.2" } }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -4734,9 +4505,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -4749,9 +4519,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -4769,9 +4538,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4783,9 +4551,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -4800,18 +4567,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -4829,9 +4594,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -4842,9 +4606,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -4874,9 +4637,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -4907,9 +4669,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -4941,6 +4702,7 @@ "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-8.0.0.tgz", "integrity": "sha512-PjK0cqPbN3ZGU1pdP78YBEFMsS1AsV28hIHg249E0v/bTtGAJqDm7lNDLj0Cs0O26P2sulbXbgEQU9xLm34WmA==", "dev": true, + "license": "MIT", "dependencies": { "jest-snapshot": "^29.0.0" }, @@ -4950,9 +4712,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4967,9 +4728,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -4984,9 +4744,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4996,9 +4755,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -5015,9 +4773,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -5030,18 +4787,16 @@ }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5071,22 +4826,27 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -5096,15 +4856,13 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5112,29 +4870,35 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5145,15 +4909,13 @@ }, "node_modules/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5166,30 +4928,26 @@ }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -5201,51 +4959,47 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5254,18 +5008,16 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5275,27 +5027,24 @@ }, "node_modules/minimist": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -5306,9 +5055,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5318,15 +5066,13 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -5335,43 +5081,54 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/napi-postinstall": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.2.tgz", + "integrity": "sha512-Wy1VI/hpKHwy1MsnFxHCJxqFwmmxD0RA/EKPL7e6mfbsY01phM2SZyJnRdU0bLvhu0Quby1DCcAZti3ghdl4/A==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -5380,31 +5137,33 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -5416,14 +5175,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5433,26 +5193,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5463,18 +5225,16 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5487,9 +5247,8 @@ }, "node_modules/optionator": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, + "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -5504,9 +5263,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5519,9 +5277,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -5534,9 +5291,8 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5555,9 +5311,8 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -5573,57 +5328,43 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5633,18 +5374,16 @@ }, "node_modules/pirates": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -5654,9 +5393,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5667,9 +5405,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -5679,9 +5416,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -5694,9 +5430,8 @@ }, "node_modules/pkg-dir/node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -5704,20 +5439,27 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, + "license": "MIT", "peer": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5731,9 +5473,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -5743,9 +5484,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -5757,9 +5497,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5769,9 +5508,8 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -5791,8 +5529,6 @@ }, "node_modules/pure-rand": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -5803,12 +5539,11 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -5823,23 +5558,24 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -5848,32 +5584,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5888,9 +5610,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -5900,9 +5621,8 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5916,44 +5636,34 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/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==", "dev": true, "funding": [ { @@ -5969,18 +5679,19 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -5992,27 +5703,28 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6020,29 +5732,42 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/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==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6052,22 +5777,25 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6075,19 +5803,19 @@ }, "node_modules/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==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-git": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.23.0.tgz", - "integrity": "sha512-P9ggTW8vb/21CAL/AmnACAhqBDfnqSSZVpV7WuFtsFR9HLunf5IqQvk+OXAQTfkcZep8pKnt3DV3o7w3TegEkQ==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", + "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", "dev": true, + "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" + "debug": "^4.3.5" }, "funding": { "type": "github", @@ -6096,33 +5824,29 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -6130,15 +5854,20 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -6148,18 +5877,16 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -6170,9 +5897,8 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6183,14 +5909,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6200,28 +5927,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6229,9 +5959,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6241,27 +5970,24 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6271,9 +5997,8 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6283,18 +6008,16 @@ }, "node_modules/supports-color/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6303,34 +6026,34 @@ } }, "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", + "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", "dev": true, + "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.1", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -6346,15 +6069,13 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -6364,27 +6085,53 @@ "node": ">=8" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6398,40 +6145,45 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.3.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.4.tgz", + "integrity": "sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==", "dev": true, + "license": "MIT", "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.2", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -6441,6 +6193,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -6457,6 +6212,7 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -6500,6 +6256,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -6511,45 +6268,23 @@ }, "node_modules/tsconfig-paths/node_modules/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6559,49 +6294,50 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6611,16 +6347,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6630,24 +6367,31 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6656,11 +6400,33 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.32.1.tgz", + "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/utils": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -6672,15 +6438,47 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", + "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.2", + "@unrs/resolver-binding-darwin-x64": "1.7.2", + "@unrs/resolver-binding-freebsd-x64": "1.7.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-musl": "1.7.2", + "@unrs/resolver-binding-wasm32-wasi": "1.7.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" + } }, "node_modules/update-browserslist-db": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { @@ -6692,6 +6490,7 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -6712,17 +6511,23 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -6734,24 +6539,21 @@ }, "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6764,9 +6566,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -6779,16 +6580,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6799,9 +6600,8 @@ }, "node_modules/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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6816,15 +6616,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -6833,38 +6631,41 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xml": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -6880,27 +6681,24 @@ }, "node_modules/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==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6908,5005 +6706,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", - "dev": true - }, - "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "requires": { - "debug": "^4.1.1" - } - }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": 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==", - "dev": true, - "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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgr/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz", - "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@trunkio/launcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@trunkio/launcher/-/launcher-1.3.0.tgz", - "integrity": "sha512-CIehTfjiB905y9SuSMIRKkMv7qV+2jOALau7f1w0kjD14aHZIerT+eSeIzfrp2CTgRTTPAz2MZh+euNmh2Goxg==", - "dev": true, - "requires": { - "semver": "^7.5.4", - "tar": "^6.2.0", - "yaml": "^2.2.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/caller": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/caller/-/caller-1.0.2.tgz", - "integrity": "sha512-NRXTeF8nnjSAHFxHKMnqpUWY1gTyAHLMhPTKeeHWTZdPilcFiCvlfvpVB8bOMfHbWYIxiPwZDwrYwMsRFkeh7A==", - "dev": true - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/jest-specific-snapshot": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@types/jest-specific-snapshot/-/jest-specific-snapshot-0.5.9.tgz", - "integrity": "sha512-NPcItjVhJq3x6MWR6QNi92n5orOkcTvuQ0E8nqK2WZN18a7O93D2dcNL0x+eSNxmNSIbgfgCJ5eUScjACPCWsg==", - "dev": true, - "requires": { - "@types/jest": "*" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "20.11.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", - "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "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==", - "dev": true - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/caller/-/caller-1.1.0.tgz", - "integrity": "sha512-n+21IZC3j06YpCWaxmUy5AnVqhmCIM2bQtqQyy00HJlmStRt6kwDX5F9Z97pqwAB+G/tgSz6q/kUBbNyQzIubw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "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==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "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==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "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==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - } - } - }, - "eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.10.0" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-prefer-arrow-functions": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow-functions/-/eslint-plugin-prefer-arrow-functions-3.3.2.tgz", - "integrity": "sha512-XRGsga9cK6pZ48IA2PM2PABBlWshRYhkofkQxcWzCM0YlDnal2hrQKsuz0FqtBHimJpgEXGgHUko3KrOayxlOQ==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" - } - }, - "eslint-plugin-simple-import-sort": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.0.0.tgz", - "integrity": "sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-sort": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.0.tgz", - "integrity": "sha512-c/cMBGA5mH3OYjaXedtLIM3hQjv+KuZuiD2QEH5GofNOZeQVDIYIN7Okc2AW1KPhk44g5PTZnXp8t2lOMl8qhQ==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "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==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "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==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": 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" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "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" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "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==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "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==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.11" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-specific-snapshot": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-8.0.0.tgz", - "integrity": "sha512-PjK0cqPbN3ZGU1pdP78YBEFMsS1AsV28hIHg249E0v/bTtGAJqDm7lNDLj0Cs0O26P2sulbXbgEQU9xLm34WmA==", - "dev": true, - "requires": { - "jest-snapshot": "^29.0.0" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "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==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.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==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "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==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": 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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", - "dev": true, - "peer": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "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==", - "dev": true - }, - "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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==", - "dev": true - }, - "simple-git": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.23.0.tgz", - "integrity": "sha512-P9ggTW8vb/21CAL/AmnACAhqBDfnqSSZVpV7WuFtsFR9HLunf5IqQvk+OXAQTfkcZep8pKnt3DV3o7w3TegEkQ==", - "dev": true, - "requires": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "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==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "requires": {} - }, - "ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/package.json b/package.json index 81b4da78c..49d1dff31 100644 --- a/package.json +++ b/package.json @@ -6,43 +6,46 @@ "trunk": "trunk" }, "devDependencies": { - "@jest/console": "^29.4.1", - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@trunkio/launcher": "^1.3.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@trunkio/launcher": "^1.3.4", "@types/caller": "^1.0.2", "@types/debug": "^4.1.12", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.14", "@types/jest-specific-snapshot": "^0.5.9", - "@types/node": "^20.11.28", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", + "@types/node": "^22.15.21", + "@types/semver": "^7.7.0", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", "caller": "^1.1.0", - "debug": "^4.3.4", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.9.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prefer-arrow-functions": "^3.3.2", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-simple-import-sort": "^12.0.0", - "fast-sort": "^3.2.0", - "jest": "^29.3.1", + "debug": "^4.4.1", + "eslint": "9.27.0", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-import-x": "^4.13.3", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-n": "^17.18.0", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "fast-sort": "^3.4.1", + "jest": "^29.7.0", + "jest-junit": "^16.0.0", "jest-specific-snapshot": "^8.0.0", - "semver": "^7.6.0", - "simple-git": "^3.23.0", - "ts-jest": "^29.1.2", + "semver": "^7.7.2", + "simple-git": "^3.27.0", + "ts-jest": "^29.3.4", "ts-node": "^10.9.2", - "tsconfig-paths": "^4.1.2", - "typescript": "^5.4.2", - "yaml": "^2.4.1" + "tsconfig-paths": "^4.2.0", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.1", + "yaml": "^2.8.0" }, "bundleDependencies": [ "tests" ], "engines": { - "node": ">=16" + "node": ">=22" } } diff --git a/plugin.yaml b/plugin.yaml index 5a1be73eb..d02f1b220 100644 --- a/plugin.yaml +++ b/plugin.yaml @@ -1,6 +1,6 @@ version: 0.1 # IfChange -required_trunk_version: ">=1.18.2-beta.7" +required_trunk_version: ">=1.22.2-beta.5" # ThenChange tests/repo_tests/config_check.test.ts environments: diff --git a/repo-tools/definition-checker/check.ts b/repo-tools/definition-checker/check.ts new file mode 100644 index 000000000..c6bb04fc7 --- /dev/null +++ b/repo-tools/definition-checker/check.ts @@ -0,0 +1,149 @@ +import fs from "fs"; +import path from "path"; +// trunk-ignore(eslint/import-x/no-extraneous-dependencies) +import YAML from "yaml"; + +// Avoid strictly typing composite config +// trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-assignment) +// trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-member-access) +// trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-call) +// trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-return) + +/**** Helpers ****/ + +/** + * Generate a diagnostic message that matches the parse_regex spec. + */ +const generateMessage = (file: string, message: string, code: string): string => + `${file} [error]: ${message} (${code})`; + +/** + * Validate that a plugin.yaml doesn't explicitly enable any linters, tools, or actions. + */ +const validateEnables = (file: string, config: any): string[] => { + const enableErrors: string[] = []; + const lintEnabled = config.lint?.enabled; + const toolsEnabled = config.tools?.enabled; + const actionsEnabled = config.actions?.enabled; + + [ + [lintEnabled, "Linter"], + [toolsEnabled, "Tool"], + [actionsEnabled, "Action"], + ].forEach((value: any[][]) => { + const [enableds, enabledType] = value as [any[], string]; + if (enableds?.length) { + enableErrors.push( + ...enableds.map((enabled: string) => + generateMessage( + file, + `${enabledType} ${enabled} is explicitly enabled`, + `no-enable-${enabledType.toLowerCase()}`, + ), + ), + ); + } + }); + + const lintDefinitions = config.lint?.definitions; + const toolsDefinitions = config.tools?.definitions; + const actionsDefinitions = config.actions?.definitions; + + [ + [lintDefinitions, "Linter"], + [toolsDefinitions, "Tool"], + [actionsDefinitions, "Action"], + ].forEach((value: any[][]) => { + const [definitions, definitionType] = value as [any[], string]; + if (!definitions) { + return; + } + enableErrors.push( + ...definitions.reduce((acc: string[], definition: any) => { + if (definition?.enabled) { + acc.push( + generateMessage( + file, + `${definitionType} ${definition.name ?? definition.id} is explicitly enabled`, + `no-enable-${definitionType.toLowerCase()}`, + ), + ); + } + return acc; + }, []), + ); + }); + + return enableErrors; +}; + +/** + * Ensure that a linter definition has a 'suggest_if' and 'description' field. + */ +const validateLinters = (file: string, config: any): string[] => { + if (!config.lint?.definitions) { + return []; + } + + return config.lint.definitions.reduce((acc: string[], definition: any) => { + if (definition.deprecated) { + return acc; + } + if (!definition.suggest_if) { + acc.push( + generateMessage( + file, + `Linter ${definition.name} should specify 'suggest_if'`, + "suggest-if-linter", + ), + ); + } + if (!definition.description) { + acc.push( + generateMessage( + file, + `Linter ${definition.name} should specify 'description'`, + "description-linter", + ), + ); + } + return acc; + }, []); +}; + +/** + * Ensure that a plugin.yaml in the linters or tools subfolders has a matching test file. + */ +const validateTests = async (file: string): Promise => { + if (!file.includes("linters") || !file.includes("tools")) { + return []; + } + + const directoryContents = await fs.promises.readdir(path.dirname(file)); + const hasTest = directoryContents.some((dirFile: string) => dirFile.endsWith(".test.ts")); + if (hasTest) { + return []; + } + return [generateMessage(file, "No test file found", "no-test-file")]; +}; + +/**** Lint Plugin Files ****/ + +const fileArgs = process.argv.slice(2); + +const processFile = async (filePath: string) => { + const fileContent = await fs.promises.readFile(filePath, "utf8"); + const yamlContents = YAML.parse(fileContent); + const errors = validateEnables(filePath, yamlContents); + errors.push(...validateLinters(filePath, yamlContents)); + errors.push(...(await validateTests(filePath))); + console.log(errors.join("\n")); +}; + +const processFiles = async (filePaths: string[]) => { + for (const filePath of filePaths) { + await processFile(filePath); + } +}; + +void processFiles(fileArgs); diff --git a/repo-tools/linter-test-helper/generate b/repo-tools/linter-test-helper/generate index 9d4038f1c..0992fb654 100755 --- a/repo-tools/linter-test-helper/generate +++ b/repo-tools/linter-test-helper/generate @@ -5,60 +5,12 @@ from datetime import datetime, timedelta import click -INITIAL_PLUGIN_CONTENTS = """version: 0.1 -# Tools can be either runtime package-based or -# download-based. This boilerplate assumes the (far more verbose) latter case. -downloads: - - name: NAME_HERE - # executable: true - # NOTE: These are (common) sample values. Please replace with real values. - downloads: - - os: - linux: linux - macos: darwin - windows: windows - cpu: - x86_64: amd64 - arm_64: arm64 - url: https://URL_HERE/${version}/${os}-${cpu}-NAME_HERE -# Fill out this part if the linter is tool-based (most common case) - otherwise delete -tools: - definitions: - - name: NAME_HERE - # RUNTIME_OR_DOWNLOAD_INFO_HERE - # download: NAME_HERE - known_good_version: VERSION_HERE - shims: [NAME_HERE] -lint: - definitions: - - name: NAME_HERE - files: [FILE_TYPES_HERE] - # TOOL_OR_RUNTIME_OR_DOWNLOAD_INFO_HERE - known_good_version: # VERSION_HERE - suggest_if: never - commands: - - name: LINT_OR_FORMAT_HERE - output: OUTPUT_TYPE_HERE - run: COMMAND_HERE - success_codes: [0] -""" +directory = os.path.dirname(__file__) +with open(os.path.join(directory, "linter_sample_plugin.yaml"), "r") as file: + initial_plugin_contents = file.read() -INITIAL_TEST_CONTENTS = """import { linterCheckTest, linterFmtTest } from "tests"; -// Uncomment and use if your tool is a linter -// linterCheckTest({ linterName: "*{}*" }); - -// Uncomment and use if your tool is a formatter -// linterFmtTest({ linterName: "*{}*" }); - -// Guidelines for configuring tests: -// - By default, linters and formatters will only run on files with syntax `.in.` -// - You can customize test setup using the `preCheck` callback (see git_diff_check.test.ts and golangci_lint.test.ts) -// - You can specify additional customization using the `customLinterCheckTest and customLinterFmtTest` helpers -// - Additional information on test setup can be found in tests/README.md -// -// If you are unable to write a test for this linter, please document why in your PR, and add -// it to the list in tests/repo_tests/test_coverage_test.ts -""" +with open(os.path.join(directory, "linter_sample.test.ts"), "r") as file: + initial_test_contents = file.read() @click.group() @@ -86,7 +38,9 @@ def scan(workspace): generated_files = True # Write plugin.yaml with open(os.path.join(subdir_path, "plugin.yaml"), "w") as plugin_file: - plugin_file.write(INITIAL_PLUGIN_CONTENTS) + plugin_file.write( + initial_plugin_contents.replace("NAME_HERE", linter_name) + ) # Write test file with open( @@ -95,7 +49,7 @@ def scan(workspace): ), "w", ) as test_file: - test_file.write(INITIAL_TEST_CONTENTS.replace("*{}*", linter_name)) + test_file.write(initial_test_contents.replace("NAME_HERE", linter_name)) # Create empty test_data dir test_dir = os.path.join(subdir_path, "test_data") diff --git a/repo-tools/linter-test-helper/linter_sample.test.ts b/repo-tools/linter-test-helper/linter_sample.test.ts new file mode 100644 index 000000000..775f434e1 --- /dev/null +++ b/repo-tools/linter-test-helper/linter_sample.test.ts @@ -0,0 +1,15 @@ +import { linterCheckTest, linterFmtTest } from "tests"; + +// Guidelines for configuring tests: +// - By default, linters and formatters will only run on files with syntax `.in.` +// - You can customize test setup using the `preCheck` callback (see git_diff_check.test.ts and golangci_lint.test.ts) +// - You can specify additional customization using the `customLinterCheckTest` and `customLinterFmtTest` helpers +// - Additional information on test setup can be found in tests/README.md +// +// If you are unable to write a test for this linter, please document why in your PR. Feel free to ask for help! + +// Use if your tool is a linter +linterCheckTest({ linterName: "NAME_HERE" }); + +// Use if your tool is a formatter +linterFmtTest({ linterName: "NAME_HERE" }); diff --git a/repo-tools/linter-test-helper/linter_sample_plugin.yaml b/repo-tools/linter-test-helper/linter_sample_plugin.yaml new file mode 100644 index 000000000..620ad80a7 --- /dev/null +++ b/repo-tools/linter-test-helper/linter_sample_plugin.yaml @@ -0,0 +1,54 @@ +version: 0.1 +# Tools can be either runtime package-based or download-based. Modify this boilerplate +# to fit your use case. + +# Fill out this part if the linter/tool is download-based - otherwise delete +downloads: + - name: NAME_HERE + # executable: true + # DOWNLOAD_URL_INFO_HERE + downloads: + - os: + linux: linux + macos: darwin + windows: windows + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://URL_HERE/${version}/${os}-${cpu}-NAME_HERE +# Fill out this part if the linter is tool-based (most common case) - otherwise delete +tools: + definitions: + - name: NAME_HERE + # RUNTIME_OR_DOWNLOAD_INFO_HERE + # runtime: RUNTIME_HERE + # package: NAME_HERE + # -- OR -- + # download: NAME_HERE + known_good_version: VERSION_HERE + shims: [NAME_HERE] + health_checks: + - command: NAME_HERE --version + parse_regex: ${semver} +lint: + definitions: + - name: NAME_HERE + files: [FILE_TYPES_HERE] + # TOOL_OR_RUNTIME_OR_DOWNLOAD_INFO_HERE + # tools: [NAME_HERE] + # -- OR -- + # runtime: RUNTIME_HERE + # package: NAME_HERE + # -- OR -- + # download: NAME_HERE + known_good_version: VERSION_HERE + suggest_if: never + commands: + # https://docs.trunk.io/check/configuration/custom-linters/commands/definition + - name: LINT_OR_FORMAT_HERE + # https://docs.trunk.io/check/configuration/custom-linters/commands/output-types + output: OUTPUT_TYPE_HERE + run: COMMAND_HERE + success_codes: [0] + # formatter: true + # in_place: true diff --git a/repo-tools/tool-test-helper/generate b/repo-tools/tool-test-helper/generate index 8c9f26f69..506726d4e 100644 --- a/repo-tools/tool-test-helper/generate +++ b/repo-tools/tool-test-helper/generate @@ -5,60 +5,12 @@ from datetime import datetime, timedelta import click -INITIAL_PLUGIN_CONTENTS = """version: 0.1 -# Tools can be either runtime package-based or -# download-based. This boilerplate assumes the (far more verbose) latter case. -downloads: - - name: *{}* - # executable: true - # NOTE: These are (common) sample values. Please replace with real values. - downloads: - - os: - linux: linux - macos: darwin - windows: windows - cpu: - x86_64: amd64 - arm_64: arm64 - url: https://URL_HERE/${version}/${os}-${cpu}-NAME_HERE -tools: - definitions: - - name: *{}* - # RUNTIME_OR_DOWNLOAD_INFO_HERE - # download: *{}* - known_good_version: VERSION_HERE - # NOTE: shim may differ from tool name - shims: [*{}*] -""" +directory = os.path.dirname(__file__) +with open(os.path.join(directory, "tool_sample_plugin.yaml"), "r") as file: + initial_plugin_contents = file.read() -INITIAL_TEST_CONTENTS = """import { makeToolTestConfig, toolTest, toolInstallTest } from "tests"; -toolTest({ - toolName: "*{}*", - toolVersion: "VERSION_HERE", - testConfigs: [ - makeToolTestConfig({ - command: ["SHIM_NAME", "COMMAND_HERE"], - expectedOut: "OUTPUT_HERE", - }), - ], -}); - -toolInstallTest({ - toolName: "*{}*", - toolVersion: "VERSION_HERE", -}) - -// Guidelines for configuring tests: -// - Prefer using health check in config + toolInstallTest, if you must use toolTest leave a -// comment explaining why. Only one of the two options is sufficient. -// - Usually, just a version or help text command is sufficient -// - add a test for each command that is used in the plugin.yaml -// - exit code 0 is assumed, so set expectedExitCode if it is different -// - expectedOut/expectedErr do a substring match, so you can just put a portion of the output -// -// If you are unable to write a test for this tool, please document why in your PR, and add -// it to the list in tests/repo_tests/test_coverage_test.ts -""" +with open(os.path.join(directory, "tool_sample.test.ts"), "r") as file: + initial_test_contents = file.read() @click.group() @@ -86,7 +38,9 @@ def scan(workspace): generated_files = True # Write plugin.yaml with open(os.path.join(subdir_path, "plugin.yaml"), "w") as plugin_file: - plugin_file.write(INITIAL_PLUGIN_CONTENTS.replace("*{}*", tool_name)) + plugin_file.write( + initial_plugin_contents.replace("NAME_HERE", tool_name) + ) # Write test file with open( @@ -95,7 +49,7 @@ def scan(workspace): ), "w", ) as test_file: - test_file.write(INITIAL_TEST_CONTENTS.replace("*{}*", tool_name)) + test_file.write(initial_test_contents.replace("NAME_HERE", tool_name)) print("Created starter files in {}", subdir_path) diff --git a/repo-tools/tool-test-helper/tool_sample.test.ts b/repo-tools/tool-test-helper/tool_sample.test.ts new file mode 100644 index 000000000..22c444378 --- /dev/null +++ b/repo-tools/tool-test-helper/tool_sample.test.ts @@ -0,0 +1,28 @@ +import { makeToolTestConfig, toolInstallTest, toolTest } from "tests"; + +// Guidelines for configuring tests: +// - Prefer using health check in config + toolInstallTest, if you must use toolTest leave a +// comment explaining why. Only one of the two options is sufficient. +// - Usually, just a version or help text command is sufficient +// - add a test for each command that is used in the plugin.yaml +// - exit code 0 is assumed, so set expectedExitCode if it is different +// - expectedOut/expectedErr do a substring match, so you can just put a portion of the output +// +// If you are unable to write a test for this tool, please document why in your PR. Feel free to ask for help! + +toolInstallTest({ + toolName: "NAME_HERE", + toolVersion: "VERSION_HERE", +}); + +// No need to include if a toolInstallTest is included. +toolTest({ + toolName: "NAME_HERE", + toolVersion: "VERSION_HERE", + testConfigs: [ + makeToolTestConfig({ + command: ["SHIM_NAME", "COMMAND_HERE"], + expectedOut: "OUTPUT_HERE", + }), + ], +}); diff --git a/repo-tools/tool-test-helper/tool_sample_plugin.yaml b/repo-tools/tool-test-helper/tool_sample_plugin.yaml new file mode 100644 index 000000000..185bea871 --- /dev/null +++ b/repo-tools/tool-test-helper/tool_sample_plugin.yaml @@ -0,0 +1,31 @@ +version: 0.1 +# Tools can be either runtime package-based or download-based. Modify this boilerplate +# to fit your use case. + +# Fill out this part if the linter/tool is download-based - otherwise delete +downloads: + - name: NAME_HERE + # executable: true + # DOWNLOAD_URL_INFO_HERE + downloads: + - os: + linux: linux + macos: darwin + windows: windows + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://URL_HERE/${version}/${os}-${cpu}-NAME_HERE +tools: + definitions: + - name: NAME_HERE + # RUNTIME_OR_DOWNLOAD_INFO_HERE + # runtime: RUNTIME_HERE + # package: NAME_HERE + # -- OR -- + # download: NAME_HERE + known_good_version: VERSION_HERE + shims: [NAME_HERE] + health_checks: + - command: NAME_HERE --version + parse_regex: ${semver} diff --git a/runtimes/java/plugin.yaml b/runtimes/java/plugin.yaml index d74abba50..d470e3f50 100644 --- a/runtimes/java/plugin.yaml +++ b/runtimes/java/plugin.yaml @@ -4,6 +4,16 @@ downloads: # implementing the Java runtime. The Temurin releases are hosted on GitHub, which would allow us # to use "latest version query" logic on them, but their release naming isn't trivially compatible # with our current schema (e.g. JDK 11.0.17+8 has URL /jdk-11.0.17+8/[...]_11.0.17_8.tar.gz). + - name: jdk-23 + downloads: + - os: + linux: linux + macos: macosx + cpu: + x86_64: x64 + arm_64: aarch64 + url: https://cdn.azul.com/zulu/bin/zulu23.30.13-ca-jdk23.0.1-${os}_${cpu}.tar.gz + strip_components: 1 - name: jdk-17 downloads: @@ -53,7 +63,7 @@ downloads: runtimes: definitions: - type: java - download: jdk-13 + download: jdk-23 runtime_environment: - name: HOME value: ${env.HOME:-} diff --git a/runtimes/node/plugin.yaml b/runtimes/node/plugin.yaml index 09657f4b5..a783ff2a8 100644 --- a/runtimes/node/plugin.yaml +++ b/runtimes/node/plugin.yaml @@ -47,6 +47,10 @@ runtimes: - name: NPM_CONFIG_USERCONFIG value: ${env.NPM_CONFIG_USERCONFIG} optional: true + # Necessary for some Windows install scripts + - name: COMSPEC + value: ${env.COMSPEC} + optional: true linter_environment: - name: PATH list: ["${linter}/node_modules/.bin"] @@ -55,7 +59,7 @@ runtimes: - name: NODE_OPTIONS value: ${env.NODE_OPTIONS} optional: true - known_good_version: 18.12.1 + known_good_version: 22.16.0 version_commands: - run: node --version parse_regex: ${semver} diff --git a/runtimes/php/plugin.yaml b/runtimes/php/plugin.yaml new file mode 100644 index 000000000..653287088 --- /dev/null +++ b/runtimes/php/plugin.yaml @@ -0,0 +1,29 @@ +version: 0.1 +downloads: # Needed for the php runtime to install packages + - name: composer + executable: true + version: 2.8.3 + downloads: + - version: 2.8.3 + gpg: CBB3D576F2A0946F + - name: phive + executable: true + version: 0.15.3 + downloads: + - url: https://github.com/phar-io/phive/releases/download/${version}/phive-${version}.phar +runtimes: + definitions: + - type: php + system_version: required + version: ">=8.0.0" + runtime_environment: + - name: HOME + value: ${env.HOME} + - name: PATH + list: ["${env.PATH}"] + linter_environment: + - name: PATH + list: ["${linter}/bin"] + version_commands: + - run: php --version + parse_regex: PHP ${short_semver} diff --git a/runtimes/python/plugin.yaml b/runtimes/python/plugin.yaml index 300eead83..2569ea002 100644 --- a/runtimes/python/plugin.yaml +++ b/runtimes/python/plugin.yaml @@ -2,6 +2,16 @@ version: 0.1 downloads: - name: python downloads: + - os: + linux: unknown-linux-gnu + macos: apple-darwin + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + arm_64: aarch64 + version: <=3.9.22 + url: https://github.com/astral-sh/python-build-standalone/releases/download/20250409/cpython-${version}+20250409-${cpu}-${os}-install_only.tar.gz + strip_components: 1 - os: linux: unknown-linux-gnu macos: apple-darwin @@ -34,6 +44,16 @@ downloads: version: <=3.10.8 url: https://github.com/indygreg/python-build-standalone/releases/download/20221106/cpython-${version}+20221106-${cpu}-${os}-install_only.tar.gz strip_components: 1 + - os: + linux: unknown-linux-gnu + macos: apple-darwin + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + arm_64: aarch64 + version: <=3.10.17 + url: https://github.com/astral-sh/python-build-standalone/releases/download/20250409/cpython-${version}+20250409-${cpu}-${os}-install_only.tar.gz + strip_components: 1 - os: linux: unknown-linux-gnu macos: apple-darwin @@ -66,23 +86,63 @@ downloads: version: <=3.11.6 url: https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-${version}+20231002-${cpu}-${os}-install_only.tar.gz strip_components: 1 - # Note that older versions of pylint, djlint, flake8 are not compatible with python@3.12 - os: linux: unknown-linux-gnu macos: apple-darwin cpu: x86_64: x86_64 arm_64: aarch64 - version: <=3.12.2 - url: https://github.com/indygreg/python-build-standalone/releases/download/20240224/cpython-${version}+20240224-${cpu}-${os}-install_only.tar.gz + version: <=3.11.9 + url: https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-${version}+20240415-${cpu}-${os}-install_only.tar.gz + strip_components: 1 + - os: + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + version: <=3.11.9 + url: https://github.com/indygreg/python-build-standalone/releases/download/20240415/cpython-${version}+20240415-${cpu}-${os}-install_only.tar.gz + strip_components: 1 + + - os: + linux: unknown-linux-gnu + macos: apple-darwin + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + arm_64: aarch64 + version: <=3.11.12 + url: https://github.com/astral-sh/python-build-standalone/releases/download/20250409/cpython-${version}+20250409-${cpu}-${os}-install_only.tar.gz strip_components: 1 - os: + linux: unknown-linux-gnu + macos: apple-darwin windows: pc-windows-msvc-shared cpu: x86_64: x86_64 + arm_64: aarch64 version: <=3.12.2 url: https://github.com/indygreg/python-build-standalone/releases/download/20240224/cpython-${version}+20240224-${cpu}-${os}-install_only.tar.gz strip_components: 1 + - os: + linux: unknown-linux-gnu + macos: apple-darwin + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + arm_64: aarch64 + version: <=3.12.10 + url: https://github.com/astral-sh/python-build-standalone/releases/download/20250517/cpython-${version}+20250517-${cpu}-${os}-install_only.tar.gz + strip_components: 1 + - os: + linux: unknown-linux-gnu + macos: apple-darwin + windows: pc-windows-msvc-shared + cpu: + x86_64: x86_64 + arm_64: aarch64 + version: <=3.13.3 + url: https://github.com/astral-sh/python-build-standalone/releases/download/20250517/cpython-${version}+20250517-${cpu}-${os}-install_only.tar.gz + strip_components: 1 runtimes: definitions: @@ -104,6 +164,12 @@ runtimes: - name: https_proxy value: ${env.https_proxy} optional: true + - name: REQUESTS_CA_BUNDLE + value: ${env.REQUESTS_CA_BUNDLE} + optional: true + - name: PIP_CERT + value: ${env.PIP_CERT} + optional: true - name: PYTHONUTF8 # Necessary for isort and our custom parsers on Windows value: 1 linter_environment: @@ -113,6 +179,15 @@ runtimes: - "${linter}/Scripts" # Windows places binaries here instead of bin/ - name: VIRTUAL_ENV value: ${linter} + - name: http_proxy + value: ${env.http_proxy} + optional: true + - name: https_proxy + value: ${env.https_proxy} + optional: true + - name: REQUESTS_CA_BUNDLE + value: ${env.REQUESTS_CA_BUNDLE} + optional: true known_good_version: 3.10.8 version_commands: - run: python3 --version diff --git a/runtimes/ruby/plugin.yaml b/runtimes/ruby/plugin.yaml index 64b850c23..af8da07fa 100644 --- a/runtimes/ruby/plugin.yaml +++ b/runtimes/ruby/plugin.yaml @@ -1,15 +1,15 @@ version: 0.1 downloads: - name: ruby-build - version: 20230330 + version: 20250409 downloads: - os: linux: linux macos: macos - url: https://github.com/rbenv/ruby-build/archive/refs/tags/v20230330.tar.gz + url: https://github.com/rbenv/ruby-build/archive/refs/tags/v20250409.tar.gz strip_components: 1 - name: ruby-install - version: 3.1.4 + version: 3.4.2 downloads: # Functionally a separate download used for Windows only. Runs OOTB and does not require a prepare build step. - os: windows @@ -44,10 +44,10 @@ runtimes: - name: SYSTEMDRIVE value: ${env.SYSTEMDRIVE} optional: true - known_good_version: 3.1.4 + known_good_version: 3.4.2 version_commands: - run: ruby --version - parse_regex: ruby ([0-9\.]+)(p+.*) + parse_regex: ruby ${semver}(p+.*)? shims: - bundle - bundler diff --git a/runtimes/rust/plugin.yaml b/runtimes/rust/plugin.yaml index 8dd7b4acc..1d16ec7b9 100644 --- a/runtimes/rust/plugin.yaml +++ b/runtimes/rust/plugin.yaml @@ -35,7 +35,7 @@ runtimes: linter_environment: - name: PATH list: ["${linter}/bin"] - known_good_version: 1.71.1 + known_good_version: 1.82.0 version_commands: - run: rustc --version parse_regex: ${semver} diff --git a/tests/README.md b/tests/README.md index 4db7c70ee..351013159 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,16 +1,25 @@ # Testing -To run tests and generate snapshots, run `npm install` and `npm test `. +```bash +npm ci +npm test +``` + +- [Overview](#overview) +- [Configuring Tests](#configuring-tests) +- [Running and Debugging Tests](#running-tests) +- [Additional Options](#additional-options) ## Overview -We ask that all new linter definitions in this repository add some basic testing. This should be a -straightforward and simple process, with minimal overhead, but let us know if you need help! Please -start by following the instructions below: +We ask that all new linter and tool definitions in this repository add some basic testing. This +should be a straightforward and simple process, with minimal overhead, but let us know if you need +help! Please start by following the instructions below: ## Configuring Tests -Please create a directory structure in your linter/formatter definition analogous to the following: +Follow the setup quickstart in the [contributing guidelines](../CONTRIBUTING.md). As a result, you +should have a directory structure like the following: ```text linters/ @@ -20,16 +29,17 @@ linters/ │ README.md (optional) │ my-config.json (optional) └─test_data/ - └─basic.in.py (with appropriate extension) + └─basic.in.foo (with appropriate extension) ``` - Specify a `README.md` if your linter integration requires additional explanation or configuration. -- Specify a `my-config.json` (or whatever `direct_configs` item applies) ONLY if providing this - config file is sufficient to enable your linter in ALL cases. This will be created whenever - someone enables your linter. -- Specify a typescript test file that calls `linterCheckTest` or `linterFmtTest` with the name of - your linter and (optionally) the prefixes of your input files and any special callbacks. -- Inside of `test_data/`, provide at least one input file. +- Specify a `my-config.json` (or whatever `direct_configs` item applies) ONLY if it is universally + applicable. This will be created whenever someone enables your linter. +- Specify a [Jest test file](../repo-tools/linter-test-helper/linter_sample.test.ts) that calls + `linterCheckTest` or `linterFmtTest` with the name of your linter and (optionally) the prefixes of + your input files and any special callbacks. +- Inside of `test_data/`, provide at least one input file. **This file should be named + `.in.` to be automatically picked up by the testing framework.** - For linters, specify a sample input file (with an appropriate file extension). For reference, the tests will run the following command against your input file: @@ -45,26 +55,21 @@ linters/ trunk fmt --force --filter= ``` -Refer to [sqlfluff](../linters/sqlfluff) or [pragma-once](../linters/pragma-once) as testing -examples. +Refer to [sqlfluff](../linters/sqlfluff/sqlfluff.test.ts) or +[pragma-once](../linters/pragma-once/pragma_once.test.ts) as testing examples. ## Running Tests -To run all tests, run `npm install` and then run: +The first time you run a test, it will automatically generate the necessary snapshot for the +`known_good_version`. -```bash -npm test -``` - -To run an individual test, run: +To run a test with debug information and preserve a sandbox for debugging, run: ```bash -npm test +npm ci +SANDBOX_DEBUG="true" DEBUG="Driver:*" npm test ``` -Then, verify that the generated snapshot file includes the results you would expect (e.g. an Object -with several fileIssues, no taskFailures). - For context, the general test execution is as follows: 1. Create a sandbox testing directory by copying a linter's subdirectory and its `test_data`. @@ -72,6 +77,7 @@ For context, the general test execution is as follows: [.trunk/trunk.yaml](../.trunk/trunk.yaml). 3. Run `trunk check enable `. 4. Run `trunk check` or `trunk fmt` on files with the `.in.` syntax. +5. Cache any linter/tool downloads in `${TMPDIR:-/tmp}/plugins_testing_download_cache` ### Linter Versioning @@ -99,7 +105,7 @@ The process of resolving snapshots for asserting output correctness is as follow If no such snapshot exists, a new snapshot is created with the enabled version of the linter (use [debug logging](#debugging) to see what version was enabled). -The reasoning for this setup is threefold: +[The reasoning for this setup is threefold](https://trunk.io/blog/how-we-eliminate-tool-rot-and-confidently-upgrade-our-open-source-dependencies): 1. Linters can update their arguments or outputs on occasion, which can lead to a different trunk output. We would like to be aware of these changes, particularly if they require trunk to accept @@ -142,42 +148,25 @@ include: version change. - `SANDBOX_DEBUG` if `true`, prevents sandbox test directories from being deleted, and logs their path for additional debugging. +- [`DEBUG`](https://www.npmjs.com/package/debug) is used to configure log information. Use + `DEBUG=Driver:*` to view useful test driver logs, or use `DEBUG=*:sqlfluff*` to view all logs + related to a particular linter (`::<#>`). ### CI PRs will run 5 types of tests across all platforms as applicable: -1. Enable and test all linters with their `known_good_version`, if applicable. To replicate this - behavior, run: `PLUGINS_TEST_LINTER_VERSION=KnownGoodVersion npm test`. If the +1. Enable and test all changed linters with their `known_good_version`, if applicable. To replicate + this behavior, run: `PLUGINS_TEST_LINTER_VERSION=KnownGoodVersion npm test`. If the `known_good_version` is different from the version enabled when you defined the linter, you will need to first run this locally to generate a snapshot file. -2. Enable and test all linters with their latest version, if applicable. To replicate this behavior, - run: `npm test`. -3. Assert that all linters pass config validation. This is also validated while running: `npm test`. -4. Assert that all linters have test coverage. -5. Assert that all linters are included in the [`README.md`](../README.md). +2. Enable and test all changed linters with their latest version, if applicable. To replicate this + behavior, run: `npm test`. +3. Assert that all linters pass config validation and best practices. +4. Assert that all linters are included in the [`README.md`](../README.md). ### Debugging Individual tests normally complete in less than 1 minute. They may take up to 5 minutes or so if the -dependency cache is empty (linters need to be downloaded and installed to run the linter tests). -Subsequent runs will not experience this delay. - -Errors encountered during test runs are reported through the standard `console`, but additional -debugging is provided using [debug](https://www.npmjs.com/package/debug). The namespace convention -used is `::<#>`, where Location is `Driver | Tests`, linter is the name of the -linter being tested (alternatively `test<#>` if no linter is specified), and # is a counter used to -distinguish between multiple tests with the same linter. - -Accordingly, in order to view debug logs for all sqlfluff tests, you can set the environment -variable: - -```bash -DEBUG=*:sqlfluff* -``` - -To just see debug logs from the test driver, use: - -```bash -DEBUG=Driver:* -``` +`/tmp/plugins_testing_download_cache` dependency cache is empty (linters need to be downloaded and +installed to run the linter tests). Subsequent runs will not experience this delay. diff --git a/tests/driver/driver.ts b/tests/driver/driver.ts index f43f21636..6716ecc9a 100644 --- a/tests/driver/driver.ts +++ b/tests/driver/driver.ts @@ -21,6 +21,8 @@ export interface SetupSettings { trunkVersion?: string; } +export type CustomExecOptions = ExecOptions & { stdin?: string }; + const execFilePromise = util.promisify(execFile); const TEMP_SUBDIR = "tmp"; @@ -29,8 +31,8 @@ const UNINITIALIZED_ERROR = `You have attempted to modify the sandbox before it Please call this method after setup has been called.`; export const executionEnv = (sandbox: string) => { - // trunk-ignore(eslint/@typescript-eslint/no-unused-vars): Strip TRUNK_CLI_VERSION from CI-Debugger - const { PWD, INIT_CWD, TRUNK_CLI_VERSION, ...strippedEnv } = process.env; + // trunk-ignore(eslint/@typescript-eslint/no-unused-vars): Remove vars. + const { PWD, INIT_CWD, ...strippedEnv } = process.env; return { ...strippedEnv, // This keeps test downloads separate from manual trunk invocations @@ -378,13 +380,41 @@ export abstract class GenericTrunkDriver { * Run a command inside the sandbox test repo. * @param bin command to run * @param args arguments to run - * @param execOptions + * @param execOptions options to pass the stdin to exec */ - async run(bin: string, args: string[], execOptions?: ExecOptions) { - return await execFilePromise(bin, args, { + async run(bin: string, args: string[], execOptions?: CustomExecOptions) { + const exec = execFile(bin, args, { cwd: this.sandboxPath, env: executionEnv(this.sandboxPath ?? ""), ...execOptions, }); + exec.stdin?.write(execOptions?.stdin ?? ""); + exec.stdin?.end(); + + return await new Promise<{ stdout: string; stderr: string }>((resolve, reject) => { + let stdout = ""; + let stderr = ""; + + exec.stdout?.on("data", (chunk: string) => { + stdout += chunk; + }); + + exec.stderr?.on("data", (chunk: string) => { + stderr += chunk; + }); + + exec.on("error", (err: any) => { + // trunk-ignore(eslint/@typescript-eslint/prefer-promise-reject-errors) + reject(err); + }); + exec.on("exit", (code: number) => { + if (code === 0) { + resolve({ stdout, stderr }); + } else { + // trunk-ignore(eslint/@typescript-eslint/prefer-promise-reject-errors) + reject({ error: new Error(`Process exited with code ${code}`), code, stdout, stderr }); + } + }); + }); } } diff --git a/tests/driver/lint_driver.ts b/tests/driver/lint_driver.ts index b74a93b3a..3220fc681 100644 --- a/tests/driver/lint_driver.ts +++ b/tests/driver/lint_driver.ts @@ -94,7 +94,7 @@ runtimes: enabled: # required in order to query latest - go@1.21.0 - - node@18.12.1 + - node@22.16.0 - python@3.10.8 - ruby@3.1.4 plugins: @@ -126,6 +126,7 @@ lint: (this.getFullTrunkConfig().lint.definitions.find( ({ name }: { name: string }) => name === this.linter, )?.known_good_version as string) ?? ""; + // trunk-ignore(eslint/@typescript-eslint/no-unnecessary-template-expression): Convert kgv to string if (this.linter === "include-what-you-use" && `${kgv}`.length === 3) { // TODO(Tyler): `trunk config print` does not correctly wrap quotes around kgv, so we must patch iwyu here return `${kgv}0`; @@ -148,7 +149,7 @@ lint: let newTrunkContents = ""; try { - // Cast version to string in case of decimal representation (e.g. 0.40) + // trunk-ignore(eslint/@typescript-eslint/no-unnecessary-template-expression): Cast to string to handle decimal case const version = `${this.extractLinterVersion()}`; const versionString = version.length > 0 ? `@${version}` : ""; const linterVersionString = `${this.linter}${versionString}`; @@ -165,7 +166,7 @@ lint: ); const enabledVersionRegex = `(?${this.linter})@(?.+)\n`; const foundIn = newTrunkContents.match(enabledVersionRegex); - if (foundIn && foundIn.groups?.version && foundIn.groups?.version.length > 0) { + if (foundIn?.groups?.version && foundIn.groups.version.length > 0) { this.enabledVersion = foundIn.groups.version; this.debug("Enabled %s", this.enabledVersion); } @@ -284,7 +285,7 @@ lint: // this has been changed from ".json" to ".out.json" for linters that run on terraform files // terraform extensions are .tf and .tf.json - this change prevents accidentally linting the trunk output const resultJsonPath = `${targetAbsPath}.out.json`; - const args = `${targetRelativePath}`; + const args = targetRelativePath; this.debug("Running `trunk check` on %s", targetRelativePath); return await this.runCheck({ args, linter, targetAbsPath, resultJsonPath }); } @@ -360,7 +361,7 @@ lint: async runFmtUnit(targetRelativePath: string, linter: string): Promise { const targetAbsPath = path.resolve(this.sandboxPath ?? "", targetRelativePath); const resultJsonPath = `${targetAbsPath}.json`; - const args = `${targetRelativePath}`; + const args = targetRelativePath; this.debug("Running `trunk fmt` on %s", targetRelativePath); return await this.runFmt({ args, linter, targetAbsPath, resultJsonPath }); } diff --git a/tests/driver/tool_driver.ts b/tests/driver/tool_driver.ts index eb26deec7..d2ae68b6a 100644 --- a/tests/driver/tool_driver.ts +++ b/tests/driver/tool_driver.ts @@ -84,7 +84,7 @@ lint: return; } try { - // Cast version to string in case of decimal representation (e.g. 0.40) + // trunk-ignore(eslint/@typescript-eslint/no-unnecessary-template-expression): Cast to string to handle decimal case const version = `${this.extractToolVersion()}`; const versionString = version.length > 0 ? `@${version}` : ""; const toolVersionString = `${this.tool}${versionString}`; @@ -99,7 +99,7 @@ lint: ); const enabledVersionRegex = `(?${this.tool})@(?.+)\n`; const foundIn = newTrunkContents.match(enabledVersionRegex); - if (foundIn && foundIn.groups?.version && foundIn.groups?.version.length > 0) { + if (foundIn?.groups?.version && foundIn.groups.version.length > 0) { this.enabledVersion = foundIn.groups.version; this.debug("Enabled %s", this.enabledVersion); } @@ -158,13 +158,35 @@ lint: stdout: string; stderr: string; exitCode: number; + details?: string; }> => { try { const { stdout, stderr } = await this.runTrunk(["tools", "install", toolName, "--ci"]); - return { exitCode: 0, stdout, stderr }; + return { exitCode: 0, stdout, stderr, details: undefined }; } catch (e: any) { - // trunk-ignore(eslint/@typescript-eslint/no-unsafe-member-access) - return { exitCode: e.code as number, stdout: e.stdout as string, stderr: e.stderr as string }; + let details = undefined; + /* eslint-disable-next-line + @typescript-eslint/no-unsafe-call, + @typescript-eslint/no-unsafe-member-access, + @typescript-eslint/no-unsafe-assignment + */ + const detailsPath = e.stdout.match(/\.trunk\/out\/(.+\.yaml)/); + if (detailsPath) { + details = await fs.promises.readFile( + /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access */ + path.resolve(this.sandboxPath ?? "", detailsPath[0]), + "utf8", + ); + } + + /* eslint-disable @typescript-eslint/no-unsafe-member-access */ + return { + exitCode: e.code as number, + stdout: e.stdout as string, + stderr: e.stderr as string, + /* eslint-enable @typescript-eslint/no-unsafe-member-access */ + details, + }; } }; @@ -195,16 +217,17 @@ lint: /**** Execution methods ****/ - async runTool(command: string[]): Promise { + async runTool(command: string[], stdin?: string): Promise { const tools_subdir = fs.existsSync(path.resolve(this.sandboxPath ?? "", ".trunk/dev-tools")) ? "dev-tools" : "tools"; try { if (process.platform == "win32") { - const { stdout, stderr } = await this.run("powershell", [ - `.trunk/${tools_subdir}/${command[0]}.bat`, - ...command.slice(1), - ]); + const { stdout, stderr } = await this.run( + "powershell", + [`.trunk/${tools_subdir}/${command[0]}.bat`, ...command.slice(1)], + { stdin }, + ); return { exitCode: 0, stdout, @@ -215,6 +238,7 @@ lint: const { stdout, stderr } = await this.run( `.trunk/${tools_subdir}/${command[0]}`, command.slice(1), + { stdin }, ); return { exitCode: 0, diff --git a/tests/index.ts b/tests/index.ts index 920379961..3a470bc8c 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -252,12 +252,15 @@ export const toolInstallTest = ({ describe(`Testing tool ${toolName}`, () => { const driver = setUpTrunkToolDriverForHealthCheck(dirName, {}, toolName, toolVersion, preCheck); conditionalTest(skipTestIf(toolVersion), "tool ", async () => { - const { exitCode, stdout, stderr } = await driver.runInstall(toolName); - expect(exitCode).toEqual(0); - expect(stdout).toContain(toolName); - expect(stdout).toContain(toolVersion); - expect(stderr).toEqual(""); - expect(stdout).not.toContain("Failures:"); + const installResult = await driver.runInstall(toolName); + expect(installResult).toMatchObject({ + exitCode: 0, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + stdout: expect.stringMatching(`${toolName}.+${toolVersion}(?!.*trunk)`), + stderr: "", + details: undefined, + }); + expect(installResult.stdout).not.toContain("Failures:"); }); }); }; @@ -267,6 +270,7 @@ interface ToolTestConfig { expectedOut?: string; expectedErr?: string; expectedExitCode?: number; + stdin?: string; } export const makeToolTestConfig = ({ @@ -274,11 +278,13 @@ export const makeToolTestConfig = ({ expectedOut = "", expectedErr = "", expectedExitCode = 0, + stdin = "", }: ToolTestConfig) => ({ command, expectedOut, expectedErr, expectedExitCode, + stdin, }); export const toolTest = ({ @@ -298,12 +304,16 @@ export const toolTest = ({ }) => { describe(`Testing tool ${toolName}`, () => { const driver = setupTrunkToolDriver(dirName, {}, toolName, toolVersion, preCheck); - testConfigs.forEach(({ command, expectedOut, expectedErr, expectedExitCode }) => { + testConfigs.forEach(({ command, expectedOut, expectedErr, expectedExitCode, stdin }) => { conditionalTest(skipTestIf(toolVersion), command.join(" "), async () => { - const { stdout, stderr, exitCode } = await driver.runTool(command); - expect(stdout).toContain(expectedOut); - expect(stderr).toContain(expectedErr); - expect(exitCode).toEqual(expectedExitCode); + const installResult = await driver.runTool(command, stdin); + expect(installResult).toMatchObject({ + exitCode: expectedExitCode, + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + stdout: expect.stringContaining(expectedOut ?? ""), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + stderr: expect.stringContaining(expectedErr ?? ""), + }); }); }); }); @@ -836,6 +846,7 @@ export const linterFmtTest = ({ snapshotPath, ); registerFailureMode("assertion_failure"); + // trunk-ignore(eslint/@typescript-eslint/no-non-null-assertion) expect(fs.readFileSync(testRunResult.targetPath!, "utf-8")).toMatchSpecificSnapshot( snapshotPath, ); diff --git a/tests/jest_setup.ts b/tests/jest_setup.ts index 2a7ec187f..caf1e4c41 100644 --- a/tests/jest_setup.ts +++ b/tests/jest_setup.ts @@ -2,7 +2,7 @@ import { FileIssue } from "tests/types"; import { osTimeoutMultiplier } from "tests/utils"; import { isDeepStrictEqual } from "util"; -jest.setTimeout(300000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(300000 * osTimeoutMultiplier); /** * Compares 2 file issues to determine exact equality. diff --git a/tests/parse/index.ts b/tests/parse/index.ts index 210e45f49..fa5d2eab2 100644 --- a/tests/parse/index.ts +++ b/tests/parse/index.ts @@ -11,11 +11,15 @@ import { } from "tests/types"; import { REPO_ROOT } from "tests/utils"; import { getTrunkVersion } from "tests/utils/trunk_config"; +import YAML from "yaml"; const RESULTS_FILE = path.resolve(REPO_ROOT, "results.json"); -const FAILURES_FILE = path.resolve(REPO_ROOT, "failures.json"); +const FAILURES_FILE = path.resolve(REPO_ROOT, "failures.yaml"); const RERUN_FILE = path.resolve(REPO_ROOT, "reruns.txt"); +const EXCLUDED_RERUN_LINTERS: string[] = ["snyk"]; +const VALIDATED_LINTER_BLOCKLIST: string[] = []; + const RUN_ID = process.env.RUN_ID ?? ""; const TEST_REF = process.env.TEST_REF ?? "latest release"; const GITHUB_REPOSITORY = process.env.GITHUB_REPOSITORY ?? "missing_repo"; @@ -297,10 +301,11 @@ const writeFailuresForNotification = (failures: FailedVersion[]) => { const blocks = allBlocks.length > 50 ? allBlocks.slice(0, 49).concat(remainingBlock) : allBlocks; const failuresObject = { + channel: process.env.SLACK_CHANNEL_ID, text: `${failures.length} failures encountered running plugins tests for ${TEST_REF}`, blocks, }; - const failuresString = JSON.stringify(failuresObject); + const failuresString = YAML.stringify(failuresObject); fs.writeFileSync(FAILURES_FILE, failuresString); console.log(`Wrote ${failures.length} failures out to ${FAILURES_FILE}:`); console.log(failuresString); @@ -323,7 +328,11 @@ const writeTestResults = (testResults: TestResultSummary) => { const pluginVersion = PLUGIN_VERSION; const validatedVersions = Array.from(testResults.testResults).reduce( (accumulator: ValidatedVersion[], [linter, { version, testResultStatus }]) => { - if (testResultStatus === "passed" && version) { + if ( + testResultStatus === "passed" && + version && + !VALIDATED_LINTER_BLOCKLIST.includes(linter) + ) { const additionalValidatedVersion: ValidatedVersion = { linter, version }; return accumulator.concat([additionalValidatedVersion]); } @@ -349,12 +358,14 @@ const writeTestResults = (testResults: TestResultSummary) => { const allMetadata = Array.from(testFailureMetadata.values()); // Must have at least one assertion_failure and no other failure types in order to proactively generate snapshot. const shouldRerunTest = + !EXCLUDED_RERUN_LINTERS.includes(linter) && allMetadata.every( (failureMode) => failureMode === "assertion_failure" || failureMode === "skipped" || failureMode === "passed", - ) && allMetadata.find((failureMode) => failureMode === "assertion_failure") !== undefined; + ) && + allMetadata.find((failureMode) => failureMode === "assertion_failure") !== undefined; if (shouldRerunTest) { rerunPaths.push(testFilePath); } diff --git a/tests/repo_tests/config_check.test.ts b/tests/repo_tests/config_check.test.ts index 8c1adfcd1..73ecb0384 100644 --- a/tests/repo_tests/config_check.test.ts +++ b/tests/repo_tests/config_check.test.ts @@ -7,10 +7,9 @@ import { osTimeoutMultiplier, REPO_ROOT } from "tests/utils"; // trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-assignment) // trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-member-access) // trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-call) -// trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-argument) // trunk-ignore-all(eslint/@typescript-eslint/no-unsafe-return) -jest.setTimeout(300000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(300000 * osTimeoutMultiplier); /** * This test runs 'trunk config print' from the root of the repository to verify a healthy config. @@ -25,7 +24,7 @@ describe("Global config health check", () => { setupTrunk: true, // NOTE: This version should be kept compatible in lockstep with the `required_trunk_version` in plugin.yaml // IfChange - trunkVersion: "1.18.2-beta.7", + trunkVersion: "1.22.2-beta.5", // ThenChange plugin.yaml }); @@ -149,7 +148,7 @@ describe("Global config health check", () => { "dotenv-linter", "git-diff-check", "gofmt", - "golangci-lint", + "golangci-lint2", "hadolint", "haml-lint", "isort", @@ -165,84 +164,10 @@ describe("Global config health check", () => { "shfmt", "svgo", "taplo", - "terrascan", "tflint", - "trivy", "trufflehog", "yamllint", ] `); }); }); - -/** - * This test validates that only explicitly enumerated linters are recommended by default. - */ -describe("Explicitly enabled healthcheck", () => { - // Step 1: Define test setup and teardown - const driver = setupLintDriver(REPO_ROOT, { - setupGit: false, - setupTrunk: true, - }); - - // Step 2: Validate that no plugin linters or actions are explicitly enabled - it("validate explicitly enabled actions and linters", async () => { - // Remove user.yaml if it exists, since it could affect the enabled set. - // Specifying force avoid errors being thrown if it doesn't exist. - fs.rmSync(path.resolve(driver.getSandbox(), ".trunk/user.yaml"), { - force: true, - }); - - const compositeConfig = await driver.getFullTrunkConfig(); - const lintDefinitions = compositeConfig.lint.definitions; - const actionDefinitions = compositeConfig.actions.definitions; - - const explicitlyEnabledLinters = lintDefinitions.reduce( - (enabledLinters: string[], definition: any) => { - if (definition.enabled) { - return enabledLinters.concat(definition.name); - } - - if (definition.commands) { - const commandEnabled = definition.commands.reduce((enabled: boolean, command: any) => { - if (command.enabled) { - return true; - } - return enabled; - }, false); - if (commandEnabled) { - return enabledLinters.concat(definition.name); - } - } - - return enabledLinters; - }, - [], - ); - - // No linters should be enabled by default - expect(explicitlyEnabledLinters).toMatchInlineSnapshot(`[]`); - - const explicitlyEnabledActions = actionDefinitions.reduce( - (enabledActions: string[], definition: any) => { - if (definition.enabled) { - return enabledActions.concat(definition.id); - } - - return enabledActions; - }, - [], - ); - - // Built-in actions only - expect(explicitlyEnabledActions).toMatchInlineSnapshot(` - [ - "trunk-cache-prune", - "trunk-share-with-everyone", - "trunk-single-player-auto-upgrade", - "trunk-single-player-auto-on-upgrade", - "trunk-whoami", - ] - `); - }); -}); diff --git a/tests/repo_tests/readme_inclusion.test.ts b/tests/repo_tests/readme_inclusion.test.ts index c6a6dd452..60462d941 100644 --- a/tests/repo_tests/readme_inclusion.test.ts +++ b/tests/repo_tests/readme_inclusion.test.ts @@ -12,6 +12,7 @@ const readmeTableContents = readmeContents.substring( ); const reducedReadmeContents = readmeTableContents ? readmeTableContents : readmeContents; +// TODO(Tyler): Move this to 'definition-checker' linter. // This test asserts that all linters are included in the root README.md. This does not cover subcommands, and it assumes one // directory per linter. Name mapping can be achieved through `abbreviationMapping`. describe("All linters must be included in README.md", () => { diff --git a/tests/repo_tests/test_coverage.test.ts b/tests/repo_tests/test_coverage.test.ts deleted file mode 100644 index a74e1d051..000000000 --- a/tests/repo_tests/test_coverage.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { execSync } from "child_process"; -import fs from "fs"; -import path from "path"; -import { REPO_ROOT } from "tests/utils"; - -// This should be empty unless we've agreed that certain linters can omit coverage. e.g. ["oxipng"] -// Note that any linters without tests will not upload validated versions for `trunk upgrade`. -const excludedLinters: string[] = []; - -// This test asserts that all linters have at least one test. All new linters are expected to have -// test coverage. Review tests/README.md for testing guidelines. Prefer using npm test for indirection -// in this test so that we get an accurate list of all tests, regardless of any changes to the test spec -// in jest.config.json. -describe("All linters must have tests", () => { - // Find all tests detected by jest - const stdout = execSync("npm test -- --listTests", { cwd: REPO_ROOT }).toString(); - const testFiles = stdout - .split("\n") - .filter((file) => file.startsWith("/") || file.match(/[A-Z]:\\/)) - .map((file) => path.relative(REPO_ROOT, file)); - - // Key the tests by their linter subdirectory - const testDirMap = testFiles.reduce((accumulator: Map, file: string) => { - const linterSubdir = - process.platform === "win32" ? file.match(/linters\\[^\\]+/) : file.match(/linters\/[^/]+/); - if (linterSubdir) { - const matches = accumulator.get(linterSubdir[0]) ?? []; - accumulator.set(linterSubdir[0], [...matches, file]); - } - return accumulator; - }, new Map()); - const testDirObject = Object.fromEntries(testDirMap); - - // Find all linter subdirectories - const linterDir = path.resolve(REPO_ROOT, "linters"); - const linters = fs - .readdirSync(linterDir) - .filter((file) => fs.lstatSync(path.resolve(linterDir, file)).isDirectory()); - - // Assert that each linter subdirectory has a test (excluding an explicit subset) - linters - .filter((linter) => !excludedLinters.includes(linter)) - .forEach((linter) => { - // trunk-ignore(eslint/jest/valid-title) - it(linter, () => { - const linterSubdir = path.join("linters", linter); - expect(testDirObject).toHaveProperty(linterSubdir); - }); - }); -}); diff --git a/tests/repo_tests/valid_package_download.test.ts b/tests/repo_tests/valid_package_download.test.ts index b2278909e..3e8c1c31f 100644 --- a/tests/repo_tests/valid_package_download.test.ts +++ b/tests/repo_tests/valid_package_download.test.ts @@ -3,6 +3,7 @@ import path from "path"; import { REPO_ROOT } from "tests/utils"; import { parseYaml } from "tests/utils/trunk_config"; +// TODO(Tyler): Move this to 'definition-checker' linter. // These linters use go or rust downloads. const excludedLinters: string[] = [ "clippy", diff --git a/tests/reporter/index.js b/tests/reporter/index.js index 71479f9d7..b13da7823 100644 --- a/tests/reporter/index.js +++ b/tests/reporter/index.js @@ -1,4 +1,3 @@ -// trunk-ignore-all(eslint) const path = require("path"); const tsNode = require("ts-node"); diff --git a/tests/types/index.ts b/tests/types/index.ts index 2c3f8245e..fd4ed87c3 100644 --- a/tests/types/index.ts +++ b/tests/types/index.ts @@ -70,13 +70,13 @@ export interface FileIssue { level: string; // bucket: string; issueClass: string; - // below_threshold: boolean; linter: string; targetType: string; targetPath?: string; autofixOptions?: Autofix[]; ranges?: any[]; - issueUrl: string; + issueUrl?: string; + belowThreshold?: boolean; } /** @@ -88,6 +88,7 @@ export interface LintAction { parser: string; report: string; cacheHit?: boolean; + cacheExpiration?: string; upstream: boolean; fileGroupName: string; command: string; diff --git a/tests/utils/index.ts b/tests/utils/index.ts index ba4c26a84..7e8135752 100644 --- a/tests/utils/index.ts +++ b/tests/utils/index.ts @@ -165,7 +165,7 @@ export const getSnapshotPathForAssert = ( let closestMatchPath; for (const snapshotName of availableSnapshots) { const match = snapshotName.match(snapshotFileRegex); - if (match && match.groups) { + if (match?.groups) { const snapshotVersion = match.groups.version; const comparator = versionGreaterThanOrEqual ?? semver.gte; if ( diff --git a/tests/utils/landing_state.ts b/tests/utils/landing_state.ts index 3b9a67f4f..da433ca78 100644 --- a/tests/utils/landing_state.ts +++ b/tests/utils/landing_state.ts @@ -21,14 +21,15 @@ const normalizePlatformPath = (originalPath: string | undefined) => { return originalPath; }; -// TODO(Tyler): These extract functions are used to filter down to deterministic fields. In the future -// we should preserve the original structure and use jest matchers on the non-deterministic fields. +// These extract functions are used to filter down to deterministic fields. const extractLintActionFields = ({ actionDurationMs: _actionDurationMs, cacheHit: _cacheHit, + cacheExpiration: _cacheExpiration, paths: _paths, ...rest }: LintAction): LintAction => ({ + // trunk-ignore(eslint/@typescript-eslint/no-non-null-assertion) paths: _paths.map((originalPath) => normalizePlatformPath(originalPath)!), ...rest, }); @@ -38,6 +39,7 @@ const extractTaskFailureFields = ( { detailPath, message, ...rest }: TaskFailure, ): TaskFailure => ({ ...rest, + // trunk-ignore(eslint/@typescript-eslint/no-non-null-assertion) message: normalizePlatformPath(message)!, details: detailPath ? fs.readFileSync(path.resolve(sandboxPath, detailPath), { encoding: "utf-8" }) @@ -73,8 +75,10 @@ const normalizeMessage = (message?: string) => .replaceAll("\\", "/") .replace(/\/plugins_.{6}/gm, "/plugins_") .replace(".dup.", ".") + .replace(/NBQA-CELL-SEP.{6}/gm, "NBQA-CELL-SEP") .trim(); +// trunk-ignore(eslint/@typescript-eslint/no-non-null-assertion) const normalizeFile = (file: string) => normalizePlatformPath(file.replace(".dup.", "."))!; const normalizeRange = ({ filePath: _filePath = undefined, ...rest }) => ({ @@ -82,10 +86,14 @@ const normalizeRange = ({ filePath: _filePath = undefined, ...rest }) => ({ ...rest, }); +const normalizeIssueUrl = (issueUrl: string) => + issueUrl.replace(/markdownlint\/blob\/v[0-9.]+\//gm, "markdownlint/blob/vx.x.x/").trim(); + const normalizeIssues = ({ message: _message, targetPath: _targetPath, file: _file, + issueUrl: _issueUrl, autofixOptions: _autofixOptions = [], ranges: _ranges, ...rest @@ -97,11 +105,14 @@ const normalizeIssues = ({ }; if (_ranges) { // trunk-ignore(eslint/@typescript-eslint/no-unsafe-argument) - ret["ranges"] = _ranges.map((range) => normalizeRange(range)); + ret.ranges = _ranges.map((range) => normalizeRange(range)); } if (_autofixOptions.length > 0) { ret.autofixOptions = _autofixOptions.map(normalizeAutofix); } + if (_issueUrl) { + ret.issueUrl = normalizeIssueUrl(_issueUrl); + } return ret; }; @@ -113,13 +124,14 @@ const extractLandingStateFields = ( sandboxPath: string, { issues = [], unformattedFiles = [], lintActions = [], taskFailures = [] }: LandingState, ) => - { + ({ issues: sort(issues.map(normalizeIssues)).asc((issue) => [ issue.file, issue.line, issue.column, issue.code, issue.message, + issue.belowThreshold, ]), unformattedFiles: sort(unformattedFiles.map(normalizeIssues)).asc((issue) => [ issue.file, @@ -138,7 +150,7 @@ const extractLandingStateFields = ( taskFailures: sort( taskFailures.map((failure) => extractTaskFailureFields(sandboxPath, failure)), ).asc((failure) => [failure.name, failure.message]), - }; + }) as LandingState; /** * Extract the LandingState from an input `json`, returning a deterministic landing state diff --git a/tests/utils/trunk_config.ts b/tests/utils/trunk_config.ts index f514d76f7..5e8e98764 100644 --- a/tests/utils/trunk_config.ts +++ b/tests/utils/trunk_config.ts @@ -16,7 +16,7 @@ export const parseYaml = (filePath: string): any => { * Return the yaml result of parsing the .trunk/trunk.yaml in a specified repo root. */ export const getTrunkConfig = (repoRoot: string): any => { - const trunkYamlPath = path.resolve(repoRoot ?? "", ".trunk/trunk.yaml"); + const trunkYamlPath = path.resolve(repoRoot, ".trunk/trunk.yaml"); return parseYaml(trunkYamlPath); }; @@ -26,6 +26,6 @@ export const getTrunkConfig = (repoRoot: string): any => { */ export const getTrunkVersion = (): string => { // trunk-ignore(eslint/@typescript-eslint/no-unsafe-member-access) - const repoCliVersion = getTrunkConfig(REPO_ROOT).cli.version as string; + const repoCliVersion = getTrunkConfig(REPO_ROOT).cli.version as string | undefined; return ARGS.cliVersion ?? repoCliVersion ?? "bad-version"; }; diff --git a/tools/awscli/awscli.test.ts b/tools/awscli/awscli.test.ts index 2640735a7..7244f4fa2 100644 --- a/tools/awscli/awscli.test.ts +++ b/tools/awscli/awscli.test.ts @@ -3,11 +3,11 @@ import { skipOS } from "tests/utils"; toolTest({ toolName: "awscli", - toolVersion: "1.29.30", + toolVersion: "1.40.22", testConfigs: [ makeToolTestConfig({ command: ["aws", "--version"], - expectedOut: "aws-cli/1.29.30", + expectedOut: "aws-cli/1.40.22", }), ], // On Windows, the shim is aws.cmd, and we don't support platform-specific shims yet. diff --git a/tools/awscli/plugin.yaml b/tools/awscli/plugin.yaml index 3a5f6cd67..829a8252a 100644 --- a/tools/awscli/plugin.yaml +++ b/tools/awscli/plugin.yaml @@ -4,5 +4,5 @@ tools: - name: awscli runtime: python package: awscli - known_good_version: 1.29.30 + known_good_version: 1.40.22 shims: [aws] diff --git a/tools/dbt-cli/dbt_cli.test.ts b/tools/dbt-cli/dbt_cli.test.ts new file mode 100644 index 000000000..86fe7224a --- /dev/null +++ b/tools/dbt-cli/dbt_cli.test.ts @@ -0,0 +1,6 @@ +import { toolInstallTest } from "tests"; + +toolInstallTest({ + toolName: "dbt-cli", + toolVersion: "0.38.14", +}); diff --git a/tools/dbt-cli/plugin.yaml b/tools/dbt-cli/plugin.yaml new file mode 100644 index 000000000..a9d14650c --- /dev/null +++ b/tools/dbt-cli/plugin.yaml @@ -0,0 +1,26 @@ +version: 0.1 +downloads: + - name: dbt-cli + version: 0.38.14 + downloads: + - os: + linux: linux + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://github.com/dbt-labs/dbt-cli/releases/download/v${version}/dbt_${version}_${os}_${cpu}.tar.gz + - os: + macos: darwin + url: https://github.com/dbt-labs/dbt-cli/releases/download/v${version}/dbt_${version}_darwin_all.tar.gz + - os: + windows: windows + url: https://github.com/dbt-labs/dbt-cli/releases/download/v${version}/dbt_${version}_windows_amd64.tar.gz +tools: + definitions: + - name: dbt-cli + download: dbt-cli + known_good_version: 0.38.14 + shims: [dbt] + health_checks: + - command: dbt --version + parse_regex: dbt Cloud CLI - ${semver} diff --git a/tools/diff-so-fancy/diff_so_fancy.test.ts b/tools/diff-so-fancy/diff_so_fancy.test.ts index eafc51d19..457174c53 100644 --- a/tools/diff-so-fancy/diff_so_fancy.test.ts +++ b/tools/diff-so-fancy/diff_so_fancy.test.ts @@ -1,6 +1,34 @@ -import { toolInstallTest } from "tests"; +import { makeToolTestConfig, toolTest } from "tests"; -toolInstallTest({ +const sampleDiff = `diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml +index dc4f1f8..fb8fe54 100644 +--- a/.trunk/trunk.yaml ++++ b/.trunk/trunk.yaml +@@ -13,3 +13,6 @@ lint: + - node_modules/** + - .trunk/configs/** + - .gitattributes ++tools: ++ enabled: ++ - diff-so-fancy@1.4.3`; + +let exitCode = 25; +if (process.platform === "darwin") { + exitCode = 102; +} else if (process.platform === "win32") { + exitCode = 0; +} +// diff-so-fancy returns a nonzero exit code for its version command, so we have to +// use the custom test constructor. +toolTest({ toolName: "diff-so-fancy", toolVersion: "1.4.3", + testConfigs: [ + makeToolTestConfig({ + command: ["diff-so-fancy"], + expectedExitCode: exitCode, + expectedOut: "modified:", + stdin: sampleDiff, + }), + ], }); diff --git a/tools/difft/difft.test.ts b/tools/difft/difft.test.ts new file mode 100644 index 000000000..40e310e56 --- /dev/null +++ b/tools/difft/difft.test.ts @@ -0,0 +1,6 @@ +import { toolInstallTest } from "tests"; + +toolInstallTest({ + toolName: "difft", + toolVersion: "0.56.1", +}); diff --git a/tools/difft/plugin.yaml b/tools/difft/plugin.yaml new file mode 100644 index 000000000..ad295dc69 --- /dev/null +++ b/tools/difft/plugin.yaml @@ -0,0 +1,25 @@ +version: 0.1 +downloads: + - name: difft + downloads: + - os: + linux: unknown-linux-gnu + macos: apple-darwin + cpu: + x86_64: x86_64 + arm_64: aarch64 + url: https://github.com/Wilfred/difftastic/releases/download/${version}/difft-${cpu}-${os}.tar.gz + - os: + windows: pc-windows-msvc + cpu: + x86_64: x86_64 + url: https://github.com/Wilfred/difftastic/releases/download/${version}/difft-${cpu}-${os}.zip +tools: + definitions: + - name: difft + download: difft + known_good_version: 0.56.1 + shims: [difft] + health_checks: + - command: difft --version + parse_regex: Difftastic ${semver} diff --git a/tools/docker-credential-ecr-login/docker-credential-ecr-login.test.ts b/tools/docker-credential-ecr-login/docker-credential-ecr-login.test.ts new file mode 100644 index 000000000..5239aecb7 --- /dev/null +++ b/tools/docker-credential-ecr-login/docker-credential-ecr-login.test.ts @@ -0,0 +1,12 @@ +import { makeToolTestConfig, toolTest } from "tests"; + +toolTest({ + toolName: "docker-credential-ecr-login", + toolVersion: "0.8.0", + testConfigs: [ + makeToolTestConfig({ + command: ["docker-credential-ecr-login", "-v"], + expectedOut: "Version: 0.8.0", + }), + ], +}); diff --git a/tools/docker-credential-ecr-login/plugin.yaml b/tools/docker-credential-ecr-login/plugin.yaml new file mode 100644 index 000000000..e2fa0a70d --- /dev/null +++ b/tools/docker-credential-ecr-login/plugin.yaml @@ -0,0 +1,24 @@ +version: 0.1 +downloads: + - name: docker-credential-ecr-login + executable: true + downloads: + - os: + linux: linux + macos: darwin + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com/${version}/${os}-${cpu}/docker-credential-ecr-login + - os: + windows: windows + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com/${version}/windows-${cpu}/docker-credential-ecr-login.exe +tools: + definitions: + - name: docker-credential-ecr-login + download: docker-credential-ecr-login + known_good_version: 0.8.0 + shims: [docker-credential-ecr-login] diff --git a/tools/flyway/flyway.test.ts b/tools/flyway/flyway.test.ts new file mode 100644 index 000000000..2e2b616f5 --- /dev/null +++ b/tools/flyway/flyway.test.ts @@ -0,0 +1,12 @@ +import { makeToolTestConfig, toolTest } from "tests"; + +toolTest({ + toolName: "flyway", + toolVersion: "11.9.2", + testConfigs: [ + makeToolTestConfig({ + command: ["flyway", "--version"], + expectedOut: "Flyway OSS Edition 11.9.2 by Redgate", + }), + ], +}); diff --git a/tools/flyway/plugin.yaml b/tools/flyway/plugin.yaml new file mode 100644 index 000000000..120b367b5 --- /dev/null +++ b/tools/flyway/plugin.yaml @@ -0,0 +1,29 @@ +version: 0.1 +downloads: + - name: flyway + args: + semver: ${version}=>flyway-(?P.*) + downloads: + - os: + linux: linux + macos: macosx + cpu: + x86_64: x64 + arm_64: arm64 + url: https://github.com/flyway/flyway/releases/download/flyway-${semver}/flyway-commandline-${semver}-${os}-${cpu}.tar.gz + strip_components: 1 + - os: + windows: Windows + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://github.com/flyway/flyway/releases/download/flyway-${semver}/flyway-commandline-${semver}-windows-x64.zip + strip_components: 1 +tools: + definitions: + - name: flyway + download: flyway + known_good_version: 11.9.2 + shims: + - name: flyway + target: flyway diff --git a/tools/gk/gk.test.ts b/tools/gk/gk.test.ts index 15d0f0a1f..347cfd8a9 100644 --- a/tools/gk/gk.test.ts +++ b/tools/gk/gk.test.ts @@ -1,6 +1,8 @@ -import { toolInstallTest } from "tests"; +import { makeToolTestConfig, toolTest } from "tests"; -toolInstallTest({ +// No version command for gk +toolTest({ toolName: "gk", toolVersion: "1.2.2", + testConfigs: [makeToolTestConfig({ command: ["gk", "-h"], expectedErr: "Usage" })], }); diff --git a/tools/goreleaser/goreleaser.test.ts b/tools/goreleaser/goreleaser.test.ts new file mode 100644 index 000000000..6e6b8e8f8 --- /dev/null +++ b/tools/goreleaser/goreleaser.test.ts @@ -0,0 +1,13 @@ +import { makeToolTestConfig, toolTest } from "tests"; +import { osTimeoutMultiplier } from "tests/utils"; + +// This install is quite slow on some Linux machines. +jest.setTimeout(600000 * osTimeoutMultiplier); + +toolTest({ + toolName: "goreleaser", + toolVersion: "1.25.1", + testConfigs: [ + makeToolTestConfig({ command: ["goreleaser", "--version"], expectedOut: "goreleaser" }), + ], +}); diff --git a/tools/goreleaser/plugin.yaml b/tools/goreleaser/plugin.yaml new file mode 100644 index 000000000..1717ff9f1 --- /dev/null +++ b/tools/goreleaser/plugin.yaml @@ -0,0 +1,10 @@ +version: 0.1 +tools: + definitions: + - name: goreleaser + known_good_version: 1.25.1 + package: github.com/goreleaser/goreleaser + runtime: go + shims: + - name: goreleaser + target: goreleaser diff --git a/tools/grpcui/grpcui.test.ts b/tools/grpcui/grpcui.test.ts new file mode 100644 index 000000000..05a963dc0 --- /dev/null +++ b/tools/grpcui/grpcui.test.ts @@ -0,0 +1,6 @@ +import { toolInstallTest } from "tests"; + +toolInstallTest({ + toolName: "grpcui", + toolVersion: "1.4.1", +}); diff --git a/tools/grpcui/plugin.yaml b/tools/grpcui/plugin.yaml new file mode 100644 index 000000000..288b4c12f --- /dev/null +++ b/tools/grpcui/plugin.yaml @@ -0,0 +1,26 @@ +version: 0.1 +downloads: + - name: grpcui + downloads: + - os: + linux: linux + macos: osx + cpu: + x86_64: x86_64 + arm_64: arm64 + url: https://github.com/fullstorydev/grpcui/releases/download/v${version}/grpcui_${version}_${os}_${cpu}.tar.gz + - os: + windows: windows + cpu: + x86_64: amd64 + url: https://github.com/fullstorydev/grpcui/releases/download/v${version}/grpcui_${version}_windows_x86_64.zip +tools: + definitions: + - name: grpcui + download: grpcui + known_good_version: 1.4.1 + shims: [grpcui] + health_checks: + - command: grpcui --version + parse_regex: grpcui v${semver} + check_stderr: true diff --git a/tools/kubectl/kubectl.test.ts b/tools/kubectl/kubectl.test.ts index 136a9de56..2bcd4cc3e 100644 --- a/tools/kubectl/kubectl.test.ts +++ b/tools/kubectl/kubectl.test.ts @@ -1,16 +1,17 @@ import { makeToolTestConfig, toolTest } from "tests"; -import { skipOS } from "tests/utils"; toolTest({ toolName: "kubectl", toolVersion: "1.25.16", testConfigs: [ makeToolTestConfig({ + // --short flag will be removed in future versions command: ["kubectl", "version", "--short"], expectedOut: "Client Version: v1.25.16", // This fails on no kubectl credentials. Why do you need that for a version check? Who knows... expectedExitCode: 1, }), ], - skipTestIf: skipOS(["win32"]), + // kubectl does not run on Windows. But kubectl is frequently flaky in CI because it spins up a kubectl daemon. + skipTestIf: () => true, }); diff --git a/tools/paratest/paratest.test.ts b/tools/paratest/paratest.test.ts new file mode 100644 index 000000000..10dd9d245 --- /dev/null +++ b/tools/paratest/paratest.test.ts @@ -0,0 +1,8 @@ +import { toolInstallTest } from "tests"; +import { skipOS } from "tests/utils"; + +toolInstallTest({ + toolName: "paratest", + toolVersion: "7.6.0", + skipTestIf: skipOS(["win32"]), +}); diff --git a/tools/paratest/plugin.yaml b/tools/paratest/plugin.yaml new file mode 100644 index 000000000..5bac06460 --- /dev/null +++ b/tools/paratest/plugin.yaml @@ -0,0 +1,15 @@ +version: 0.1 +tools: + definitions: + - name: paratest + runtime: php + package: brianium/paratest + # Minimum version compatible with php@8.4 + known_good_version: 7.6.0 + shims: [paratest] + environment: + - name: PATH + list: ["${tool}/vendor/bin"] + health_checks: + - command: paratest --version + parse_regex: ParaTest v${semver} diff --git a/tools/phpunit/phpunit.test.ts b/tools/phpunit/phpunit.test.ts new file mode 100644 index 000000000..b9e94bbd0 --- /dev/null +++ b/tools/phpunit/phpunit.test.ts @@ -0,0 +1,8 @@ +import { toolInstallTest } from "tests"; +import { skipOS } from "tests/utils"; + +toolInstallTest({ + toolName: "phpunit", + toolVersion: "11.1.3", + skipTestIf: skipOS(["win32"]), +}); diff --git a/tools/phpunit/plugin.yaml b/tools/phpunit/plugin.yaml new file mode 100644 index 000000000..542a1a89a --- /dev/null +++ b/tools/phpunit/plugin.yaml @@ -0,0 +1,14 @@ +version: 0.1 +tools: + definitions: + - name: phpunit + runtime: php + package: phpunit/phpunit + known_good_version: 11.1.3 + shims: [phpunit] + environment: + - name: PATH + list: ["${tool}/vendor/bin"] + health_checks: + - command: phpunit --version + parse_regex: PHPUnit ${semver} diff --git a/tools/renovate/renovate.test.ts b/tools/renovate/renovate.test.ts index 1671964a8..f9b24e558 100644 --- a/tools/renovate/renovate.test.ts +++ b/tools/renovate/renovate.test.ts @@ -1,7 +1,7 @@ import { makeToolTestConfig, toolTest } from "tests"; import { osTimeoutMultiplier, skipOS } from "tests/utils"; -jest.setTimeout(600000 * osTimeoutMultiplier); // 300s or 900s +jest.setTimeout(600000 * osTimeoutMultiplier); toolTest({ toolName: "renovate", diff --git a/tools/sourcery/plugin.yaml b/tools/sourcery/plugin.yaml index cc305162c..963eedbb0 100644 --- a/tools/sourcery/plugin.yaml +++ b/tools/sourcery/plugin.yaml @@ -5,4 +5,4 @@ tools: runtime: python package: sourcery shims: [sourcery] - known_good_version: 1.2.0 + known_good_version: 1.37.0 diff --git a/tools/sourcery/sourcery.test.ts b/tools/sourcery/sourcery.test.ts index afaaa8a14..e66b30c72 100644 --- a/tools/sourcery/sourcery.test.ts +++ b/tools/sourcery/sourcery.test.ts @@ -1,11 +1,11 @@ import { makeToolTestConfig, toolTest } from "tests"; toolTest({ toolName: "sourcery", - toolVersion: "1.2.0", + toolVersion: "1.37.0", testConfigs: [ makeToolTestConfig({ command: ["sourcery", "--version"], - expectedOut: "1.2.0", + expectedOut: "1.37.0", }), ], }); diff --git a/tools/tofu/plugin.yaml b/tools/tofu/plugin.yaml new file mode 100644 index 000000000..beb10b9d6 --- /dev/null +++ b/tools/tofu/plugin.yaml @@ -0,0 +1,19 @@ +version: 0.1 +downloads: + - name: tofu + version: 1.6.2 + downloads: + - os: + linux: linux + macos: darwin + windows: windows + cpu: + x86_64: amd64 + arm_64: arm64 + url: https://github.com/opentofu/opentofu/releases/download/v${version}/tofu_${version}_${os}_${cpu}.zip +tools: + definitions: + - name: tofu + download: tofu + shims: [tofu] + known_good_version: 1.6.2 diff --git a/tools/tofu/tofu.test.ts b/tools/tofu/tofu.test.ts new file mode 100644 index 000000000..bacd89cca --- /dev/null +++ b/tools/tofu/tofu.test.ts @@ -0,0 +1,11 @@ +import { makeToolTestConfig, toolTest } from "tests"; +toolTest({ + toolName: "tofu", + toolVersion: "1.6.2", + testConfigs: [ + makeToolTestConfig({ + command: ["tofu", "--version"], + expectedOut: "OpenTofu v1.6.2", + }), + ], +}); diff --git a/tools/tsc/plugin.yaml b/tools/tsc/plugin.yaml index cce3dd100..1935cf23a 100644 --- a/tools/tsc/plugin.yaml +++ b/tools/tsc/plugin.yaml @@ -6,3 +6,6 @@ tools: package: typescript known_good_version: 5.2.2 shims: [tsc] + health_checks: + - command: tsc --version + parse_regex: Version ${semver} diff --git a/tools/yq/plugin.yaml b/tools/yq/plugin.yaml new file mode 100644 index 000000000..f3519367a --- /dev/null +++ b/tools/yq/plugin.yaml @@ -0,0 +1,26 @@ +version: 0.1 +downloads: + - name: yq + downloads: + - os: + linux: linux + macos: darwin + cpu: + x86_64: 386 + arm_64: arm64 + url: https://github.com/mikefarah/yq/releases/download/v${version}/yq_${os}_${cpu} + - os: + windows: windows + cpu: + x86_64: 386 + arm_64: arm64 + url: https://github.com/mikefarah/yq/releases/download/v${version}/yq_${os}_${cpu}.exe +tools: + definitions: + - name: yq + download: yq + known_good_version: 4.44.1 + shims: [yq] + health_checks: + - command: yq --version + parse_regex: version v${semver} diff --git a/tools/yq/yq.test.ts b/tools/yq/yq.test.ts new file mode 100644 index 000000000..c256e557a --- /dev/null +++ b/tools/yq/yq.test.ts @@ -0,0 +1,7 @@ +import { toolInstallTest } from "tests"; + +// The binary name varies by platform so we can't roll this into a health_check as-is. +toolInstallTest({ + toolName: "yq", + toolVersion: "4.44.1", +}); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy