name: Code Review - TypeScript

on:
  pull_request:
    branches: ['main', 'dev']
    paths: ['ts/**', 'yarn.lock']
  push:
    paths: ['ts/**', 'yarn.lock']

jobs:
  format:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '16'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Format
        run: yarn format

  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '16'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Lint
        run: yarn lint

  depcheck:
    name: Dependency check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '16'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Duplicates check
        run: yarn deduplicate

  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '16'
          cache: 'yarn'

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Run Test
        run: yarn test

  sast:
    name: Security Scan
    runs-on: ubuntu-latest
    container:
      image: returntocorp/semgrep

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Run semgrep
        run: semgrep ci --sarif --output=semgrep-results.sarif
        env:
          SEMGREP_RULES: p/typescript

      - name: Upload output
        uses: github/codeql-action/upload-sarif@v2
        if: always()
        with:
          sarif_file: semgrep-results.sarif

  sca:
    name: Dependency Scan
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      # Report all vulnerabilities in security tab
      - name: Report on all vulnerabilities
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: 'fs'
          scan-ref: 'yarn.lock'
          ignore-unfixed: true
          hide-progress: true
          format: 'sarif'
          output: 'trivy-results.sarif'

      # Fail the job on critical vulnerabiliies with fix available
      - name: Fail on critical vulnerabilities
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: 'fs'
          scan-ref: 'yarn.lock'
          ignore-unfixed: true
          hide-progress: true
          format: 'table'
          severity: 'CRITICAL'
          exit-code: '1'

      - name: Upload output
        uses: github/codeql-action/upload-sarif@v2
        if: always()
        with:
          sarif_file: 'trivy-results.sarif'

  yarn-pass:
    name: Yarn tests pass
    needs: ['format', 'lint', 'test']
    runs-on: ubuntu-latest
    steps:
      - run: echo ok

  security-pass:
    name: Security tests pass
    needs: ['sca', 'sast']
    runs-on: ubuntu-latest
    steps:
      - run: echo ok

  all-pass:
    name: All tests pass 🚀
    needs: ['yarn-pass', 'security-pass']
    runs-on: ubuntu-latest
    steps:
      - run: echo ok
