import { argumentNotEmptyString } from "../safe"; import { TraceSource } from "../log/TraceSource"; const trace = TraceSource.get(module.id); const mainModule = require.main; const mainRequire = (id: string) => mainModule ? mainModule.require(id) : require; class ModuleResolver { _base: string | undefined; _require: NodeRequireFunction; constructor(req: NodeRequireFunction, base?: string) { this._base = base; this._require = (req || mainRequire).bind(null); } resolve(moduleName: string) { argumentNotEmptyString(moduleName, "moduleName"); const resolvedName = moduleName[0] === "." && this._base ? [this._base, moduleName].join("/") : moduleName; trace.debug(`${moduleName} -> ${resolvedName}`); return this._require(resolvedName); } } export function makeResolver(moduleName: string, contextRequire: NodeRequireFunction) { const base = moduleName && moduleName.split("/").slice(0, -1).join("/"); const resolver = new ModuleResolver(contextRequire, base); return (id: string) => resolver.resolve(id); }