name: CI

on:
  push:
    branches: [master, next]
  pull_request:

permissions:
  contents: read

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        node-version: [20]
        runner: [ubuntu-latest, windows-latest]

    runs-on: ${{ matrix.runner }}
    timeout-minutes: 15

    steps:
      - uses: actions/checkout@v3
      - uses: pnpm/action-setup@v3
        with:
          version: ^9.5.0

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'pnpm'

      # Cargo already skips downloading dependencies if they already exist
      - name: Cache cargo
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      # Cache the `oxide` Rust build
      - name: Cache oxide build
        uses: actions/cache@v3
        with:
          path: |
            ./target/
            ./crates/node/*.node
            ./crates/node/index.js
            ./crates/node/index.d.ts
          key: ${{ runner.os }}-oxide-${{ hashFiles('./crates/**/*') }}

      - name: Install dependencies
        run: pnpm install

      - name: Build
        run: pnpm run build

      - name: Lint
        run: pnpm run lint
        # Only lint on linux to avoid \r\n line ending errors
        if: matrix.runner == 'ubuntu-latest'

      - name: Test
        run: pnpm run test

      - name: Integration Tests
        run: pnpm run test:integrations

      - name: Install Playwright Browsers
        run: npx playwright install --with-deps

      - name: Run Playwright tests
        run: npm run test:ui

      - uses: actions/upload-artifact@v3
        if: always()
        with:
          name: playwright-report
          path: packages/tailwindcss/playwright-report/
          retention-days: 30