name: CI

on:
  workflow_dispatch:
  push:
    branches:
      - main
      - '[0-9]+.x'
    tags:
      - '*'
    paths-ignore:
      - 'docs/**'
      - '*.md'
  pull_request:
    paths-ignore:
      - 'docs/**'
      - '*.md'

jobs:
  test:
    name: Node ${{ matrix.node_version }} - On ${{ matrix.os }}
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ ubuntu-latest, windows-latest, macos-latest ]

    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Use Node
        id: setup-node
        uses: actions/setup-node@v6.0.0
        with:
          node-version: 16.x
          cache: 'npm'

      - uses: actions/cache@v4
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Deps
        run: |
          npm ci

      - name: Lint
        run: |
          npm run lint
          npm run format:check

      - name: Test
        run: |
          npm run test:ci

      - name: Coverage
        if: matrix.os == 'ubuntu-latest'
        uses: codecov/codecov-action@v5
        timeout-minutes: 5
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          verbose: true
          files: ./coverage/coverage-final.json
          fail_ci_if_error: false

  release:
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/v')
    needs:
      - test
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Use Node
        id: setup-node
        uses: actions/setup-node@v6.0.0
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        with:
          node-version: 16.x
          registry-url: 'https://registry.npmjs.org'

      - uses: actions/cache@v4
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Deps
        run: |
          npm ci

      - name: Publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: |
          npm publish --access public

      - name: Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body_path: CHANGELOG.md
          draft: false
          prerelease: contains(github.ref, '-')


  automerge:
    needs:
      - test
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: write
    steps:
      - uses: fastify/github-action-merge-dependabot@v3.11.2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
