
# Zakres specyfikacji

Phasis jest zgodny z aktualną specyfikacją ECMAScript (ES2024+) i uwzględnia propozycje TC39 na etapie Stage 3 i wyższym. Ta strona to czytelny dla człowieka indeks tego, co faktycznie zostało dostarczone.

## Język

| Funkcja | Status |
|---|:---:|
| Deklaracje leksykalne (`let`, `const`) z TDZ | ✅ |
| Zakres blokowy, zakres funkcji, zakres modułu | ✅ |
| Funkcje strzałkowe (z leksykalnym `this`) | ✅ |
| Parametry domyślne, parametry rest, rozproszenie | ✅ |
| Destrukturyzacja (tablic, obiektów, zagnieżdżona, z wartościami domyślnymi i rest) | ✅ |
| Literały szablonowe, szablony z tagami | ✅ |
| Obliczane nazwy właściwości | ✅ |
| Skrócone właściwości i metody | ✅ |
| Klasy — konstruktory, metody, gettery/settery, elementy statyczne | ✅ |
| Pola klas (publiczne, prywatne, statyczne) | ✅ |
| Metody prywatne i akcesory | ✅ |
| `super` w metodach i konstruktorach | ✅ |
| Dekoratory (Stage 3) | ✅ |
| Bloki inicjalizujące elementy statyczne | ✅ |
| Łańcuchowanie opcjonalne (`?.`), koalescencja wartości nullish (`??`) | ✅ |
| Operatory przypisania logicznego (`&&=`, `\|\|=`, `??=`) | ✅ |
| Separatory numeryczne (`1_000_000`) | ✅ |
| Literały BigInt (`123n`) i operatory | ✅ |
| Funkcje asynchroniczne, generatory asynchroniczne, await na najwyższym poziomie | ✅ |
| Generatory (synchroniczne i asynchroniczne) | ✅ |
| `for…of`, `for…in`, `for await…of` | ✅ |
| Iteratory i obiekty iterowalne (Symbol.iterator) | ✅ |
| Prymitywy Symbol i symbole dobrze znane | ✅ |
| Moduły ES (`import` / `export`, dynamiczne `import()`) | ✅ |
| `import.meta` | ✅ |
| `import attributes` (Stage 3) | ✅ |
| Tryb ścisły + starsze zachowania Annex B | ✅ |
| Wyrażenia regularne (`/u`, `/v`, `/d`, nazwane grupy, lookbehind) | ✅ |
| Automatyczne wstawianie średników (ASI) | ✅ |
| Gramatyka hashbang (`#!/usr/bin/env phasis`) | ✅ |
| Poprawne wywołania ogonowe w trybie ścisłym (ES2015, wymagane przez specyfikację) | ✅ |

## Biblioteka standardowa

### Podstawowe

| Obiekt | Zakres obsługi |
|---|---|
| `Object` | pełna — `keys`, `values`, `entries`, `assign`, `create`, `freeze`, `seal`, `getOwnPropertyDescriptor(s)`, `setPrototypeOf`, `getOwnPropertyNames`, `getOwnPropertySymbols`, `hasOwn`, `groupBy`, `fromEntries` i inne |
| `Array` | pełna — wszystkie metody prototypu, w tym `at`, `flatMap`, `flat`, `findLast`, `findLastIndex`, `toReversed`, `toSorted`, `toSpliced`, `with`, `group`, `groupToMap` |
| `String` | pełna — `at`, `codePointAt`, `match`, `matchAll`, `replaceAll`, `padStart`, `padEnd`, `trimStart`, `trimEnd`, `isWellFormed`, `toWellFormed` |
| `Number` | pełna — `isFinite`, `isInteger`, `isNaN`, `isSafeInteger`, `EPSILON`, `MAX_SAFE_INTEGER` i inne |
| `BigInt` | pełna — dowolna precyzja przez bcmath |
| `Boolean` | pełna |
| `Math` | pełna — każda metoda i każdy przypadek specjalny dla NaN / Infinity / -0 |
| `JSON` | pełna — `parse`, `stringify`, własne funkcje replacer, reviver i wcięcia |
| `Symbol` | pełna — `for`, `keyFor`, wszystkie dobrze znane symbole, `Symbol.toPrimitive` |
| `Function` | pełna — semantyka `call`, `apply`, `bind`, `length`, `name`, `prototype` |

### Kolekcje

| Obiekt | Zakres obsługi |
|---|---|
| `Map` | pełna — w tym `groupBy` i iteracja na żywo |
| `Set` | pełna — w tym `intersection`, `union`, `difference`, `symmetricDifference`, `isSubsetOf`, `isSupersetOf`, `isDisjointFrom` |
| `WeakMap`, `WeakSet`, `WeakRef`, `FinalizationRegistry` | pełna |

### Asynchroniczność

| Obiekt | Zakres obsługi |
|---|---|
| `Promise` | pełna — `all`, `race`, `any`, `allSettled`, `withResolvers`, iteracja asynchroniczna |
| `AsyncIterator`, `AsyncGenerator` | pełna |
| Planowanie zadań mikrotask | ✅ |

### Dane binarne

| Obiekt | Zakres obsługi |
|---|---|
| `ArrayBuffer`, `SharedArrayBuffer` | pełna |
| `DataView` | pełna — `getBigInt64`, `setBigInt64` i inne |
| `Int8Array`, `Uint8Array`, `Uint8ClampedArray`, `Int16Array`, `Uint16Array`, `Int32Array`, `Uint32Array`, `BigInt64Array`, `BigUint64Array`, `Float16Array`, `Float32Array`, `Float64Array` | pełna |
| `Atomics` — `add`, `sub`, `and`, `or`, `xor`, `compareExchange`, `exchange`, `isLockFree`, `load`, `notify`, `pause`, `store`, `wait`, `waitAsync` | pełna (tylko jeden agent)

### Refleksja i proxy

| Obiekt | Zakres |
|---|---|
| `Proxy` | wszystkie 13 pułapek, możliwość cofnięcia |
| `Reflect` | wszystkie 14 metod statycznych |

### Błędy

| Obiekt | Zakres |
|---|---|
| `Error`, `TypeError`, `RangeError`, `ReferenceError`, `SyntaxError`, `URIError`, `EvalError` | pełny |
| `AggregateError` | pełny |
| `SuppressedError` (jawne zarządzanie zasobami — etap 3) | pełny |

### Daty i godziny

| Obiekt | Zakres |
|---|---|
| `Date` | pełny |
| `Temporal` (etap 3) | pełny — `Now`, `Instant`, `PlainDate`, `PlainTime`, `PlainDateTime`, `PlainYearMonth`, `PlainMonthDay`, `ZonedDateTime`, `Duration`, `TimeZone`, `Calendar` (w tym hebrajski, chiński, Dangi, etiopski itd.) |

### Internacjonalizacja

| Obiekt | Zakres |
|---|---|
| `Intl.Locale`, `Intl.Collator`, `Intl.DateTimeFormat`, `Intl.NumberFormat`, `Intl.PluralRules`, `Intl.RelativeTimeFormat`, `Intl.ListFormat`, `Intl.DisplayNames`, `Intl.Segmenter` | pełny (w razie dostępności deleguje do rozszerzenia `intl` obiektu PHP) |

### Zarządzanie zasobami

| Obiekt | Zakres |
|---|---|
| `DisposableStack`, `AsyncDisposableStack` (etap 3) | pełny |
| `Symbol.dispose`, `Symbol.asyncDispose` | pełny |
| deklaracje `using` / `await using` | pełne |

### Inne

| Obiekt | Zakres |
|---|---|
| `RegExp` (w tym notacja zbiorów `/v`, nazwane grupy przechwytujące, lookaround, flagi sticky/global) | pełny |
| pomocniki `Iterator` (etap 3) — `map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`, `find` | pełne |
| `ShadowRealm` (etap 3) | pełny |
| `globalThis` | ✅ |

## Interfejsy API platformy WWW (WHATWG / W3C, nie TC39)

Poza czystym ECMAScript Phasis dostarcza kilka warstwowych pakietów interfejsów API platformy WWW, które rzeczywiste biblioteki JS sprawdzają wstępnie. Pełny zakres i zgodność w poszczególnych obszarach opisano na stronie [Interfejsy API platformy WWW](https://phasis.inline0.dev/pl/docs/compatibility/web-apis).

| Pakiet | Zmienne globalne | WPT |
|---|---|---|
| **Platforma WWW** | `URL`, `URLSearchParams`, `URLPattern`, `TextEncoder`, `TextDecoder`, `atob`, `btoa`, `structuredClone`, `performance`, `console`, `setTimeout` / `setInterval` / `queueMicrotask`, `reportError`, `self` (alias dla `globalThis`), `DOMException` | 100 % |
| **Fetch** | `fetch`, `Request`, `Response`, `Headers`, domieszka `Body`, `AbortController`, `AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`, `Event`, pełna obsługa strumieni WHATWG (`ReadableStream`, `WritableStream`, `TransformStream`, strategie kolejkowania, BYOB), `CompressionStream` / `DecompressionStream` (zlib + opcjonalny brotli przez `ext-brotli`), `navigator` | 100 %¹ |
| **Crypto** | `crypto.getRandomValues`, `crypto.randomUUID`, pełny `SubtleCrypto` (digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA P-256/384/521, ECDH, HKDF, PBKDF2) | 100 % |
| **WebSocket** | `WebSocket` (konstruktor + koder ramek RFC 6455, wymienny transport przez `setWebSocketTransport`) | 100 % |
| **XHR** | `XMLHttpRequest` + `XMLHttpRequestUpload` + `ProgressEvent` (oparte na transporcie fetch, więc obowiązują zaczepy zasad) | 100 % |
| **Pętla zdarzeń** | `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`, `AsyncContext` (etap 3) | nie dotyczy (testowane względem wzorca) |

¹ Z wyłączeniem dozwolonych podtestów w zestawach testowych kompresji: przypadków brotli, które wymagają `ext-brotli`, oraz przypadków przekazujących dane wejściowe oparte na `SharedArrayBuffer` (`EXPECTED_FAILURES` w `tests/Wpt/WptTest.php`).

Wszystkie pozostałe zaimportowane testy platformy WWW przechodzą — zestawienie zgodności znajdziesz na stronie [Interfejsy API platformy WWW](https://phasis.inline0.dev/pl/docs/compatibility/web-apis).

## Jeszcze niezaimplementowane elementy

- **Semantyka SharedArrayBuffer wątków roboczych** poza pojedynczym agentem — atomowe powiadamianie między wieloma rzeczywistymi wątkami systemu operacyjnego wymaga `pcntl` i nie ma go w planach. Atomiki pojedynczego agenta działają.
- **`Intl.Segmenter` z klastrami grafemów wymagającymi ICU 76+** — zależy od wersji rozszerzenia `intl` hosta PHP.

## Wersjonowanie

Phasis stosuje semver. Linia wersji odpowiada wersjom roboczym specyfikacji ECMAScript:

| Wersja Phasis | Docelowa specyfikacja | Propozycje etapu 3 |
|---|---|---|
| 0.x | ES2024 | dekoratory, Temporal, jawne zarządzanie zasobami, pomocniki iteratorów, metody zbiorów |

Wydanie wersji 1.0 wymaga zaimplementowania każdej propozycji etapu 4 z projektu ES2025 oraz ustabilizowania semantyki opróżniania Promise.
