name: Lint

on:
  push:
  merge_group:
  pull_request:
  workflow_dispatch:

concurrency: ${{ github.workflow }}-${{ github.ref }}

permissions:
  contents: write

jobs:
  docker-lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0
        with:
          verbose: true
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
        # uses version from "packageManager" field in package.json

      - name: Setup Node.js
        uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
        with:
          cache: pnpm
          node-version-file: '.node-version'

      - name: Install Packages
        run: |
          pnpm install --frozen-lockfile
        env:
          CYPRESS_CACHE_FOLDER: .cache/Cypress

      - name: Run Linting
        shell: bash
        run: |
          if ! pnpm run lint; then
              # print a nice error message on lint failure
              ERROR_MESSAGE='Running `pnpm run lint` failed.'
              ERROR_MESSAGE+=' Running `pnpm -w run lint:fix` may fix this issue. '
              ERROR_MESSAGE+=" If this error doesn't occur on your local machine,"
              ERROR_MESSAGE+=' make sure your packages are up-to-date by running `pnpm install`.'
              ERROR_MESSAGE+=' You may also need to delete your prettier cache by running'
              ERROR_MESSAGE+=' `rm ./node_modules/.cache/prettier/.prettier-cache`.'
              echo "::error title=Lint failure::${ERROR_MESSAGE}"
              # make sure to return an error exitcode so that GitHub actions shows a red-cross
              exit 1
          fi

      - name: Verify `./src/config.type.ts` is in sync with `./src/schemas/config.schema.yaml`
        shell: bash
        run: |
          if ! pnpm run --filter mermaid types:verify-config; then
            ERROR_MESSAGE='Running `pnpm run --filter mermaid types:verify-config` failed.'
            ERROR_MESSAGE+=' This should be fixed by running'
            ERROR_MESSAGE+=' `pnpm run --filter mermaid types:build-config`'
            ERROR_MESSAGE+=' on your local machine.'
            echo "::error title=Lint failure::${ERROR_MESSAGE}"
            # make sure to return an error exitcode so that GitHub actions shows a red-cross
            exit 1
          fi

      - name: Verify no circular dependencies
        working-directory: ./packages/mermaid
        shell: bash
        run: |
          if ! pnpm run --filter mermaid checkCircle; then
            ERROR_MESSAGE='Circular dependency detected.'
            ERROR_MESSAGE+=' This should be fixed by removing the circular dependency.'
            ERROR_MESSAGE+=' Run `pnpm run --filter mermaid checkCircle` on your local machine'
            ERROR_MESSAGE+=' to see the circular dependency.'
            echo "::error title=Lint failure::${ERROR_MESSAGE}"
            # make sure to return an error exitcode so that GitHub actions shows a red-cross
            exit 1
          fi

      - name: Verify Docs
        id: verifyDocs
        working-directory: ./packages/mermaid
        continue-on-error: ${{ github.event_name == 'push' }}
        run: pnpm run docs:verify

      - uses: testomatio/check-tests@0ea638fcec1820cf2e7b9854fdbdd04128a55bd4 # stable
        with:
          framework: cypress
          tests: './cypress/e2e/**/**.spec.js'
          token: ${{ secrets.GITHUB_TOKEN }}
          has-tests-label: true
