Skip to content

Node >=14 engines claim doesn't hold: shipped bundle fails to parse on Node 14 #608

Description

@axisrow

Node >=14 engines claim doesn't hold: the shipped bundle fails to parse on Node 14

package.json declares "engines": { "node": ">=14.0.0" } and the build targets Node 14 (bun build … --target=node --target-version=14), but the shipped dist/ cannot even be loaded by a real Node 14.

Repro (ccstatusline 2.2.30, macOS, Node v14.21.3)

$ printf '{"model":{"id":"claude-sonnet-4-5"}}' | node-v14.21.3-darwin-x64/bin/node dist/ccstatusline.js
file:///…/dist/ccstatusline-wckvcay0.js:15
    var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
                                               ^^^

SyntaxError: Unexpected token '??='
    at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18)

The failing code is bun's own ESM-interop helper chunk, emitted into the bundle with ??= intact — --target-version=14 does not transpile logical assignment operators (??=/||=/&&=, Node 15+). Since the chunk is imported at startup, the binary exits before rendering anything.

The floor is higher for two more reasons

  • The bundle inlines dependencies, and the pinned versions declare much higher floors themselves: chalk@6 → node >=22, ink@6.2.0 → node >=20. Even with the syntax issue fixed, nothing on a Node 14 runtime is exercised or guaranteed (ink 6 is required for the TUI).
  • Observed the same ??= rejection on independent builds (including a --packages=external variant), so it is not specific to one bundle layout.

Suggestion

Pick one, whichever matches the project's intent:

  1. Honest floor (probably cheapest): bump engines to >=20 (ink's floor) or >=22 (chalk's), and drop --target-version=14 so the target claim matches reality. Note npm does not hard-enforce engines by default, so today users on old Node get the SyntaxError above instead of a clear message.
  2. Keep 14: transpile logical assignment operators in the build output and downgrade the bundled dependency set (chalk would need a ≤4-era pin, which conflicts with the current chalk@6 dependency) — significantly more work and a permanent transpile-maintenance burden.

Verified today on current main; happy to send a PR for either direction.

Environment: ccstatusline 2.2.30, macOS (darwin-x64), Node v14.21.3, bun 1.3.13 build.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions