UNPKG

@neabyte/project-root

Version:

A TypeScript library for detecting project root directories by analyzing file patterns and indicators across multiple programming languages and build systems.

1 lines 1.22 kB
import path from"node:path";import fg from"fast-glob";import*as indicators from"../indicators/index.js";export const allIndicators=[...indicators.listRepository,...indicators.listLanguage,...indicators.listPackage,...indicators.listBuilder,...indicators.listConfig,...indicators.listIDE,...indicators.listConfig];export function calculateScore(t){let i=0;for(const r of t){const t=allIndicators.find(t=>r.endsWith(t.path)||r.includes(t.path));t&&(i+=t.score)}return i}export function checkProjectRoot(t){try{const i=allIndicators.map(t=>t.path);return calculateScore(fg.sync(i,{cwd:t,onlyFiles:!1,onlyDirectories:!1,ignore:indicators.listBlacklist}))}catch{return 0}}export function isInsideBlacklist(t){const i=t.replace(/\\/g,"/").split("/");for(const t of i)if(indicators.listBlacklist.some(i=>{const r=i.replace("/**","");return t===r}))return!0;return!1}export function isPathRelative(t){const i=t.replace(/\\/g,"/");return i.startsWith("./")||i.startsWith("../")||!i.startsWith("/")&&!/^[A-Za-z]:/.exec(i)}export function validateAndNormalizePath(t){if("string"!=typeof t||!t||0===t.trim().length)return null;let i=t;if(isPathRelative(t))try{i=path.resolve(t)}catch{return null}return isInsideBlacklist(i)?null:i}