Zum Inhalt springen

CLI

Phasis enthält drei wichtige ausführbare Dateien in bin/:

  • bin/phasis — JavaScript-Dateien ausführen, Quelltext aus der Befehlszeile auswerten und ASTs ausgeben.
  • bin/test262 — die offizielle ECMAScript-Konformitätssuite mit Phasis ausführen.
  • bin/wpt — die Web Platform Tests-Fixtures mit Phasis ausführen (URL, Encoding, Fetch, Header, Blob, AbortSignal, Streams, …).

Nach composer require phasis/phasis sind bin/phasis und bin/test262 mit vendor/bin/ verknüpft. Von dort aus funktioniert nur bin/phasis: bin/test262 benötigt das git-Submodul test262 und die Testklassen, die das Composer-Paket nicht enthält; bin/wpt wird überhaupt nicht mitgeliefert. Führe beide aus einem Klon des Repositorys Phasis aus.

bin/phasis

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

Diese drei Formen bilden die gesamte Schnittstelle. Es gibt weder eine REPL noch eine stdin-Eingabe oder ein Modul-Flag.

Datei ausführen

Shell
./vendor/bin/phasis script.js

Führt script.js als klassisches Skript aus. Nach Abschluss wird alles, was das Skript mit console.log (und console.error, console.warn, …) geschrieben hat, auf einmal nach stdout ausgegeben. Wirft das Skript einen Fehler, wird die Fehlermeldung nach stderr ausgegeben und der Exit-Status ist 1.

Die Datei wird immer als klassisches Skript geparst. Daher führt eine Datei mit import / export oder await auf oberster Ebene zu einem SyntaxError. Um ein ES-Modul auszuführen, verwende Engine::evalAsModule() von PHP (siehe die Referenz zu API) oder bündle den Code zuerst.

Quelltext auswerten

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

Das Argument wird als vollständiges Skript ausgewertet. Ausgegeben wird nur die Ausgabe von console; der Wert des letzten Ausdrucks wird nicht ausgegeben, daher gibt phasis -e '1 + 2' nichts aus.

AST ausgeben

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

Gibt den Parse-Baum als JSON aus (mit zwei Leerzeichen eingerückt). Nützlich, um Parserprobleme zu beheben oder Werkzeuge auf Basis von Phasis zu erstellen. Für den programmgesteuerten Zugriff verwende den Parser API.

bin/test262

bin/test262 führt die offizielle test262-Suite mit Phasis aus. Sie eignet sich als Regressionstest beim Entwickeln von Änderungen. Der vollständige Suite-Snapshot in COMPAT.md wird vom zugehörigen bin/compat-report erstellt, das die manuell gestartete CI-Matrix in Teilmengen ausführt.

Einzelne Kategorie ausführen

Shell
./bin/test262 --category built-ins/Array

Vollständige Suite ausführen

Shell
./bin/test262 --jobs 4

Konfiguration

Der Runner liest config/support.php aus dem Projektstammverzeichnis. Seine Liste test262_skipped_features ist leer: Kein test262-Feature wird übersprungen, einschließlich tail-call-optimization. Die Datei listet außerdem die Kategorien und Tests auf, die isoliert ausgeführt werden müssen.

Die Suite selbst ist das git-Submodul test262. Führe nach dem Klonen git submodule update --init test262 aus. Fehlt es, wird der Runner mit "test262 suite not found" beendet.

Weitere nützliche Flags

Flag Zweck
--failures eine Zeile pro fehlgeschlagenem Test ausgeben
--limit N nach den ersten N Tests stoppen
--jobs N N Tests parallel ausführen
--files-from file nur die in file aufgeführten Tests ausführen
--json maschinenlesbare Zusammenfassung auf stdout ausgeben
--no-progress Fortschrittszeile unterdrücken

Den aktuellen Snapshot findest du im Abschnitt Kompatibilität.

bin/wpt

bin/wpt führt die in tests/Wpt/fixtures/ importierten Web Platform Tests-Fixtures aus. Der Korpus umfasst URL, Encoding, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, den gesamten Bereich crypto/SubtleCrypto, fetch/Request/Response, XMLHttpRequest/XMLHttpRequestUpload und WebSocket. Die Tabelle zu den Erfolgsraten der einzelnen Bereiche findest du unter Web-APIs.

Alle importierten Fixtures ausführen

Shell
./bin/wpt

Einzelne Kategorie ausführen

Shell
./bin/wpt --category headers
./bin/wpt --category streams
./bin/wpt --category blob

Ausgabe pro Untertest

Shell
./bin/wpt --category abort --verbose

Gibt jeden Untertest (PASS / FAIL) innerhalb jeder Fixture aus, bei fehlgeschlagenen Tests mit Assertionsmeldungen.

JSON-Ausgabe

Shell
./bin/wpt --json

Maschinenlesbare Zusammenfassung zu Erfolgen und Fehlern für CI-Pipelines oder skriptgesteuerte Analysen.

Hinweise

  • Fixtures, die Fetch verwenden, starten den mitgelieferten WPT-Testserver automatisch unter tests/Wpt/fetch-server.php auf 127.0.0.1:8765 und fahren ihn anschließend herunter.
  • Der Harness-Shim unter tests/Wpt/testharness-shim.js implementiert nur die WPT-API-Schnittstelle, die von den importierten Fixtures verwendet wird (etwa 400 Zeilen gegenüber den rund 3K Zeilen des vollständigen testharness.js).
  • Die Quell-Fixtures befinden sich unter tests/Wpt/upstream/ (ein von Git ignorierter Sparse-Checkout von web-platform-tests/wpt). Um weitere zu importieren, kopiere .any.js-Dateien aus upstream/<area>/ nach fixtures/<category>/; der Runner findet sie dann automatisch.

Exit-Codes

bin/phasis wird mit einem von zwei Statuscodes beendet:

Code Bedeutung
0 Erfolg — das Skript wurde vollständig ausgeführt (auch nach --ast)
1 alles andere: eine nicht abgefangene JS-Ausnahme, ein Syntaxfehler, eine fehlende Datei oder ungültige Argumente

Fehler des Skripts geben ihre Meldung auf stderr aus. Bei ungültigen Argumenten und fehlenden Dateien wird die Nutzungshinweiszeile auf stderr ausgegeben.

Ressourcenlimits

bin/phasis läuft mit den Standardeinstellungen der Engine und bietet keine Flags für Limits: eine Obergrenze von 4,096 Frames für den JS-Aufrufstapel, eine Begrenzung auf 8,192 Frames für transpilierte Closures und standardmäßig maxLoopIterations von 100,000, das nur für Code gilt, den der Tree-Walking-Interpreter ausführt (siehe API: setLimit). Es gibt kein Zeitlimit; verwende timeout, wenn ein Skript möglicherweise nicht endet.