name: Publish npm package on: push: tags: ['v*'] permissions: contents: read id-token: write jobs: build: name: Build ${{ matrix.target }} runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: macos-14 target: aarch64-apple-darwin steps: - uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable - uses: oven-sh/setup-bun@v2 with: bun-version: latest - name: Cache cargo uses: actions/cache@v4 with: path: | ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ napi/target/ key: ${{ runner.os }}-cargo-napi-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-napi- - name: Install dependencies working-directory: napi run: bun install - name: Build native addon working-directory: napi run: bunx napi build --platform --release - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.target }} path: napi/*.node if-no-files-found: error publish: name: Publish to npm needs: build runs-on: ubuntu-latest permissions: contents: read id-token: write steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: node-version: '24' registry-url: 'https://registry.npmjs.org' - name: Download all artifacts uses: actions/download-artifact@v4 with: path: napi/artifacts - uses: oven-sh/setup-bun@v2 with: bun-version: latest - name: Install dependencies working-directory: napi run: bun install - name: Generate JS bindings working-directory: napi run: bunx napi prepublish --skip-gh-release - name: Collect binaries and publish working-directory: napi run: | # Copy all .node binaries into the package directory cp artifacts/bindings-*/*.node . echo "=== Package contents ===" ls -la *.node index.js index.d.ts npm publish --provenance --access public