Compute the base path from cfg.baseUrl and set it as a data attribute on
<body> so client-side scripts can resolve links correctly when Quartz is
deployed to a subdirectory (e.g., user.github.io/repository).
Replace per-plugin npm install with a single aggregated npm install
in the quartz root. Plugins declaring requiresInstall in their quartz
manifest now have their peerDependencies collected and installed
together, letting npm resolve compatible versions across plugins.
Remove dependencies that are only used by plugins and already bundled
into their dist files via devDependencies/tsup. This reduces the
install footprint by ~136 packages.
Removed: flexsearch, github-slugger (kept - needed by @quartz-community/utils),
gray-matter, hast-util-to-html, hast-util-to-string, is-absolute-url,
js-yaml, mdast-util-find-and-replace, mdast-util-to-hast,
mdast-util-to-string, reading-time, rehype-autolink-headings,
rehype-citation, rehype-katex, rehype-mathjax, rehype-pretty-code,
rehype-raw, rehype-slug, remark-breaks, remark-frontmatter,
remark-gfm, remark-math, remark-smartypants, satori, toml,
@types/js-yaml.
Kept native-binary deps: sharp, @napi-rs/simple-git,
@myriaddreamin/rehype-typst (cannot be bundled by plugins).
Add logOverride to the main esbuild build context to silence three
warning types that originate from upstream third-party code bundled
inside plugin dist files:
- direct-eval: gray-matter's JS frontmatter engine in note-properties
- equals-negative-zero: webidl-conversions in citations
- duplicate-object-key: BibTeX month mapping in citations
- validatePluginExternals() scans plugin dist/ for unbundled imports
and warns when non-allowlisted externals are detected
- installPluginDepsIfNeeded() runs npm install for plugins with
quartz.requiresInstall flag (for native deps like sharp)
- Added requiresInstall field to PluginManifest type
- Removed frontmatter from description plugin's vfile augmentation to avoid
conflicting DataMap declarations (TS2717/TS2687)
- Aligned frontmatter type in index.ts with note-properties plugin declaration
- Updated quartz.lock.json for description plugin
- Use --ignore-scripts during npm install to prevent duplicate builds
- Skip build entirely when dist/ directory already exists (pre-built plugins)
- Add buildPluginAsync() and runParallel() for concurrent plugin builds
- Convert all 5 build loops to parallel execution bounded by CPU count
- Prune devDependencies after build to avoid singleton duplication
Extend linkPeerPlugins() to handle two cases after pruning devDependencies:
1. @quartz-community/* peers → symlink to sibling plugin (existing)
2. All other peers → symlink to host Quartz node_modules (new)
Combined with the plugin-side changes (build tools moved to devDependencies,
shared runtime deps moved to peerDependencies), this reduces per-plugin
node_modules from ~59MB to ~6.7MB — an ~89% reduction (~2.2GB total savings
across 42 plugins).