
# CLI

Phasis menyertakan tiga executable utama di `bin/`:

- **`bin/phasis`** — jalankan file JavaScript, evaluasi sumber yang diberikan lewat baris perintah, cetak AST.
- **`bin/test262`** — jalankan rangkaian uji kesesuaian ECMAScript resmi pada Phasis.
- **`bin/wpt`** — jalankan fixture Web Platform Tests pada Phasis (URL, encoding, fetch, header, Blob, AbortSignal, stream, …).

Setelah `composer require phasis/phasis`, `bin/phasis` dan `bin/test262` ditautkan dari `vendor/bin/`. Hanya `bin/phasis` yang berfungsi dari sana: `bin/test262` memerlukan submodul git `test262` dan kelas pengujian, yang tidak disertakan dalam paket Composer, sedangkan `bin/wpt` sama sekali tidak disertakan. Jalankan keduanya dari hasil clone repositori Phasis.

## bin/phasis

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

Ketiga bentuk ini adalah seluruh antarmukanya. Tidak ada REPL, input stdin, ataupun flag modul.

### Jalankan file

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

Menjalankan `script.js` sebagai skrip klasik. Setelah selesai, semua yang ditulis skrip menggunakan `console.log` (serta `console.error`, `console.warn`, …) dicetak sekaligus ke stdout. Jika skrip melempar error, pesan error dikirim ke stderr dan status keluar adalah 1.

File selalu diuraikan sebagai skrip klasik, jadi file dengan `import` / `export` atau `await` tingkat teratas akan gagal dengan SyntaxError. Untuk menjalankan modul ES, gunakan `Engine::evalAsModule()` dari PHP (lihat referensi [API](https://phasis.inline0.dev/id/docs/api#evalasmodule)) atau bundel kode terlebih dahulu.

### Evaluasi sumber

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

Argumen dievaluasi sebagai skrip lengkap. Hanya output `console` yang dicetak; nilai ekspresi terakhir tidak dicetak, jadi `phasis -e '1 + 2'` tidak menghasilkan apa pun.

### Cetak AST

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

Mencetak pohon parse sebagai JSON (dengan indentasi dua spasi). Berguna untuk men-debug masalah parser atau membangun perkakas di atas Phasis. Untuk akses terprogram, gunakan [parser API](https://phasis.inline0.dev/id/docs/parser).

## bin/test262

`bin/test262` menjalankan rangkaian uji [resmi test262](https://github.com/tc39/test262) pada Phasis. Ini berguna sebagai rangkaian regresi saat berkontribusi perubahan. Snapshot rangkaian lengkap di `COMPAT.md` dihasilkan oleh `bin/compat-report` terkait, yang dijalankan secara manual oleh matriks CI dalam beberapa shard.

### Jalankan satu kategori

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

### Jalankan seluruh rangkaian uji

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

### Konfigurasi

Runner membaca `config/support.php` dari akar proyek. Daftar `test262_skipped_features`-nya kosong: tidak ada fitur test262 yang dilewati, termasuk `tail-call-optimization`. File tersebut juga mencantumkan kategori dan pengujian yang harus dijalankan secara terisolasi.

Rangkaian uji itu sendiri adalah submodul git `test262`; jalankan `git submodule update --init test262` setelah melakukan clone. Tanpanya, runner keluar dengan pesan "test262 suite not found".

### Flag lain yang berguna

| Flag | Tujuan |
|---|---|
| `--failures` | cetak satu baris untuk setiap pengujian yang gagal |
| `--limit N` | berhenti setelah N pengujian pertama |
| `--jobs N` | jalankan N pengujian secara paralel |
| `--files-from file` | jalankan hanya pengujian yang tercantum di `file` |
| `--json` | keluarkan ringkasan yang dapat dibaca mesin ke stdout |
| `--no-progress` | sembunyikan baris progres |

Lihat bagian [Kompatibilitas](https://phasis.inline0.dev/id/docs/compatibility) untuk snapshot terbaru.

## bin/wpt

`bin/wpt` menjalankan fixture Web Platform Tests yang diimpor ke `tests/Wpt/fixtures/`. Korpusnya mencakup URL, encoding, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, seluruh permukaan `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload`, dan `WebSocket`. Lihat [API Web](https://phasis.inline0.dev/id/docs/compatibility/web-apis) untuk tabel tingkat kelulusan tiap area.

### Jalankan semua fixture yang diimpor

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

### Jalankan satu kategori

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

### Output per subtes

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

Mencetak setiap subtes (PASS / FAIL) di dalam tiap fixture, beserta pesan asersi untuk kegagalan.

### Output JSON

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

Ringkasan lulus/gagal yang dapat dibaca mesin untuk pipeline CI atau analisis berskrip.

### Catatan

- Fixture yang menggunakan fetch otomatis menjalankan server pengujian WPT bawaan di `tests/Wpt/fetch-server.php` pada `127.0.0.1:8765`, lalu menghentikannya setelah itu.
- Shim harness di `tests/Wpt/testharness-shim.js` hanya mengimplementasikan permukaan WPT API yang digunakan fixture impor (~400 baris dibandingkan dengan `testharness.js` lengkap yang berisi ~3K baris).
- Fixture sumber berada di `tests/Wpt/upstream/` (sparse-checkout [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt) yang diabaikan git). Untuk mengimpor lebih banyak, salin file `.any.js` dari `upstream/<area>/` ke `fixtures/<category>/`; runner akan mengambilnya secara otomatis.

## Kode keluar

`bin/phasis` keluar dengan salah satu dari dua kode:

| Kode | Arti |
|---|---|
| `0` | berhasil — skrip berjalan sampai selesai (termasuk setelah `--ast`) |
| `1` | selain itu: exception JS yang tidak tertangkap, kesalahan sintaks, file tidak ditemukan, atau argumen tidak valid |

Error dari skrip mencetak pesannya ke stderr. Argumen tidak valid dan file yang tidak ditemukan akan mencetak baris penggunaan ke stderr.

## Batas sumber daya

`bin/phasis` berjalan dengan default engine dan tidak memiliki flag batas: batas tumpukan pemanggilan JS sebanyak 4,096 frame, guard 8,192 frame untuk closure yang ditranspilasi, dan `maxLoopIterations` default sebesar 100,000, yang hanya berlaku untuk kode yang dijalankan interpreter tree-walking (lihat [APIsetLimit](https://phasis.inline0.dev/id/docs/api#setlimit)). Tidak ada batas waktu; bungkus perintah dengan `timeout` jika skrip mungkin tidak berhenti.
