[Feature]: TS Type generation #465
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: Package Preview Publish | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| jobs: | |
| publish-preview: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: ".node-version" | |
| registry-url: "https://registry.npmjs.org" | |
| - name: Update npm | |
| run: npm install -g npm@latest | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: latest | |
| - name: Install dependencies | |
| run: bun install --frozen-lockfile | |
| - name: Build package | |
| run: bun run build | |
| - name: Generate preview package name and version | |
| id: preview_info | |
| run: | | |
| PR_NUMBER="${{ github.event.number }}" | |
| COMMIT_HASH="${{ github.sha }}" | |
| SHORT_COMMIT="${COMMIT_HASH:0:7}" | |
| # Get current version from package.json | |
| BASE_VERSION=$(node -p "require('./package.json').version") | |
| if [ ! -z "$PR_NUMBER" ]; then | |
| # Format: 0.0.1-pr.123.abc1234 (valid semver prerelease) | |
| PREVIEW_VERSION="$BASE_VERSION-pr.$PR_NUMBER.$SHORT_COMMIT" | |
| else | |
| # Format: 0.0.1-dev.abc1234 (valid semver prerelease) | |
| PREVIEW_VERSION="$BASE_VERSION-dev.$SHORT_COMMIT" | |
| fi | |
| echo "version=$PREVIEW_VERSION" >> $GITHUB_OUTPUT | |
| echo "package_name=@base44-preview/cli" >> $GITHUB_OUTPUT | |
| echo "full_package=@base44-preview/cli@$PREVIEW_VERSION" >> $GITHUB_OUTPUT | |
| - name: Update package.json for preview | |
| run: | | |
| # Create a backup of original package.json | |
| cp package.json package.json.bak | |
| # Get the official package name for safety checks | |
| OFFICIAL_PACKAGE=$(node -p "require('./package.json').name") | |
| PREVIEW_PACKAGE="${{ steps.preview_info.outputs.package_name }}" | |
| echo "Official package: $OFFICIAL_PACKAGE" | |
| echo "Preview package: $PREVIEW_PACKAGE" | |
| # Safety check: Ensure we're not accidentally using the official package name | |
| if [ "$PREVIEW_PACKAGE" = "$OFFICIAL_PACKAGE" ]; then | |
| echo "❌ ERROR: Preview package name matches official package name!" | |
| echo "This would overwrite the official package. Aborting." | |
| exit 1 | |
| fi | |
| # Update name with error handling | |
| if ! npm pkg set name="$PREVIEW_PACKAGE"; then | |
| echo "❌ ERROR: Failed to set package name to $PREVIEW_PACKAGE" | |
| exit 1 | |
| fi | |
| # Update version with error handling | |
| if ! npm pkg set version="${{ steps.preview_info.outputs.version }}"; then | |
| echo "❌ ERROR: Failed to set package version to ${{ steps.preview_info.outputs.version }}" | |
| exit 1 | |
| fi | |
| echo "✅ Package.json updated successfully" | |
| - name: Final safety check before publish | |
| run: | | |
| # Double-check package name one more time before publishing | |
| CURRENT_PACKAGE_NAME=$(node -p "require('./package.json').name") | |
| OFFICIAL_PACKAGE=$(jq -r '.name' package.json.bak) | |
| echo "About to publish: $CURRENT_PACKAGE_NAME" | |
| if [ "$CURRENT_PACKAGE_NAME" = "$OFFICIAL_PACKAGE" ]; then | |
| echo "❌ CRITICAL ERROR: About to publish to official package name!" | |
| echo "This is not allowed. Check the workflow configuration." | |
| exit 1 | |
| fi | |
| echo "✅ Safety check passed. Package name is safe to publish." | |
| - name: Publish preview package | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| run: | | |
| if npm publish --tag preview; then | |
| echo "✅ Package published successfully" | |
| else | |
| echo "❌ Package publish failed" | |
| exit 1 | |
| fi | |
| - name: Restore original package.json | |
| if: always() | |
| run: | | |
| if [ -f package.json.bak ]; then | |
| mv package.json.bak package.json | |
| echo "✅ Original package.json restored" | |
| else | |
| echo "❌ WARNING: Backup file package.json.bak not found" | |
| echo "This could indicate an earlier step failed" | |
| fi | |
| - name: Comment PR with install instructions | |
| uses: actions/github-script@v6 | |
| with: | |
| script: | | |
| const fullPackage = '${{ steps.preview_info.outputs.full_package }}'; | |
| const installCmd = `npm i ${fullPackage}`; | |
| const aliasInstallCmd = `npm i "base44@npm:${fullPackage}"`; | |
| const body = `### 🚀 Package Preview Available! | |
| --- | |
| **Install this PR's preview build with npm:** | |
| \`\`\`sh | |
| ${installCmd} | |
| \`\`\` | |
| **Prefer not to change any import paths? Install using npm alias so your code still imports \`base44\`:** | |
| \`\`\`sh | |
| ${aliasInstallCmd} | |
| \`\`\` | |
| Or add it to your \`package.json\` dependencies: | |
| \`\`\`json | |
| { | |
| "dependencies": { | |
| "base44": "npm:${fullPackage}" | |
| } | |
| } | |
| \`\`\` | |
| - 📦 **Preview Package**: \`${fullPackage}\` | |
| - 🔗 [View this commit on GitHub](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) | |
| --- | |
| <sub>Preview published to npm registry — try new features instantly!</sub>`; | |
| const botCommentIdentifier = '### 🚀 Package Preview Available!'; | |
| async function findBotComment(issueNumber) { | |
| if (!issueNumber) return null; | |
| const comments = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issueNumber, | |
| }); | |
| return comments.data.find((comment) => | |
| comment.body.includes(botCommentIdentifier) | |
| ); | |
| } | |
| async function createOrUpdateComment(issueNumber) { | |
| if (!issueNumber) { | |
| console.log('No issue number provided. Cannot post or update comment.'); | |
| return; | |
| } | |
| const existingComment = await findBotComment(issueNumber); | |
| if (existingComment) { | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: existingComment.id, | |
| body: body, | |
| }); | |
| } else { | |
| await github.rest.issues.createComment({ | |
| issue_number: issueNumber, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: body, | |
| }); | |
| } | |
| } | |
| if (context.eventName === 'pull_request') { | |
| if (context.issue.number) { | |
| await createOrUpdateComment(context.issue.number); | |
| } | |
| } | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| id-token: write |