name: Publish Package on: push: tags: - "v*" workflow_dispatch: inputs: release_tag: description: Existing tag to publish (must match package.json version, e.g. v1.1.0) required: true type: string permissions: id-token: write # Required for OIDC contents: read jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: ref: ${{ inputs.release_tag && format('refs/tags/{0}', inputs.release_tag) || github.ref }} - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v6 with: node-version: "24" registry-url: "https://registry.npmjs.org" scope: "@warkypublic" cache: pnpm - name: Verify release tag env: EVENT_NAME: ${{ github.event_name }} TRIGGER_REF: ${{ github.ref }} RELEASE_TAG: ${{ inputs.release_tag }} run: | node --input-type=module <<'JS' import { readFileSync } from 'node:fs'; const { version } = JSON.parse(readFileSync('package.json', 'utf8')); const tag = process.env.EVENT_NAME === 'workflow_dispatch' ? process.env.RELEASE_TAG : process.env.TRIGGER_REF.replace(/^refs\/tags\//, ''); if (tag !== `v${version}`) { throw new Error(`Release tag must be v${version}; received ${tag || '(empty)'}`); } JS - run: pnpm install --frozen-lockfile - run: pnpm test - run: pnpm check:bundle - name: Publish to npm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | set -eu : "${NODE_AUTH_TOKEN:?Set the NPM_TOKEN Actions secret with npm publish access}" version=$(node -p "require('./package.json').version") case "$version" in *-*) dist_tag=next ;; *) dist_tag=latest ;; esac pnpm publish --no-git-checks --tag "$dist_tag"