name: Node.js

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  test:
    timeout-minutes: 10
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest]
        node-version: [18.x, 20.x, 22.x]
        package:
          - cli-hooks
          - cli-test
          - logger
          - oauth
          - rtm-api
          - socket-mode
          - types
          - web-api
          - webhook
    runs-on: ${{ matrix.os }}
    steps:
      - name: Configure git settings (Windows)
        if: matrix.os == 'windows-latest'
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf
      - uses: actions/checkout@v4
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm --version
      - run: npm install
        working-directory: packages/${{ matrix.package }}
      - name: Link dependent packages (*nix)
        if: matrix.os == 'ubuntu-latest'
        working-directory: packages/${{ matrix.package }}
        run: |
          # depending on which package we are testing, also npm link up dependent packages within this monorepo
          case "$PWD" in
            */webhook) pushd ../types && npm i && popd && npm link ../types;;
            */web-api) pushd ../types && npm i && popd && npm link ../types && pushd ../logger && npm i && popd && npm link ../logger;;
            */oauth) pushd ../logger && npm i && popd && npm link ../logger && pushd ../web-api && npm i && popd && npm link ../web-api;;
            */socket-mode) pushd ../logger && npm i && popd && npm link ../logger && pushd ../web-api && npm i && popd && npm link ../web-api;;
            *) ;; # default
          esac
      - name: Link dependent packages (Windows)
        if: matrix.os == 'windows-latest'
        working-directory: packages/${{ matrix.package }}
        run: |
          # depending on which package we are testing, also npm link up dependent packages within this monorepo
          # NOTE: the following is PowerShell
          echo "$pwd"
          switch -Wildcard ( "$pwd" )
          {
            '*\webhook'
            {
              pushd ..\types && npm i && popd && npm link ..\types
            }
            '*\web-api'
            {
              pushd ..\types && npm i && popd && npm link ..\types && pushd ..\logger && npm i && popd && npm link ..\logger
            }
            '*\oauth'
            {
              pushd ..\logger && npm i && popd && npm link ..\logger && pushd ..\web-api && npm i && popd && npm link ..\web-api
            }
            '*\socket-mode'
            {
              pushd ..\logger && npm i && popd && npm link ..\logger && pushd ..\web-api && npm i && popd && npm link ..\web-api
            }
          }
      - run: npm test
        working-directory: packages/${{ matrix.package }}
      - name: Check for coverage report existence
        id: check_coverage
        uses: andstor/file-existence-action@v3
        with:
          files: packages/${{ matrix.package }}/coverage/lcov.info
      - name: Upload code coverage
        if: matrix.node-version == '22.x' && matrix.os == 'ubuntu-latest' && steps.check_coverage.outputs.files_exists == 'true'
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          directory: packages/${{ matrix.package }}/coverage
          flags: ${{ matrix.package }}
          verbose: true