Skip to main content

Bun Semver API

Universal Release uses Bun's native Bun.semver for all version operations.

Why Bun.semver?​

  • 20x faster than node-semver
  • Built-in - No external dependencies
  • Full compatibility with npm semver
  • Native implementation in Zig

Basic Operations​

// Compare versions
Bun.semver.order("1.0.0", "1.0.1"); // -1, 0, or 1

// Check range satisfaction
Bun.semver.satisfies("1.2.3", "^1.0.0"); // true

// Sort versions
const versions = ["1.0.0", "2.0.0", "1.5.0"];
versions.sort(Bun.semver.order);
// ["1.0.0", "1.5.0", "2.0.0"]

Version Comparison​

// order() returns -1, 0, or 1
Bun.semver.order("1.0.0", "2.0.0"); // -1 (first is less)
Bun.semver.order("2.0.0", "1.0.0"); // 1 (first is greater)
Bun.semver.order("1.0.0", "1.0.0"); // 0 (equal)

Range Satisfaction​

// Caret ranges
Bun.semver.satisfies("1.2.3", "^1.0.0"); // true
Bun.semver.satisfies("2.0.0", "^1.0.0"); // false

// Tilde ranges
Bun.semver.satisfies("1.2.3", "~1.2.0"); // true
Bun.semver.satisfies("1.3.0", "~1.2.0"); // false

// Exact match
Bun.semver.satisfies("1.2.3", "1.2.3"); // true

// Range expressions
Bun.semver.satisfies("1.5.0", ">=1.0.0 <2.0.0"); // true

Performance Comparison​

Benchmark: 1 million semver operations

node-semver: ~2000ms
Bun.semver: ~100ms

20x faster! ⚑

Migration from node-semver​

Before:

import semver from "semver";
semver.satisfies("1.2.3", "^1.0.0");
semver.gt("2.0.0", "1.0.0");

After:

// Built-in to Bun runtime
Bun.semver.satisfies("1.2.3", "^1.0.0");
Bun.semver.order("2.0.0", "1.0.0") === 1;

Version Manager Integration​

Universal Release's VersionManager wraps Bun.semver for convenience:

import { VersionManager } from "@universal/release";

const vm = new VersionManager();

// Bump version
vm.bump("1.0.0", "minor"); // "1.1.0"

// Parse version
vm.parse("1.2.3-beta.1");

// Compare versions
vm.compare("2.0.0", "1.9.9"); // 1

Next Steps​