mirror of
https://github.com/oven-sh/bun
synced 2026-02-14 21:01:52 +00:00
Add stubs for missing node builtins (#2534)
* Stub `node:v8`
* Stub `node:trace_events`
* Stub `node:repl`
* Stub `node:inspector`
* Stub `node:http2`
* Stub `node:diagnostics_channel`
* Stub `node:dgram`
* Stub `node:cluster`
* Link stubs
* cleanup
* Clean up the test
* Implement `node:vm` stub
* Cleanup `v8` module stub
* Add missing `promises` export to node:stream
* Implement `node:stream/promise`
* Implement `node:assert/strict`
* cleanup
* better errors
* Increaase timeout
* Update inspector.exports.js
* Make the version consistent
* Implement `process.binding("constants")`
* Update runner.node.mjs
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
This commit is contained in:
120
test/js/node/stubs.test.js
Normal file
120
test/js/node/stubs.test.js
Normal file
@@ -0,0 +1,120 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
const weirdInternalSpecifiers = [
|
||||
"_http_agent",
|
||||
"_http_client",
|
||||
"_http_common",
|
||||
"_http_incoming",
|
||||
"_http_outgoing",
|
||||
"_http_server",
|
||||
"_stream_duplex",
|
||||
"_stream_passthrough",
|
||||
"_stream_readable",
|
||||
"_stream_transform",
|
||||
"_stream_wrap",
|
||||
"_stream_writable",
|
||||
"_tls_common",
|
||||
"_tls_wrap",
|
||||
];
|
||||
|
||||
// Check that all the node modules comply with the expected interface in bun
|
||||
var specifiers = [
|
||||
"assert",
|
||||
"assert/strict",
|
||||
"async_hooks",
|
||||
"buffer",
|
||||
"child_process",
|
||||
"cluster",
|
||||
"console",
|
||||
"constants",
|
||||
"crypto",
|
||||
"dgram",
|
||||
"diagnostics_channel",
|
||||
"dns",
|
||||
"dns/promises",
|
||||
"domain",
|
||||
"events",
|
||||
"fs",
|
||||
"fs/promises",
|
||||
"http",
|
||||
"http2",
|
||||
"https",
|
||||
"inspector",
|
||||
"inspector/promises",
|
||||
"module",
|
||||
"net",
|
||||
"os",
|
||||
"path",
|
||||
"path/posix",
|
||||
"path/win32",
|
||||
"perf_hooks",
|
||||
"process",
|
||||
"punycode",
|
||||
"querystring",
|
||||
"readline",
|
||||
"readline/promises",
|
||||
"repl",
|
||||
"stream",
|
||||
"stream/consumers",
|
||||
"stream/promises",
|
||||
"stream/web",
|
||||
"string_decoder",
|
||||
"sys",
|
||||
"timers",
|
||||
"timers/promises",
|
||||
"tls",
|
||||
"trace_events",
|
||||
"tty",
|
||||
"url",
|
||||
"util",
|
||||
"util/types",
|
||||
"v8",
|
||||
"vm",
|
||||
"worker_threads",
|
||||
"zlib",
|
||||
];
|
||||
specifiers = [...weirdInternalSpecifiers, ...specifiers.flatMap(a => ["node:" + a, a])];
|
||||
|
||||
for (let specifier of specifiers) {
|
||||
test(`stubbed CJS import.meta.require ${specifier}`, async () => {
|
||||
import.meta.require(specifier);
|
||||
});
|
||||
|
||||
test(`stubbed CJS require ${specifier}`, async () => {
|
||||
require(specifier);
|
||||
});
|
||||
|
||||
test(`stubbed import ${specifier}`, async () => {
|
||||
const mod = await import(specifier);
|
||||
if ("default" in mod) {
|
||||
expect(mod).toHaveProperty("default");
|
||||
const cjs = mod.default[Symbol.for("CommonJS")];
|
||||
if (typeof cjs !== "undefined") {
|
||||
if (cjs === 1) {
|
||||
expect(typeof mod.default).toBe("function");
|
||||
} else if (cjs === true) {
|
||||
expect(cjs).toBe(true);
|
||||
if (typeof mod.default !== "undefined") {
|
||||
expect(typeof mod.default).toBe("function");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: when node:vm is implemented, delete this test.
|
||||
test("node:vm", () => {
|
||||
const { Script } = import.meta.require("node:vm");
|
||||
try {
|
||||
// **This line should appear in the stack trace**
|
||||
// That way it shows the "real" line causing the issue
|
||||
// Instead of several layers of wrapping
|
||||
new Script("1 + 1");
|
||||
throw new Error("unreacahble");
|
||||
} catch (e) {
|
||||
const msg = Bun.inspect(e);
|
||||
expect(msg).not.toContain("node:vm:");
|
||||
expect(msg).toContain("**This line should appear in the stack trace**");
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user