name: Continuous Integration

on:
  pull_request: {}
  push:
    branches:
      - master
  # Allow manual runs if needed.
  workflow_dispatch: {}

jobs:
  lint:
    name: Lint Code
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
          cache-dependency-path: 'package.json'

      - name: Install dependencies
        run: npm install

      - name: JSHint
        run: npm run lint

  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
          cache-dependency-path: 'package.json'

      - name: Install dependencies
        run: npm install

      - name: Build
        run: npm run dist-build

  node-tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node_version: [8, 10, 12, 14, 16, 18, 20]

    steps:
      - uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node_version }}
          cache: npm
          cache-dependency-path: 'package.json'

      - name: Install dependencies
        run: npm install

      - name: Unit Tests
        run: npm run test-node

  browser-tests:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
          cache-dependency-path: 'package.json'

      - name: Install dependencies
        run: npm install

      - name: Unit Tests
        run: npm run test-browser

  types:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
          cache-dependency-path: 'package.json'

      - name: Install dependencies
        run: npm install

      - name: Typescript Tests
        run: npm run test-types
