name: CI
on:
  push:
    branches: [main]
  pull_request:
permissions:
  contents: read # to fetch code (actions/checkout)

env:
  # We only install Chromium manually
  PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1'

jobs:
  Tests:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 15
    strategy:
      matrix:
        include:
          - node-version: 18
            os: windows-latest
          - node-version: 18
            os: macOS-latest
          - node-version: 18
            os: ubuntu-latest
          - node-version: 20
            os: ubuntu-latest
          - node-version: 22
            os: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm playwright install chromium
      - run: pnpm test
        env:
          CI: true
  Lint:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: pnpm
      - name: install
        run: pnpm install --frozen-lockfile
      - name: type check
        run: pnpm check
      - name: lint
        if: (${{ success() }} || ${{ failure() }}) # ensures this step runs even if previous steps fail (avoids multiple runs uncovering different issues at different steps)
        run: pnpm lint
      - name: build and check generated types
        if: (${{ success() }} || ${{ failure() }}) # ensures this step runs even if previous steps fail
        run: pnpm build && { [ "`git status --porcelain=v1`" == "" ] || (echo "Generated types have changed — please regenerate types locally and commit the changes after you have reviewed them"; git diff; exit 1); }
  Benchmarks:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: pnpm
      - run: pnpm install --frozen-lockfile
      - run: pnpm bench
        env:
          CI: true