# 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`.