
# Superfície da especificação

Phasis tem como alvo a especificação ECMAScript atual (ES2024+) e acompanha as propostas do TC39 no Stage 3 ou superior. Esta página é o índice legível por pessoas do que foi realmente implementado.

## Linguagem

| Recurso | Status |
|---|:---:|
| Declarações léxicas (`let`, `const`) com TDZ | ✅ |
| Escopo de bloco, de função e de módulo | ✅ |
| Funções de seta (com `this` léxico) | ✅ |
| Parâmetros padrão, parâmetros rest, spread | ✅ |
| Desestruturação (array, objeto, aninhada, padrões, rest) | ✅ |
| Literais de template, templates marcados | ✅ |
| Nomes de propriedades computados | ✅ |
| Propriedades e métodos abreviados | ✅ |
| Classes — construtores, métodos, getters/setters, estáticos | ✅ |
| Campos de classe (públicos, privados, estáticos) | ✅ |
| Métodos e acessores privados | ✅ |
| `super` em métodos e construtores | ✅ |
| Decoradores (Stage 3) | ✅ |
| Blocos inicializadores estáticos | ✅ |
| Encadeamento opcional (`?.`), coalescência de nulos (`??`) | ✅ |
| Operadores de atribuição lógica (`&&=`, `\|\|=`, `??=`) | ✅ |
| Separadores numéricos (`1_000_000`) | ✅ |
| Literais BigInt (`123n`) e operadores | ✅ |
| Funções assíncronas, geradores assíncronos, await no nível superior | ✅ |
| Geradores (síncronos e assíncronos) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Iteradores e iteráveis (Symbol.iterator) | ✅ |
| Primitivas Symbol e símbolos conhecidos | ✅ |
| Módulos ES (`import` / `export`, `import()` dinâmico) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (Stage 3) | ✅ |
| Modo estrito + comportamentos legados do Annex B | ✅ |
| Expressões regulares (`/u`, `/v`, `/d`, grupos nomeados, lookbehind) | ✅ |
| Inserção automática de ponto e vírgula (ASI) | ✅ |
| Gramática de hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Chamadas de cauda adequadas no modo estrito (ES2015, exigidas pela especificação) | ✅ |

## Biblioteca padrão

### Fundamental

| Objeto | Cobertura |
|---|---|
| `Object` | completa — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries` etc. |
| `Array` | completa — todos os métodos de protótipo, incluindo `at`, `flatMap`, `flat`, `findLast`, `findLastIndex`, `toReversed`, `toSorted`, `toSpliced`, `with`, `group`, `groupToMap` |
| `String` | completa — `at`, `codePointAt`, `match`, `matchAll`, `replaceAll`, `padStart`, `padEnd`, `trimStart`, `trimEnd`, `isWellFormed`, `toWellFormed` |
| `Number` | completa — `isFinite`, `isInteger`, `isNaN`, `isSafeInteger`, `EPSILON`, `MAX_SAFE_INTEGER` etc. |
| `BigInt` | completa — precisão arbitrária via bcmath |
| `Boolean` | completa |
| `Math` | completa — todos os métodos e casos especiais para NaN / Infinity / -0 |
| `JSON` | completa — `parse`, `stringify`, substituidores personalizados, reviver, indentação |
| `Symbol` | completa — `for`, `keyFor`, todos os símbolos conhecidos, `Symbol.toPrimitive` |
| `Function` | completa — semântica de `call`, `apply`, `bind`, `length`, `name`, `prototype` |

### Coleções

| Objeto | Cobertura |
|---|---|
| `Map` | completa — incluindo `groupBy` e iteração ao vivo |
| `Set` | completa — incluindo `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | completa |

### Assíncrono

| Objeto | Cobertura |
|---|---|
| `Promise` | completa — `all`, `race`, `any`, `allSettled`, `withResolvers`, iteração assíncrona |
| `AsyncIterator`, `AsyncGenerator` | completa |
| Agendamento de microtarefas | ✅ |

### Dados binários

| Objeto | Cobertura |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | completa |
| `DataView` | completa — `getBigInt64`, `setBigInt64` etc. |
| `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `BigInt64Array`, `BigUint64Array`, `Float16Array`, `Float32Array`, `Float64Array` | completa |
| `Atomics` — `add`, `sub`, `and`, `or`, `xor`, `compareExchange`, `exchange`, `isLockFree`, `load`, `notify`, `pause`, `store`, `wait`, `waitAsync` | completa (apenas agente único) |

### Reflexão e proxies

| Objeto | Cobertura |
|---|---|
| `Proxy` | todas as 13 armadilhas, revogável |
| `Reflect` | todos os 14 métodos estáticos |

### Erros

| Objeto | Cobertura |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | completa |
| `AggregateError` | completa |
| `SuppressedError` (gerenciamento explícito de recursos, Stage 3) | completa |

### Datas e horários

| Objeto | Cobertura |
|---|---|
| `Date` | completa |
| `Temporal` (Stage 3) | completa — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (incluindo hebraico, chinês, Dangi, etíope etc.) |

### Internacionalização

| Objeto | Cobertura |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | completa (delegada à extensão `intl` de PHP quando disponível) |

### Gerenciamento de recursos

| Objeto | Cobertura |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (Stage 3) | completa |
| `Symbol.dispose`, `Symbol.asyncDispose` | completa |
| Declarações `using` / `await using` | completa |

### Outros

| Objeto | Cobertura |
|---|---|
| `RegExp` (incluindo notação de conjuntos `/v`, capturas nomeadas, lookaround, flags sticky/global) | completa |
| Auxiliares `Iterator` (Stage 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | completa |
| `ShadowRealm` (Stage 3) | completa |
| `globalThis` | ✅ |

## APIs da plataforma Web (WHATWG / W3C, não TC39)

Além do ECMAScript puro, Phasis fornece vários conjuntos em camadas de APIs Web que bibliotecas JS do mundo real verificam previamente. Consulte [APIs Web](https://phasis.inline0.dev/pt/docs/compatibility/web-apis) para ver toda a superfície e a conformidade de cada área.

| Conjunto | Globais | WPT |
|---|---|---|
| **Plataforma Web** | `URL`, `URLSearchParams`, `URLPattern`, `TextEncoder`, `TextDecoder`, `atob`, `btoa`, `structuredClone`, `performance`, `console`, `setTimeout` / `setInterval` / `queueMicrotask`, `reportError`, `self` (alias de `globalThis`), `DOMException` | 100 % |
| **Fetch** | `fetch`, `Request`, `Response`, `Headers`, mixin `Body`, `AbortController`, `AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`, `Event`, fluxos WHATWG completos (`ReadableStream`, `WritableStream`, `TransformStream`, estratégias de enfileiramento, BYOB), `CompressionStream` / `DecompressionStream` (zlib + brotli opcional via `ext-brotli`), `navigator` | 100 %¹ |
| **Crypto** | `crypto.getRandomValues`, `crypto.randomUUID`, `SubtleCrypto` completo (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (construtor + codec de frames RFC 6455, transporte substituível via `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (em camadas sobre o transporte fetch, portanto os hooks de política se aplicam) | 100 % |
| **Loop de eventos** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (Stage 3) | n/a (testado com oráculo) |

¹ Excluindo os subtestes permitidos nas fixtures de compressão: os casos de brotli, que precisam de `ext-brotli`, e os casos que recebem entrada baseada em `SharedArrayBuffer` (`EXPECTED_FAILURES` em `tests/Wpt/WptTest.php`).

Todos os demais Web Platform Tests importados passam — consulte [APIs Web](https://phasis.inline0.dev/pt/docs/compatibility/web-apis) para ver a divisão da conformidade.

## O que ainda não foi implementado

- **Semântica de workers SharedArrayBuffer** além de um único agente — a notificação atômica multithread entre threads reais do sistema operacional requer `pcntl` e não está no roadmap. Átomos de agente único funcionam.
- **`Intl.Segmenter` com clusters de grafemas que precisam do ICU 76+** — depende da versão da extensão `intl` do PHP hospedeiro.

## Versionamento

Phasis segue o semver. A linha de versões acompanha os rascunhos da especificação ECMAScript:

| Versão do Phasis | Alvo da especificação | Propostas Stage 3 |
|---|---|---|
| 0.x | ES2024 | decoradores, Temporal, gerenciamento explícito de recursos, auxiliares de iterador, métodos de conjunto |

A atualização para 1.0 depende da implementação de todas as propostas Stage 4 do rascunho ES2025 e de uma semântica estável para drenagem de Promise.
