Where it runs

Every line here was run, not assumed: the binary was started on that system and asked to check its own layout.

Where it runs
01

✓ run and checked   ○ builds, or follows from what was measured   ✗ known not to work

Linux

✓Debian 11 · 12 · 13layout clean, scripts running
✓Ubuntu 20.04 · 22.04 · 24.04layout clean, scripts running
✓Fedora 41JavaScriptCore comes inside webkit2gtk4.1 there
✓CentOS 7 — glibc 2.17the oldest C library the binary asks for, from 2012. Anything newer is in range
✓Alpine and other musl systemsspark build linux-musl-x86_64 / -arm64; webkit2gtk-4.1 brings the engine

Windows

✓Windows 10 · 11, x86_64the target this is built and checked against
✓Windows, 32-bit (win-x86)285 KB, same layout, same scripts
○Windows on ARM (win-arm64)not run on real hardware here — and such a machine runs the x86_64 build under emulation anyway
○Windows 7 · 8.1the binary imports the Universal CRT, which ships with Windows only from 10. Earlier needs KB2999226, which Windows Update has delivered since 2015. Building against the older msvcrt instead would need a second toolchain: zig ships no import library for it
✓curl.exe for spark.fetchin System32 since Windows 10 1803; a Wine prefix has none, so requests answer null there
✓Winehow Windows is checked from a Mac. Its own JScript is below ES5, which is why the bundling step targets es5

macOS

✓macOS 11 and later, Apple siliconthe machine this is developed on
○macOS 11 and later, Intelthe universal binary carries the slice; not run on Intel hardware here

Windowing

✓GTK 3what the Linux host talks to, opened at run time
✓Waylandnatively: the Linux host links neither libX11 nor libXft
✓X11the same host, on the older session
The engines, measured
02

What the three JavaScript engines actually agree about

Spark ships no engine. macOS and Linux use the JavaScriptCore the system already has; Windows uses Chakra, and Chakra is ES5.1. That is a real trade, and a trade nobody measures is one nobody can hold us to — so the same document is run on all three and what each one answered is checked into the repository. This table is that file.

questionmacOSLinuxWindows
es6.letyesyesno
es6.arrowyesyesno
es6.promiseyesyesno
es6.mapyesyesno
es6.setyesyesno
es6.symbolyesyesno
es6.objectAssignyesyesno
es6.startsWithyesyesno
es6.includesyesyesno
es2017.padStartyesyesno
es2019.flatyesyesno
text.upper.sharpSSTRASSESTRASSESTRAßE
text.comparebeforebeforethrew
text.normalizeyesyesno
number.addition0.300000000000000040.300000000000000040.3
number.big1e+211e+211E+21
number.parseIntOct880
number.maxSafeyesyesno
regexp.unicodeyesyesno
regexp.namedyesyesno
date.toISO1970-01-01T00:00:00.000Z1970-01-01T00:00:00.000Zthrew
date.parse15779342450001577934245000NaN

22 of 44 questions. The rest all three answered the same way.

How to read it. Nothing here is a browser test. The questions are the ones an app actually runs into, and the surprises are not the missing ES6 features — those are documented — but the small ones: parseInt("08") is 0 on Windows and 8 elsewhere, 1e21 prints with a capital E, and 0.1 + 0.2 prints as 0.3 rather than the seventeen digits everything else shows. Bundling fixes syntax. It does not fix these.
The Windows column is Wine. It is what this project can run on demand, and it is not the same thing as Windows. Where it says a feature is missing, believe it; where it says something threw, check on Windows before building on it.
spark test js            # run it everywhere and compare
spark test js --write    # record what the engines say now

A difference already written down is a fact about the world. A new one is a change, and the build says so.

How that is known
03

How it is checked

spark cross app/index.html

The same document through macOS, a Linux container and Wine, each asked “is every widget where the layout put it?” and “what can the keyboard reach?”, each leaving a screenshot behind. The distribution table above comes from running the Linux binary in a clean container of each, installing nothing but libgtk-3-0 libfontconfig1, then adding the JavaScript engine to see the scripts run.

The engine is opened, not linked. Debian and Ubuntu call it libjavascriptcoregtk-4.1-0; Fedora ships it inside webkit2gtk4.1. Spark opens it at run time under every name it is known by, and a machine without it still starts and still shows the document, with one line saying its scripts will not run.