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
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
./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
./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
./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
./bin/test262 --category built-ins/Array
Vollständige Suite ausführen
./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
./bin/wpt
Einzelne Kategorie ausführen
./bin/wpt --category headers
./bin/wpt --category streams
./bin/wpt --category blob
Ausgabe pro Untertest
./bin/wpt --category abort --verbose
Gibt jeden Untertest (PASS / FAIL) innerhalb jeder Fixture aus, bei fehlgeschlagenen Tests mit Assertionsmeldungen.
JSON-Ausgabe
./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.phpauf127.0.0.1:8765und fahren ihn anschließend herunter. - Der Harness-Shim unter
tests/Wpt/testharness-shim.jsimplementiert nur die WPT-API-Schnittstelle, die von den importierten Fixtures verwendet wird (etwa 400 Zeilen gegenüber den rund 3K Zeilen des vollständigentestharness.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 ausupstream/<area>/nachfixtures/<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.