// @generated — DO NOT EDIT. Source: packages/shared/reference-common.ts // --- Vault file tree helpers --- export const FILE_BROWSER_EXCLUDED = [ "node_modules/", ".git/", "dist/", "build/", ".next/", "__pycache__/", ".obsidian/", ".trash/", ".venv/", "vendor/", "target/", ".cache/", "coverage/", ".turbo/", ".svelte-kit/", ".nuxt/", ".output/", ".parcel-cache/", ".webpack/", ".expo/", "_site/", "public/", ".jekyll-cache/", "out/", ".docusaurus/", "storybook-static/", ]; export interface VaultNode { name: string; path: string; // relative path within vault type: "file" | "folder"; children?: VaultNode[]; } /** * Build a nested file tree from a sorted list of relative paths. * Folders are sorted before files at each level. */ export function buildFileTree(relativePaths: string[]): VaultNode[] { const root: VaultNode[] = []; for (const filePath of relativePaths) { const parts = filePath.split("/"); let current = root; let pathSoFar = ""; for (let i = 0; i < parts.length; i++) { const part = parts[i]; pathSoFar = pathSoFar ? `${pathSoFar}/${part}` : part; const isFile = i === parts.length - 1; let node = current.find( (n) => n.name === part && n.type === (isFile ? "file" : "folder"), ); if (!node) { node = { name: part, path: pathSoFar, type: isFile ? "file" : "folder", }; if (!isFile) node.children = []; current.push(node); } if (!isFile) { current = node.children!; } } } // Sort: folders first (alphabetical), then files (alphabetical) const sortNodes = (nodes: VaultNode[]) => { nodes.sort((a, b) => { if (a.type !== b.type) return a.type === "folder" ? -1 : 1; return a.name.localeCompare(b.name); }); for (const node of nodes) { if (node.children) sortNodes(node.children); } }; sortNodes(root); return root; }