aboutsummaryrefslogtreecommitdiff
path: root/test/js/node/module
diff options
context:
space:
mode:
Diffstat (limited to 'test/js/node/module')
-rw-r--r--test/js/node/module/modulePrototypeOverwrite-fixture.cjs1
-rw-r--r--test/js/node/module/modulePrototypeOverwrite.cjs17
-rw-r--r--test/js/node/module/node-module-module.test.js48
-rw-r--r--test/js/node/module/resolveFilenameOverwrite-fixture.cjs1
-rw-r--r--test/js/node/module/resolveFilenameOverwrite.cjs14
5 files changed, 81 insertions, 0 deletions
diff --git a/test/js/node/module/modulePrototypeOverwrite-fixture.cjs b/test/js/node/module/modulePrototypeOverwrite-fixture.cjs
new file mode 100644
index 000000000..eecab81c1
--- /dev/null
+++ b/test/js/node/module/modulePrototypeOverwrite-fixture.cjs
@@ -0,0 +1 @@
+module.exports = require("hook");
diff --git a/test/js/node/module/modulePrototypeOverwrite.cjs b/test/js/node/module/modulePrototypeOverwrite.cjs
new file mode 100644
index 000000000..4e84026a6
--- /dev/null
+++ b/test/js/node/module/modulePrototypeOverwrite.cjs
@@ -0,0 +1,17 @@
+// This behavior is required for Next.js to work
+const eql = require("assert").deepStrictEqual;
+const Module = require("module");
+
+const old = Module.prototype.require;
+Module.prototype.require = function (str) {
+ if (str === "hook") return "winner";
+ return {
+ wrap: old.call(this, str),
+ };
+};
+
+// this context has the new require
+const result = require("./modulePrototypeOverwrite-fixture.cjs");
+eql(result, { wrap: "winner" });
+
+console.log("--pass--");
diff --git a/test/js/node/module/node-module-module.test.js b/test/js/node/module/node-module-module.test.js
index 08955a7b7..5ac48d426 100644
--- a/test/js/node/module/node-module-module.test.js
+++ b/test/js/node/module/node-module-module.test.js
@@ -1,6 +1,8 @@
import { expect, test } from "bun:test";
+import { bunEnv, bunExe } from "harness";
import { _nodeModulePaths, builtinModules, isBuiltin, wrap } from "module";
import Module from "module";
+import path from "path";
test("builtinModules exists", () => {
expect(Array.isArray(builtinModules)).toBe(true);
@@ -57,3 +59,49 @@ test("Module.wrap", () => {
expect(mod.exports.foo).toBe(1);
expect(wrap()).toBe("(function (exports, require, module, __filename, __dirname) { undefined\n});");
});
+
+test("Overwriting _resolveFilename", () => {
+ const { stdout, exitCode } = Bun.spawnSync({
+ cmd: [bunExe(), "run", path.join(import.meta.dir, "resolveFilenameOverwrite.cjs")],
+ env: bunEnv,
+ stderr: "inherit",
+ });
+
+ expect(stdout.toString().trim().endsWith("--pass--")).toBe(true);
+ expect(exitCode).toBe(0);
+});
+
+test("Overwriting Module.prototype.require", () => {
+ const { stdout, exitCode } = Bun.spawnSync({
+ cmd: [bunExe(), "run", path.join(import.meta.dir, "modulePrototypeOverwrite.cjs")],
+ env: bunEnv,
+ stderr: "inherit",
+ });
+
+ expect(stdout.toString().trim().endsWith("--pass--")).toBe(true);
+ expect(exitCode).toBe(0);
+});
+
+test("Module.prototype._compile", () => {
+ const module = new Module("module id goes here");
+ const starting_exports = module.exports;
+ const r = module._compile(
+ "module.exports = { module, exports, require, __filename, __dirname }",
+ "/file/path/goes/here.js",
+ );
+ expect(r).toBe(undefined);
+ expect(module.exports).not.toBe(starting_exports);
+ const { module: m, exports: e, require: req, __filename: fn, __dirname: dn } = module.exports;
+ expect(m).toBe(module);
+ expect(e).toBe(starting_exports);
+ expect(req).toBe(module.require);
+ expect(fn).toBe("/file/path/goes/here.js");
+ expect(dn).toBe("/file/path/goes");
+});
+
+test("Module._extensions", () => {
+ expect(".js" in Module._extensions).toBeTrue();
+ expect(".json" in Module._extensions).toBeTrue();
+ expect(".node" in Module._extensions).toBeTrue();
+ expect(require.extensions).toBe(Module._extensions);
+});
diff --git a/test/js/node/module/resolveFilenameOverwrite-fixture.cjs b/test/js/node/module/resolveFilenameOverwrite-fixture.cjs
new file mode 100644
index 000000000..adae3dd6e
--- /dev/null
+++ b/test/js/node/module/resolveFilenameOverwrite-fixture.cjs
@@ -0,0 +1 @@
+module.exports = "winner";
diff --git a/test/js/node/module/resolveFilenameOverwrite.cjs b/test/js/node/module/resolveFilenameOverwrite.cjs
new file mode 100644
index 000000000..e2d1327a7
--- /dev/null
+++ b/test/js/node/module/resolveFilenameOverwrite.cjs
@@ -0,0 +1,14 @@
+// This behavior is required for Next.js to work
+const eql = require("assert").strictEqual;
+const path = require("path");
+const Module = require("module");
+
+const original = Module._resolveFilename;
+Module._resolveFilename = str => {
+ eql(str.endsWith("💔"), true);
+ return path.join(__dirname, "./resolveFilenameOverwrite-fixture.cjs");
+};
+eql(require("overwriting _resolveFilename broke 💔"), "winner");
+Module._resolveFilename = original;
+
+console.log("--pass--");