name: Build

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

jobs:
  build:
    name: Unit Tests

    strategy:
      matrix:
        node-version:
          - 16.x
          - 18.x
        os:
          - ubuntu-latest
          - windows-latest
          - macOS-latest

    runs-on: ${{ matrix.os }}

    steps:
      - name: git checkout
        uses: actions/checkout@v4

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

      - run: npm ci
      - run: npm run build --if-present
      - run: npm test

      - name: Calculate code coverage
        run: npm run coverage

      - name: Coveralls
        uses: coverallsapp/github-action@master
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          flag-name: ${{ matrix.os }}
          parallel: true

  notify:
    needs:
      - build

    name: Code Coverage
    if: ${{ success() }}
    runs-on: ubuntu-latest

    steps:
      - name: Coveralls Finished
        uses: coverallsapp/github-action@master
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          parallel-finished: true

  publish:
    needs:
      - build
      - notify

    name: Publish to npm
    if: ${{ success() && github.event_name == 'push' && github.repository_owner == 'accordproject' }}
    runs-on: ubuntu-latest

    outputs:
      job-status: ${{ job.status }}

    steps:
      - name: git checkout
        uses: actions/checkout@v4

      - name: Use Node.js 18.x
        uses: actions/setup-node@v4
        with:
          node-version: 18.x

      - run: npm ci
      - run: npm run build --if-present

      - name: timestamp
        id: timestamp
        run: |
          node ./scripts/timestamp.js

      - name: build and publish
        run: |
          npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
          npm version --no-git-tag-version --yes --exact ${{ steps.timestamp.outputs.stamp }}
          npm publish --access public --tag=unstable 2>&1
