name: CI
on:
push:
pull_request:
release:
types: [published]
permissions:
contents: read
env:
APP_NAME: peisar
RUST_BACKTRACE: 1
MACOSX_DEPLOYMENT_TARGET: "10.13"
jobs:
test:
name: Test on ${{ matrix.os }}
if: github.event_name == 'release'
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 24
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Install dependencies
run: npm ci
- name: Run JavaScript unit tests
run: npm run wf:test
build:
if: github.event_name == 'release'
strategy:
fail-fast: false
matrix:
settings:
- host: macos-latest
target: aarch64-apple-darwin
- host: macos-latest
target: x86_64-apple-darwin
- host: ubuntu-latest
target: x86_64-unknown-linux-gnu
flags: --use-napi-cross
- host: ubuntu-latest
target: aarch64-unknown-linux-gnu
flags: --use-napi-cross
- host: ubuntu-latest
target: x86_64-unknown-linux-musl
flags: --cross-compile
- host: ubuntu-latest
target: aarch64-unknown-linux-musl
flags: --cross-compile
- host: windows-latest
target: x86_64-pc-windows-msvc
- host: windows-latest
target: aarch64-pc-windows-msvc
- host: ubuntu-latest
target: wasm32-wasip1-threads
name: Build ${{ matrix.settings.target }}
runs-on: ${{ matrix.settings.host }}
steps:
- uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 24
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.settings.target }}
- name: Install dependencies
run: npm ci
- name: Setup Zig
if: contains(matrix.settings.flags, '--cross-compile')
uses: mlugg/setup-zig@v2
with:
version: 0.15.2
- name: Build & package artifacts
run: |
npx napi build --release --platform --features npm --js index.cjs --config-path napi.config.json --target ${{ matrix.settings.target }} ${{ matrix.settings.flags }}
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: peisar-${{ matrix.settings.target }}
path: |
${{ env.APP_NAME }}.*.node
${{ env.APP_NAME }}.*.wasm
${{ env.APP_NAME }}.wasi.cjs
${{ env.APP_NAME }}.wasi.d.cts
${{ env.APP_NAME }}.wasi-browser.js
wasi-worker.mjs
wasi-worker-browser.mjs
if-no-files-found: error
publish:
if: github.event_name == 'release'
needs: [test, build]
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@v7
with:
repository: suseejs/peisar_browser
path: peisar_browser
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 24
registry-url: https://registry.npmjs.org
cache: npm
cache-dependency-path: |
package-lock.json
peisar_browser/package-lock.json
- name: Install dependencies
run: npm ci
- name: Install browser dependencies
run: npm ci
working-directory: peisar_browser
- name: Build browser bundle
run: npm run build
working-directory: peisar_browser
- name: Upload browser bundle to GitHub Release
run: gh release upload "$GITHUB_REF_NAME" browser/peisar.js --clobber
env:
GH_TOKEN: ${{ github.token }}
- name: Generate JS binding & types
run: npm run build
- name: Download all artifacts
uses: actions/download-artifact@v8
with:
path: artifacts
digest-mismatch: warn
- name: Scaffolding platform package dirs
run: npx napi create-npm-dirs --config-path napi.config.json
- name: Distribute build artifacts to npm dirs
run: npx napi artifacts --config-path napi.config.json
- name: Sync version from release tag
if: github.event.release.tag_name != ''
run: |
TAG="${{ github.event.release.tag_name }}"
# Strip optional leading 'v' (e.g. v0.2.0 → 0.2.0)
VERSION="${TAG#v}"
echo "Release tag: $TAG → version: $VERSION"
node -e "
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
if (pkg.version !== '$VERSION') {
console.warn('package.json version (' + pkg.version + ') != tag ($VERSION). Fixing.');
pkg.version = '$VERSION';
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
} else {
console.log('package.json version already matches: ' + pkg.version);
}
"
- name: Prepare publish
run: npx napi prepublish --config-path napi.config.json -t npm --gh-release-id ${{ github.event.release.id }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish to npm
run: |
npm config set provenance true
npm publish --access public --no-git-checks
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}