require-it
Version:
This module extends the default Node.js require with capabilities to require nested modules, independent on where they are nested.
96 lines • 3.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.requireFrom = exports.requireGlobal = exports.requireIt = void 0;
const node_child_process_1 = require("node:child_process");
const node_path_1 = require("node:path");
const utils_1 = require("./utils");
let globalRoot;
const getGlobalRoot = () => {
if (!globalRoot) {
globalRoot = (0, node_child_process_1.execSync)("npm root -g", { encoding: "utf8" })
.trim()
.replace(/node_modules$/, "");
}
return globalRoot;
};
const checkScopedNodeModulesOfFolder = (folder, name) => {
const directModules = (0, utils_1.getNodeModulesOfFolder)(folder);
const found = directModules.find((subfolder) => {
return (0, utils_1.getFolder)(subfolder) === name;
});
if (!found) {
throw Error(`Cannot find module: "${name}"`);
}
return (0, node_path_1.join)(folder, found);
};
const checkNodeModulesOfFolder = (folder, name) => {
const root = (0, node_path_1.join)(folder, "node_modules");
const nodeModules = (0, utils_1.getNodeModulesOfFolder)(root);
for (const nodeModule of nodeModules) {
if ((0, utils_1.getFolder)(nodeModule) === name) {
return (0, node_path_1.join)(root, nodeModule);
}
(0, utils_1.getNodeModulesOfFolder)((0, node_path_1.join)(root, nodeModule, "node_modules")).forEach((subModule) => {
nodeModules.push((0, node_path_1.join)(nodeModule, "node_modules", subModule));
});
}
};
const resolveMainFile = (name, root) => {
const names = name.match(/^(@[^/]+)\/(.+)$/);
let pathToFolder;
if (names) {
const pathToModule = checkNodeModulesOfFolder(root, names[1]);
pathToFolder = checkScopedNodeModulesOfFolder(pathToModule, names[2]);
}
else {
pathToFolder = checkNodeModulesOfFolder(root, name);
}
if (!pathToFolder)
return;
const packageJSON = (0, utils_1.readPackageJSON)(pathToFolder);
if (!packageJSON.main)
return;
return (0, node_path_1.join)(pathToFolder, packageJSON.main);
};
const resolve = (name, root) => {
if (root) {
return resolveMainFile(name, root);
}
try {
return require.resolve(name);
}
catch (_a) {
return resolveMainFile(name, process.cwd());
}
};
const directory = (name, root) => {
const pathToModule = resolve(name, root);
if (!pathToModule) {
throw Error(`Cannot find module: "${name}"`);
}
name = name.replace("/", node_path_1.sep);
const pathPieces = pathToModule
.split(name + node_path_1.sep)
.filter((p) => !/^[/\\]$/.test(p))
.filter((p) => !/\.[^\.\\/]+$/.test(p));
if (pathPieces.length > 1) {
return pathPieces.join(name);
}
return (0, node_path_1.join)(pathPieces[0], name);
};
exports.requireIt = ((name) => {
return require(exports.requireIt.resolve(name));
});
exports.requireIt.resolve = (name) => resolve(name);
exports.requireIt.directory = (name) => directory(name);
exports.requireGlobal = ((name) => {
return require(exports.requireGlobal.resolve(name));
});
exports.requireGlobal.resolve = (name) => resolve(name, getGlobalRoot());
exports.requireGlobal.directory = (name) => directory(name, getGlobalRoot());
exports.requireFrom = ((module, root) => {
return require(resolve(module, root));
});
exports.requireFrom.resolve = resolve;
exports.requireFrom.directory = directory;
//# sourceMappingURL=index.js.map