namespace: Prevent direct mutation of ES modules in tests.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2024-02-19 16:37:09 -08:00
committed by Anders Kaseorg
parent 10892f1d60
commit cc8a4636ba

View File

@@ -66,24 +66,40 @@ function need_to_mock_template_error(filename) {
} }
function load(request, parent, isMain) { function load(request, parent, isMain) {
let module;
const filename = Module._resolveFilename(request, parent, isMain); const filename = Module._resolveFilename(request, parent, isMain);
if (module_mocks.has(filename)) { if (module_mocks.has(filename)) {
used_module_mocks.add(filename); used_module_mocks.add(filename);
const obj = module_mocks.get(filename); module = module_mocks.get(filename);
return obj; } else if (filename.endsWith(".hbs") && filename.startsWith(template_path + path.sep)) {
}
if (filename.endsWith(".hbs") && filename.startsWith(template_path + path.sep)) {
const actual_render = actual_load(request, parent, isMain); const actual_render = actual_load(request, parent, isMain);
module = template_stub({filename, actual_render});
return template_stub({filename, actual_render}); } else if (filename === jquery_path && parent.filename !== real_jquery_path) {
module = jquery_function || $;
} else {
module = actual_load(request, parent, isMain);
} }
if (filename === jquery_path && parent.filename !== real_jquery_path) { if (
return jquery_function || $; (typeof module === "object" || typeof module === "function") &&
"__esModule" in module &&
"__Rewire__" in module
) {
/* istanbul ignore next */
function error_immutable() {
throw new Error(`${filename} is an immutable ES module`);
}
return new Proxy(module, {
defineProperty: error_immutable,
deleteProperty: error_immutable,
preventExtensions: error_immutable,
set: error_immutable,
setPrototypeOf: error_immutable,
});
} }
return actual_load(request, parent, isMain); return module;
} }
function template_stub({filename, actual_render}) { function template_stub({filename, actual_render}) {