# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud-libraries/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: Publish

on:
  release:
    types: [published]

permissions:
  id-token: write  # Required for OIDC
  contents: read

jobs:
  publish:
    runs-on: ubuntu-latest
    name: Build and publish to npm
    environment: npm-publish

    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          persist-credentials: false

      - name: Read package.json
        uses: nextcloud-libraries/parse-package-engines-action@122ae05d4257008180a514e1ddeb0c1b9d094bdd # v0.1.0
        id: versions

      - name: Set up node
        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
        with:
          node-version: ${{ steps.versions.outputs.node-version }}
          registry-url: https://registry.npmjs.org

      - name: Set up npm
        run: npm i -g 'npm@${{ steps.versions.outputs.package-manager-version }}'

      - name: Check tag matches package.json
        run: |
          VERSION=$(node -p -e "require('./package.json').version")
          GH_VERSION=$(echo "$GH_VERSION" | sed s,\^v,,)
          if [ "$VERSION" != "$GH_VERSION" ]; then
            echo "$VERSION does not match $GH_VERSION"
            exit 1;
          fi;
        env:
          GH_VERSION: ${{ github.event.release.tag_name }}

      - name: Install dependencies & build
        env:
          CYPRESS_INSTALL_BINARY: 0
        run: |
          npm ci --ignore-scripts
          npm run build --if-present

      - name: Fetch latest tag
        id: latest-tag
        run: |
          TAG=$(gh release list \
            --exclude-drafts \
            --exclude-pre-releases \
            --json isLatest,tagName \
            --jq 'map(select(.isLatest == true))[].tagName' \
            -R ${{ github.repository }})
          echo "Latest tag is $TAG"
          echo "LATEST_TAG=$TAG" >> $GITHUB_OUTPUT
        env:
          GH_TOKEN: ${{ github.token }}

      - name: Publish
        run: |
          npm publish --tag $RELEASE_GROUP
        env:
          RELEASE_GROUP: ${{ (contains(github.ref, 'rc') || contains(github.ref, 'beta') || contains(github.ref, 'alpha')) && 'next' || ((steps.latest-tag.outputs.LATEST_TAG != github.event.release.tag_name) && 'stable' || 'latest') }}
