Skip to content

chore(release): version packages (#1287) #699

chore(release): version packages (#1287)

chore(release): version packages (#1287) #699

Workflow file for this run

name: Release - Version
on:
push:
branches: [main]
permissions:
contents: write
pull-requests: write
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
env:
NODE_VERSION: "22"
jobs:
version:
name: Version
runs-on: ubuntu-latest
# Skip version commits to avoid infinite loops
if: "!startsWith(github.event.head_commit.message, 'chore(release)')"
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v6
with:
version: 9
- uses: actions/setup-node@v7
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Auto-generate changeset if missing
run: |
# Check if there are already pending changesets
EXISTING=$(ls .changeset/*.md 2>/dev/null | grep -v README.md | head -1 || true)
if [ -n "$EXISTING" ]; then
echo "Changeset already exists, skipping auto-generation"
exit 0
fi
# Detect which packages changed in the last commit
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || echo "")
if [ -z "$CHANGED_FILES" ]; then
echo "No changed files detected"
exit 0
fi
# Map changed directories to package names
PACKAGES=""
if echo "$CHANGED_FILES" | grep -q "^packages/icons/\|^icons/\|^public/icons/\|^src/data/icons\.json"; then
PACKAGES="$PACKAGES \"@thesvg/icons\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/react/"; then
PACKAGES="$PACKAGES \"@thesvg/react\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/vue/"; then
PACKAGES="$PACKAGES \"@thesvg/vue\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/svelte/"; then
PACKAGES="$PACKAGES \"@thesvg/svelte\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/thesvg/"; then
PACKAGES="$PACKAGES \"thesvg\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/cli/"; then
PACKAGES="$PACKAGES \"@thesvg/cli\": patch"$'\n'
fi
if echo "$CHANGED_FILES" | grep -q "^packages/mcp/"; then
PACKAGES="$PACKAGES \"@thesvg/mcp-server\": patch"$'\n'
fi
# If icons changed, also bump framework packages (they re-export icons)
if echo "$CHANGED_FILES" | grep -q "^packages/icons/\|^icons/\|^public/icons/\|^src/data/icons\.json"; then
for PKG in "@thesvg/react" "@thesvg/vue" "@thesvg/svelte" "thesvg"; do
if ! echo "$PACKAGES" | grep -q "$PKG"; then
PACKAGES="$PACKAGES \"$PKG\": patch"$'\n'
fi
done
fi
if [ -z "$PACKAGES" ]; then
echo "No publishable package changes detected"
exit 0
fi
COMMIT_MSG=$(git log -1 --pretty=format:"%s")
CHANGESET_FILE=".changeset/auto-$(date +%s).md"
{
echo "---"
echo "$PACKAGES"
echo "---"
echo ""
echo "$COMMIT_MSG"
} > "$CHANGESET_FILE"
echo "Generated changeset: $CHANGESET_FILE"
cat "$CHANGESET_FILE"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# changesets/action creates a "Version Packages" PR when changesets exist.
# It does NOT publish here - publishing happens in publish.yml after PR merge.
- name: Create Version PR
uses: changesets/action@v2
with:
commit-message: "chore(release): version packages"
pr-title: "chore(release): version packages"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}