diff options
Diffstat (limited to 'test/js/node/module')
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--"); |