.PHONY: help release-beta release-patch release-minor release-major _release release-tag release-dry-run
NOSIGN := GIT_CONFIG_COUNT=2 \
GIT_CONFIG_KEY_0=tag.gpgsign GIT_CONFIG_VALUE_0=false \
GIT_CONFIG_KEY_1=commit.gpgsign GIT_CONFIG_VALUE_1=false
PREID := beta
help: ## Show available targets
@grep -E '^[a-zA-Z_-]+:.*?
release-beta: ## Step 1: open a PR bumping to the next -beta.N
@$(MAKE) --no-print-directory _release BUMP=prerelease
release-patch: ## Step 1: open a PR bumping to the next patch (x.y.z-beta.0)
@$(MAKE) --no-print-directory _release BUMP=prepatch
release-minor: ## Step 1: open a PR bumping to the next minor (x.y+1.0-beta.0)
@$(MAKE) --no-print-directory _release BUMP=preminor
release-major: ## Step 1: open a PR bumping to the next major (x+1.0.0-beta.0)
@$(MAKE) --no-print-directory _release BUMP=premajor
_release:
@set -e; \
if [ -n "$$(git status --porcelain)" ]; then echo "working tree not clean — commit or stash first"; exit 1; fi; \
git checkout main; git pull --ff-only; \
npm version --no-git-tag-version $(BUMP) --preid=$(PREID); \
VERSION=$$(node -p "require('./package.json').version"); \
git checkout -b "release/v$$VERSION"; \
$(NOSIGN) git commit -am "chore(release): v$$VERSION"; \
git push -u origin "release/v$$VERSION"; \
gh pr create --base main --head "release/v$$VERSION" \
--title "chore(release): v$$VERSION" \
--body "Version bump to \`v$$VERSION\`. Merge, then run \`make release-tag\` to publish."; \
echo "PR opened. After it merges: make release-tag"
release-tag: ## Step 2: after the release PR merges, tag main to publish
@set -e; \
git checkout main; git pull --ff-only; \
VERSION=$$(node -p "require('./package.json').version"); \
echo "Tagging v$$VERSION on main and pushing (fires the release workflow)…"; \
$(NOSIGN) git tag "v$$VERSION"; \
git push origin "v$$VERSION"
release-dry-run: ## Build and preview npm tarball (no publish, no tag)
rm -rf dist
npm run build
npm publish --dry-run