Publish to JSR & NPM #29
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: Publish to Cargo, JSR, & NPM | |
| on: | |
| push: | |
| tags: | |
| - "v*" | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: "Version to publish (e.g. v1.2.3). Used when manually dispatching." | |
| required: false | |
| type: string | |
| permissions: write-all | |
| jobs: | |
| codegen: | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Show files exist | |
| run: | | |
| set -euxo pipefail | |
| ls -la packages/ts || true | |
| ls -la packages/rust || true | |
| cat packages/ts/deno.json | |
| cat packages/ts/package.json | |
| cat packages/rust/Cargo.toml | |
| - name: Determine VERSION | |
| run: | | |
| set -euo pipefail | |
| if [ "${{ github.ref_type }}" = "tag" ]; then | |
| VERSION="${{ github.ref_name }}" | |
| elif [ -n "${{ inputs.version || '' }}" ]; then | |
| VERSION="${{ inputs.version }}" | |
| else | |
| echo "No tag ref and no 'version' input. Provide a tag (push a tag) or pass inputs.version." >&2 | |
| exit 1 | |
| fi | |
| # If you don't want the leading 'v' inside files, strip it: | |
| STRIPPED="${VERSION#v}" | |
| echo "VERSION=$STRIPPED" >> "$GITHUB_ENV" | |
| echo "Resolved VERSION=$STRIPPED" | |
| - name: Set Package Versions to current tag | |
| run: | | |
| set -euxo pipefail | |
| for f in \ | |
| packages/ts/deno.json \ | |
| packages/ts/package.json \ | |
| packages/rust/Cargo.toml | |
| do | |
| test -f "$f" || { echo "Missing $f" >&2; exit 1; } | |
| # replace __PACKAGE_VERSION__ with env VERSION | |
| sed -i "s/__PACKAGE_VERSION__/${VERSION//\//-}/g" "$f" | |
| done | |
| - name: Setup Buf | |
| uses: bufbuild/buf-setup-action@main | |
| with: | |
| github_token: ${{ github.token }} | |
| - name: Generate code | |
| run: buf generate | |
| - name: Copy license & README | |
| run: | | |
| cp LICENSE packages/ts | |
| cp LICENSE packages/rust | |
| cp README.md packages/ts | |
| cp README.md packages/rust | |
| - name: Upload Rust code | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: rust_code | |
| path: packages/rust | |
| - name: Upload TypeScript code | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ts_code | |
| path: packages/ts | |
| - name: Push to schema registry | |
| env: | |
| BUF_TOKEN: ${{ secrets.BUF_TOKEN }} | |
| run: | | |
| buf push --tag ${{ github.ref_name }} | |
| publish-jsr: | |
| runs-on: ubuntu-24.04 | |
| needs: codegen | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - name: Download TypeScript code | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ts_code | |
| - name: Remove package.json (JSR doesn’t need it) | |
| run: rm -f package.json | |
| - name: Set up Deno | |
| uses: denoland/setup-deno@main | |
| with: | |
| deno-version: rc | |
| - name: Publish to JSR | |
| run: deno publish --unstable-sloppy-imports | |
| publish-cargo: | |
| runs-on: ubuntu-24.04 | |
| needs: codegen | |
| steps: | |
| - name: Download Rust code | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: rust_code | |
| - name: Set up Rust | |
| uses: actions-rust-lang/setup-rust-toolchain@v1 | |
| - name: Check Library | |
| run: cargo check | |
| - name: Publish to crates.io | |
| uses: katyo/publish-crates@v2 | |
| with: | |
| registry-token: ${{ secrets.CARGO_TOKEN }} | |
| ignore-unpublished-changes: true |