name: Release

on:
  push:
    branches: [master]

jobs:
  check-release-tag:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Prepare tag
        id: prepare_tag
        continue-on-error: true
        run: |
          export TAG=v$(jq -r '.version' package.json)
          echo "TAG=$TAG" >> $GITHUB_ENV

          export CHECK_TAG=$(git tag | grep $TAG)
          if [[ $CHECK_TAG ]]; then
            echo "Skipping because release tag already exists"
            exit 1
          fi
      - name: Output
        id: release_output
        if: ${{ steps.prepare_tag.outcome == 'success' }}
        run: |
          echo "tag=${{ env.TAG }}" >> $GITHUB_OUTPUT
    outputs:
      tag: ${{ steps.release_output.outputs.tag }}

  create-github-release:
    runs-on: ubuntu-latest
    needs: check-release-tag
    if: ${{ needs.check-release-tag.outputs.tag }}
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - name: Prepare tag
        run: |
          export TAG=v$(jq -r '.version' package.json)
          echo "TAG=$TAG" >> $GITHUB_ENV
      - name: Setup git
        run: |
          git config user.email "pusher-ci@pusher.com"
          git config user.name "Pusher CI"
      - name: Prepare description
        run: |
          csplit -s CHANGELOG.md "/##/" {1}
          cat xx01 > CHANGELOG.tmp
      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ env.TAG }}
          name: ${{ env.TAG }}
          body_path: CHANGELOG.tmp
          draft: false
          prerelease: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  publish-to-npm:
    runs-on: ubuntu-latest
    needs: create-github-release
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          registry-url: "https://registry.npmjs.org"
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
