import { BORN_EMPTY_FOLDERS, KEEP_FILE, SHIP_LIST_KEY, SHIP_MANIFEST, TEXT_EXTENSIONS, } from "#configuration/constants/coordination.constants"; import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; import { join, relative, sep } from "node:path"; const isText = function isText(name: string): boolean { return TEXT_EXTENSIONS.some((extension) => name.endsWith(extension)); }; const listedFiles = function listedFiles(parsed: unknown): string[] { if (typeof parsed !== "object" || parsed === null || !(SHIP_LIST_KEY in parsed)) { return []; } const listed: unknown = parsed[SHIP_LIST_KEY]; return Array.isArray(listed) ? listed.filter((entry): entry is string => typeof entry === "string") : []; }; export const shippedEntries = function shippedEntries(root: string): string[] { const parsed: unknown = JSON.parse(readFileSync(join(root, SHIP_MANIFEST), "utf8")); return [SHIP_MANIFEST, ...listedFiles(parsed)].filter((entry) => existsSync(join(root, entry))); }; const filesUnder = function filesUnder(path: string): string[] { if (!statSync(path).isDirectory()) { return isText(path) ? [path] : []; } return readdirSync(path).flatMap((name) => filesUnder(join(path, name))); }; export const packageFiles = function packageFiles(root: string): string[] { return shippedEntries(root) .flatMap((entry) => filesUnder(join(root, entry))) .sort((a, b) => a.localeCompare(b)); }; export const populatedFolders = function populatedFolders(root: string): string[] { return BORN_EMPTY_FOLDERS.flatMap((folder) => { const path = join(root, folder); if (!existsSync(path)) { return []; } return readdirSync(path) .filter((name) => name !== KEEP_FILE) .map((name) => `${folder}/${name}`); }); }; export const packagePath = function packagePath(root: string, file: string): string { return relative(root, file).split(sep).join("/"); };