
# CLI

Phasis turi tris pagrindinius vykdomuosius failus kataloge `bin/`:

- **`bin/phasis`** — vykdyti JavaScript failus, įvertinti komandinėje eilutėje perduotą kodą, išvesti AST.
- **`bin/test262`** — vykdyti oficialų ECMAScript atitikties testų rinkinį su Phasis.
- **`bin/wpt`** — vykdyti Web Platform Tests testus su Phasis (URL, koduotė, fetch, antraštės, Blob, AbortSignal, srautai, …).

Įdiegus `composer require phasis/phasis`, `bin/phasis` ir `bin/test262` susiejami su `vendor/bin/`. Iš ten veikia tik `bin/phasis`: `bin/test262` reikia `test262` git submodulio ir testų klasių, kurių Composer pakete nėra, o `bin/wpt` apskritai netiekiamas. Abu vykdykite klonavę Phasis saugyklą.

## bin/phasis

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

Šios trys formos sudaro visą sąsają. Nėra REPL, stdin įvesties ar modulio vėliavėlės.

### Vykdyti failą

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

Vykdo `script.js` kaip klasikinį scenarijų. Jam pasibaigus, viskas, ką scenarijus išvedė naudodamas `console.log` (ir `console.error`, `console.warn`, …), iš karto išspausdinama į stdout. Jei scenarijus išmeta klaidą, jos pranešimas išspausdinamas į stderr, o išėjimo būsena yra 1.

Failas visada analizuojamas kaip klasikinis scenarijus, todėl failas su `import` / `export` arba aukščiausio lygio `await` sukelia SyntaxError. Norėdami vykdyti ES modulį, naudokite `Engine::evalAsModule()` iš PHP (žr. [nuorodąAPI](https://phasis.inline0.dev/lt/docs/api#evalasmodule)) arba pirmiausia supakuokite kodą.

### Įvertinti kodą

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

Argumentas įvertinamas kaip visas scenarijus. Išvedama tik `console` išvestis; paskutinės išraiškos reikšmė neišvedama, todėl `phasis -e '1 + 2'` nieko neišspausdina.

### Išvesti AST

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

Analizės medis išspausdinamas kaip JSON (su dviejų tarpų įtraukomis). Naudinga derinant analizatoriaus problemas arba kuriant įrankius Phasis pagrindu. Norėdami pasiekti programiškai, naudokite [analizatoriaus API](https://phasis.inline0.dev/lt/docs/parser).

## bin/test262

`bin/test262` vykdo [oficialų test262 testų rinkinį](https://github.com/tc39/test262) su Phasis. Jis naudingas kaip regresijos testavimo priemonė teikiant pakeitimus. Visą testų rinkinio momentinę kopiją, esančią `COMPAT.md`, sukuria susijęs `bin/compat-report`, kurį rankiniu būdu paleidžiama CI matrica vykdo dalimis.

### Vykdyti vieną kategoriją

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

### Vykdyti visą testų rinkinį

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

### Konfigūracija

Vykdyklė projekto šakniniame kataloge skaito `config/support.php`. Joje `test262_skipped_features` sąrašas tuščias: nepraleidžiama jokia test262 funkcija, įskaitant `tail-call-optimization`. Faile taip pat išvardytos kategorijos ir testai, kuriuos būtina vykdyti atskirai.

Pats testų rinkinys yra `test262` git submodulis; po klonavimo vykdykite `git submodule update --init test262`. Be jo vykdyklė baigia darbą su pranešimu „test262 suite not found“.

### Kitos naudingos vėliavėlės

| Vėliavėlė | Paskirtis |
|---|---|
| `--failures` | išspausdinti po vieną eilutę apie kiekvieną nepavykusį testą |
| `--limit N` | sustoti po pirmųjų N testų |
| `--jobs N` | vykdyti N testų lygiagrečiai |
| `--files-from file` | vykdyti tik `file` išvardytus testus |
| `--json` | stdout išvesti kompiuterio nuskaitomą suvestinę |
| `--no-progress` | nerodyti eigos eilutės |

Naujausią momentinę kopiją rasite [suderinamumo skyriuje](https://phasis.inline0.dev/lt/docs/compatibility).

## bin/wpt

`bin/wpt` vykdo į `tests/Wpt/fixtures/` importuotus Web Platform Tests testus. Testų rinkinys apima URL, koduotę, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, visą `crypto`/`SubtleCrypto` sąsają, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` ir `WebSocket`. Kiekvienos srities išlaikymo rodiklių lentelę žr. [žiniatinklio API](https://phasis.inline0.dev/lt/docs/compatibility/web-apis).

### Vykdyti visus importuotus testus

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

### Vykdyti vieną kategoriją

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

### Kiekvieno potesto išvestis

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

Išveda kiekvieną potestį (PASS / FAIL) kiekviename teste, o nepavykus — ir teiginių pranešimus.

### JSON išvestis

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

Kompiuterio nuskaitoma išlaikytų ir nepavykusių testų suvestinė CI konvejeriams arba automatinei analizei.

### Pastabos

- Su fetch susiję testai automatiškai paleidžia kartu pateikiamą WPT testų serverį adresu `tests/Wpt/fetch-server.php` per `127.0.0.1:8765`, o vėliau jį išjungia.
- Testų aplinkos sąsajos modulis, esantis `tests/Wpt/testharness-shim.js`, įgyvendina tik tą WPT API sąsajos dalį, kurią naudoja importuoti testai (~400 eilučių, palyginti su visu ~3K eilučių `testharness.js`).
- Šaltinio testai yra `tests/Wpt/upstream/` (gitignore įtrauktas retas [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt) išsiregistravimas). Norėdami importuoti daugiau, nukopijuokite `.any.js` failus iš `upstream/<area>/` į `fixtures/<category>/`; vykdyklė juos aptiks automatiškai.

## Išėjimo kodai

`bin/phasis` baigia darbą grąžindama vieną iš dviejų kodų:

| Kodas | Reikšmė |
|---|---|
| `0` | sėkmė — scenarijus įvykdytas iki galo (taip pat ir po `--ast`) |
| `1` | visa kita: nepagauta JS išimtis, sintaksės klaida, trūkstamas failas arba netinkami argumentai |

Scenarijaus klaidų pranešimai spausdinami į stderr. Netinkami argumentai ir trūkstami failai sukelia naudojimo eilutės išspausdinimą į stderr.

## Išteklių ribos

`bin/phasis` veikia su numatytaisiais variklio nustatymais ir neturi ribojimo vėliavėlių: 4,096 kadrų JS iškvietimų steko riba, 8,192 kadrų riba transpilintoms uždaroms funkcijoms ir numatytoji `maxLoopIterations` reikšmė 100,000, taikoma tik kodui, kurį vykdo medį pereinantis interpretatorius (žr. [API: setLimit](https://phasis.inline0.dev/lt/docs/api#setlimit)). Laiko apribojimo nėra; apgaubkite komandą `timeout`, jei scenarijus gali nepasibaigti.
