@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
50 lines (39 loc) • 1.16 kB
text/typescript
import path from 'path';
import resolveFrom from 'resolve-from';
import parentModule from 'parent-module';
import { defaultBasicLogger } from './logging';
const resolve = (moduleId: string) => {
try {
const parent = parentModule(__filename);
if (!parent) {
return undefined;
}
return resolveFrom(path.dirname(parent), moduleId);
} catch (error) {
return undefined;
}
};
export const clearModule = (moduleId: string) => {
if (typeof moduleId !== 'string') {
throw new TypeError(`Expected a \`string\`, got \`${typeof moduleId}\``);
}
const filePath = resolve(moduleId);
if (!filePath) {
return;
}
const logger = defaultBasicLogger();
logger.log(' Clearing', filePath);
const cache = require.cache as { [key: string]: NodeModule | undefined };
const entry = cache[filePath];
// Delete itself from module parent
if (entry && entry.parent) {
const children = entry.parent.children;
for (let i = children.length - 1; i >= 0; i -= 1) {
if (children[i].id === filePath) {
children.splice(i, 1);
}
}
}
// Delete module from cache
delete cache[filePath];
};