Files
node/test/module-hooks/test-module-hooks-load-builtin-override-json.js
Joyee Cheung 28f468a615 module: fix sync resolve hooks for require with node: prefixes
Previously, when require()-ing builtins with the node: prefix,
the sync resolve hooks were not properly invoked, and load hooks
could not override the builtin's format. This fixes the
handling and enables redirecting prefixed built-ins to on-disk
files and overriding them with other module types via hooks.

PR-URL: https://github.com/nodejs/node/pull/61088
Fixes: https://github.com/nodejs/node/issues/60005
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
2025-12-22 14:35:45 +00:00

38 lines
1.2 KiB
JavaScript

'use strict';
// This tests that load hooks can override the format of builtin modules
// to 'json' format.
const common = require('../common');
const assert = require('assert');
const { registerHooks } = require('module');
// Pick a builtin that's unlikely to be loaded already - like zlib.
assert(!process.moduleLoadList.includes('NativeModule zlib'));
const hook = registerHooks({
load: common.mustCall(function load(url, context, nextLoad) {
// Only intercept zlib builtin
if (url === 'node:zlib') {
// Return JSON format to override the builtin
return {
source: JSON.stringify({ custom_zlib: 'JSON overridden zlib' }),
format: 'json',
shortCircuit: true,
};
}
return nextLoad(url, context);
}, 2), // Called twice: once for 'zlib', once for 'node:zlib'
});
// Test: Load hook overrides builtin format to json
const zlib = require('zlib');
assert.strictEqual(zlib.custom_zlib, 'JSON overridden zlib');
assert.strictEqual(typeof zlib.createGzip, 'undefined'); // Original zlib API should not be available
// Test with node: prefix
const zlib2 = require('node:zlib');
assert.strictEqual(zlib2.custom_zlib, 'JSON overridden zlib');
assert.strictEqual(typeof zlib2.createGzip, 'undefined');
hook.deregister();