name: Continuous Integration

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  Linting:
    name: Linting NodeJS
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Project
        uses: actions/checkout@v3
      - name: Add problem matchers
        run: echo "::add-matcher::.github/problemMatchers/eslint.json"
      - name: Use Node.js v16
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: yarn
          registry-url: https://registry.npmjs.org/
      - name: Install Dependencies
        run: yarn --immutable
      - name: Run ESLint
        run: yarn lint --fix=false

  Building:
    name: Building NodeJS
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Project
        uses: actions/checkout@v3
      - name: Add problem matchers
        run: echo "::add-matcher::.github/problemMatchers/tsc.json"
      - name: Use Node.js v16
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: yarn
          registry-url: https://registry.npmjs.org/
      - name: Install Dependencies
        run: yarn --immutable
      - name: Build code
        run: yarn build

  TypeChecking:
    name: Type check code with tsc
    runs-on: ubuntu-latest
    if: false # TODO: Enable this once the currently broken type checking bugs are fixed
    steps:
      - name: Checkout Project
        uses: actions/checkout@v3
      - name: Add problem matchers
        run: echo "::add-matcher::.github/problemMatchers/tsc.json"
      - name: Use Node.js v16
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: yarn
          registry-url: https://registry.npmjs.org/
      - name: Install Dependencies
        run: yarn --immutable
      - name: Typecheck code
        run: yarn typecheck

  UnitTesting:
    name: Unit Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Project
        uses: actions/checkout@v2
      - name: Use Node.js v16
        uses: actions/setup-node@1f8c6b94b26d0feae1e387ca63ccbdc44d27b561 # renovate: tag=v2
        with:
          node-version: 16
          cache: yarn
          registry-url: https://registry.npmjs.org/
      - name: Install Dependencies
        run: yarn --immutable
      - name: Run unit tests
        run: yarn test
      - name: Store code coverage report
        uses: actions/upload-artifact@v3
        with:
          name: coverage
          path: coverage/

  Upload_Coverage_Report:
    name: Upload coverage report to codecov
    needs: UnitTesting
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Project
        uses: actions/checkout@v2
        with:
          fetch-depth: 2
      - name: Download NodeJS Unit Test Coverage report
        uses: actions/download-artifact@v3
        with:
          name: coverage
          path: coverage/
      - name: Codecov Upload
        uses: codecov/codecov-action@v3.1.1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: true
