
# Zgodność

Phasis zweryfikowano przy użyciu trzech niezależnych źródeł referencyjnych:

1. **test262** — oficjalny zestaw testów zgodności ECMAScript TC39. **100 %** rewizji przypiętej w repozytorium.
2. **Web Platform Tests** — oficjalny zestaw WHATWG / W3C dla internetowych API innych niż ECMAScript (fetch, XHR, WebSocket, Streams, Headers, Blob, kodowanie, URL, structured-clone, abort, hr-time, atob, crypto). **100 %** zaimportowanego zbioru testów.
3. **Popularne biblioteki** — 204 szeroko używanych pakietów npm (acorn, lodash, zod, ramda, immer, redux, date-fns, marked, fuse.js, semver, validator, …) wykonuje się identycznie bajt po bajcie jak Node.js.

## W porównaniu z innymi silnikami

| Silnik | test262 | Uwagi |
|---|---:|---|
| **Phasis** | **100 %** | Czysty PHP. Obsługuje ES2024 i nowsze. |
| V8 (Node, Chrome) | 99.8 % | Referencyjny silnik C++. |
| SpiderMonkey (Firefox) | 99.6 % | Referencyjny silnik C++. |
| JavaScriptCore (Safari) | 99.4 % | Referencyjny silnik C++. |
| QuickJS | ~97 % | Lekki silnik osadzalny napisany w C. |
| Hermes (React Native) | ~95 % | Silnik osadzalny zoptymalizowany pod kątem urządzeń mobilnych. |

Dane z [test262.fyi](https://test262.fyi). Phasis plasuje się w czołówce obok silników używanych w przeglądarkach.

## Strony

- **[test262 — zakres testów](https://phasis.inline0.dev/pl/docs/compatibility/test262)** — co jest testowane, jak działa zestaw i dlaczego 100% ma znaczenie.
- **[API internetowe (WPT)](https://phasis.inline0.dev/pl/docs/compatibility/web-apis)** — Web Platform Pack i Fetch Pack: URL, kodowanie, atob/btoa, structuredClone, performance, Headers, Blob, AbortSignal, EventTarget, Streams, a także crypto, WebSocket i XMLHttpRequest.
- **[Strumienie](https://phasis.inline0.dev/pl/docs/compatibility/streams)** — pełny standard WHATWG Streams: ReadableStream, WritableStream, TransformStream, BYOB, tee, pipeTo/pipeThrough, strategie kolejkowania, iteracja asynchroniczna.
- **[Popularne pakiety](https://phasis.inline0.dev/pl/docs/compatibility/popular-packages)** — weryfikowana w CI zgodność bajt po bajcie z Node.js dla 204 pakietów npm obejmujących analizowanie, szablony, walidację, daty i godziny, matematykę, haszowanie, wyszukiwanie i porównywanie, kolory, obsługę URL i nie tylko.
- **[Zakres specyfikacji](https://phasis.inline0.dev/pl/docs/compatibility/spec-surface)** — wszystkie wbudowane elementy ECMAScript, funkcje składniowe i obiekty biblioteki standardowej dostarczane przez Phasis.
- **[Znane ograniczenia](https://phasis.inline0.dev/pl/docs/compatibility/limitations)** — obszary, w których Phasis celowo odbiega od V8: limit wydajności, współbieżność wielu agentów, Wasm, internetowe API dostępne tylko w przeglądarkach.

## Jak wykonywane są pomiary

- **test262** — `bin/test262` uruchamia zestaw lokalnie. Pełna macierz jest uruchamiana ręcznie w procesie `compat-matrix.yml`, a nie przy każdym pushu; po udanym przebiegu migawka trafia do [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md), gdzie zapisuje się datę jej wykonania i commit, dla którego ją utworzono. Wersja zestawu testów jest przypięta przez podmoduł Git `test262`.
- **Web Platform Tests** — `bin/wpt` uruchamia zaimportowane fixture’y. Proces `wpt.yml` uruchamia je po pushach do `main` oraz przy pull requestach zmieniających `src/`, fixture’y lub pliki Composer.
- **Popularne biblioteki** — `composer test` uruchamia PHPUnit, w tym zestaw testów zgodności bajt po bajcie popularnych bibliotek, w ramach `tests/Popular/`. Proces `popular.yml` uruchamia go przy tej samej filtracji ścieżek, a także ponownie generuje wszystkie źródła referencyjne w prawdziwym Node, dzięki czemu aktualizacja dołączonej biblioteki ujawni nieaktualne źródło referencyjne.

Regresja w WPT lub popularnym pakiecie powoduje niepowodzenie pull requesta, który ją wprowadza. Regresja test262 zostanie wykryta przy następnym uruchomieniu macierzy.
