
# CLI

Phasis obsahuje tři hlavní spustitelné soubory v `bin/`:

- **`bin/phasis`** — spouští soubory JavaScript, vyhodnocuje zdrojový kód předaný v příkazovém řádku a vypisuje AST.
- **`bin/test262`** — spouští oficiální sadu testů shody s ECMAScriptem pro Phasis.
- **`bin/wpt`** — spouští testovací případy Web Platform Tests pro Phasis (URL, kódování, fetch, hlavičky, Blob, AbortSignal, streamy, …).

Po `composer require phasis/phasis` jsou `bin/phasis` a `bin/test262` propojené z `vendor/bin/`. Odtud funguje pouze `bin/phasis`: `bin/test262` potřebuje submodul `test262` git a testovací třídy, které balíček Composer neobsahuje, a `bin/wpt` se vůbec nedodává. Spusťte oba z klonu repozitáře Phasis.

## bin/phasis

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

Tyto tři formy představují celé rozhraní. Není k dispozici REPL, vstup ze stdin ani příznak pro moduly.

### Spuštění souboru

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

Spustí `script.js` jako klasický skript. Po jeho dokončení se vše, co skript zapsal pomocí `console.log` (a `console.error`, `console.warn`, …), najednou vypíše na stdout. Pokud skript vyvolá chybu, její zpráva se vypíše na stderr a návratový kód bude 1.

Soubor se vždy parsuje jako klasický skript, takže soubor obsahující `import` / `export` nebo `await` na nejvyšší úrovni skončí chybou SyntaxError. Chcete-li spustit modul ES, použijte `Engine::evalAsModule()` z PHP (viz [příručka API](https://phasis.inline0.dev/cs/docs/api#evalasmodule)) nebo kód nejprve zabalte.

### Vyhodnocení zdrojového kódu

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

Argument se vyhodnotí jako úplný skript. Vypíše se pouze výstup `console`; hodnota posledního výrazu se nevypisuje, takže `phasis -e '1 + 2'` nic nevypíše.

### Výpis AST

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

Vypíše syntaktický strom ve formátu JSON (s odsazením o dvě mezery). Hodí se k ladění problémů s parserem nebo k vytváření nástrojů postavených na Phasis. Pro programový přístup použijte [parser API](https://phasis.inline0.dev/cs/docs/parser).

## bin/test262

`bin/test262` spouští [oficiální sadu testů test262](https://github.com/tc39/test262) pro Phasis. Hodí se jako testovací sada pro regresní testy při přispívání změnami. Snímek celé sady v `COMPAT.md` vytváří související nástroj `bin/compat-report`, který se spouští ručně jako matice CI rozdělená do částí.

### Spuštění jedné kategorie

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

### Spuštění celé sady

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

### Konfigurace

Spouštěč načítá `config/support.php` z kořene projektu. Jeho seznam `test262_skipped_features` je prázdný: nepřeskakuje se žádná funkce test262, včetně `tail-call-optimization`. Soubor také uvádí kategorie a testy, které se musí spustit izolovaně.

Samotná testovací sada je submodul `test262` git; po naklonování spusťte `git submodule update --init test262`. Bez ní se spouštěč ukončí s hlášením „testovací sada test262 nebyla nalezena“.

### Další užitečné příznaky

| Příznak | Účel |
|---|---|
| `--failures` | vypíše jeden řádek pro každý neúspěšný test |
| `--limit N` | zastaví se po prvních N testech |
| `--jobs N` | spustí N testů paralelně |
| `--files-from file` | spustí pouze testy uvedené v `file` |
| `--json` | vypíše na stdout souhrn čitelný pro počítače |
| `--no-progress` | potlačí řádek s průběhem |

Aktuální snímek najdete v části [Kompatibilita](https://phasis.inline0.dev/cs/docs/compatibility).

## bin/wpt

`bin/wpt` spouští testovací případy Web Platform Tests importované do `tests/Wpt/fixtures/`. Korpus pokrývá URL, kódování, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, celé rozhraní `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` a `WebSocket`. Tabulku úspěšnosti jednotlivých oblastí najdete v části [Web APIs](https://phasis.inline0.dev/cs/docs/compatibility/web-apis).

### Spuštění všech importovaných testovacích případů

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

### Spuštění jedné kategorie

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

### Výstup pro jednotlivé podtesty

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

Vypíše každý podtest (PASS / FAIL) v rámci jednotlivých testovacích případů a při neúspěchu také zprávy o selhání kontrolních tvrzení.

### Výstup JSON

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

Souhrn úspěšných a neúspěšných testů ve strojově čitelném formátu pro CI kanály nebo skriptovanou analýzu.

### Poznámky

- Testy pracující s fetch automaticky spustí přibalený testovací server WPT na adrese `tests/Wpt/fetch-server.php` na `127.0.0.1:8765` a po dokončení jej ukončí.
- Náhrada pro testovací prostředí na adrese `tests/Wpt/testharness-shim.js` implementuje pouze rozhraní API WPT, které používají importované testy (~400 řádků oproti úplnému souboru `testharness.js` o ~3 tisících řádcích).
- Zdrojové testy jsou uloženy v `tests/Wpt/upstream/` (řídký checkout [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt) ignorovaný Gitem). Chcete-li importovat další, zkopírujte soubory `.any.js` z `upstream/<area>/` do `fixtures/<category>/` a runner je automaticky načte.

## Návratové kódy

`bin/phasis` končí s jedním ze dvou návratových kódů:

| Kód | Význam |
|---|---|
| `0` | úspěch — skript se dokončil (také po `--ast`) |
| `1` | cokoli jiného: nezachycená výjimka JS, syntaktická chyba, chybějící soubor nebo neplatné argumenty |

Chyby skriptu vypisují svou zprávu na stderr. Neplatné argumenty a chybějící soubory vypíší na stderr řádek s nápovědou k použití.

## Limity prostředků

`bin/phasis` běží s výchozím nastavením stroje a nemá příznaky pro limity: limit hloubky zásobníku volání JS činí 4,096 rámců, limit hloubky transpileovaných uzávěrů 8,192 rámců a výchozí `maxLoopIterations` má hodnotu 100,000; platí pouze pro kód spouštěný interpretem, který prochází strom (viz [API: setLimit](https://phasis.inline0.dev/cs/docs/api#setlimit)). Časový limit neexistuje; pokud skript nemusí skončit, obalte příkaz pomocí `timeout`.
