name: Publish VS Code Extension on: workflow_dispatch: inputs: version: description: Extension version to publish, for example 0.1.0. Leave empty to use package.json or the pushed tag. required: false type: string publish_to_marketplace: description: Publish to the Visual Studio Marketplace after packaging. required: true type: boolean default: true push: tags: - 'gframework-config-tool-v*' permissions: contents: read jobs: publish: name: Package And Publish Marketplace Extension runs-on: ubuntu-latest defaults: run: working-directory: tools/vscode-config-extension steps: - name: Checkout repository uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js 20 uses: actions/setup-node@v5 with: node-version: 20 - name: Setup Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.2.15 - name: Determine extension version id: version shell: bash run: | set -euo pipefail PACKAGE_VERSION=$(node -p "require('./package.json').version") VERSION="${PACKAGE_VERSION}" if [[ "${GITHUB_REF:-}" == refs/tags/gframework-config-tool-v* ]]; then VERSION="${GITHUB_REF#refs/tags/gframework-config-tool-v}" elif [[ -n "${{ inputs.version || '' }}" ]]; then VERSION="${{ inputs.version }}" fi echo "Resolved extension version: ${VERSION}" echo "version=${VERSION}" >> "${GITHUB_OUTPUT}" - name: Install extension dependencies run: bun install - name: Synchronize package.json version shell: bash run: | set -euo pipefail node -e "const fs=require('fs'); const path='package.json'; const data=JSON.parse(fs.readFileSync(path,'utf8')); data.version='${{ steps.version.outputs.version }}'; fs.writeFileSync(path, JSON.stringify(data, null, 2) + '\n');" - name: Run extension tests run: bun run test - name: Package VSIX run: | set -euo pipefail mkdir -p ../../artifacts bun run package:vsix -- --out "../../artifacts/gframework-config-tool-${{ steps.version.outputs.version }}.vsix" - name: Upload VSIX artifact uses: actions/upload-artifact@v7 with: name: gframework-config-tool-vsix path: artifacts/gframework-config-tool-${{ steps.version.outputs.version }}.vsix if-no-files-found: error - name: Publish to Visual Studio Marketplace if: github.event_name == 'push' || inputs.publish_to_marketplace env: VSCE_PAT: ${{ secrets.VSCE_PAT }} run: bun run publish:marketplace