---
name: CI

on:
  push:
    branches: [master]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [master]
  schedule:
    - cron: '0 2 * * 1' # At 02:00 on Monday

permissions: {}

jobs:
  test:
    name: Test
    timeout-minutes: 15
    strategy:
      matrix:
        os: [ubuntu-latest]
        node-version: [10, 12, 14, 16]
        include:
          - os: macos-latest
            node-version: 14 # LTS
          - os: windows-latest
            node-version: 14 # LTS
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Update NPM
        run: npm install -g npm
      - name: Bootstrap project
        if: ${{ !contains(fromJSON('[4, 6, 8]'), matrix.node-version) }}
        run: npm ci
      - name: Run tests
        run: 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 }}
          path-to-lcov: ${{ github.workspace }}/coverage/lcov.info
          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

  code-lint:
    name: Commit Lint
    runs-on: ubuntu-latest
    if: ${{ github.event.pull_request }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Use Node.js 14
        uses: actions/setup-node@v2
        with:
          node-version: 14
      - name: Bootstrap project
        run: npm ci --ignore-scripts
      - name: Verify commit linting
        run: npm run lint

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

  codeql:
    name: CodeQL
    runs-on: ubuntu-latest
    permissions:
      # See: https://github.com/github/codeql-action/blob/008b2cc71c4cf3401f45919d8eede44a65b4a322/README.md#usage
      security-events: write
    steps:
    - uses: actions/checkout@v2
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: 'javascript'
        config-file: ./.github/codeql/codeql-config.yaml
    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1
