@nodecg/types
Version:
Dynamic broadcast graphics rendered in a browser
46 lines (41 loc) • 1.07 kB
text/typescript
import fs from "node:fs";
import path from "node:path";
import type express from "express";
import { isChildPath } from "../is-child-path";
import { sendFile } from "../send-file";
export function recursivelyFindFileInNodeModules(
startDir: string,
limitDir: string,
targetFilePath: string,
) {
const fileFullPath = path.join(startDir, "node_modules", targetFilePath);
if (isChildPath(limitDir, fileFullPath) && fs.existsSync(fileFullPath)) {
return fileFullPath;
}
const parentDir = path.dirname(startDir);
if (
parentDir === startDir ||
(limitDir !== parentDir && !isChildPath(limitDir, parentDir))
) {
return undefined;
}
return recursivelyFindFileInNodeModules(parentDir, limitDir, targetFilePath);
}
export function sendNodeModulesFile(
startDir: string,
limitDir: string,
filePath: string,
res: express.Response,
next: express.NextFunction,
) {
const foundPath = recursivelyFindFileInNodeModules(
startDir,
limitDir,
filePath,
);
if (!foundPath) {
res.sendStatus(404);
return;
}
sendFile(limitDir, foundPath, res, next);
}