Spec surface
Phasis targets the current ECMAScript specification (ES2024+) and tracks TC39 proposals at Stage 3 and above. This page is the human-readable index of what's actually shipped.
Language
| Feature | Status |
|---|---|
Lexical declarations (let, const) with TDZ | ✅ |
| Block scope, function scope, module scope | ✅ |
Arrow functions (with lexical this) | ✅ |
| Default parameters, rest parameters, spread | ✅ |
| Destructuring (array, object, nested, defaults, rest) | ✅ |
| Template literals, tagged templates | ✅ |
| Computed property names | ✅ |
| Shorthand properties and methods | ✅ |
| Classes — constructors, methods, getters/setters, static | ✅ |
| Class fields (public, private, static) | ✅ |
| Private methods and accessors | ✅ |
super in methods and constructors | ✅ |
| Decorators (Stage 3) | ✅ |
| Static initializer blocks | ✅ |
Optional chaining (?.), nullish coalescing (??) | ✅ |
Logical assignment operators (&&=, ||=, ??=) | ✅ |
Numeric separators (1_000_000) | ✅ |
BigInt literals (123n) and operators | ✅ |
| Async functions, async generators, top-level await | ✅ |
| Generators (sync and async) | ✅ |
for…of, for…in, for await…of | ✅ |
| Iterators and iterables (Symbol.iterator) | ✅ |
| Symbol primitives and well-known symbols | ✅ |
ES Modules (import / export, dynamic import()) | ✅ |
import.meta | ✅ |
import attributes (Stage 3) | ✅ |
| Strict mode + Annex B legacy behaviours | ✅ |
Regular expressions (/u, /v, /d, named groups, lookbehind) | ✅ |
| Automatic semicolon insertion (ASI) | ✅ |
Hashbang grammar (#!/usr/bin/env phasis) | ✅ |
Standard library
Fundamental
| Object | Coverage |
|---|---|
Object | full — keys, values, entries, assign, create, freeze, seal, getOwnPropertyDescriptor(s), setPrototypeOf, getOwnPropertyNames, getOwnPropertySymbols, hasOwn, groupBy, fromEntries, etc. |
Array | full — every prototype method including at, flatMap, flat, findLast, findLastIndex, toReversed, toSorted, toSpliced, with, group, groupToMap |
String | full — at, codePointAt, match, matchAll, replaceAll, padStart, padEnd, trimStart, trimEnd, isWellFormed, toWellFormed |
Number | full — isFinite, isInteger, isNaN, isSafeInteger, EPSILON, MAX_SAFE_INTEGER, etc. |
BigInt | full — arbitrary-precision via bcmath |
Boolean | full |
Math | full — every method, every special-case for NaN / Infinity / -0 |
JSON | full — parse, stringify, custom replacers, reviver, indentation |
Symbol | full — for, keyFor, all well-known symbols, Symbol.toPrimitive |
Function | full — call, apply, bind, length, name, prototype semantics |
Collections
| Object | Coverage |
|---|---|
Map | full — including groupBy and live iteration |
Set | full — including intersection, union, difference, symmetricDifference, isSubsetOf, isSupersetOf, isDisjointFrom |
WeakMap, WeakSet, WeakRef, FinalizationRegistry | full |
Async
| Object | Coverage |
|---|---|
Promise | full — all, race, any, allSettled, withResolvers, async iteration |
AsyncIterator, AsyncGenerator | full |
| Microtask scheduling | ✅ |
Binary data
| Object | Coverage |
|---|---|
ArrayBuffer, SharedArrayBuffer | full |
DataView | full — getBigInt64, setBigInt64, etc. |
Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, BigUint64Array, Float16Array, Float32Array, Float64Array | full |
Atomics — add, sub, and, or, xor, compareExchange, exchange, isLockFree, load, notify, pause, store, wait, waitAsync | full (single-agent only) |
Reflection and proxies
| Object | Coverage |
|---|---|
Proxy | all 13 traps, revocable |
Reflect | all 14 static methods |
Errors
| Object | Coverage |
|---|---|
Error, TypeError, RangeError, ReferenceError, SyntaxError, URIError, EvalError | full |
AggregateError | full |
SuppressedError (Stage 3 explicit resource management) | full |
Dates and time
| Object | Coverage |
|---|---|
Date | full |
Temporal (Stage 3) | full — Now, Instant, PlainDate, PlainTime, PlainDateTime, PlainYearMonth, PlainMonthDay, ZonedDateTime, Duration, TimeZone, Calendar (incl. Hebrew, Chinese, Dangi, Ethiopic, etc.) |
Internationalisation
| Object | Coverage |
|---|---|
Intl.Locale, Intl.Collator, Intl.DateTimeFormat, Intl.NumberFormat, Intl.PluralRules, Intl.RelativeTimeFormat, Intl.ListFormat, Intl.DisplayNames, Intl.Segmenter | full (delegates to PHP's intl extension when available) |
Resource management
| Object | Coverage |
|---|---|
DisposableStack, AsyncDisposableStack (Stage 3) | full |
Symbol.dispose, Symbol.asyncDispose | full |
using / await using declarations | full |
Other
| Object | Coverage |
|---|---|
RegExp (incl. /v set notation, named captures, lookaround, sticky/global flags) | full |
Iterator helpers (Stage 3) — map, filter, take, drop, flatMap, reduce, toArray, forEach, some, every, find | full |
ShadowRealm (Stage 3) | full |
globalThis | ✅ |
Web Platform APIs (WHATWG / W3C, not TC39)
Beyond pure ECMAScript, Phasis ships several layered packs of Web APIs that real-world JS libraries pre-check for. See Web APIs for the full surface and per-area conformance.
| Pack | Globals | WPT |
|---|---|---|
| Web Platform | URL, URLSearchParams, URLPattern, TextEncoder, TextDecoder, atob, btoa, structuredClone, performance, console, setTimeout / setInterval / queueMicrotask, reportError, self (alias of globalThis), DOMException | 100 % |
| Fetch | fetch, Request, Response, Headers, Body mixin, AbortController, AbortSignal, Blob, File, FormData, EventTarget, Event, full WHATWG Streams (ReadableStream, WritableStream, TransformStream, queuing strategies, BYOB), CompressionStream / DecompressionStream (zlib + optional brotli via ext-brotli), navigator | 100 %* |
| Crypto | crypto.getRandomValues, crypto.randomUUID, full SubtleCrypto (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| WebSocket | WebSocket (constructor + RFC 6455 frame codec, replaceable transport via setWebSocketTransport) | 100 % |
| XHR | XMLHttpRequest + XMLHttpRequestUpload + ProgressEvent (layered over the fetch transport, so policy hooks apply) | 100 % |
| Event loop | setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, AsyncContext (Stage 3) | n/a (oracle-tested) |
All imported Web Platform Tests pass — see Web APIs for the conformance breakdown.
What's not yet implemented
- SharedArrayBuffer worker semantics beyond a single agent — multi-thread atomic notification across real OS threads requires
pcntland isn't on the roadmap. Single-agent atomics work. Intl.Segmenterwith grapheme clusters that need ICU 76+ — depends on the host PHP'sintlextension version.Tail call optimization— proper tail calls (PTC) are optional in the spec; we don't implement them.
Versioning
Phasis follows semver. The version line tracks ECMAScript spec drafts:
| Phasis version | Spec target | Stage 3 proposals |
|---|---|---|
| 0.x | ES2024 | decorators, Temporal, explicit resource management, iterator helpers, set methods |
A bump to 1.0 is gated on every Stage 4 proposal in the ES2025 draft being implemented and on a stable Promise drain semantics.
Popular packages
Phasis runs 204+ real-world JS libraries — acorn, lodash, zod, marked, ramda, dayjs, date-fns, immer, redux, immutable, fuse.js, minisearch, semver, prettier, typescript, svelte (compiler), terser, @babel/parser, graphql-js, ajv, mobx, cheerio, htmlparser2, papaparse, lunr, postcss, moment, luxon, JSZip, xstate, chai, mqtt-packet, yaml, jsonata, escodegen, magic-string, valtio, nanostores, jotai, redux-saga, and more — byte-equal to Node.js. Verified on every push via the popular.yml CI workflow.
Known limitations
Where Phasis intentionally diverges from V8 — performance ceilings, host integrations, and design trade-offs.