name: Test

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: lts/*
          cache: "npm"
      - run: yarn --frozen-lockfile
      - name: Cache eslint result
        uses: actions/cache@v4
        with:
          path: .eslintcache
          key: lint-eslint-${{ runner.os }}-node-${{ hashFiles('**/package-lock.json', '**/eslint.config.mjs') }}
          restore-keys: lint-eslint-
      - run: npm run lint
  test:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node-version: [6.x, 8.x, 10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x]
        exclude:
          - os: windows-latest
            node-version: 6.x
          - os: macos-latest
            node-version: 6.x
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/github-script@v7
        id: calculate_architecture
        with:
          result-encoding: string
          script: |
            if ('${{ matrix.os }}' === 'macos-latest' && ('${{ matrix['node-version'] }}' === '6.x' || '${{ matrix['node-version'] }}' === '8.x' || '${{ matrix['node-version'] }}' === '10.x' || '${{ matrix['node-version'] }}' === '12.x' || '${{ matrix['node-version'] }}' === '14.x')) {
              return "x64"
            } else {
              return ''
            }
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          architecture: ${{ steps.calculate_architecture.outputs.result }}
        if: matrix.node-version == '6.x'
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          architecture: ${{ steps.calculate_architecture.outputs.result }}
          cache: "npm"
        if: matrix.node-version != '6.x'
      - run: |
          sudo npm i npm@6.x
          sudo npm install --ignore-engines
          sudo npm run test:cover
        if: matrix.node-version == '6.x'
      - run: npm install --ignore-engines
        if: matrix.node-version != '6.x' && matrix.node-version == '8.x' || matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x'
      - run: npm ci
        if: matrix.node-version != '6.x' && matrix.node-version != '8.x' && matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' && matrix.node-version != '16.x'
      - run: npm run test:cover
        if: matrix.node-version != '6.x'
      - uses: codecov/codecov-action@v5
        with:
          flags: integration
          token: ${{ secrets.CODECOV_TOKEN }}
