
# Surface de la spécification

Phasis cible la spécification ECMAScript actuelle (ES2024+) et suit les propositions du TC39 au stade 3 et au-delà. Cette page constitue l'index lisible par un humain de ce qui est effectivement fourni.

## Langage

| Fonctionnalité | État |
|---|:---:|
| Déclarations lexicales (`let`, `const`) avec TDZ | ✅ |
| Portée de bloc, portée de fonction, portée de module | ✅ |
| Fonctions fléchées (avec `this` lexical) | ✅ |
| Paramètres par défaut, paramètres rest, spread | ✅ |
| Déstructuration (tableaux, objets, imbrication, valeurs par défaut, rest) | ✅ |
| Littéraux de gabarit, gabarits marqués | ✅ |
| Noms de propriétés calculés | ✅ |
| Propriétés et méthodes abrégées | ✅ |
| Classes — constructeurs, méthodes, accesseurs, statiques | ✅ |
| Champs de classe (publics, privés, statiques) | ✅ |
| Méthodes et accesseurs privés | ✅ |
| `super` dans les méthodes et les constructeurs | ✅ |
| Décorateurs (stade 3) | ✅ |
| Blocs d'initialisation statiques | ✅ |
| Chaînage optionnel (`?.`), coalescence des valeurs nulles (`??`) | ✅ |
| Opérateurs d'affectation logique (`&&=`, `\|\|=`, `??=`) | ✅ |
| Séparateurs numériques (`1_000_000`) | ✅ |
| Littéraux BigInt (`123n`) et opérateurs | ✅ |
| Fonctions asynchrones, générateurs asynchrones, await au niveau supérieur | ✅ |
| Générateurs (synchrones et asynchrones) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Itérateurs et itérables (Symbol.iterator) | ✅ |
| Primitifs Symbol et symboles bien connus | ✅ |
| Modules ES (`import` / `export`, `import()` dynamique) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (stade 3) | ✅ |
| Mode strict et comportements hérités de l'Annex B | ✅ |
| Expressions régulières (`/u`, `/v`, `/d`, groupes nommés, lookbehind) | ✅ |
| Insertion automatique de points-virgules (ASI) | ✅ |
| Grammaire hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Appels terminaux optimisés en mode strict (ES2015, exigés par la spécification) | ✅ |

## Bibliothèque standard

### Fondamentaux

| Objet | Couverture |
|---|---|
| `Object` | complète — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries`, etc. |
| `Array` | complète — toutes les méthodes de prototype, dont `at`, `flatMap`, `flat`, `findLast`, `findLastIndex`, `toReversed`, `toSorted`, `toSpliced`, `with`, `group`, `groupToMap` |
| `String` | complète — `at`, `codePointAt`, `match`, `matchAll`, `replaceAll`, `padStart`, `padEnd`, `trimStart`, `trimEnd`, `isWellFormed`, `toWellFormed` |
| `Number` | complète — `isFinite`, `isInteger`, `isNaN`, `isSafeInteger`, `EPSILON`, `MAX_SAFE_INTEGER`, etc. |
| `BigInt` | complète — précision arbitraire via bcmath |
| `Boolean` | complète |
| `Math` | complète — toutes les méthodes, tous les cas particuliers pour NaN / Infinity / -0 |
| `JSON` | complète — `parse`, `stringify`, remplaçants personnalisés, reviver, indentation |
| `Symbol` | complète — `for`, `keyFor`, tous les symboles bien connus, `Symbol.toPrimitive` |
| `Function` | complète — sémantique de `call`, `apply`, `bind`, `length`, `name`, `prototype` |

### Collections

| Objet | Couverture |
|---|---|
| `Map` | complète — y compris `groupBy` et l'itération en temps réel |
| `Set` | complète — y compris `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | complète |

### Asynchrone

| Objet | Couverture |
|---|---|
| `Promise` | complète — `all`, `race`, `any`, `allSettled`, `withResolvers`, itération asynchrone |
| `AsyncIterator`, `AsyncGenerator` | complète |
| Ordonnancement des microtâches | ✅ |

### Données binaires

| Objet | Couverture |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | complète |
| `DataView` | complète — `getBigInt64`, `setBigInt64`, etc. |
| `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `BigInt64Array`, `BigUint64Array`, `Float16Array`, `Float32Array`, `Float64Array` | complète |
| `Atomics` — `add`, `sub`, `and`, `or`, `xor`, `compareExchange`, `exchange`, `isLockFree`, `load`, `notify`, `pause`, `store`, `wait`, `waitAsync` | complète (agent unique uniquement) |

### Réflexion et proxys

| Objet | Couverture |
|---|---|
| `Proxy` | les 13 pièges, révocables |
| `Reflect` | les 14 méthodes statiques |

### Erreurs

| Objet | Couverture |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | complète |
| `AggregateError` | complète |
| `SuppressedError` (gestion explicite des ressources, étape 3) | complète |

### Dates et heures

| Objet | Couverture |
|---|---|
| `Date` | complète |
| `Temporal` (étape 3) | complète — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (y compris l'hébreu, le chinois, le Dangi, l'éthiopien, etc.) |

### Internationalisation

| Objet | Couverture |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | complète (délègue à l'extension `intl` de PHP lorsqu'elle est disponible) |

### Gestion des ressources

| Objet | Couverture |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (étape 3) | complète |
| `Symbol.dispose`, `Symbol.asyncDispose` | complète |
| Déclarations `using` / `await using` | complètes |

### Autres

| Objet | Couverture |
|---|---|
| `RegExp` (y compris la notation d'ensemble `/v`, les captures nommées, les assertions de recherche et les indicateurs sticky/global) | complète |
| Assistants `Iterator` (étape 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | complète |
| `ShadowRealm` (étape 3) | complète |
| `globalThis` | ✅ |

## API de la plateforme Web (WHATWG / W3C, hors TC39)

Au-delà d'ECMAScript, Phasis fournit plusieurs ensembles d'API Web à plusieurs niveaux, que les bibliothèques JS du monde réel vérifient au préalable. Consultez [API Web](https://phasis.inline0.dev/fr/docs/compatibility/web-apis) pour découvrir toute la surface et la conformité par domaine.

| Ensemble | Globals | WPT |
|---|---|---|
| **Plateforme 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 WHATWG complets (`ReadableStream`, `WritableStream`, `TransformStream`, stratégies de mise en file d'attente, BYOB), `CompressionStream` / `DecompressionStream` (zlib + brotli facultatif via `ext-brotli`), `navigator` | 100 %¹ |
| **Crypto** | `crypto.getRandomValues`, `crypto.randomUUID`, `SubtleCrypto` complet (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (constructeur + codec de trames RFC 6455, transport remplaçable via `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (au-dessus du transport fetch, les hooks de stratégie s'appliquent donc) | 100 % |
| **Boucle d'événements** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (étape 3) | s.o. (testé par oracle) |

¹ À l'exclusion des sous-tests autorisés dans les jeux de tests de compression : les cas brotli, qui nécessitent `ext-brotli`, et ceux qui utilisent une entrée reposant sur `SharedArrayBuffer` (`EXPECTED_FAILURES` dans `tests/Wpt/WptTest.php`).

Tous les autres tests importés de la plateforme Web réussissent — consultez [API Web](https://phasis.inline0.dev/fr/docs/compatibility/web-apis) pour le détail de la conformité.

## Fonctionnalités pas encore implémentées

- **Sémantique des workers SharedArrayBuffer** au-delà d'un seul agent — la notification atomique multithread entre de vrais threads du système d'exploitation nécessite `pcntl` et n'est pas prévue. Les opérations atomiques sur un seul agent fonctionnent.
- **`Intl.Segmenter` avec des graphèmes nécessitant ICU 76+** — dépend de la version de l'extension `intl` du PHP hôte.

## Gestion des versions

Phasis suit le versionnage sémantique. La branche de version suit les brouillons de spécification ECMAScript :

| Version de Phasis | Cible de la spécification | Propositions de l'étape 3 |
|---|---|---|
| 0.x | ES2024 | décorateurs, Temporal, gestion explicite des ressources, assistants d'itération, méthodes d'ensemble |

Le passage à la version 1.0 dépend de l'implémentation de toutes les propositions de l'étape 4 dans le brouillon ES2025 et de la stabilité de la sémantique de vidage des Promises.
