Changelog
All notable changes to @shzd/bun-geos are documented here. The library's GEOS surface is
strict 3.14 (D5); GEOS upgrades ship as releases of this package, never as user-visible
version gating.
Format: Keep a Changelog-ish; semver-ish (0.0.x while the release pipeline hardens; 0.1.0 is the Phase-5 hardened release).
0.1.0 — Phase 5 (hardening & polish)
The complete api-surface target, permanently gated: 257 tests, an 8.7k-op XML corpus differential gate, Valgrind + ASan shim gates, GeoArrow golden-byte conformance, and the reference docs.
Added:
- The full construction-op surface (D27):
convexHull,concaveHull,simplify,topologyPreserveSimplify,clipByRect,delaunay,constrainedDelaunay,voronoi,lineMerge(+directed),lineSubstring,offsetCurve,sharedPaths,snap,node,buildArea,polygonize,centroid,interiorPoint,boundary,nearestPoints,minimumClearance/minimumClearanceLine,maximumInscribedCircle,largestEmptyCircle,clusterDBSCAN(ids per input, -1 = noise),gridIntersectionFractions— with element-wise*Allbatch forms for the loop-shaped ones through one new shim surface (geos_shim_unary_all/geos_shim_binary_all, selftest-pinned op-id tables). - GeoArrow shapes v2 (D28): tagged kinds (the
geoarrow.*extension-name mapping), Arrow LSB validity bitmaps with batchnullMode("throw"/"skip"), representable empty MULTI*, dense-uniongeometrycollection.toArrownow emits tagged values (breaking vs 0.0.x; legacy untagged input is still accepted). Conformance is pinned byte-for-byte against the reference implementation (geoarrow-pyarrow) in both directions. - API reference (
docs/reference/api.md) and a generated symbol table (docs/reference/symbols.md, 196 bindings), enforced fresh by a test. - Benchmark regression alerts (
bun run bench:check, a manual-dispatch CI job) and a construction-batch row in the published suite. - The XML corpus gate is PERMANENT: 8,753 ops across the general/robust/validate/issue
xmltester files run on every PR (resolved from the pinned tarball extraction when
vendor/is absent; hard-fails under CI when missing — D29). Every op of the shared GEOS/JTS corpus the C API can express is executed; the only sanctioned skip isdensify(C++-only, no C API).
Changed:
geos.toArrowreturns tagged shapes (see above).- DECISIONS D27–D28 recorded; house rules extended (unary/binary op-id tables, int-return exceptions).
Gates (CI, per testing.md §5): lint + typecheck + full tests (incl. the corpus) + ASan/UBSan + Valgrind memcheck + spike suite + PostGIS oracle on every PR; nightly long-run soak; benchmark regression alerts on dispatch.
0.0.2 — Phase 4 (packaging fixes) — never published (rolled into 0.1.0)
The 0.0.2 section below documents repo-side fixes that landed after 0.0.1; the registry never received 0.0.2 (its
latestwas 0.0.1 until 0.1.0), and the "first trusted-published release" claim was aspirational — the first real OIDC publish is 0.1.0. The fixes ship with 0.1.0.
Fixed:
- Platform manifests declared
libc: ["gnu"]; npm's field vocabulary isglibc/musl, so npm on Linux skipped both linux packages (bun ignores the field — the two managers diverged). Nowlibc: ["glibc"]for the-gnupackages. (musl was always correct.) repository.urlpointed at the wrong org; npm trusted publishing requires an exact match.
Changed:
- Publishing switched to npm trusted publishing (OIDC) — no tokens in CI. The 0.0.1
bootstrap was published interactively because granular tokens do not bypass 2FA-enforced
publishing (
EOTP), and npm is deprecating 2FA-bypassing tokens outright.
0.0.1 — Phase 4 (packaging & release) — first publish
The first npm release. The library surface itself was completed across Phases 1–3 (see the roadmap for what landed when and the measured results).
Added (this phase):
- The 8-package publish layout:
@shzd/bun-geos+ 7 platform packages (darwin-{arm64,x64},linux-{arm64,x64}-{gnu,musl},win32-x64), exact version pins, lockstep releases (D6/D7). - CI build matrix (GitHub Actions): native per-target builds, platform smoke against the
staged package on every runner, licensing spot checks (
ldd/otool/dumpbin+ no-static- GEOS-symbols), artifact upload → publish → registry-resolution verify → main. - GEOS source pinning: official release tarball + SHA-256, recorded in every platform
package's
THIRD_PARTY.md; verbatim LGPL-2.1LICENSEships in every platform package (D12). - Release tooling:
scripts/release.ts(idempotent, staged-publish model D26), verdaccio dry-run (bun run release:dry-run), install matrix (bun/npm/pnpm × glibc/musl, < 60 s budget). - Shim portability (D4 amendment):
SHIM_TLSmacro for MSVC (__declspec(thread)), forced pre-C11 atomic fallback on_MSC_VER, Windows export list (native/shim.def) with sync-checks on every platform. - Loader: Windows preload order (
geos.dll→geos_c.dll→ shim — the DLL search path excludes the loaded DLL's own directory),BUN_GEOS_PACKAGE_DIRoverride for staged-package testing. - User guides: getting started, memory & disposal, workers & parallelism.