name: CodeQL (SAST) on: push: branches: [main, develop] pull_request: branches: [main, develop] schedule: # Every Sunday at 02:00 UTC — catches CVEs disclosed during the week - cron: '0 2 * * 0' permissions: contents: read security-events: write actions: read concurrency: group: codeql-${{ github.ref }} cancel-in-progress: true jobs: analyze: name: Analyze ${{ matrix.language }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: language: [javascript-typescript] steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Initialize CodeQL uses: github/codeql-action/init@9f759ee644a3e7c15c1390abf49868036c00067b # v3.38.3 with: languages: ${{ matrix.language }} # OWASP top-10 + injection + auth flaws + prototype pollution queries: security-extended,security-and-quality - name: Autobuild uses: github/codeql-action/autobuild@9f759ee644a3e7c15c1390abf49868036c00067b # v3.38.3 - name: Perform analysis uses: github/codeql-action/analyze@9f759ee644a3e7c15c1390abf49868036c00067b # v3.38.3 with: category: /language:${{ matrix.language }} # GitHub Advanced Security dashboard upload requires paid plan. # SARIF saved as a downloadable artifact instead. upload: false output: /tmp/codeql-results - name: Upload SARIF as artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 continue-on-error: true with: name: codeql-sarif-${{ matrix.language }} path: /tmp/codeql-results/*.sarif retention-days: 7