name: Build & Test & Release

on: [push]

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: '14.x'
          registry-url: 'https://registry.npmjs.org'

      - name: NPM Install
        run: npm ci

      - name: Lint files
        run: npm run lint

  test:
    name: Test
    runs-on: ubuntu-latest
    container: node:14
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: root
          POSTGRES_USER: postgres
          POSTGRES_DB: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: NPM Install
        run: npm ci

      - name: Run tests
        run: npm run test

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: '14.x'
          registry-url: 'https://registry.npmjs.org'

      - name: NPM Install
        run: npm ci

      - name: Run build
        run: npm run build

  version:
    name: Version
    needs: [test, lint, build]
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.release.outputs.tag }}
      name: ${{ steps.release.outputs.name }}
      notes: ${{ steps.release.outputs.notes }}
      channel: ${{ steps.release.outputs.channel }}
      version: ${{ steps.release.outputs.version }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: Semantic Release
        id: release
        uses: sujimoshi/semantic-release-action@v1.5.2
        with:
          noFailOnNothingToRelease: true
          branches: |
            master
            next
            next-major
            { "name": "alpha", "prerelease": true }
            { "name": "beta", "prerelease": true }
            { "name": "*/[A-Z]+-[0-9]+/*", "prerelease": "<%= name.split('/')[1] %>", "channel": "<%= name.split('/')[1] %>" }

  release:
    name: Release
    needs: [version]
    if: needs.version.outputs.version != ''
    runs-on: ubuntu-latest
    steps:
      - name: Publish Github Release
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ needs.version.outputs.tag }}
          name: ${{ needs.version.outputs.name }}
          body: ${{ needs.version.outputs.notes }}
          draft: false
          token: ${{ secrets.GITHUB_TOKEN }}
          prerelease: ${{ !!needs.version.outputs.channel }}

  publish:
    name: Publish
    needs: [version]
    if: needs.version.outputs.version != ''
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: '14.x'
          registry-url: 'https://registry.npmjs.org'

      - name: NPM Install
        run: npm ci

      - name: Build files
        run: npm run build

      - name: Publish NPM Package
        env:
          NODE_AUTH_TOKEN: ${{ secrets.SHOPMONKEY_NPM_TOKEN }}
        run: |
          npm --no-git-tag-version version '${{ needs.version.outputs.version }}'
          npm publish --tag '${{ needs.version.outputs.channel || 'latest' }}'
