
# Ámbito de la especificación

Phasis tiene como objetivo la especificación actual de ECMAScript (ES2024+) y sigue las propuestas de TC39 en la fase 3 o superior. Esta página es el índice legible de lo que realmente incluye.

## Lenguaje

| Característica | Estado |
|---|:---:|
| Declaraciones léxicas (`let`, `const`) con TDZ | ✅ |
| Ámbito de bloque, de función y de módulo | ✅ |
| Funciones flecha (con `this` léxico) | ✅ |
| Parámetros predeterminados, parámetros rest y expansión | ✅ |
| Desestructuración (de matrices, objetos, anidada, con valores predeterminados y rest) | ✅ |
| Literales de plantilla y plantillas etiquetadas | ✅ |
| Nombres de propiedades calculados | ✅ |
| Propiedades y métodos abreviados | ✅ |
| Clases: constructores, métodos, getters/setters y estáticos | ✅ |
| Campos de clase (públicos, privados y estáticos) | ✅ |
| Métodos y accesores privados | ✅ |
| `super` en métodos y constructores | ✅ |
| Decoradores (fase 3) | ✅ |
| Bloques de inicialización estáticos | ✅ |
| Encadenamiento opcional (`?.`), fusión con nulos (`??`) | ✅ |
| Operadores de asignación lógica (`&&=`, `\|\|=`, `??=`) | ✅ |
| Separadores numéricos (`1_000_000`) | ✅ |
| Literales BigInt (`123n`) y operadores | ✅ |
| Funciones asíncronas, generadores asíncronos y await de nivel superior | ✅ |
| Generadores (síncronos y asíncronos) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Iteradores e iterables (Symbol.iterator) | ✅ |
| Primitivos Symbol y símbolos conocidos | ✅ |
| Módulos ES (`import` / `export`, `import()` dinámico) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (fase 3) | ✅ |
| Modo estricto y comportamientos heredados del Anexo B | ✅ |
| Expresiones regulares (`/u`, `/v`, `/d`, grupos con nombre y búsqueda hacia atrás) | ✅ |
| Inserción automática de punto y coma (ASI) | ✅ |
| Gramática hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Llamadas de cola apropiadas en modo estricto (ES2015, exigidas por la especificación) | ✅ |

## Biblioteca estándar

### Fundamental

| Objeto | Cobertura |
|---|---|
| `Object` | completa — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries`, etc. |
| `Array` | completa — todos los métodos del prototipo, incluidos `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 — precisión arbitraria mediante bcmath |
| `Boolean` | completa |
| `Math` | completa — todos los métodos y casos especiales para NaN / Infinity / -0 |
| `JSON` | completa — `parse`, `stringify`, reemplazadores personalizados, reviver e indentación |
| `Symbol` | completa — `for`, `keyFor`, todos los símbolos conocidos y `Symbol.toPrimitive` |
| `Function` | completa — semántica de `call`, `apply`, `bind`, `length`, `name` y `prototype` |

### Colecciones

| Objeto | Cobertura |
|---|---|
| `Map` | completa, incluida `groupBy` y la iteración en vivo |
| `Set` | completa, incluidos `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | completa |

### Asincronía

| Objeto | Cobertura |
|---|---|
| `Promise` | completa — `all`, `race`, `any`, `allSettled`, `withResolvers`, iteración asíncrona |
| `AsyncIterator`, `AsyncGenerator` | completa |
| Planificación de microtareas | ✅ |

### Datos binarios

| 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 (solo agente único) |

### Reflexión y proxies

| Objeto | Cobertura |
|---|---|
| `Proxy` | las 13 trampas, revocables |
| `Reflect` | los 14 métodos estáticos |

### Errores

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

### Fechas y hora

| Objeto | Cobertura |
|---|---|
| `Date` | completa |
| `Temporal` (Stage 3) | completa — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (incluidos hebreo, chino, Dangi, etíope, etc.) |

### Internacionalización

| Objeto | Cobertura |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | completa (delega en la extensión `intl` de PHP cuando está disponible) |

### Gestión de recursos

| Objeto | Cobertura |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (Stage 3) | completa |
| `Symbol.dispose`, `Symbol.asyncDispose` | completa |
| Declaraciones `using` / `await using` | completas |

### Otros

| Objeto | Cobertura |
|---|---|
| `RegExp` (incluye la notación de conjuntos `/v`, capturas con nombre, búsqueda hacia delante y hacia atrás, indicadores sticky/global) | completa |
| Helpers `Iterator` (Stage 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | completa |
| `ShadowRealm` (Stage 3) | completa |
| `globalThis` | ✅ |

## API de la plataforma web (WHATWG / W3C, no TC39)

Además del ECMAScript puro, Phasis incluye varios paquetes escalonados de API web que las bibliotecas JS del mundo real verifican de antemano. Consulta [API web](https://phasis.inline0.dev/es/docs/compatibility/web-apis) para ver toda la superficie y la conformidad por área.

| Paquete | Globales | 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`, Streams completo de WHATWG (`ReadableStream`, `WritableStream`, `TransformStream`, estrategias de encolado, BYOB), `CompressionStream` / `DecompressionStream` (zlib + brotli opcional mediante `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` (constructor + códec de tramas RFC 6455, transporte sustituible mediante `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (implementado sobre el transporte fetch, por lo que se aplican los hooks de política) | 100 % |
| **Bucle de eventos** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (Stage 3) | n/a (probado con oráculo) |

¹ Se excluyen las subpruebas permitidas en los casos de prueba de compresión: los casos de brotli, que requieren `ext-brotli`, y los casos que reciben una entrada respaldada por `SharedArrayBuffer` (`EXPECTED_FAILURES` en `tests/Wpt/WptTest.php`).

Todas las demás Web Platform Tests importadas pasan; consulta [API web](https://phasis.inline0.dev/es/docs/compatibility/web-apis) para ver el desglose de conformidad.

## Lo que aún no está implementado

- **Semántica de SharedArrayBuffer en workers** más allá de un único agente: la notificación atómica entre varios hilos reales del sistema operativo requiere `pcntl` y no está prevista. Los átomos de un solo agente funcionan.
- **`Intl.Segmenter` con grupos de grafemas que requieren ICU 76+**: depende de la versión de la extensión `intl` de PHP del sistema anfitrión.

## Versionado

Phasis sigue el versionado semántico. La línea de versiones sigue los borradores de la especificación ECMAScript:

| Versión de Phasis | Objetivo de la especificación | Propuestas Stage 3 |
|---|---|---|
| 0.x | ES2024 | decoradores, Temporal, gestión explícita de recursos, helpers de iteradores, métodos de conjuntos |

La versión 1.0 depende de que se implementen todas las propuestas Stage 4 del borrador ES2025 y de que la semántica de vaciado de Promise sea estable.
