name: CI

on:
  pull_request:
    paths:
      - "**.go"
      - "go.mod"
      - "go.sum"
      - "**.js"
      - "**.mjs"
      - "**.cjs"
      - "**.ts"
      - "**.html"
      - "**.css"
      - "frontend/package.json"
      - "frontend/package-lock.json"
      - ".nvmrc"
  push:
    branches:
      - main
    paths:
      - "**.go"
      - "go.mod"
      - "go.sum"
      - "**.js"
      - "**.mjs"
      - "**.cjs"
      - "**.ts"
      - "**.html"
      - "**.css"
      - "frontend/package.json"
      - "frontend/package-lock.json"
      - ".nvmrc"

permissions:
  contents: read

jobs:
  go-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version-file: go.mod
          cache: true
      - name: Stub web/dist for go:embed
        run: mkdir -p web/dist && touch web/dist/.gitkeep
      - name: Test
        run: |
          go list ./... | grep -v '/frontend/node_modules/' > /tmp/go-packages.txt
          go test $(cat /tmp/go-packages.txt)

  govulncheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version-file: go.mod
          cache: true
      - name: Stub web/dist for go:embed
        run: mkdir -p web/dist && touch web/dist/.gitkeep
      - name: Install govulncheck
        run: go install golang.org/x/vuln/cmd/govulncheck@latest
      - name: Run govulncheck
        run: govulncheck ./...

  frontend:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version-file: .nvmrc
          cache: npm
          cache-dependency-path: frontend/package-lock.json
      - name: Install
        run: npm ci
        working-directory: frontend
      - name: Lint
        run: npm run lint
        working-directory: frontend
      - name: Build
        run: npm run build
        working-directory: frontend
      - name: Audit
        run: npm audit --audit-level=high
        working-directory: frontend
