All notable changes to this project are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

0.1.1 - 2026-07-08

0.1.0

Initial release.

  • Elixir NIF wrapper around zapcode-core (a minimal secure TypeScript-subset interpreter in Rust). Runs against our fork, which fixes several upstream v1.5.3 correctness bugs: array & object spread (were silently-wrong / crashing), in-place array mutation (push et al. never persisted), switch (a bare break looped forever), and destructuring parameters. Regex — previously a silent no-op — is now rejected with a clear error. Net goal: no silent wrong answers.
  • Interactive start/resume execution model with a suspend-at-external-call tool bridge — the tool runs on a normal BEAM process, not inside the NIF.
  • Durable suspend/resume: dump_snapshot/1 serializes a paused run to a binary and load_snapshot/1 restores it for resume/2 — in another process or after a restart. Unlike ExMonty, dump_snapshot/1 is non-destructive.
  • ExZapcode.Sandbox.run/2 high-level driver and ExZapcode.eval/2, mirroring the ExMonty return contract ({:ok, value, output} | {:error, %Exception{}}).
  • Resource limits: wall-clock time, memory, stack depth, allocations.
  • Full value marshalling between TypeScript and Elixir terms.
  • Precompiled NIFs for macOS and Linux (aarch64/x86_64) via rustler_precompiled.