name: frontend-tests

on:
  pull_request:
    branches: [main]
    paths:
      - 'src/**'
      - 'package.json'
      - 'package-lock.json'
      - 'vitest.config.ts'
      - 'vite.config.ts'
      - 'tsconfig.json'
      - '.github/workflows/frontend-tests.yml'
      - '.github/frontend-hot-path-files.txt'
      - 'scripts/check-frontend-hot-path-coverage.sh'
      - 'scripts/check-css-import-graph.mjs'
  push:
    branches: [main]
    paths:
      - 'src/**'
      - 'package.json'
      - 'package-lock.json'
      - 'vitest.config.ts'
      - 'vite.config.ts'
      - 'tsconfig.json'
      - '.github/workflows/frontend-tests.yml'
      - '.github/frontend-hot-path-files.txt'
      - 'scripts/check-frontend-hot-path-coverage.sh'
      - 'scripts/check-css-import-graph.mjs'
  workflow_dispatch:

permissions:
  contents: read

jobs:
  test:
    name: vitest run
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v6
        with:
          node-version: 'lts/*'
          cache: 'npm'
      - run: npm ci
      - name: vitest
        run: npm test

  typecheck:
    name: tsc --noEmit
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v6
        with:
          node-version: 'lts/*'
          cache: 'npm'
      - run: npm ci
      - run: npm run prebuild:release-notes
      - name: tsc
        run: npx tsc --noEmit

  coverage:
    name: vitest --coverage (baseline + hot-path file gate)
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v6
        with:
          node-version: 'lts/*'
          cache: 'npm'
      - name: install jq
        run: sudo apt-get update && sudo apt-get install -y jq
      - run: npm ci
      - run: npm run prebuild:release-notes
      - name: vitest run --coverage
        run: npx vitest run --coverage
      - name: hot-path file coverage gate
        run: bash scripts/check-frontend-hot-path-coverage.sh
      - uses: actions/upload-artifact@v4
        with:
          name: frontend-coverage-lcov
          path: coverage/lcov.info
          if-no-files-found: error
