
# CLI

Phasis include tre eseguibili principali in `bin/`:

- **`bin/phasis`** — esegue file JavaScript, valuta il codice sorgente passato da riga di comando e stampa gli AST.
- **`bin/test262`** — esegue la suite ufficiale di conformità ECMAScript su Phasis.
- **`bin/wpt`** — esegue i fixture dei Web Platform Tests su Phasis (URL, codifica, fetch, header, Blob, AbortSignal, stream, …).

Dopo `composer require phasis/phasis`, `bin/phasis` e `bin/test262` sono collegati da `vendor/bin/`. Da lì funziona solo `bin/phasis`: `bin/test262` richiede il sottomodulo git `test262` e le classi di test, che il pacchetto Composer non include, mentre `bin/wpt` non viene distribuito affatto. Eseguite entrambi da un clone del repository Phasis.

## bin/phasis

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

Queste tre modalità costituiscono l'intera interfaccia. Non c'è una REPL, non è possibile fornire input tramite stdin e non c'è un flag per i moduli.

### Eseguire un file

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

Esegue `script.js` come script classico. Al termine, tutto ciò che lo script ha scritto con `console.log` (e `console.error`, `console.warn`, …) viene stampato in un'unica volta su stdout. Se lo script genera un errore, il messaggio viene inviato a stderr e il codice di uscita è 1.

Il file viene sempre analizzato come script classico, quindi un file con `import` / `export` o `await` al livello superiore genera un SyntaxError. Per eseguire un modulo ES, usate `Engine::evalAsModule()` da PHP (consultate il riferimento [API](https://phasis.inline0.dev/it/docs/api#evalasmodule)) oppure create prima un bundle del codice.

### Valutare il codice sorgente

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

L'argomento viene valutato come script completo. Viene stampato solo l'output `console`; il valore dell'ultima espressione non viene stampato, quindi `phasis -e '1 + 2'` non produce output.

### Stampare l'AST

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

Stampa l'albero di analisi come JSON (con rientro di due spazi). Utile per eseguire il debug di problemi del parser o creare strumenti basati su Phasis. Per l'accesso programmatico, usate il [parser API](https://phasis.inline0.dev/it/docs/parser).

## bin/test262

`bin/test262` esegue la suite [ufficiale test262](https://github.com/tc39/test262) su Phasis. È utile come strumento di regressione quando si contribuisce con modifiche. Lo snapshot della suite completa in `COMPAT.md` è generato dal relativo `bin/compat-report`, eseguito in shard dalla matrice CI avviata manualmente.

### Eseguire una singola categoria

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

### Eseguire la suite completa

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

### Configurazione

Il runner legge `config/support.php` dalla radice del progetto. Il suo elenco `test262_skipped_features` è vuoto: non viene esclusa alcuna funzionalità test262, inclusa `tail-call-optimization`. Il file elenca anche le categorie e i test da eseguire in isolamento.

La suite stessa è il sottomodulo git `test262`; eseguite `git submodule update --init test262` dopo il clone. Se manca, il runner termina con "test262 suite not found".

### Altri flag utili

| Flag | Scopo |
|---|---|
| `--failures` | stampa una riga per ogni test non riuscito |
| `--limit N` | si ferma dopo i primi N test |
| `--jobs N` | esegue N test in parallelo |
| `--files-from file` | esegue solo i test elencati in `file` |
| `--json` | emette un riepilogo leggibile dalle macchine su stdout |
| `--no-progress` | nasconde la riga di avanzamento |

Consultate la sezione [Compatibilità](https://phasis.inline0.dev/it/docs/compatibility) per lo snapshot più recente.

## bin/wpt

`bin/wpt` esegue i fixture dei Web Platform Tests importati in `tests/Wpt/fixtures/`. Il corpus copre URL, codifica, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, l'intera superficie `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` e `WebSocket`. Consultate [Web APIs](https://phasis.inline0.dev/it/docs/compatibility/web-apis) per la tabella dei tassi di superamento per area.

### Eseguire tutti i fixture importati

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

### Eseguire una categoria

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

### Output per sottotest

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

Stampa ogni sottotest (PASS / FAIL) all'interno di ciascun fixture, con i messaggi di asserzione in caso di errore.

### Output JSON

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

Riepilogo leggibile dalle macchine dei test superati/falliti per pipeline CI o analisi tramite script.

### Note

- I fixture che usano Fetch avviano automaticamente il server WPT incluso su `tests/Wpt/fetch-server.php` alla porta `127.0.0.1:8765` e lo arrestano al termine.
- Lo shim dell'harpness in `tests/Wpt/testharness-shim.js` implementa solo la superficie API di WPT usata dai fixture importati (~400 righe rispetto alle ~3K righe complete di `testharness.js`).
- I fixture sorgente si trovano in `tests/Wpt/upstream/` (checkout sparso di [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt), ignorato da git). Per importarne altri, copiate i file `.any.js` da `upstream/<area>/` in `fixtures/<category>/`; il runner li rileverà automaticamente.

## Codici di uscita

`bin/phasis` termina con uno di due codici:

| Codice | Significato |
|---|---|
| `0` | successo: lo script è stato eseguito fino al termine (anche dopo `--ast`) |
| `1` | qualsiasi altro esito: un'eccezione JS non intercettata, un errore di sintassi, un file mancante o argomenti non validi |

Gli errori dello script stampano il proprio messaggio su stderr. Gli argomenti non validi e i file mancanti stampano su stderr la riga di utilizzo.

## Limiti delle risorse

`bin/phasis` usa i valori predefiniti del motore e non ha flag per i limiti: un limite dello stack di chiamate 4,096 frame per JS, un limite di 8,192 frame per le closure transpilate e il valore `maxLoopIterations` predefinito di 100,000, applicato solo al codice eseguito dall'interprete tree-walking (vedi [API: setLimit](https://phasis.inline0.dev/it/docs/api#setlimit)). Non c'è un limite di tempo; usate `timeout` per eseguire il comando se uno script potrebbe non terminare.
