name: CI

on:
  push:
    branches:
    - master
  pull_request:
    branches:
    - master
  schedule:
    - cron: '0 2 * * 1' # At 02:00 on Monday

jobs:
  test:
    name: Test
    strategy:
      matrix:
        node-version: [20, 22, 24]
        os: [ubuntu-latest]
        include:
          - os: macos-latest
            node-version: 22
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
    - name: Git checkout
      uses: actions/checkout@v6
      with:
        fetch-depth: 0

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v6
      with:
        node-version: ${{ matrix.node-version }}
    - name: Bootstrap project
      run: npm ci --ignore-scripts
    - name: Run Tests
      run: npx --ignore-scripts nyc --reporter=lcov npm test --ignore-scripts
    - name: Coveralls Parallel
      uses: coverallsapp/github-action@master
      with:
        github-token: ${{ secrets.github_token }}
        flag-name: run-${{ matrix.os }}-node@${{ matrix.node-version }}
        parallel: true
    
  posttest:
    name: Post-Test
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Coveralls Finish
        uses: coverallsapp/github-action@master
        with:
          github-token: ${{ secrets.github_token }}
          parallel-finished: true

  commit-lint:
    name: Commit Lint
    runs-on: ubuntu-latest
    if: ${{ github.event.pull_request }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Use Node.js 22
        uses: actions/setup-node@v6
        with:
          node-version: 22
      - name: Bootstrap project
        run: npm ci --ignore-scripts
      - name: Verify commit linting
        run: npx --no-install commitlint --from origin/master --to HEAD --verbose

  codeql:
    name: CodeQL
    runs-on: ubuntu-latest

    permissions:
      security-events: write

    steps:
    - uses: actions/checkout@v6
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: 'javascript'
        config-file: ./.github/codeql/codeql-config.yml
    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4
