import { ESCAPED_SEPARATOR, PATH_SEPARATOR, PUBLISHED_ROOT_KEYS, PUBLISHED_TEXT_EXTENSIONS, VCS_FOLDER, } from "#configuration/constants/leak.constants"; import { ROOT, absolutePath } from "@ssot/paths"; import { existsSync, readFileSync, readdirSync } from "node:fs"; import { extname, join, relative, sep } from "node:path"; import type { PublishedFile } from "#types/leak.types"; import { UTF8 } from "#configuration/constants/source.constants"; const WINDOWS_SEPARATOR = "\\"; const textFilesUnder = function textFilesUnder(dir: string): string[] { return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { const full = join(dir, entry.name); if (entry.isDirectory()) { return entry.name === VCS_FOLDER ? [] : textFilesUnder(full); } return entry.isFile() && PUBLISHED_TEXT_EXTENSIONS.has(extname(entry.name).toLowerCase()) ? [full] : []; }); }; export const publishedPaths = function publishedPaths(): string[] { return PUBLISHED_ROOT_KEYS.map((key) => absolutePath(key)) .filter((root) => existsSync(root)) .flatMap(textFilesUnder); }; export const readPublished = function readPublished(path: string): PublishedFile { return { file: relative(ROOT, path).split(sep).join(PATH_SEPARATOR), text: readFileSync(path, UTF8) }; }; export const machinePaths = function machinePaths(): string[] { const segments = ROOT.split(WINDOWS_SEPARATOR).join(PATH_SEPARATOR).split(PATH_SEPARATOR); return [...new Set([ROOT, segments.join(PATH_SEPARATOR), segments.join(ESCAPED_SEPARATOR)])]; };