Replace the hand-written PageFileData interface with an intersection
of QuartzPluginData and Record<string, unknown>. This keeps
PageFileData structurally aligned with the upstream contract so future
DataMap additions (e.g. the FullSlug branding that prompted the
previous cast) do not require boundary casts on listProps.allFiles.
The interface-extends form previously tried in PageList.tsx (removed
in commit b707032 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 PageFileData 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 tag discovery loop
(virtual tag page generation in pageType.generate) and the tag listing
itself (allPagesWithTag and the root-index tag set builder in TagContent).
Unlisted pages no longer contribute tags, and no longer appear in any
tag listing. A tag that exists only on unlisted pages will not cause a
virtual tag page to be generated at all.
Adds 4 unit tests for pageType.generate covering tag discovery from
listed pages, unlisted exclusion, shared tags across listed and unlisted
pages, and tag-only-on-unlisted-pages suppression.
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.