sensai
Version:
Because even AI needs a master
79 lines (78 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, /**
* Start tracking dependencies.
*/ "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _nodemodule = /*#__PURE__*/ _interop_require_default(require("node:module"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
// dependency tree
const dependencyTree = {};
// cache default module require
const load = _nodemodule.default.prototype.require;
const _default = ()=>{
// @ts-ignore extend node module require
_nodemodule.default.prototype.require = function(path) {
const content = load.call(this, path);
// @ts-ignore
addChildDependencies(_nodemodule.default._resolveFilename(path, this));
return content;
};
/**
* Invalidate module cache with given filename.
*
* @param {String} filename (absolute filename path)
* @public
*/ return (filename)=>{
const dependants = new Set();
resetCache(filename, (file)=>dependants.add(file));
return {
filename,
dependants: dependants
};
};
};
/**
* Add child dependencies for a given module.
* A dependency is a module that will need to be reseted whenever the parent
* module (with the fiven `modFilename]`) changes.
*
* @param {String} modFilename
* @private
*/ const addChildDependencies = (modFilename)=>{
const mod = require.cache[modFilename];
if (mod) {
for (const { filename } of mod.children){
const dep = dependencyTree[filename] = dependencyTree[filename] || [];
if (!dep.includes(modFilename)) dep.push(modFilename);
}
}
};
/**
* Reset module cache.
*
* @param {String} filename
* @param {Function} cb (function used to create a set of dependants modules)
* @private
*/ const resetCache = (filename, cb)=>{
const dependants = dependencyTree[filename];
if (dependants) {
for (const dep of dependants){
// TODO break down code to avoid range error max call stack
resetCache(dep, cb);
cb(dep);
}
}
delete require.cache[filename];
dependencyTree[filename] = undefined;
};