Node.js compatibility report
Generated by the node-compat harness (crates/chidori/src/node_compat.rs) against a curated subset of the Node.js core test suite (nodejs/node@v22.12.0 test/parallel, vendored by scripts/vendor-node-compat-tests.sh). Regenerate with:
NODE_COMPAT_UPDATE=1 cargo test -p chidori --lib -- node_compat140/144 passing (1 failing, 3 skipped). A test passes only if every assertion in the vendored Node test holds under chidori's engine and builtin shims; skips are tests needing facilities the harness does not provide (child processes, the WPT runner, 64-bit-sized Buffer allocations — common/fixtures and common/tmpdir are emulated over the VFS).
| Module | Pass | Fail | Skip | Rate |
|---|---|---|---|---|
| assert | 8 | 1 | 0 | 88% |
| async_hooks | 2 | 0 | 0 | 100% |
| buffer | 28 | 0 | 1 | 100% |
| diagnostics_channel | 4 | 0 | 0 | 100% |
| events | 20 | 0 | 0 | 100% |
| module | 1 | 0 | 0 | 100% |
| net | 3 | 0 | 0 | 100% |
| path | 11 | 0 | 0 | 100% |
| process | 2 | 0 | 0 | 100% |
| punycode | 1 | 0 | 0 | 100% |
| querystring | 4 | 0 | 0 | 100% |
| stream | 16 | 0 | 0 | 100% |
| string_decoder | 2 | 0 | 0 | 100% |
| timers | 5 | 0 | 0 | 100% |
| url | 17 | 0 | 2 | 100% |
| util | 6 | 0 | 0 | 100% |
| zlib | 10 | 0 | 0 | 100% |
Failing tests
test-assert.js— JavaScript exception: AssertionError: Expected values to be strictly deep-equal:
Skipped tests
test-buffer-tostring-range.js— requires 64-bit-sized Buffer allocations (chidori kMaxLength is the 32-bit bound)test-url-parse-invalid-input.js— requires Node test-suite facility 'spawnPromisified' (child processes)test-whatwg-url-custom-searchparams-sort.js— requires Node test-suite facility '../common/wpt'
Known root causes
test-assert.jsfails at theassert.okgenerated-message checks ('The expression evaluated to a falsy value:\n\n strict.ok(...)'). Node builds that message by eagerly capturing V8CallSiteobjects for the caller and re-reading the call expression out of the source file. The chidori-js engine only materializes stack frames on the throw-unwind path (record_unwind_frame), so no caller position exists at message-construction time; eager capture would have to thread a shadow call stack through all three interpreter tiers' call dispatch. Everything before those checks — including the fullcreateErrDiffMyers-diff message format — passes. (Bun's runtime does not implement this either — its vendored copy oftest-assert.jscomments the generated-message checks out; chidori keeps the test unmodified and tracks the gap here.)