name: Publish
run-name: Publish ${{ github.ref_name }}

on:
  push:
    tags:
      - "v*.*.*"

permissions:
  contents: read
  id-token: write

jobs:
  publish:
    runs-on: ubuntu-latest
    environment: npm-publish

    steps:
      - name: Checkout
        uses: actions/checkout@v7

      - name: Setup Node
        uses: actions/setup-node@v7
        with:
          node-version: 24
          registry-url: https://registry.npmjs.org
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Verify
        run: npm run verify

      - name: Dry-run pack
        run: npm run pack:check

      - name: Check tag matches package version
        run: |
          VERSION=$(node -p "require('./package.json').version")
          TAG="${GITHUB_REF_NAME#v}"
          test "$VERSION" = "$TAG"

      - name: Publish to npm
        run: npm publish

  release:
    needs: publish
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Create GitHub release
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          REPO="${{ github.repository }}"
          if gh release view "${GITHUB_REF_NAME}" --repo "$REPO" >/dev/null 2>&1; then
            echo "Release ${GITHUB_REF_NAME} already exists; skipping."
          else
            gh release create "${GITHUB_REF_NAME}" --repo "$REPO" --generate-notes --title "${GITHUB_REF_NAME}"
          fi
