name: Build and Deploy

on:
  push:
    branches:
      - master

env:
  CI: true
  NODE_VER: 14

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VER }}

      - uses: bahmutov/npm-install@v1
      - name: prettier
        run: npx prettier '**/*.{js?(on|x),ts?(x),y?(a)ml,graphql,md,css}' --check

      - name: typescript
        run: npx tsc --noEmit

  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VER }}

      - uses: bahmutov/npm-install@v1

      - name: test
        run: npm test

      - name: test buid
        run: npm run build

      - name: test built libs
        run: npm test

  deploy:
    runs-on: ubuntu-latest
    needs: [lint, test]

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VER }}

      - uses: bahmutov/npm-install@v1

      - name: setup .npmrc
        run: npm config set //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}

      - name: build
        run: npm run build

      - name: check if package is newer than the published version
        id: checkPublish
        run: echo "::set-output name=shouldPublish::`npm run -s isNewerThanPublished`"

      - name: publish release package if needed
        if: steps.checkPublish.outputs.shouldPublish == 'true'
        run: npm publish

      - name: publish canary release
        run: npm version --no-git-tag-version 0.0.0-${{ github.sha }} && npm publish --tag canary
