Repository navigation
chore(release): version packages (#1287) #699
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }} |