Replace the hand-written PageEntry type with an intersection of
QuartzPluginData and Record<string, unknown>. This keeps PageEntry
structurally aligned with the upstream contract so future DataMap
additions (e.g. the FullSlug branding that prompted this change) do
not require boundary casts on listProps.allFiles.
Construction sites that build a PageEntry from a plain string slug
now cast with 'as FullSlug' at the natural brand-boundary, matching
how slugs are produced elsewhere in the codebase.
The interface-extends form previously tried in PageList.tsx (removed
in commit e6a5d27 because it broke DTS builds) is not used here; the
intersection type alias inlines cleanly into the generated .d.ts.
Updated @quartz-community/types made slug a branded FullSlug type;
the local PageEntry uses an unbranded string slug. Cast at the
listProps boundary so DTS build succeeds without changing runtime
behaviour.
Respect the file.data.unlisted convention in both the folder discovery
loop (virtual folder index generation in pageType.generate) and the
folder listing itself (pagesFromAllFiles and pagesFromTrie in
FolderContent).
Unlisted pages no longer contribute folders or subfolders, and no longer
appear as entries inside any folder page listing. The foldersWithIndex
detection loop also skips unlisted pages so a user-authored unlisted
index file does not bypass the filter.
Exports pagesFromAllFiles so its filter logic can be tested directly.
Adds 5 unit tests covering unlisted exclusion, explicit unlisted: false
passthrough, subfolder grouping, and folder-index self-exclusion.
Virtual folder pages were using slugified folder names (e.g. 'Incomparable-Masks')
as titles. Now maps slug segments back to original relativePath segments to
preserve human-readable names with spaces.
Add prefixFolders option (default: false) to FolderPageOptions. When
false, generated folder pages use only the folder name as title instead
of 'Folder: full/path'. Also use last path segment only for the title
instead of the full folder path.