Skip to main content

CHANGELOG.md

# Changelog

All notable changes to this project are documented here. The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [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](https://github.com/jtippett/zapcode),
  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`.