
# CLI

Phasis obsahuje tri hlavné spustiteľné súbory v `bin/`:

- **`bin/phasis`** — spúšťanie súborov JavaScript, vyhodnocovanie zdrojového kódu zadaného v príkazovom riadku a výpis AST.
- **`bin/test262`** — spustenie oficiálnej testovacej sady zhody s ECMAScriptom pre Phasis.
- **`bin/wpt`** — spustenie testov Web Platform Tests pre Phasis (URL, kódovanie, fetch, hlavičky, Blob, AbortSignal, streamy, …).

Po `composer require phasis/phasis` sa `bin/phasis` a `bin/test262` prepoja z `vendor/bin/`. Odtiaľ funguje iba `bin/phasis`: `bin/test262` potrebuje podmodul `test262` git a testovacie triedy, ktoré balík Composer neobsahuje, a `bin/wpt` sa vôbec nedodáva. Obe spustite z klonu repozitára Phasis.

## bin/phasis

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

Tieto tri formy tvoria celé rozhranie. Nie je k dispozícii REPL, vstup zo stdin ani príznak modulu.

### Spustenie súboru

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

Spustí `script.js` ako klasický skript. Po jeho dokončení sa všetko, čo skript zapísal pomocou `console.log` (a `console.error`, `console.warn`, …), naraz vypíše na stdout. Ak skript vyvolá výnimku, chybová správa sa vypíše na stderr a stav ukončenia bude 1.

Súbor sa vždy spracuje ako klasický skript, takže súbor obsahujúci `import` / `export` alebo `await` na najvyššej úrovni skončí chybou SyntaxError. Ak chcete spustiť modul ES, použite `Engine::evalAsModule()` z PHP (pozrite si referenciu [API](https://phasis.inline0.dev/sk/docs/api#evalasmodule)) alebo najprv zabaľte kód do balíka.

### Vyhodnotenie zdrojového kódu

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

Argument sa vyhodnotí ako úplný skript. Vypisuje sa iba výstup `console`; hodnota posledného výrazu sa nevypíše, takže `phasis -e '1 + 2'` nevypíše nič.

### Výpis AST

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

Vypíše strom syntaktickej analýzy vo formáte JSON (odsadený o dve medzery). Hodí sa na ladenie problémov syntaktického analyzátora alebo na tvorbu nástrojov nad Phasis. Na programový prístup použite [analyzátor API](https://phasis.inline0.dev/sk/docs/parser).

## bin/test262

`bin/test262` spúšťa [oficiálnu test262 sadu](https://github.com/tc39/test262) testov pre Phasis. Je užitočná ako regresný testovací rámec pri prispievaní zmien. Snímku výsledkov celej sady v `COMPAT.md` vytvára súvisiaci `bin/compat-report`, ktorý ručne spúšťaná matica CI vykonáva po častiach.

### Spustenie jednej kategórie

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

### Spustenie celej sady

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

### Konfigurácia

Spúšťač načíta `config/support.php` z koreňového adresára projektu. Zoznam `test262_skipped_features` je prázdny: nevynecháva sa žiadna funkcia test262 vrátane `tail-call-optimization`. Súbor obsahuje aj zoznam kategórií a testov, ktoré sa musia spúšťať izolovane.

Samotná sada je podmodul `test262` git; po klonovaní spustite `git submodule update --init test262`. Bez neho sa spúšťač ukončí so správou „test262 sada sa nenašla“.

### Ďalšie užitočné príznaky

| Príznak | Účel |
|---|---|
| `--failures` | vypíše jeden riadok pre každý neúspešný test |
| `--limit N` | zastaví sa po prvých N testoch |
| `--jobs N` | spustí N testov paralelne |
| `--files-from file` | spustí iba testy uvedené v `file` |
| `--json` | vypíše strojovo čitateľný súhrn na stdout |
| `--no-progress` | potlačí riadok s priebehom |

Najnovšiu snímku nájdete v časti [Kompatibilita](https://phasis.inline0.dev/sk/docs/compatibility).

## bin/wpt

`bin/wpt` spúšťa testovacie súbory Web Platform Tests importované do `tests/Wpt/fixtures/`. Korpus zahŕňa URL, kódovanie, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, celé rozhranie `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` a `WebSocket`. Pre tabuľku úspešnosti jednotlivých oblastí si pozrite [Webové API](https://phasis.inline0.dev/sk/docs/compatibility/web-apis).

### Spustenie všetkých importovaných testov

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

### Spustenie jednej kategórie

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

### Výstup jednotlivých podtestov

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

Vypíše každý podtest (PASS / FAIL) v rámci každého testovacieho súboru a pri neúspechu aj správy o kontrolných výrazoch.

### Výstup JSON

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

Strojovo čitateľný súhrn úspešných a neúspešných testov pre CI pipeline alebo skriptovanú analýzu.

### Poznámky

- Testovacie súbory využívajúce fetch automaticky spustia pribalený testovací server WPT na adrese `tests/Wpt/fetch-server.php` na `127.0.0.1:8765` a potom ho vypnú.
- Pomocná vrstva spúšťača na adrese `tests/Wpt/testharness-shim.js` implementuje iba rozhranie WPT API, ktoré používajú importované testy (približne 400 riadkov oproti plnej verzii `testharness.js` s približne 3 000 riadkami).
- Zdrojové testy sa nachádzajú v `tests/Wpt/upstream/` (riedky checkout repozitára [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt) ignorovaný Gitom). Ak chcete importovať ďalšie testy, skopírujte súbory `.any.js` z `upstream/<area>/` do `fixtures/<category>/` a spúšťač ich automaticky nájde.

## Návratové kódy

`bin/phasis` sa ukončí jedným z dvoch kódov:

| Kód | Význam |
|---|---|
| `0` | úspech — skript sa vykonal do konca (aj po `--ast`) |
| `1` | čokoľvek iné: nezachytená výnimka JS, chyba syntaxe, chýbajúci súbor alebo neplatné argumenty |

Chyby zo skriptu vypíšu svoju správu na stderr. Neplatné argumenty a chýbajúce súbory vypíšu riadok s návodom na použitie na stderr.

## Limity zdrojov

`bin/phasis` používa predvolené nastavenia enginu a nemá príznaky pre limity: maximálne 4,096 rámcov zásobníka volaní JS, ochranný limit 8,192 rámcov pre transpilované uzávery a predvolenú hodnotu `maxLoopIterations` 100,000, ktorá sa vzťahuje iba na kód vykonávaný interpretom prechádzajúcim strom (pozri [API: setLimit](https://phasis.inline0.dev/sk/docs/api#setlimit)). Časový limit nie je nastavený; ak sa skript nemusí ukončiť, spustite príkaz pomocou `timeout`.
