name: Security

on:
  pull_request:
  schedule:
    - cron: '0 3 * * *' # 3 AM UTC every day
  workflow_dispatch:

permissions:
  contents: read
  pull-requests: read
  security-events: write

concurrency:
  group: security-${{ github.event.pull_request.head.label || github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  codeql:
    name: CodeQL (${{ matrix.language }})
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
    strategy:
      fail-fast: false
      matrix:
        language: ['javascript']
    steps:
      - name: Checkout repository
        uses: actions/checkout@v7

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          queries: security-extended

      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: security/maintainer-only
          upload: always

  secrets:
    name: Secret scan (betterleaks)
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v7
        with:
          fetch-depth: 0

      - name: betterleaks
        uses: docker://ghcr.io/betterleaks/betterleaks:latest
        with:
          args: >-
            dir .
            --redact=100
            --no-banner
            --report-format=sarif
            --report-path=betterleaks.sarif

      - name: Upload betterleaks SARIF
        if: always()
        uses: github/codeql-action/upload-sarif@v4
        with:
          sarif_file: betterleaks.sarif
          category: security/maintainer-only
