
# CLI

Phasis include trei executabile principale în `bin/`:

- **`bin/phasis`** — rulează fișiere JavaScript, evaluează sursa transmisă în linia de comandă și afișează AST-uri.
- **`bin/test262`** — rulează suita oficială de conformitate ECMAScript pentru Phasis.
- **`bin/wpt`** — rulează fixture-urile Web Platform Tests pentru Phasis (URL, codificare, fetch, antete, Blob, AbortSignal, fluxuri, …).

După `composer require phasis/phasis`, `bin/phasis` și `bin/test262` sunt legate din `vendor/bin/`. De acolo funcționează doar `bin/phasis`: `bin/test262` necesită submodulul `test262` git și clasele de testare, care nu sunt incluse în pachetul Composer, iar `bin/wpt` nu este livrat deloc. Rulați-le pe ambele dintr-o clonă a depozitului Phasis.

## bin/phasis

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

Aceste trei forme alcătuiesc întreaga interfață. Nu există REPL, intrare stdin sau opțiune pentru module.

### Rularea unui fișier

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

Execută `script.js` ca script clasic. Când se termină, tot ce a scris scriptul cu `console.log` (și `console.error`, `console.warn`, …) este afișat dintr-o dată în stdout. Dacă scriptul aruncă o excepție, mesajul de eroare ajunge în stderr, iar codul de ieșire este 1.

Fișierul este întotdeauna analizat ca script clasic, așa că un fișier cu `import` / `export` sau `await` la nivel superior eșuează cu o SyntaxError. Pentru a rula un modul ES, folosiți `Engine::evalAsModule()` din PHP (consultați referința [API](https://phasis.inline0.dev/ro/docs/api#evalasmodule)) sau grupați mai întâi codul.

### Evaluează sursa

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

Argumentul este evaluat ca script complet. Se afișează doar rezultatul `console`; valoarea ultimei expresii nu este afișată, așa că `phasis -e '1 + 2'` nu afișează nimic.

### Afișează AST-ul

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

Afișează arborele de parsare ca JSON (cu indentare de două spații). Util pentru depanarea problemelor analizatorului sau pentru construirea de instrumente bazate pe Phasis. Pentru acces programatic, folosiți [analizatorul API](https://phasis.inline0.dev/ro/docs/parser).

## bin/test262

`bin/test262` rulează suita [oficială test262](https://github.com/tc39/test262) pe Phasis. Este utilă ca suită de regresie când contribuiți cu modificări. Instantaneul suitei complete din `COMPAT.md` este produs de `bin/compat-report` asociat, pe care matricea CI pornită manual îl rulează în loturi.

### Rulează o singură categorie

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

### Rulează suita completă

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

### Configurare

Runnerul citește `config/support.php` din rădăcina proiectului. Lista sa `test262_skipped_features` este goală: nicio funcționalitate test262 nu este omisă, inclusiv `tail-call-optimization`. Fișierul enumeră și categoriile și testele care trebuie rulate izolat.

Suita propriu-zisă este submodulul `test262` git; rulați `git submodule update --init test262` după clonare. Fără el, runnerul se închide cu mesajul „test262 suite not found”.

### Alte opțiuni utile

| Opțiune | Scop |
|---|---|
| `--failures` | afișează câte un rând pentru fiecare test eșuat |
| `--limit N` | se oprește după primele N teste |
| `--jobs N` | rulează N teste în paralel |
| `--files-from file` | rulează doar testele enumerate în `file` |
| `--json` | emite un rezumat lizibil automat de mașină în stdout |
| `--no-progress` | suprimă rândul de progres |

Consultați secțiunea [Compatibilitate](https://phasis.inline0.dev/ro/docs/compatibility) pentru cel mai recent instantaneu.

## bin/wpt

`bin/wpt` rulează fixture-urile Web Platform Tests importate în `tests/Wpt/fixtures/`. Corpusul acoperă URL, codificarea, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, întreaga suprafață `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` și `WebSocket`. Consultați [API-uri web](https://phasis.inline0.dev/ro/docs/compatibility/web-apis) pentru tabelul ratelor de promovare pe fiecare domeniu.

### Rulează toate fixture-urile importate

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

### Rulează o categorie

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

### Rezultate pentru fiecare subtest

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

Afișează fiecare subtest (PASS / FAIL) din fiecare fixture, împreună cu mesajele de aserțiune pentru eșecuri.

### Rezultate JSON

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

Rezumat lizibil automat de mașină cu promovările/eșecurile pentru fluxurile CI sau analiza prin scripturi.

### Note

- Fixture-urile care utilizează Fetch pornesc automat serverul de testare WPT inclus la `tests/Wpt/fetch-server.php` pe `127.0.0.1:8765` și îl opresc ulterior.
- Simularea harness-ului din `tests/Wpt/testharness-shim.js` implementează doar suprafața WPT API folosită de fixture-urile importate (~400 rânduri față de fișierul complet `testharness.js` de ~3K de rânduri).
- Fixture-urile sursă se află în `tests/Wpt/upstream/` (un checkout parțial, ignorat de git, al [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Pentru a importa mai multe, copiați fișierele `.any.js` din `upstream/<area>/` în `fixtures/<category>/`, iar runnerul le preia automat.

## Coduri de ieșire

`bin/phasis` se închide cu unul dintre două coduri:

| Cod | Semnificație |
|---|---|
| `0` | succes — scriptul s-a executat până la capăt (inclusiv după `--ast`) |
| `1` | orice altceva: o excepție JS neprinsă, o eroare de sintaxă, un fișier lipsă sau argumente nevalide |

Erorile scriptului își afișează mesajul în stderr. Argumentele nevalide și fișierele lipsă afișează linia de utilizare în stderr.

## Limite de resurse

`bin/phasis` rulează cu setările implicite ale motorului și nu are opțiuni pentru limite: un plafon de 4 096 de cadre pentru stiva de apeluri JS, o limită de protecție de 8 192 de cadre pentru funcțiile de tip closure transpilate și valoarea implicită `maxLoopIterations` de 100 000, care se aplică doar codului executat de interpretorul ce parcurge arborele (consultați [API: setLimit](https://phasis.inline0.dev/ro/docs/api#setlimit)). Nu există limită de timp; încadrați comanda în `timeout` dacă un script ar putea să nu se termine.
