Skip to content

v0.60.0

Choose a tag to compare

@ttraenkler ttraenkler released this 06 Jul 02:19
7698282

v0.60.0

Released 2026-07-05.

Minor release. First release published to both npm and JSR, plus a new unscoped js2wasm proxy for discoverability. Six days of work centered on standalone (host-free) mode — native Promises, generators, and descriptor reflection with no JS runtime — alongside broad test262 conformance fixes and continued IR adoption.

test262: 32,472 / 43,106 passing (75.3%) on the committed baseline. The report now credits host-free (portable, no-JS-host) passes, so the headline number reflects a stricter honesty bar than earlier releases rather than a like-for-like count.

Packaging & distribution

  • @loopdive/js2 now publishes to npm and JSR via tokenless OIDC trusted publishing, and the unscoped js2wasm proxy makes npm install js2wasm resolve to the canonical package.
  • The publish workflow was split into independent per-registry jobs so a not-yet-configured registry can't block the others.

Standalone / host-free runtime

Standalone mode (--target standalone, pure WasmGC, no JS host) gained large chunks of runtime that previously required host imports:

  • Native Promisesnew Promise(executor) retires the Promise_new host import (#2959); Promise.all / Promise.race combinators (#2867 Gap 4); recursive thenable assimilation and async throwreject routing (#2867); and a general N-state async resume machine for multi-await linear code (#2895, #2906).
  • Native generators — heterogeneous boxed-any carriers, live-across-yield local spills, and yield* completion-value delegation (#2864); resume-funcidx desync and i64/BigInt-yield boxing fixes (#2941, #2993).
  • Descriptor reflection & builtins — host-free Object.getOwnPropertySymbols (#2866); intrinsic accessor descriptors (#2885); new <non-constructor-builtin>() throws TypeError (#2886); reflective Math / Number / globalThis reads via native singletons (#2933, #2988); and identity-stable reified builtin static-method values + shared %ArrayIteratorPrototype% identity (#2963, #3013).
  • Dynamic member-read substrate — a new __dyn_member_get carrier wired into the IR member-read path (#2949 S5.x, #3053), with byte-inert dynamic equality and relational lowering (#2949 S5.2, S5.3).
  • Host-free honesty metric — the report credits only genuinely host-free passes (#2879, #2889).

Language conformance

  • RegExp @@replace / @@split argument, flag, and exec-override result coercion (#3051).
  • for-in now walks the prototype chain for inherited enumerable keys (#2964).
  • Object.defineProperty descriptor round-trip, value-less-default → undefined, and crash fixes (#3042, #3044).
  • Destructuring — assignment-destructuring defaults fire on absent element/property (#2845); native tuple-from-iterable destructure in standalone/wasi (#2995); early errors for async shorthand properties and trailing comma after a rest element (#3026).
  • CoercionToPrimitive valueOftoString fall-through in operators (#2891); [Symbol.toPrimitive]() on hint-less object literals emits valid Wasm (#2883); BigInt⇄String loose equality via ToNumber (#2109); exact integer-exponent path for ** / Math.pow (#2887).
  • Tagged templates reconciled to a spec-correct TemplateStringsArray (#2981); (eval as any)() stack overflow fixed (#3005).

IR adoption

  • IR lowers class get/set accessors and constructors for flat classes (#3000-B, #3000-C), keeps super_init / super_call live through DCE (#3000-E), and claims static methods under extends (#2857).
  • Coercion-site and windowing type queries route through the type oracle / oracle-ratchet (#3037, #3054-B2, #1930).

Website & tooling

  • Report page gains a standalone toggle, mobile-overflow handling, benchmark data, and edition-scoped error patterns (#2871); assorted blog/landing chart and scoring fixes.
  • Merge-queue robustness: failure-aware auto-enqueue that won't re-add a just-parked PR (#2975).

Curated highlights; full history: git log v0.59.5..v0.60.0 (786 merges).