Skip to content

Commit

Permalink
Simplify patching util module [refactor]
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Dec 8, 2023
1 parent 9f4a79e commit 9eb10aa
Showing 1 changed file with 33 additions and 34 deletions.
67 changes: 33 additions & 34 deletions lib/init/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,38 +60,6 @@ function createWrappedRequire(require, filename) {
return wrappedRequire;
}

// Patches to built-in modules
const modifyBuiltins = {
__proto__: null,

util(util) {
// Modify `util.promisify()` to record promisified functions
const promisifyOriginal = util.promisify,
{custom} = promisifyOriginal;
function promisify(original) {
const promisifiedFn = promisifyOriginal(original);
// Don't record if has custom promisified function defined using `custom` symbol.
// `util.promisify` doesn't create function internally in that case.
// NB: No need to check `original` is truthy or that `original[custom]` is function,
// as `util.promisify` will have thrown already in these cases.
if (!original[custom]) specialFunctions.set(promisifiedFn, {type: 'promisify', fn: original});
return promisifiedFn;
}
promisify.custom = custom;
util.promisify = promisify;

// Modify `util.debuglog()` to record debuglog functions
const debuglogOriginal = util.debuglog;
util.debuglog = function debuglog(set, cb) {
const res = debuglogOriginal.call(this, set, cb);
specialFunctions.set(res, {type: 'debuglog', set, cb});
return res;
};

if (util.debug === debuglogOriginal) util.debug = util.debuglog;
}
};

/**
* If module is a NodeJS built-in module
* @param {string} path - Path `require()` called with
Expand All @@ -107,8 +75,39 @@ function catalogIfBuiltInModule(path, exports) {

builtinModulesUncataloged.delete(path);

const modifyBuiltin = modifyBuiltins[path];
if (modifyBuiltin) modifyBuiltin(exports);
if (path === 'util') patchUtilModule(exports);

catalogBuiltInModule(path, exports, globals);
}

/**
* Patch `util.promisify` and `util.debuglog` functions to record functions they return.
* @param {Object} util - `util` module `exports` object
* @returns {undefined}
*/
function patchUtilModule(util) {
// Modify `util.promisify()` to record promisified functions
const promisifyOriginal = util.promisify,
{custom} = promisifyOriginal;
function promisify(original) {
const promisifiedFn = promisifyOriginal(original);
// Don't record if has custom promisified function defined using `custom` symbol.
// `util.promisify` doesn't create function internally in that case.
// NB: No need to check `original` is truthy or that `original[custom]` is function,
// as `util.promisify` will have thrown already in these cases.
if (!original[custom]) specialFunctions.set(promisifiedFn, {type: 'promisify', fn: original});
return promisifiedFn;
}
promisify.custom = custom;
util.promisify = promisify;

// Modify `util.debuglog()` to record debuglog functions
const debuglogOriginal = util.debuglog;
util.debuglog = function debuglog(set, cb) {
const res = debuglogOriginal.call(this, set, cb);
specialFunctions.set(res, {type: 'debuglog', set, cb});
return res;
};

if (util.debug === debuglogOriginal) util.debug = util.debuglog;
}

0 comments on commit 9eb10aa

Please sign in to comment.