diff options
Diffstat (limited to 'test/js/node/stubs.test.js')
-rw-r--r-- | test/js/node/stubs.test.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/test/js/node/stubs.test.js b/test/js/node/stubs.test.js new file mode 100644 index 000000000..e6bce8aee --- /dev/null +++ b/test/js/node/stubs.test.js @@ -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**"); + } +}); |