
# Copertura delle specifiche

Phasis ha come obiettivo la specifica ECMAScript attuale (ES2024+) e segue le proposte TC39 allo Stage 3 e superiori. Questa pagina è l'indice leggibile di ciò che è effettivamente incluso.

## Linguaggio

| Funzionalità | Stato |
|---|:---:|
| Dichiarazioni lessicali (`let`, `const`) con TDZ | ✅ |
| Ambito di blocco, di funzione e di modulo | ✅ |
| Funzioni freccia (con `this` lessicale) | ✅ |
| Parametri predefiniti, parametri rest, spread | ✅ |
| Destrutturazione (array, oggetti, annidata, valori predefiniti, rest) | ✅ |
| Template literal e template literal con tag | ✅ |
| Nomi di proprietà calcolati | ✅ |
| Proprietà e metodi abbreviati | ✅ |
| Classi — costruttori, metodi, getter/setter, statici | ✅ |
| Campi di classe (pubblici, privati, statici) | ✅ |
| Metodi e accessor privati | ✅ |
| `super` in metodi e costruttori | ✅ |
| Decorator (Stage 3) | ✅ |
| Blocchi di inizializzazione statici | ✅ |
| Chaining opzionale (`?.`), coalescenza dei nullish (`??`) | ✅ |
| Operatori di assegnazione logica (`&&=`, `\|\|=`, `??=`) | ✅ |
| Separatore numerico (`1_000_000`) | ✅ |
| Literal BigInt (`123n`) e operatori | ✅ |
| Funzioni asincrone, generatori asincroni, await a livello superiore | ✅ |
| Generator (sincroni e asincroni) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Iterator e iterabili (Symbol.iterator) | ✅ |
| Primitivi Symbol e simboli noti | ✅ |
| Moduli ES (`import` / `export`, `import()` dinamico) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (Stage 3) | ✅ |
| Modalità strict + comportamenti legacy di Annex B | ✅ |
| Espressioni regolari (`/u`, `/v`, `/d`, gruppi con nome, lookbehind) | ✅ |
| Inserimento automatico del punto e virgola (ASI) | ✅ |
| Grammatica hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Tail call ottimali in modalità strict (ES2015, richieste dalla specifica) | ✅ |

## Libreria standard

### Fondamentali

| Oggetto | Copertura |
|---|---|
| `Object` | completa — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries`, ecc. |
| `Array` | completa — tutti i metodi prototype, inclusi `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`, ecc. |
| `BigInt` | completa — precisione arbitraria tramite bcmath |
| `Boolean` | completa |
| `Math` | completa — tutti i metodi e tutti i casi speciali per NaN / Infinity / -0 |
| `JSON` | completa — `parse`, `stringify`, replacer personalizzati, reviver, indentazione |
| `Symbol` | completa — `for`, `keyFor`, tutti i simboli noti, `Symbol.toPrimitive` |
| `Function` | completa — semantica di `call`, `apply`, `bind`, `length`, `name`, `prototype` |

### Collezioni

| Oggetto | Copertura |
|---|---|
| `Map` | completa — include `groupBy` e iterazione live |
| `Set` | completa — include `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | completa |

### Asincrono

| Oggetto | Copertura |
|---|---|
| `Promise` | completa — `all`, `race`, `any`, `allSettled`, `withResolvers`, iterazione asincrona |
| `AsyncIterator`, `AsyncGenerator` | completa |
| Pianificazione dei microtask | ✅ |

### Dati binari

| Oggetto | Copertura |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | completa |
| `DataView` | completa — `getBigInt64`, `setBigInt64`, ecc. |
| `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 singolo agente) |

### Reflection e proxy

| Oggetto | Copertura |
|---|---|
| `Proxy` | tutte le 13 trap, revocabile |
| `Reflect` | tutti i 14 metodi statici |

### Errori

| Oggetto | Copertura |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | completa |
| `AggregateError` | completa |
| `SuppressedError` (gestione esplicita delle risorse, Stage 3) | completa |

### Date e orari

| Oggetto | Copertura |
|---|---|
| `Date` | completa |
| `Temporal` (Stage 3) | completa — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (incl. ebraico, cinese, Dangi, etiope, ecc.) |

### Internazionalizzazione

| Oggetto | Copertura |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | completa (si affida all'estensione `intl` di PHP quando disponibile) |

### Gestione delle risorse

| Oggetto | Copertura |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (Stage 3) | completa |
| `Symbol.dispose`, `Symbol.asyncDispose` | completa |
| dichiarazioni `using` / `await using` | completa |

### Altro

| Oggetto | Copertura |
|---|---|
| `RegExp` (incl. notazione insiemistica `/v`, catture con nome, lookaround, flag sticky/globali) | completa |
| helper `Iterator` (Stage 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | completa |
| `ShadowRealm` (Stage 3) | completa |
| `globalThis` | ✅ |

## API della piattaforma Web (WHATWG / W3C, non TC39)

Oltre al solo ECMAScript, Phasis include diversi pacchetti stratificati di API Web per cui le librerie JS del mondo reale eseguono controlli preliminari. Consultate [API Web](https://phasis.inline0.dev/it/docs/compatibility/web-apis) per la copertura completa e la conformità per area.

| Pacchetto | Globali | WPT |
|---|---|---|
| **Piattaforma Web** | `URL`, `URLSearchParams`, `URLPattern`, `TextEncoder`, `TextDecoder`, `atob`, `btoa`, `structuredClone`, `performance`, `console`, `setTimeout` / `setInterval` / `queueMicrotask`, `reportError`, `self` (alias di `globalThis`), `DOMException` | 100 % |
| **Fetch** | `fetch`, `Request`, `Response`, `Headers`, mixin `Body`, `AbortController`, `AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`, `Event`, WHATWG Streams complete (`ReadableStream`, `WritableStream`, `TransformStream`, strategie di accodamento, BYOB), `CompressionStream` / `DecompressionStream` (zlib + brotli opzionale tramite `ext-brotli`), `navigator` | 100 %¹ |
| **Crittografia** | `crypto.getRandomValues`, `crypto.randomUUID`, `SubtleCrypto` completa (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (costruttore + codec di frame RFC 6455, trasporto sostituibile tramite `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (basati sul trasporto fetch, quindi si applicano gli hook delle policy) | 100 % |
| **Ciclo degli eventi** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (Stage 3) | n/a (test oracle) |

¹ Esclusi i sottotest autorizzati nei test di compressione: i casi brotli, che richiedono `ext-brotli`, e i casi che ricevono input basato su `SharedArrayBuffer` (`EXPECTED_FAILURES` in `tests/Wpt/WptTest.php`).

Tutti gli altri Web Platform Tests importati vengono superati: consultate [API Web](https://phasis.inline0.dev/it/docs/compatibility/web-apis) per il dettaglio della conformità.

## Funzionalità non ancora implementate

- **Semantica dei worker SharedArrayBuffer** oltre il singolo agente — la notifica atomica multithread tra thread reali del sistema operativo richiede `pcntl` e non è prevista nella roadmap. Gli atomici con un singolo agente funzionano.
- **`Intl.Segmenter` con cluster di grafemi che richiedono ICU 76+** — dipende dalla versione dell'estensione `intl` del PHP host.

## Versioni

Phasis segue il versionamento semantico. La versione segue le bozze delle specifiche ECMAScript:

| Versione Phasis | Specifica di riferimento | Proposte Stage 3 |
|---|---|---|
| 0.x | ES2024 | decorator, Temporal, gestione esplicita delle risorse, helper per iteratori, metodi per set |

Il passaggio alla versione 1.0 è subordinato all'implementazione di tutte le proposte Stage 4 della bozza ES2025 e alla stabilità della semantica di svuotamento di Promise.
