name: CI/CD

on:
  push:
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - 'doc/**'
      - 'logo/**'
  workflow_dispatch:
  pull_request:
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - 'doc/**'
      - 'logo/**'

jobs:

  lint:
    name: Lint
    runs-on: ubuntu-22.04
    timeout-minutes: 60

    steps:
      - name: Checkout
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0

      - name: Use Node.js 22.x
        uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2
        with:
          node-version: 22.x
          registry-url: 'https://registry.npmjs.org'

      - name: Use Python 3.13
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3.13'

      - name: Install and Build
        shell: bash
        run: |
          npm ci
          ./scripts/check_git_status.sh
        env:
          NODE_OPTIONS: --max_old_space_size=4096
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.com/microsoft/vscode-ripgrep/issues/9

      - name: Lint
        run: |
          npm run lint

  build:
    name: Build and Test (${{ matrix.os }}, node-${{ matrix.node }})

    strategy:
      fail-fast: false
      matrix:
        os: [windows-2022, ubuntu-22.04, macos-14]
        node: [20.x, 22.x]

    runs-on: ${{ matrix.os }}
    timeout-minutes: 60

    steps:
      - name: Checkout
        uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0

      - name: Use Node.js ${{ matrix.node }}
        uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2
        with:
          node-version: ${{ matrix.node }}
          registry-url: 'https://registry.npmjs.org'

      - name: Use Python 3.13
        uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: '3.13'
      
      - name: Build
        shell: bash
        run: |
          npm ci
          npm run build
          git status
          ./scripts/check_git_status.sh
        env:
          NODE_OPTIONS: --max_old_space_size=4096
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.com/microsoft/vscode-ripgrep/issues/9

      - name: Download Plugins
        shell: bash
        run: |
          npm run download:plugins -- --rate-limit 3
          
      - name: Test (headless)
        if: matrix.tests != 'skip'
        shell: bash
        run: |
          npm run rebuild:browser
          npm run test:theia

      - name: Test (browser)
        if: matrix.tests != 'skip' && matrix.node == '20.x'
        run: |
          npm run test:browser

      - name: Test (electron)
        if: matrix.tests != 'skip' && runner.os == 'Linux'
        run: |
          xvfb-run -a npm run test:electron
