import path from "path"; import AppNames from "./grab-app-names"; import checkExcludedPatterns from "./check-excluded-patterns"; import grabDirNames from "./grab-dir-names"; /** * Whether a file matched by the FileSystemRouter is actually a page. * * `Bun.FileSystemRouter` routes every file under `src/pages`, including * ones the bundler never builds: `.server.ts` companions, the `__root` * layout, tests, and paths excluded by `pages_exclude_patterns` (or inside * an excluded directory). Requests for those must 404 rather than wait for * a bundle that will never exist. Mirrors the rules in `grabAllPages`. */ export default function isRoutablePage(file_path) { const { PAGES_DIR } = grabDirNames(); const file_name = path.basename(file_path); if (/\.server\.(t|j)sx?$/.test(file_name)) return false; if (/\.test\.(t|j)sx?$/.test(file_name)) return false; if (/__tests__/.test(file_path)) return false; if (file_name.match(new RegExp(AppNames["RootPagesComponentName"]))) { return false; } // grabAllPages skips an excluded directory without looking inside it, // so check every directory between PAGES_DIR and the file as well. const relative = path.relative(PAGES_DIR, file_path); if (relative.startsWith("..") || path.isAbsolute(relative)) { return !checkExcludedPatterns({ path: file_path }); } let current = PAGES_DIR; for (const segment of relative.split(path.sep)) { current = path.join(current, segment); if (checkExcludedPatterns({ path: current })) return false; } return true; }