
# CLI

Phasis wordt geleverd met drie hoofdprogramma's in `bin/`:

- **`bin/phasis`** — voer JavaScript-bestanden uit, evalueer broncode die op de opdrachtregel is meegegeven en dump AST's.
- **`bin/test262`** — voer de officiële ECMAScript-conformiteitssuite uit op Phasis.
- **`bin/wpt`** — voer de Web Platform Tests-fixtures uit op Phasis (URL, codering, fetch, headers, Blob, AbortSignal, streams, …).

Na `composer require phasis/phasis` worden `bin/phasis` en `bin/test262` vanuit `vendor/bin/` gekoppeld. Alleen `bin/phasis` werkt vanaf die locatie: `bin/test262` heeft de `test262`-gitsubmodule en de testklassen nodig, die niet in het Composer-pakket zitten, en `bin/wpt` wordt helemaal niet meegeleverd. Voer beide uit vanuit een kloon van de repository Phasis.

## bin/phasis

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

Deze drie vormen vormen de volledige interface. Er is geen REPL, geen stdin-invoer en geen modulevlag.

### Een bestand uitvoeren

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

Voert `script.js` uit als een klassiek script. Wanneer het klaar is, wordt alles wat het script met `console.log` (en `console.error`, `console.warn`, …) heeft geschreven in één keer naar stdout afgedrukt. Als het script een fout gooit, gaat de foutmelding naar stderr en is de afsluitstatus 1.

Het bestand wordt altijd als een klassiek script geparseerd, dus een bestand met `import` / `export` of `await` op topniveau geeft een SyntaxError. Gebruik voor een ES-module `Engine::evalAsModule()` vanuit PHP (zie de [referentieAPI](https://phasis.inline0.dev/nl/docs/api#evalasmodule)) of bundel de code eerst.

### Broncode evalueren

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

Alleen de uitvoer van `console` wordt afgedrukt; de waarde van de laatste expressie niet. Daarom drukt `phasis -e '1 + 2'` niets af.

### De AST dumpen

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

Drukt de parseboom af als JSON (ingesprongen met twee spaties). Handig voor het opsporen van parserproblemen of het bouwen van hulpmiddelen op basis van Phasis. Gebruik voor programmatische toegang de [parser API](https://phasis.inline0.dev/nl/docs/parser).

## bin/test262

`bin/test262` voert de [officiële test262-suite](https://github.com/tc39/test262) uit op Phasis. Deze is nuttig als regressietest bij het bijdragen aan wijzigingen. De snapshot van de volledige suite in `COMPAT.md` wordt gemaakt door het verwante `bin/compat-report`, dat handmatig gestarte CI-matrix in shards uitvoert.

### Eén categorie uitvoeren

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

### De volledige suite uitvoeren

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

### Configuratie

De runner leest `config/support.php` vanuit de projectroot. De lijst `test262_skipped_features` is leeg: geen enkele test262-functie wordt overgeslagen, ook `tail-call-optimization` niet. Het bestand vermeldt ook de categorieën en tests die afzonderlijk moeten worden uitgevoerd.

De suite zelf is de gitsubmodule `test262`; voer na het klonen `git submodule update --init test262` uit. Zonder deze submodule stopt de runner met de melding "test262 suite niet gevonden".

### Andere handige vlaggen

| Vlag | Doel |
|---|---|
| `--failures` | druk één regel af per mislukte test |
| `--limit N` | stop na de eerste N tests |
| `--jobs N` | voer N tests parallel uit |
| `--files-from file` | voer alleen de tests uit die in `file` staan |
| `--json` | geef een machineleesbaar overzicht op stdout |
| `--no-progress` | onderdruk de voortgangsregel |

Zie de sectie [Compatibiliteit](https://phasis.inline0.dev/nl/docs/compatibility) voor de nieuwste snapshot.

## bin/wpt

`bin/wpt` voert de Web Platform Tests-fixtures uit die in `tests/Wpt/fixtures/` zijn geïmporteerd. Het testmateriaal omvat URL, codering, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, het volledige oppervlak van `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` en `WebSocket`. Zie [Web-API's](https://phasis.inline0.dev/nl/docs/compatibility/web-apis) voor de tabel met slagingspercentages per gebied.

### Alle geïmporteerde fixtures uitvoeren

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

### Eén categorie uitvoeren

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

### Uitvoer per subtest

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

Drukt elke subtest (PASS / FAIL) binnen elke fixture af, met foutmeldingen bij mislukte beweringen.

### Uitvoer van JSON

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

Machineleesbaar overzicht van slagen en mislukken voor CI-pipelines of geautomatiseerde analyse.

### Opmerkingen

- Fixtures die fetch gebruiken, starten automatisch de meegeleverde WPT-testserver op `tests/Wpt/fetch-server.php` op `127.0.0.1:8765` en sluiten die daarna af.
- De harness-shim op `tests/Wpt/testharness-shim.js` implementeert alleen het WPT-API-oppervlak dat de geïmporteerde fixtures gebruiken (~400 regels tegenover de volledige ~3K-regelige `testharness.js`).
- Bronfixtures staan in `tests/Wpt/upstream/` (een gitignored sparse-checkout van [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Kopieer `.any.js`-bestanden vanuit `upstream/<area>/` naar `fixtures/<category>/` om er meer te importeren; de runner pakt ze automatisch op.

## Afsluitcodes

`bin/phasis` eindigt met een van twee codes:

| Code | Betekenis |
|---|---|
| `0` | geslaagd — het script is volledig uitgevoerd (ook na `--ast`) |
| `1` | alle andere gevallen: een niet-opgevangen JS-uitzondering, een syntaxfout, een ontbrekend bestand of ongeldige argumenten |

Fouten uit het script geven hun melding weer op stderr. Ongeldige argumenten en ontbrekende bestanden geven de gebruiksregel weer op stderr.

## Resourcelimieten

`bin/phasis` gebruikt de standaardinstellingen van de engine en heeft geen vlaggen voor limieten: maximaal 4 096 frames in de JS-aanroepstack, een grens van 8 192 frames voor getranspileerde closures en standaard `maxLoopIterations` van 100 000. Die laatste geldt alleen voor code die de tree-walking-interpreter uitvoert (zie [API: setLimit](https://phasis.inline0.dev/nl/docs/api#setlimit)). Er is geen tijdslimiet; gebruik `timeout` rond de opdracht als een script mogelijk niet stopt.
