
# CLI

Phasis fournit trois exécutables principaux dans `bin/` :

- **`bin/phasis`** — exécuter des fichiers JavaScript, évaluer du code source transmis sur la ligne de commande et afficher des AST.
- **`bin/test262`** — exécuter la suite officielle de conformité ECMAScript avec Phasis.
- **`bin/wpt`** — exécuter les fixtures Web Platform Tests avec Phasis (URL, encodage, fetch, en-têtes, Blob, AbortSignal, flux, …).

Après `composer require phasis/phasis`, `bin/phasis` et `bin/test262` sont liés depuis `vendor/bin/`. Seul `bin/phasis` fonctionne à cet emplacement : `bin/test262` nécessite le sous-module git `test262` et les classes de test, absents du paquet Composer, et `bin/wpt` n'est pas fourni du tout. Exécutez les deux autres depuis un clone du dépôt Phasis.

## bin/phasis

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

Ces trois formes constituent toute l'interface. Il n'y a ni REPL, ni entrée stdin, ni option de module.

### Exécuter un fichier

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

Exécute `script.js` comme un script classique. À la fin, tout ce que le script a écrit avec `console.log` (et `console.error`, `console.warn`, …) est imprimé d’un seul coup sur stdout. Si le script lève une exception, le message d’erreur est envoyé sur stderr et le code de sortie est 1.

Le fichier est toujours analysé comme un script classique : un fichier contenant `import` / `export` ou `await` au niveau supérieur provoque donc une SyntaxError. Pour exécuter un module ES, utilisez `Engine::evalAsModule()` depuis PHP (voir la [API référence](https://phasis.inline0.dev/fr/docs/api#evalasmodule)) ou regroupez d’abord le code.

### Évaluer le code source

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

L’argument est évalué comme un script complet. Seule la sortie de `console` est affichée ; la valeur de la dernière expression ne l’est pas. `phasis -e '1 + 2'` n’affiche donc rien.

### Afficher l’AST

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

Affiche l’arbre syntaxique sous forme de JSON (avec une indentation de deux espaces). Utile pour déboguer les problèmes d’analyse ou créer des outils basés sur Phasis. Pour un accès programmatique, utilisez le [API analyseur](https://phasis.inline0.dev/fr/docs/parser).

## bin/test262

`bin/test262` exécute la [suite officielle test262](https://github.com/tc39/test262) sur Phasis. Elle sert de banc de régression lorsque vous contribuez au projet. L’instantané de la suite complète dans `COMPAT.md` est généré par le `bin/compat-report` associé, que la matrice CI lancée manuellement exécute en lots.

### Exécuter une seule catégorie

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

### Exécuter toute la suite

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

### Configuration

Le lanceur lit `config/support.php` à la racine du projet. Sa liste `test262_skipped_features` est vide : aucune fonctionnalité test262 n’est ignorée, y compris `tail-call-optimization`. Le fichier répertorie aussi les catégories et les tests à exécuter de manière isolée.

La suite elle-même est le sous-module git `test262` ; exécutez `git submodule update --init test262` après le clonage. Sans elle, le lanceur quitte avec le message « test262 suite not found ».

### Autres options utiles

| Option | Fonction |
|---|---|
| `--failures` | afficher une ligne par test en échec |
| `--limit N` | s’arrêter après les N premiers tests |
| `--jobs N` | exécuter N tests en parallèle |
| `--files-from file` | exécuter uniquement les tests répertoriés dans `file` |
| `--json` | produire un résumé lisible par machine sur stdout |
| `--no-progress` | masquer la ligne de progression |

Consultez la [section Compatibilité](https://phasis.inline0.dev/fr/docs/compatibility) pour obtenir l’instantané le plus récent.

## bin/wpt

`bin/wpt` exécute les tests Web Platform Tests importés dans `tests/Wpt/fixtures/`. Le corpus couvre URL, l’encodage, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, les flux WHATWG, l’ensemble des fonctionnalités `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` et `WebSocket`. Consultez [API Web](https://phasis.inline0.dev/fr/docs/compatibility/web-apis) pour le tableau des taux de réussite par domaine.

### Exécuter tous les tests importés

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

### Exécuter une catégorie

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

### Sortie par sous-test

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

Affiche chaque sous-test (PASS / FAIL) dans chaque test, avec les messages d’assertion en cas d’échec.

### Sortie JSON

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

Résumé des réussites et des échecs lisible par machine, pour les pipelines CI ou l’analyse par script.

### Remarques

- Les tests qui utilisent Fetch démarrent automatiquement le serveur de test WPT inclus à `tests/Wpt/fetch-server.php` sur `127.0.0.1:8765` et l’arrêtent ensuite.
- Le shim du banc de test à `tests/Wpt/testharness-shim.js` implémente uniquement les fonctionnalités WPT API utilisées par les tests importés (environ 400 lignes contre environ 3K lignes pour `testharness.js` complet).
- Les tests source se trouvent dans `tests/Wpt/upstream/` (un extrait sparse-checkout ignoré par git de [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Pour en importer davantage, copiez les fichiers `.any.js` depuis `upstream/<area>/` vers `fixtures/<category>/` : le lanceur les détectera automatiquement.

## Codes de sortie

`bin/phasis` renvoie l’un de deux codes :

| Code | Signification |
|---|---|
| `0` | réussite — le script s’est exécuté jusqu’au bout (y compris après `--ast`) |
| `1` | autre résultat : exception JS non interceptée, erreur de syntaxe, fichier introuvable ou arguments invalides |

Les erreurs du script affichent leur message sur stderr. Les arguments invalides et les fichiers manquants affichent la ligne d’aide sur stderr.

## Limites de ressources

`bin/phasis` utilise les paramètres par défaut du moteur et ne propose aucune option pour limiter : une limite de pile d’appels de 4,096 cadres JS, une protection de 8,192 cadres pour les fermetures transpilées et la valeur par défaut `maxLoopIterations` de 100,000, qui ne s’applique qu’au code exécuté par l’interpréteur à parcours d’arbre (voir [API: setLimit](https://phasis.inline0.dev/fr/docs/api#setlimit)). Il n’y a pas de limite de temps ; enveloppez la commande dans `timeout` si un script risque de ne pas se terminer.
