name: Node

on:
  pull_request:
  push:
    branches-ignore: "dependabot/**"

permissions:
  contents: read # to fetch code (actions/checkout)

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    name: ${{ matrix.NPM_SCRIPT }} - ${{ matrix.NAME }} (${{ matrix.NODE_VERSION }})
    strategy:
      fail-fast: false
      matrix:
        NAME: ["Node"]
        NODE_VERSION: [18.x, 20.x, 22.x, 23.x]
        NPM_SCRIPT: ["test:browserless"]
        include:
          - NAME: "Node"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "lint"
          - NAME: "Chrome/Firefox"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:browser"
          - NAME: "Chrome"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:slim"
          - NAME: "Chrome"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:no-deprecated"
          - NAME: "Chrome"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:selector-native"
          - NAME: "Chrome"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:esm"
          - NAME: "Firefox ESR (new)"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:firefox"
          - NAME: "Firefox ESR (old)"
            NODE_VERSION: "22.x"
            NPM_SCRIPT: "test:firefox"
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Use Node.js ${{ matrix.NODE_VERSION }}
        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
        with:
          node-version: ${{ matrix.NODE_VERSION }}

      - name: Cache
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock-

      - name: Set download URL for Firefox ESR (old)
        run: |
          echo "FIREFOX_SOURCE_URL=https://download.mozilla.org/?product=firefox-esr-latest-ssl&lang=en-US&os=linux64" >> "$GITHUB_ENV"
        if: contains(matrix.NAME, 'Firefox ESR (old)')

      - name: Set download URL for Firefox ESR (new)
        run: |
          echo "FIREFOX_SOURCE_URL=https://download.mozilla.org/?product=firefox-esr-next-latest-ssl&lang=en-US&os=linux64" >> "$GITHUB_ENV"
        if: contains(matrix.NAME, 'Firefox ESR (new)')

      - name: Install Firefox ESR
        run: |
          # Support: Firefox <135 only
          # Older Firefox used to be compressed using bzip2, newer using xz. Try
          # to uncompress using xz, fall back to bzip2 if that fails.
          # Note: this will download the old Firefox ESR twice, but it will still work
          # when the current ESR version starts to use xz with no changes to the code.
          wget --no-verbose "$FIREFOX_SOURCE_URL" -O - | tar -Jx -C "$HOME" || \
          wget --no-verbose "$FIREFOX_SOURCE_URL" -O - | tar -jx -C "$HOME"
          echo "PATH=${HOME}/firefox:$PATH" >> "$GITHUB_ENV"
          echo "FIREFOX_BIN=${HOME}/firefox/firefox" >> "$GITHUB_ENV"
        if: contains(matrix.NAME, 'Firefox ESR')

      - name: Install dependencies
        run: npm install

      - name: Build all for linting
        run: npm run build:all
        if: contains(matrix.NPM_SCRIPT, 'lint')

      - name: Run tests
        run: npm run ${{ matrix.NPM_SCRIPT }}

  ie:
    runs-on: windows-latest
    env:
      NODE_VERSION: 22.x
    name: test:ie - IE
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Use Node.js ${{ env.NODE_VERSION }}
        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Cache
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ env.NODE_VERSION }}-npm-lock-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-${{ env.NODE_VERSION }}-npm-lock-

      - name: Install dependencies
        run: npm install

      - name: Run tests in Edge in IE mode
        run: npm run test:ie

  safari:
    runs-on: macos-latest
    env:
      NODE_VERSION: 22.x
    name: test:safari - Safari
    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Use Node.js ${{ env.NODE_VERSION }}
        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Cache
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ env.NODE_VERSION }}-npm-lock-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-${{ env.NODE_VERSION }}-npm-lock-

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm run test:safari
