
# CLI

Phasis inclui três executáveis principais em `bin/`:

- **`bin/phasis`** — executa arquivos JavaScript, avalia código-fonte passado pela linha de comando e exibe ASTs.
- **`bin/test262`** — executa a suíte oficial de conformidade ECMAScript em Phasis.
- **`bin/wpt`** — executa os testes do Web Platform Tests em Phasis (URL, codificação, fetch, cabeçalhos, Blob, AbortSignal, streams, …).

Depois de `composer require phasis/phasis`, `bin/phasis` e `bin/test262` são vinculados a partir de `vendor/bin/`. Só `bin/phasis` funciona nesse diretório: `bin/test262` precisa do submódulo `test262` git e das classes de teste, que não estão incluídos no pacote Composer, e `bin/wpt` não é distribuído. Execute ambos a partir de um clone do repositório Phasis.

## bin/phasis

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

Essas três formas compõem toda a interface. Não há REPL, entrada via stdin nem flag de módulo.

### Executar um arquivo

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

Executa `script.js` como um script clássico. Quando termina, tudo o que o script escreveu com `console.log` (e `console.error`, `console.warn`, …) é impresso de uma só vez em stdout. Se o script lançar uma exceção, a mensagem de erro vai para stderr e o status de saída é 1.

O arquivo é sempre analisado como um script clássico, portanto um arquivo com `import` / `export` ou `await` no nível superior falha com um SyntaxError. Para executar um módulo ES, use `Engine::evalAsModule()` de PHP (consulte a referência [APIreferência](https://phasis.inline0.dev/pt/docs/api#evalasmodule)) ou agrupe o código primeiro.

### Avaliar código-fonte

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

O argumento é avaliado como um script completo. Apenas a saída `console` é impressa; o valor da última expressão não é, então `phasis -e '1 + 2'` não imprime nada.

### Exibir a AST

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

Imprime a árvore sintática como JSON (com recuo de dois espaços). Útil para depurar problemas do analisador ou criar ferramentas com base em Phasis. Para acesso programático, use o [analisador API](https://phasis.inline0.dev/pt/docs/parser).

## bin/test262

`bin/test262` executa a suíte [oficial test262](https://github.com/tc39/test262) em Phasis. Ela é útil como conjunto de testes de regressão ao contribuir com alterações. O instantâneo da suíte completa em `COMPAT.md` é gerado pelo `bin/compat-report` relacionado, que a matriz de CI iniciada manualmente executa em partes.

### Executar uma categoria

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

### Executar a suíte completa

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

### Configuração

O executor lê `config/support.php` da raiz do projeto. A lista `test262_skipped_features` está vazia: nenhum recurso test262 é ignorado, incluindo `tail-call-optimization`. O arquivo também lista as categorias e os testes que devem ser executados isoladamente.

A própria suíte é o submódulo `test262` git; execute `git submodule update --init test262` depois de clonar. Sem ele, o executor termina com "suíte test262 não encontrada".

### Outras flags úteis

| Flag | Finalidade |
|---|---|
| `--failures` | imprime uma linha para cada teste com falha |
| `--limit N` | para após os primeiros N testes |
| `--jobs N` | executa N testes em paralelo |
| `--files-from file` | executa apenas os testes listados em `file` |
| `--json` | emite um resumo legível por máquina em stdout |
| `--no-progress` | oculta a linha de progresso |

Consulte a [seção de compatibilidade](https://phasis.inline0.dev/pt/docs/compatibility) para ver o instantâneo mais recente.

## bin/wpt

`bin/wpt` executa os testes do Web Platform Tests importados para `tests/Wpt/fixtures/`. O conjunto de testes cobre URL, codificação, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, toda a superfície de `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` e `WebSocket`. Consulte [APIs da Web](https://phasis.inline0.dev/pt/docs/compatibility/web-apis) para ver a tabela de taxas de aprovação por área.

### Executar todos os testes importados

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

### Executar uma categoria

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

### Saída por subteste

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

Imprime cada subteste (PASS / FAIL) dentro de cada teste, com mensagens de asserção quando há falha.

### Saída JSON

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

Resumo de aprovação/falha legível por máquina para pipelines de CI ou análise por script.

### Observações

- Os testes que usam Fetch iniciam automaticamente o servidor de testes WPT incluído em `tests/Wpt/fetch-server.php` na porta `127.0.0.1:8765` e o encerram depois.
- O shim do harness em `tests/Wpt/testharness-shim.js` implementa apenas a superfície API do WPT usada pelos testes importados (~400 linhas, em comparação com as ~3 mil linhas completas de `testharness.js`).
- Os testes de origem ficam em `tests/Wpt/upstream/` (um checkout esparso de [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt), ignorado pelo git). Para importar mais, copie os arquivos `.any.js` de `upstream/<area>/` para `fixtures/<category>/` e o executor os encontrará automaticamente.

## Códigos de saída

`bin/phasis` termina com um de dois códigos:

| Código | Significado |
|---|---|
| `0` | sucesso — o script foi executado até o fim (também após `--ast`) |
| `1` | qualquer outro caso: uma exceção JS não capturada, erro de sintaxe, arquivo ausente ou argumentos inválidos |

Os erros do script imprimem sua mensagem em stderr. Argumentos inválidos e arquivos ausentes imprimem a linha de uso em stderr.

## Limites de recursos

`bin/phasis` é executado com os padrões do mecanismo e não tem flags para limites: um limite de pilha de chamadas de 4,096 frames em JS, uma proteção de 8,192 frames para closures transpiladas e o `maxLoopIterations` padrão de 100,000, que se aplica apenas ao código executado pelo interpretador que percorre a árvore (consulte [API: setLimit](https://phasis.inline0.dev/pt/docs/api#setlimit)). Não há limite de tempo; envolva o comando em `timeout` se um script puder não terminar.
