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.
Plugins run server-side during the Quartz build step, not in the
browser. Setting platform: 'node' tells esbuild to treat Node builtins
as available externals and avoids CJS-in-ESM require() failures for
any bundled dependencies that use Node APIs.
Install github-slugger and hast-util-to-jsx-runtime as devDependencies.
These are peer dependencies of @quartz-community/utils that must be present
for tsup's DTS build to resolve all transitive type imports.
Pre-built output is now committed to the repository so that
Quartz can skip the build step during plugin installation.
The prepare script is removed to prevent redundant builds
when installing from npm/git.
tsup and typescript are only needed at build time — move to devDependencies
so they can be pruned after build. Dependencies already available from the
host Quartz installation are moved to peerDependencies to avoid duplication.