
# CLI

Phasis zawiera trzy główne programy wykonywalne w `bin/`:

- **`bin/phasis`** — uruchamia pliki JavaScript, oblicza kod źródłowy przekazany w wierszu poleceń i zrzuca AST.
- **`bin/test262`** — uruchamia oficjalny zestaw zgodności ECMAScript dla Phasis.
- **`bin/wpt`** — uruchamia testy Web Platform Tests dla Phasis (URL, kodowanie, fetch, nagłówki, Blob, AbortSignal, strumienie, …).

Po `composer require phasis/phasis`, `bin/phasis` i `bin/test262` są dowiązaniami do `vendor/bin/`. Działa tam tylko `bin/phasis`: `bin/test262` wymaga podmodułu git `test262` i klas testowych, których pakiet Composer nie zawiera, a `bin/wpt` w ogóle nie jest dołączony. Oba uruchamiaj z klonu repozytorium Phasis.

## bin/phasis

```
phasis <file.js> | phasis -e '<source>' | phasis --ast <file.js>
```

To cały interfejs: brak REPL, wejścia ze stdin i flagi modułu.

### Uruchamianie pliku

```bash
./vendor/bin/phasis script.js
```

Wykonuje `script.js` jako klasyczny skrypt. Po zakończeniu wszystkie treści wypisane przez skrypt za pomocą `console.log` (oraz `console.error`, `console.warn`, …) są jednocześnie drukowane na stdout. Jeśli skrypt zgłosi wyjątek, komunikat błędu trafia na stderr, a kod wyjścia wynosi 1.

Plik jest zawsze analizowany jako klasyczny skrypt, więc plik z `import` / `export` lub najwyższopoziomowym `await` powoduje błąd SyntaxError. Aby uruchomić moduł ES, użyj `Engine::evalAsModule()` z PHP (zobacz dokumentację [API](https://phasis.inline0.dev/pl/docs/api#evalasmodule)) albo najpierw zbundluj kod.

### Obliczanie kodu źródłowego

```bash
./vendor/bin/phasis -e 'console.log(Math.PI * 2)'
# 6.283185307179586
```

Drugi argument jest obliczany jako kompletny skrypt. Drukowane jest tylko wyjście `console`; wartość ostatniego wyrażenia nie jest wyświetlana, więc `phasis -e '1 + 2'` nic nie drukuje.

### Zrzut AST

```bash
./vendor/bin/phasis --ast script.js
./vendor/bin/phasis -e 'a + b' --ast
```

Drukuje drzewo parsowania w formacie JSON (z wcięciem dwóch spacji). Przydatne do debugowania problemów parsera lub tworzenia narzędzi opartych na Phasis. Aby uzyskać dostęp programistyczny, użyj [parser API](https://phasis.inline0.dev/pl/docs/parser).

## bin/test262

`bin/test262` uruchamia [oficjalny test262 zestaw zgodności](https://github.com/tc39/test262) dla Phasis. Przydaje się jako zestaw testów regresji przy wnoszeniu zmian. Pełny zrzut zestawu w `COMPAT.md` jest tworzony przez powiązane `bin/compat-report`, które ręcznie uruchamiana macierz CI wykonuje w shardach.

### Uruchamianie pojedynczej kategorii

```bash
./bin/test262 --category built-ins/Array
```

### Uruchamianie pełnego zestawu

```bash
./bin/test262 --jobs 4
```

### Konfiguracja

Runner odczytuje `config/support.php` z katalogu głównego projektu. Lista `test262_skipped_features` jest pusta: żadna funkcja test262 nie jest pomijana, w tym `tail-call-optimization`. Plik zawiera też listę kategorii oraz testów, które muszą być uruchamiane w izolacji.

Sam zestaw jest podmodułem git `test262`; po sklonowaniu uruchom `git submodule update --init test262`. Bez niego runner kończy działanie komunikatem "Nie znaleziono zestawu test262".

### Inne przydatne flagi

| Flaga | Działanie |
|---|---|
| `--failures` | wypisuje jeden wiersz dla każdego niezaliczonego testu |
| `--limit N` | kończy po pierwszych N testach |
| `--jobs N` | uruchamia równolegle N testów |
| `--files-from file` | uruchamia tylko testy wymienione w `file` |
| `--json` | emituje podsumowanie czytelne dla maszyny na stdout |
| `--no-progress` | ukrywa wiersz postępu |

Najnowszy zrzut znajdziesz w sekcji [Zgodność](https://phasis.inline0.dev/pl/docs/compatibility).

## bin/wpt

`bin/wpt` uruchamia fixtures Web Platform Tests zaimportowane do `tests/Wpt/fixtures/`. Zestaw obejmuje URL, kodowanie, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, pełny interfejs `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` oraz `WebSocket`. Tabela wskaźników zaliczenia dla poszczególnych obszarów znajduje się w sekcji [Interfejsy Web](https://phasis.inline0.dev/pl/docs/compatibility/web-apis).

### Uruchamianie wszystkich zaimportowanych fixtures

```bash
./bin/wpt
```

### Uruchamianie jednej kategorii

```bash
./bin/wpt --category headers
./bin/wpt --category streams
./bin/wpt --category blob
```

### Dane wyjściowe dla podtestów

```bash
./bin/wpt --category abort --verbose
```

Drukuje każdy podtest (PASS / FAIL) w ramach każdego fixture, a przy niepowodzeniu również komunikaty asercji.

### Dane wyjściowe JSON

```bash
./bin/wpt --json
```

Podsumowanie zaliczenia lub niezaliczenia w formacie czytelnym maszynowo dla potoków CI lub analizy skryptowej.

### Uwagi

- Testy fixture’ów korzystające z fetch automatycznie uruchamiają dołączony serwer testowy WPT pod adresem `tests/Wpt/fetch-server.php` na `127.0.0.1:8765`, a następnie go wyłączają.
- Warstwa pośrednicząca harnessu w `tests/Wpt/testharness-shim.js` implementuje tylko te elementy API WPT API, z których korzystają zaimportowane fixture’y (około 400 linii w porównaniu z pełnym plikiem liczącym około 3 tys. linii `testharness.js`).
- Fixture’y źródłowe znajdują się w `tests/Wpt/upstream/` (to ignorowany przez Git rzadki checkout [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Aby zaimportować kolejne, skopiuj pliki `.any.js` z `upstream/<area>/` do `fixtures/<category>/`, a runner wykryje je automatycznie.

## Kody wyjścia

`bin/phasis` kończy działanie z jednym z dwóch kodów:

| Kod | Znaczenie |
|---|---|
| `0` | powodzenie — skrypt wykonał się do końca (również po `--ast`) |
| `1` | każdy inny przypadek: nieobsłużony wyjątek JS, błąd składni, brakujący plik lub nieprawidłowe argumenty |

Błędy skryptu wypisują komunikat na standardowe wyjście błędów (stderr). Nieprawidłowe argumenty i brakujące pliki powodują wypisanie wiersza użycia na stderr.

## Limity zasobów

`bin/phasis` działa z domyślnymi ustawieniami silnika i nie udostępnia flag limitów: stos wywołań JS ma limit 4 096 ramek, transpilowane domknięcia są chronione limitem 8 192 ramek, a domyślne `maxLoopIterations` wynosi 100 000 i dotyczy tylko kodu wykonywanego przez interpreter przechodzący po drzewie (zobacz [API: setLimit](https://phasis.inline0.dev/pl/docs/api#setlimit)). Nie ma limitu czasu; jeśli skrypt może się nie zakończyć, uruchom polecenie przez `timeout`.
