Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .changeset/migrate-to-bun.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
"h2m-parser": major
---

**BREAKING CHANGES:** Migrate to Bun and add standalone binary compilation

This release introduces significant infrastructure changes:

- **ESM-only package**: Removed CommonJS builds. The package now exports only ESM format.
- **Bun development requirement**: Development now requires Bun 1.2+ instead of pnpm.
- **Node.js runtime compatibility maintained**: Runtime consumption still supports Node.js 22+.

**New Features:**
- Standalone binary compilation using Bun's `--compile` flag
- Cross-platform support: linux-x64, linux-arm64, darwin-x64, darwin-arm64, windows-x64
- Baseline and modern CPU variants (Haswell/AVX2+)
- Automated GitHub workflow for binary builds on releases
- Runtime detection for Bun.CryptoHasher with Node.js fallback for hash computation

**Build System:**
- Replaced tsup with Bun.build() for faster builds (~0.6s vs 1.5s)
- Simplified package exports to ESM default only
- Updated all 30+ benchmark scripts to use Bun
- Removed pnpm workspace configuration
87 changes: 87 additions & 0 deletions .github/workflows/build-binaries.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Build Binaries

on:
release:
types: [published]
workflow_dispatch:
inputs:
ref:
description: 'Git ref (tag or branch) to build from'
required: false
default: ''

concurrency:
group: build-binaries-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: read

env:
OUTDIR: dist/bin

jobs:
build:
name: Build Bun binaries
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
ref: ${{ github.event_name == 'release' && github.event.release.tag_name || inputs.ref || github.ref }}

- name: Setup Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
with:
bun-version: latest

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Verify project
run: bun run verify

- name: Build baseline binaries
run: bun run build:binary --all --outdir "$OUTDIR"

- name: Build modern binaries
run: bun run build:binary --all --modern --outdir "$OUTDIR"

- name: Generate checksums
run: |
cd "$OUTDIR"
sha256sum h2m-* > SHA256SUMS

- name: Upload artifacts
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0
with:
name: h2m-binaries-${{ github.run_id }}
path: ${{ env.OUTDIR }}/*
if-no-files-found: error

publish:
name: Attach release assets
runs-on: ubuntu-latest
if: github.event_name == 'release'
needs: build
permissions:
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: h2m-binaries-${{ github.run_id }}
path: ${{ env.OUTDIR }}

- name: List artifacts
run: ls -R $OUTDIR

- name: Publish to GitHub Release
uses: softprops/action-gh-release@62c96d0c4e8a889135c1f3a25910db8dbe0e85f7 # v2.3.4
with:
files: ${{ env.OUTDIR }}/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32 changes: 11 additions & 21 deletions .github/workflows/performance-regression.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
paths:
- 'src/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'bun.lock'
push:
branches:
- main
Expand All @@ -32,21 +32,16 @@ jobs:
persist-credentials: false
lfs: true

- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
with:
run_install: false

- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: '24'
bun-version: latest

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: bun install --frozen-lockfile

- name: Build project
run: pnpm build
run: bun run build

- name: Restore main baseline
run: |
Expand Down Expand Up @@ -136,21 +131,16 @@ jobs:
fetch-depth: 0
lfs: true

- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
with:
run_install: false

- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
- name: Setup Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
with:
node-version: '24'
bun-version: latest

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: bun install --frozen-lockfile

- name: Build project
run: pnpm build
run: bun run build

- name: Capture baseline
run: node bench/capture-baseline.js
Expand Down
21 changes: 11 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,33 +27,34 @@ jobs:
fetch-depth: 0 # Fetch all history for changesets
persist-credentials: false

- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
with:
bun-version: latest

- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 #v5.0.0
with:
node-version: 24
cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'
always-auth: true

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: bun install --frozen-lockfile

- name: Verify build
run: |
pnpm lint
pnpm typecheck
pnpm test
pnpm build
bun lint
bun typecheck
bun test
bun run build

- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@e0145edc7d9d8679003495b11f87bd8ef63c0cba #v1.5.3
with:
publish: pnpm changeset publish
version: pnpm changeset version
publish: bun changeset publish
version: bun changeset version
commit: 'chore(release): version packages'
title: 'chore(release): version packages'
createGithubReleases: true
Expand Down
20 changes: 8 additions & 12 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,22 @@ jobs:
persist-credentials: false
lfs: true

- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda #v4.1.0

- name: Setup Node.js ${{ matrix.node }}
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 #v5.0.0
- name: Setup Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2
with:
node-version: ${{ matrix.node }}
cache: 'pnpm'
bun-version: latest

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: bun install --frozen-lockfile

- name: Lint
run: pnpm lint
run: bun lint

- name: Type check
run: pnpm typecheck
run: bun typecheck

- name: Test
run: pnpm test
run: bun test

- name: Build
run: pnpm build
run: bun run build
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
node_modules
.DS_Store
dist
dist/bin
coverage
bench/output
bench/artifacts/
Expand Down
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
pnpm lint-staged
bun lint-staged
Loading