import { expect, test } from "vitest"; import type { PageMeta } from "@silverbulletmd/silverbullet/type/index"; import { buildPageTree } from "./plainleaf_workspace.tsx"; function page(name: string, extra: Partial = {}): PageMeta { return { ref: name, tag: "page", name, created: "2026-08-12T00:00:00Z", lastModified: "2026-08-12T00:00:00Z", perm: "rw", ...extra, }; } test("builds nested folders from slash-separated page names", () => { const tree = buildPageTree([ page("Inbox"), page("Projects/Plainleaf/Plan"), page("Projects/Plainleaf/Research"), page("Projects/Website"), ]); expect(tree.map((node) => [node.kind, node.name])).toEqual([ ["folder", "Projects"], ["page", "Inbox"], ]); expect(tree[0]).toMatchObject({ kind: "folder", name: "Projects", children: [ { kind: "folder", name: "Plainleaf", children: [ { kind: "page", name: "Projects/Plainleaf/Plan", label: "Plan" }, { kind: "page", name: "Projects/Plainleaf/Research", label: "Research", }, ], }, { kind: "page", name: "Projects/Website", label: "Website" }, ], }); }); test("keeps a page and a same-named folder as separate nodes", () => { const tree = buildPageTree([page("Projects"), page("Projects/Plan")]); expect(tree).toMatchObject([ { kind: "folder", name: "Projects", children: [{ kind: "page", name: "Projects/Plan" }], }, { kind: "page", name: "Projects" }, ]); }); test("omits aspiring and decorated hidden pages", () => { const tree = buildPageTree([ page("Visible"), page("Aspiring", { _isAspiring: true }), page("Hidden", { pageDecoration: { hide: true } }), ]); expect(tree).toMatchObject([{ kind: "page", name: "Visible" }]); });