name: Verify Source
on: [pull_request, push]

jobs:
  build:
    name: Build package
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Use Node.js 20.x
        uses: actions/setup-node@v3
        with:
          node-version: 20.x
      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      - name: Install dependencies
        run: npm i
      - name: Build NodeJS package
        run: npm run build
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Use Node.js 20.x
        uses: actions/setup-node@v3
        with:
          node-version: 20.x
      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      - name: Install dependencies
        run: npm i
      - name: Run linter
        run: npm run lint
        env:
          # Authorise GitHub API requests for editorconfig-checker
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Detect changed documentation files
        uses: dorny/paths-filter@v2
        id: changes
        with:
          list-files: shell
          filters: |
            docs:
              - '*.md'
              - '.github/**.md'
      - name: Check documentation links
        if: steps.changes.outputs.docs == 'true'
        run: |
          npx markdown-link-check --retry \
            --config .github/markdown-link-check.json \
            ${{ steps.changes.outputs.docs_files }}
        continue-on-error: ${{ github.ref == 'refs/heads/develop' }}
      - name: Verify file permissions
        run: |
          CHECK_DIRS="icons/ _data/"
          echo "Searching the following directories for executable files:"
          echo "${CHECK_DIRS}"
          echo ""
          EXE_FILES=$(find ${CHECK_DIRS} -type f -executable)
          if test -n "${EXE_FILES-}"
          then
            echo "Some files were detected to have their executable bit set."
            echo "To fix this, you can use 'chmod -x PATH/TO/FILE' on the following files:"
            echo ""
            echo "${EXE_FILES}"
            exit 1
          else
            echo "All clear."
            exit 0
          fi
  test:
    name: Test package
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Use Node.js 20.x
        uses: actions/setup-node@v3
        with:
          node-version: 20.x
      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      - name: Install dependencies
        run: npm i
      - name: Run tests
        run: npm run test