Skip to content

ADR-001: ESM-only, zero runtime dependencies

Date: 2026-06-28 Status: Accepted Source: RD-01 (scaffolding & toolchain), reaffirmed by RD-10 (non-functional)

Context

A terminal SDK foundation ships to many environments and must be trustworthy at the supply-chain level. Two early choices shape everything downstream: the module system, and how much third-party code runs at runtime.

Options Considered

Option A: Dual CJS+ESM, allow runtime deps as needed

  • Pros: Broadest consumer compatibility; reuse existing terminal libraries.
  • Cons: Dual-build complexity; every runtime dep is attack surface, audit burden, and a potential native-build/install failure.

Option B: ESM-only, zero runtime dependencies (pure-JS, Node built-ins only)

  • Pros: Minimal attack surface; clean installs on all platforms (no node-gyp); forces a well-factored pure core; trivial to audit.
  • Cons: No CommonJS require(); must re-implement primitives instead of pulling a library.

Decision

Chosen option: Option B — the package is ESM-only and ships with zero runtime dependencies, using only Node built-ins.

Rationale

The foundation's value is correctness and trustworthiness, not breadth of features borrowed from npm. Zero runtime deps makes the runtime surface auditable to the Node standard library, guarantees clean cross-platform installs, and pressures the design toward pure, testable functions. ESM-only matches the modern Node baseline (≥ 18) and avoids dual-build complexity. The choice is enforced by npm run check:deps (fails on any native runtime dep) and the RD-01 packaging spec (sideEffects:false, .d.ts, engines.node>=18).

Consequences

Positive

  • Auditably small runtime surface; npm audit stays clean.
  • Tree-shakeable (sideEffects:false), verified by the RD-10 esbuild check.
  • Clean installs everywhere — no compile step.

Negative

  • CommonJS consumers must use dynamic import().
  • Primitives (width tables, colour math) are implemented in-repo rather than borrowed.

Risks

  • A future genuine need for a runtime dep would require a license/audit guard (tracked as RD-10 DEF-2) before it ships.