mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-12-21 03:44:05 -06:00
* fix: small typos (#686) * fix: sluggify pound (closes #681) * fix: add another test for notes with dots * fix: dont hijack handlers when search is not focused (closes #680) * docs: add sidneys artist handbook to showcase * feat: improve default layout * fix: unbork search shortcut * fix: allow transcludes of notes with dots (closes #682) * fix: rebuild errors on windows (#692) * Revert "fix: rebuild errors on windows (#692)" (#695) This reverts commit8eec47c340. * fix: dont use default callout title if theres additional title children left (closes #693) * feat: External link icons (#697) * fix: external link icon shouldn't be vertical aligned (#699) * fix: use joinSegments for `contentIndex.json` file path (#702) * feat: add ofm option to transform `<img>` tags with video exts into `<video>` (closes #463) (#664) * enableVideoEmbed plugin * enableVideoEmbed plugin * enableVideoEmbed plugin * enableVideoEmbed plugin * enableVideoEmbed plugin * cleaned up index validation, regex, conditional, no autoplay * Update quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update ofm.ts * Update ofm.ts --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: clean up ofm code for video parsing * fix: remove extra console log * style: make internal link have less visual padding (closes #706) * refactor: move emit from callback to helper file function (#704) * Change emit from callback to helpers file function * Update docs, remove commented code, improve type sig * fix: allow dashes and underscores in block references (closes #712) * feat: Add an option to display or not reading time from notes (#707) * add an option to display or not reading time from notes * Prettier (?) * Remove ContentMeta override from quartz.layout.ts * Make it positive ! 🌞 * Update quartz/components/ContentMeta.tsx --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat(ofm): add options to parse arrows (#713) * feat(ofm): add options to parse arrows Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(ofm): add options to parse arrows Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: remove quartz 3 references, update font style in popovers * fix(search): use anchor element (closes #698) (#717) * fix(search): use anchor element This addresses #698 to allow search title to include links for SPA Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: formatter Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: move itemTile to `a` Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove nested a title Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(search): remove spaNavigate since now searchResult is an `a` item Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: breadcrumbs on non-folder pages * fix: process comments at a text level rather than a markdown level * fix: more robust ofm comment handling * fix: font weight in search * fix: add polyfill for broken tabindex on mac * pkg: bump to 4.1.5 * fix(search): update no results to be `a` (#721) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * cleanup: Move `rebuild` function outside `startServing` function (#715) * Move rebuild function outside `startServing` * Move toRebuild and toRemove inside rebuild func * Revert "Move toRebuild and toRemove inside rebuild func" This reverts commit8c4dbb13c7. * Rename func to rebuildFromEntrypoint * feat: Emit custom event when theme changes (#723) * Emit custom event when theme changes * Type themechange custom event * Update darkmode docs * fix(style): make a not inline-block * fix: make search result card block * fix: border-box result-card * feat: Enable custom callout (#724) * Enable custom callout make a callout custom defaulted to a note one. * Add a comment * remove comment from quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: code block overflow scroll (#729) * docs: rearrange showcase * docs: add nicole van der hoeven's setup guide * fix: allow partial when specifiying layout for emitter plugins * docs: fix phrasing * docs: i can't type * feat: Handling cssclasses properties in Quartz (#711) * Add cssclasses to article * Prettier * Update quartz/components/pages/Content.tsx * Update quartz/components/pages/Content.tsx --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: generalize frontmatter parsing and coercing * feat: enable dependabot * chore(deps): bump rehype-pretty-code from 0.12.3 to 0.12.6 (#741) Bumps [rehype-pretty-code](https://github.com/atomiks/rehype-pretty-code) from 0.12.3 to 0.12.6. - [Release notes](https://github.com/atomiks/rehype-pretty-code/releases) - [Commits](https://github.com/atomiks/rehype-pretty-code/compare/v0.12.3...v0.12.6) --- updated-dependencies: - dependency-name: rehype-pretty-code dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump tsx from 4.6.2 to 4.7.0 (#743) Bumps [tsx](https://github.com/privatenumber/tsx) from 4.6.2 to 4.7.0. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/develop/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.6.2...v4.7.0) --- updated-dependencies: - dependency-name: tsx dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump @napi-rs/simple-git from 0.1.9 to 0.1.11 (#746) Bumps [@napi-rs/simple-git](https://github.com/Brooooooklyn/simple-git) from 0.1.9 to 0.1.11. - [Release notes](https://github.com/Brooooooklyn/simple-git/releases) - [Commits](https://github.com/Brooooooklyn/simple-git/compare/v0.1.9...v0.1.11) --- updated-dependencies: - dependency-name: "@napi-rs/simple-git" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump rehype-mathjax from 5.0.0 to 6.0.0 (#745) Bumps [rehype-mathjax](https://github.com/remarkjs/remark-math) from 5.0.0 to 6.0.0. - [Release notes](https://github.com/remarkjs/remark-math/releases) - [Commits](https://github.com/remarkjs/remark-math/compare/rehype-mathjax@5.0.0...rehype-mathjax@6.0.0) --- updated-dependencies: - dependency-name: rehype-mathjax dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump shikiji from 0.9.9 to 0.10.2 (#742) Bumps [shikiji](https://github.com/antfu/shikiji/tree/HEAD/packages/shikiji) from 0.9.9 to 0.10.2. - [Release notes](https://github.com/antfu/shikiji/releases) - [Commits](https://github.com/antfu/shikiji/commits/v0.10.2/packages/shikiji) --- updated-dependencies: - dependency-name: shikiji dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * deps: bump flexsearch * fix: revert bad tsconfig change * feat: Option to mask folder count (#734) * Option to mask folder count * Update quartz/components/pages/FolderContent.tsx --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: fmt * fix: allow alt to be defined in wikilinks alongside dims * style: remove redundant webkit prefix * docs: improve first-time git setup * fix: revert parsing dates in frontmatter * fix: content-disposition inline should apply to all resource types (closes #728) * fix: `cssclasses` was not applied on folder note (index) (#749) * docs: improve first-time git setup * fix: cssClasses was not applied on index page * refactor: remove vscode files * fix: format * fix: cssClasses should be applied on the entire div, not only the article * feat: support cssClasses for tag-listing --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat: allow to config a translation for date (#739) * fix: alt error mix with height/width More granular detection of alt and resize in image * fix: format * feat: allow to translate the date displayed * style: format * fix: rename to fusion dateLocale with locale (i18n support) * Update quartz/components/PageList.tsx Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * remove default key as it was already set * add docstring for locale --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat: div that encapsulate PageList component (#750) * feat: div that encapsulate PageList component * change class to follow review Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * apply page-listing div to TagContent --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat(icon): update content for gfm links (#751) * feat(icon): update content for gfm links Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove unused var Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: inherit display to remove additional spacing Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * revert: remove redundant svg attribute Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: attempt to merge cached folder state between builds (closes #691) * fix: implement regex fix for alt in image wikilinks (closes #753) * fix: fmt * chore(deps): bump @napi-rs/simple-git from 0.1.11 to 0.1.14 (#756) Bumps [@napi-rs/simple-git](https://github.com/Brooooooklyn/simple-git) from 0.1.11 to 0.1.14. - [Release notes](https://github.com/Brooooooklyn/simple-git/releases) - [Commits](https://github.com/Brooooooklyn/simple-git/compare/v0.1.11...v0.1.14) --- updated-dependencies: - dependency-name: "@napi-rs/simple-git" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump rfdc from 1.3.0 to 1.3.1 (#759) Bumps [rfdc](https://github.com/davidmarkclements/rfdc) from 1.3.0 to 1.3.1. - [Commits](https://github.com/davidmarkclements/rfdc/compare/v1.3.0...v1.3.1) --- updated-dependencies: - dependency-name: rfdc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump remark-rehype from 11.0.0 to 11.1.0 (#758) Bumps [remark-rehype](https://github.com/remarkjs/remark-rehype) from 11.0.0 to 11.1.0. - [Release notes](https://github.com/remarkjs/remark-rehype/releases) - [Commits](https://github.com/remarkjs/remark-rehype/compare/11.0.0...11.1.0) --- updated-dependencies: - dependency-name: remark-rehype dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump workerpool from 8.0.0 to 9.1.0 (#757) * chore(deps): bump workerpool from 8.0.0 to 9.1.0 Bumps [workerpool](https://github.com/josdejong/workerpool) from 8.0.0 to 9.1.0. - [Changelog](https://github.com/josdejong/workerpool/blob/master/HISTORY.md) - [Commits](https://github.com/josdejong/workerpool/compare/v8.0.0...v9.1.0) --- updated-dependencies: - dependency-name: workerpool dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> * remove @types/workerpool --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix(type): make sure dispatchEvent also accept UIEvent (#760) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(div): update class name to remove weird space afterwards (#763) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(type): annotate event for nav (#761) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(css): improve wrapping when right sidebar has more than two items (#762) * improve wrapping when right sidebar has more than two items, particularly on mobile * Adjusted min-width * feat: support selfhost umami (#764) * feat: support selfhsot umami * Update quartz/plugins/emitters/componentResources.ts Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * Update quartz/plugins/emitters/componentResources.ts Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * chore(deps-dev): bump prettier from 3.1.1 to 3.2.4 (#768) * chore(deps-dev): bump prettier from 3.1.1 to 3.2.4 Bumps [prettier](https://github.com/prettier/prettier) from 3.1.1 to 3.2.4. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.1.1...3.2.4) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * format --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore(deps-dev): bump @types/node from 20.3.3 to 20.11.11 (#767) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.3.3 to 20.11.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump @floating-ui/dom from 1.5.3 to 1.6.1 (#766) Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.5.3 to 1.6.1. - [Release notes](https://github.com/floating-ui/floating-ui/releases) - [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md) - [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.1/packages/dom) --- updated-dependencies: - dependency-name: "@floating-ui/dom" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump lightningcss from 1.22.1 to 1.23.0 (#765) Bumps [lightningcss](https://github.com/parcel-bundler/lightningcss) from 1.22.1 to 1.23.0. - [Release notes](https://github.com/parcel-bundler/lightningcss/releases) - [Commits](https://github.com/parcel-bundler/lightningcss/compare/v1.22.1...v1.23.0) --- updated-dependencies: - dependency-name: lightningcss dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: Feature/custom callout icon (#727) * Add icons as masks To handle a simple way to add custom icons, i made it pure css. Icon are now a mask for the callout-icon div, so they always follow the --color form the current callout. Now to add a custom icon, you simply add ```css .callout { &[data-callout="custom"] { --color: #customcolor; --border: #custombordercolor; --bg: #custombg; --callout-icon: url('data:image/svg+xml; utf8, <custom formatted svg>'); } ``` to custom.scss * remove now unused code * Make callouts an enum * docs: update instructions for custom callouts * Prettier & run format * dynamic matching For maintainability, make dynamic mathching. If we or Obsidian want to support more callouts, we simply add it to the enum * callout mapping const Getting ride of the enum entierly as it's not worth here? * fix callout icon styling * Add forgotten icons * Rebase * harmonize callout icon and fold icon * fix docs + prettier * Update docs/features/callouts.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update quartz/plugins/transformers/ofm.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Suggestions fix * remove unecessary rules * comment is always nice * Update docs/features/callouts.md --------- Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: properly parse tags in body * feat(search): experimental telescope layout (closes #718) (#722) * feat(search): telescope-style search Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(search): cleanup some basis and borders Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(search): make sure to set overflow-y Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(search): shows preview on desktop only search Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * perf: add options to control layout through config cache memoize results to avoid fetching Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: use the default configuration * fix: correct minor type for search Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: use datasets to query for preview Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: layout changes show preview on normal layout, and only show previous layout in list page. * fix(type): annotate search with types Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: apply jacky's suggestion Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore: using map API and scss Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: styling on search container view on phones Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * Update quartz.layout.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore(deps): bump katex to 0.16.9 (#772) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(usability): update functions for search (#774) * feat(usability): update functions for search Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * perf: slightly cleaner variables Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(style): search preview consistency * pkg: bump to 4.1.6 * fix: allow formatting in callout titles * docs: fix outdated comment on rebuild debounce behaviour * fix: fmt * fix(search): remove background with mouseEvent (#775) * fix(search): remove background with mouseEvent make sure when mouseenter we remove all existing background Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: update logics from suggestions Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * revert: class is evicted * fix: address correct type Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix: regression in formatted callout titles * deps: reduce dependabot frequency * chore(deps-dev): bump @types/node from 20.11.11 to 20.11.14 (#779) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.11.11 to 20.11.14. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump async-mutex from 0.4.0 to 0.4.1 (#777) Bumps [async-mutex](https://github.com/DirtyHairy/async-mutex) from 0.4.0 to 0.4.1. - [Changelog](https://github.com/DirtyHairy/async-mutex/blob/master/CHANGELOG.md) - [Commits](https://github.com/DirtyHairy/async-mutex/compare/v0.4.0...v0.4.1) --- updated-dependencies: - dependency-name: async-mutex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump mdast-util-to-hast from 13.0.2 to 13.1.0 (#776) Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.0.2 to 13.1.0. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](https://github.com/syntax-tree/mdast-util-to-hast/compare/13.0.2...13.1.0) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/hast from 3.0.3 to 3.0.4 (#780) Bumps [@types/hast](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/hast) from 3.0.3 to 3.0.4. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/hast) --- updated-dependencies: - dependency-name: "@types/hast" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(search): improve more general usability (closes #781) (#782) * fix(search): improve more general usability Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: revert naming Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: correct check for enter event on no-match cases Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * Update quartz/components/scripts/search.inline.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore: remove unecessary class for tracking mouse Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat(search): highlight on preview (#783) * feat: primitive full-text search on preview Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: remove invalid regex and unused code path Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(search): increase size on fullPageWidth viewport (#784) * fix(search): increase size on fullPageWidth viewport Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: fix width size to be consistent on multiple views Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: set layout to 0 if there is no term remove flashing by setting max-height Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(search): check for input type and assignment of focus (#785) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * docs: clarity for `RecentNotes` (#786) - Removed a word for clarity - added reference to layout file * chore: add window.addCleanup() for cleaning up handlers * feat: improve search preview styling and tokenization * fix: border radius on search preview * fix: index setup, styling fixes * chore(cleanup): misc refactoring for cleanup, fix some search bugs * pkg: bump to 4.2.0 * chore: fmt * fix: flatmap children when highlighting rich preview to avoid body * fix: be more eager about constructing search index * fix(style): reasonable page width for rich search preview * fix(search): set correct attribute on hover icon (#787) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: parallelize search indexing * fix: font weight consistency * fix: font smoothing defaults * fix(revert): font aliasing * fix: use display instead of visibility for click handling pasthrough * fix: search async ordering, scroll offset * fix(style): remove redundant selector * pkg: bump to 4.2.1 * fix(style): correctly collapse on mobile * fix: properly handle absolute paths in `CreatedModifiedDate` (#790) When providing an absolute path to the content directory (e.g. when using an Obsidian Vault in another directory), the build step would fail with Failed to process `/absolute/path/to/file.md`: ENOENT: no such file or directory, stat '/current/working/directory/absolute/path/' This problem originated in the `CreatedModifiedDate` transformer which tries to construct a native filesystem path to the file to call `fs.stat` on. It did not however, account for the original file path contained in the received `VFile` being an absolute path and so, just concatenated the current working directory with the absolute path producing a nonexistent one. This patch adds a simple fix for this issue by checking if the original file path is already absolute before concatenating with the current working directory. * fix(search): null checks and focus fixes * fix(style): prevent callout icon from shrinking on long titles (closes #792) * fix(search): dont rely on mouse to manipulate focus * fix(search): oops restore ability to preview on hover lol * fix(search): flex basis and card highlighting * fix: calculate heading after latex (closes #719) * feat: Adding support for i18n (closes #462) (#738) * fix: alt error mix with height/width More granular detection of alt and resize in image * fix: format * feat: init i18n * feat: add translation * style: prettier for test * fix: build-up the locale to fusion with dateLocale * style: run prettier * remove cursed file * refactor: remove i18n library and use locale way instead * format with prettier * forgot to remove test * prevent merging error * format * format * fix: allow string for locale - Check during translation if valid / existing locale - Allow to use "en" and "en-US" for example - Add fallback directly in the function - Add default key in the function - Add docstring to cfg.ts * forgot item translation * remove unused locale variable * forgot to remove fr-FR testing * format * feat(ofm): parsing all type of arrow (#797) * feat(ofm): parsing all type of arrow Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: use html value instead of decimal Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: skip parsing arrow if it is not a valid supported mapping Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(i18n): backlinks naming in mapping (#800) * chore(i18n): refactor and cleanup (#805) * checkpoint * finish * docs * fix(path): properly path encode & * pkg: bump to 4.2.2 * style(search): increase width on mobile view (#796) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat: support checkbox (closes #646) (#799) * feat: support checkbox Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: apply review from jacky --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(i18n): German translation (#808) * feat(i18n): Add Japanese to i18n (#809) Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * feat(i18n): Add Dutch to i18n (#813) * Create nl-NL.ts * Update index.ts * Update nl-NL.ts * chore(deps): bump @napi-rs/simple-git from 0.1.14 to 0.1.16 (#810) Bumps [@napi-rs/simple-git](https://github.com/Brooooooklyn/simple-git) from 0.1.14 to 0.1.16. - [Release notes](https://github.com/Brooooooklyn/simple-git/releases) - [Commits](https://github.com/Brooooooklyn/simple-git/compare/v0.1.14...v0.1.16) --- updated-dependencies: - dependency-name: "@napi-rs/simple-git" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 20.11.14 to 20.11.16 (#811) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.11.14 to 20.11.16. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(i18n): add default locale * fix(i18n): forgot a string * perf: don't load mermaid if its not on the page * fix(search): set background-color for icon within preview panel (#815) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(links): show backdrop on links highlighted in headers alias (#816) * fix: assign specific classes based on parent node Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: use custom role for anchor icone Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: allow color on links 😄 Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: unify search inner container Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(i18n): add Romanian to i18n (#821) * chore(lang): lang element based on frontmatter or default locale (#819) default locale Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * add Spanish translations (#822) * add Spanish translations * format with prettier * clears npm ci, formatted w/ prettier * feat(fonts): fetch before build (#817) * feat: fetch google fonts before build Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * Update quartz/plugins/emitters/componentResources.ts * fix: fetching wolff2 Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove request stylesheet Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: race condition Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove preconnect for static fonts since we are already downloading fonts into public folder Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove deadcode Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: add options to gate for cdn caching Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore: apply jacky's suggestion Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore: add docs and only use one promise Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: fmt Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: remove deadcode * chore: final touches Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * revert: changes in theme.ts * fix: styles and remove deadcode Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix(umami): format correct string from custom hosts (#826) * added Ukrainian to i18n (#829) * feat(i18n): use Romanian translation for `ro-MD` locale (#828) * fix: set default locale for lang attribute * feat(experimental): partial rebuilds (#716) * feat(i18n): add Arabic translation (#837) * feat(i18n): add Arabic translation * chore: format * feat(i18n): support parsing callouts (#834) * feat(i18n): support parsing callouts Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: move callout into components Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: update arabic translation Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: make sure to use correct items Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: move fonts all into static folder (#835) * chore: move fonts all into static folder Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore: update formatter Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * chore(callouts): remove unnecessary whitespaces after class name (#833) Though we should have a plugins that just strip whitespace in all node class. Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(i18n): localize the min read string (#838) * feat(i18n): localize the min read string fixes #825 * chore: format * docs: add documentation for Umami analytics integration (#846) * chore: refactor out and export endsWith * fix: breadcrumbs displayName issue for file names ending with index (#839) * feat(i18n): localize the `min read` string for the `ro-RO` locale (#847) * feat(i18n): localize `min read` string for `ro-RO` locale * chore: run Prettier on `quartz/i18n/locales/ro-RO.ts` * fix(breadcrumbs): folder index by full path rather than folder name (closes #676) * chore(deps): bump esbuild-sass-plugin from 2.16.0 to 2.16.1 (#778) Bumps [esbuild-sass-plugin](https://github.com/glromeo/esbuild-sass-plugin) from 2.16.0 to 2.16.1. - [Release notes](https://github.com/glromeo/esbuild-sass-plugin/releases) - [Commits](https://github.com/glromeo/esbuild-sass-plugin/compare/v2.16.0...v2.16.1) --- updated-dependencies: - dependency-name: esbuild-sass-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(ofm): allow diacretic marks in tag regex (closes #830) * fix(fast rebuild): call only required emitters, don't always copy assets (#845) * fix(fast rebuild): call only required emitters, don't always copy assets * Type function * feat: add transclude-src to transclude 'link to original' * feat(i18n): localize the min read string for the nl-NL locale (#850) * Update min read translation * Added nl_BE to Dutch Added Flemish (nl_BE) to point to nl. * Removed period to match other translations * fix(analytics): umami custom host should be a string (closes #852) * chore(deps-dev): bump tsx from 4.7.0 to 4.7.1 (#859) Bumps [tsx](https://github.com/privatenumber/tsx) from 4.7.0 to 4.7.1. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/develop/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.7.0...v4.7.1) --- updated-dependencies: - dependency-name: tsx dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump preact from 10.19.3 to 10.19.4 (#858) Bumps [preact](https://github.com/preactjs/preact) from 10.19.3 to 10.19.4. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.19.3...10.19.4) --- updated-dependencies: - dependency-name: preact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump @floating-ui/dom from 1.6.1 to 1.6.3 (#857) Bumps [@floating-ui/dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/dom) from 1.6.1 to 1.6.3. - [Release notes](https://github.com/floating-ui/floating-ui/releases) - [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/dom/CHANGELOG.md) - [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/dom@1.6.3/packages/dom) --- updated-dependencies: - dependency-name: "@floating-ui/dom" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: incorrect link resolution for transclusion in root index file (#853) Co-authored-by: Lauréline Nevin <laureline.nevin@unicaen.fr> * fix: base.com not being resolved properly with joinSegments * chore(types): add additional hint for LSP support (#864) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * docs: workaround for shallow clones on Cloudflare Pages (#868) Rather than recommend a different hosting provider, Cloudflare Pages users that prioritize the `git` method for their `CreatedModifiedDate` configuration can preface the build command with a means of fetching the required repository history. See: - https://gohugo.io/methods/page/gitinfo/#hosting-considerations * Add support for image popovers (#854) * feat(popover): Add support for images * fix: run prettier * feat(popover): use switch logic for content types & adjust styles * feat(popover): Add content type data tag for popover-inner class * feat: implement getDependencyGraph for FolderPage (#849) * feat: implement getDependencyGraph for AliasRedirects emitter (#860) * fix/feat(fast rebuild): re-render transclusions in normal and fastRebuild mode (#842) * Re-render transclusions in normal watch mode * Include transclusions in ContentPage getDependencyGraph * Address PR comments * feat: add user-defined config for syntax highlighting plugin (#869) * feat: add user-defined options to syntax highlighting plugin * feat: add default syntax highlighting config to `quartz.config.ts` * chore: refactor according to @aarnphm's review Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * chore: run Prettier on `quartz/plugins/transformers/syntax.ts` * Update quartz/plugins/transformers/syntax.ts Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * Update syntax.ts --------- Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * fix(style): introduce semiBoldWeight and various improvements to reduce CLS * fix(style): bold should use semibold * fix(breadcrumbs): calculate trailing slash for tag hierarchies (closes #873) * feat(i18n): add Russian (#886) * feat(i18n): add Korean (#889) * feat(i18n): add Korean * feat(i18n): add Korean * perf(cdn): CDNJS instead of JSDelivr (#891) * fix(frontmatter): delimiters parameter was not passed (#885) * fix: delimiters parameter was not passed Signed-off-by: Eiko Wagenknecht <git@eiko-wagenknecht.de> * fix: remove unneeded undefined --------- Signed-off-by: Eiko Wagenknecht <git@eiko-wagenknecht.de> * feat(i18n): Add Italian (#893) Signed-off-by: Leonardo Ledda <leonardoledda@gmail.com> * docs: add self-hosting section (#883) * Add Self-Hosting section Add Nginx section * run prettier * feat(i18n): add Simplified Chinese (#896) * feat: implement getDependencyGraph for TagPage (#872) * feat: implement getDependencyGraph for TagPage * Only add file to dg if it has at least 1 tag * fix: remove assets via globs to avoid volume mount lock (#877) * Fix docker volume lock issue by altering asset cleanup method Modified build process to prevent the deletion of the output directory. * Add fsOps utility for filesystem operations * Use cleanDirectory in build process to fix volume lock issue * applied prettier * handle ENOENT error when output dir does not exist * remove native function in favor of rimraf * use path.join to concatenate paths * chore(deps-dev): bump @types/node from 20.11.16 to 20.11.19 (#899) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.11.16 to 20.11.19. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump globby from 14.0.0 to 14.0.1 (#897) Bumps [globby](https://github.com/sindresorhus/globby) from 14.0.0 to 14.0.1. - [Release notes](https://github.com/sindresorhus/globby/releases) - [Commits](https://github.com/sindresorhus/globby/compare/v14.0.0...v14.0.1) --- updated-dependencies: - dependency-name: globby dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump preact from 10.19.4 to 10.19.5 (#898) Bumps [preact](https://github.com/preactjs/preact) from 10.19.4 to 10.19.5. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.19.4...10.19.5) --- updated-dependencies: - dependency-name: preact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: correctly parse falsy js as title (#900) * feat(i18n): change itemsUnderFolder, itemsUnderTag translation of ko-KR (#905) * feat(i18n): add Korean * feat(i18n): add Korean * feat(i18n): change itemsUnderFolder, itemsUnderTag translation of ko-KR * fix: add space and missing dot for listing pages (#907) * fix(toc): correct type for minEntries param (#909) * docs: Fix in explorer.md (#911) * docs: Add Aster's notebook to showcase.md (#912) * chore: passing additional buildCtx to componentData (#914) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * feat(popover): add support for PDF (#913) * feat(popover): add support for PDF Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore: split pdf by ';' Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: remove unnecessary check Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(img): return targetUrl as given href (#916) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * deps(highlighting): migrate to shiki as shikiji has been archived (#918) * fix(docs): make docs accurate to callout behaviour (closes #920) * fix(callouts): use user provided title instead of canonical for default title * docs: update plugin documentation (#888) * docs: first few plugins documented * docs: move plugin info * docs: move plugin docs to tag based system * docs: update latex example code snippet * docs: fix spelling of latex in title * docs: add missing linebreak * docs: remove plugin tag from feature pages * docs: shorten titles * docs: refine wording * docs: move plugin details for frontmatter * docs: add features/* tags * docs: update latex example * docs: make references more explicit * docs: add stubs for the remaining plugins * docs: more descriptions * docs: fix feature tags * docs: descriptions * docs: new plugin pages * docs: update configuration page * docs: more plugin work * docs: run prettier * docs: remove comments in config file and add link to docs * docs: minor fixes * docs: run prettier * docs: spelling * docs: update docs/plugins/AliasRedirects.md Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * docs: update docs/plugins/Assets.md Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * docs: update docs/plugins/CNAME.md Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * docs: update docs/plugins/Static.md Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * docs: update docs * docs: update docs/features/Mermaid diagrams.md Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * docs: update docs/plugins/RemoveDrafts.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs: update docs/plugins/Assets.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs: update docs/configuration.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs: update docs/configuration.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs: update docs/configuration.md Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs: some updates * docs: work in review comments --------- Signed-off-by: Eiko Wagenknecht <git@eiko-wagenknecht.de> Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> * docs(latex): mhchem * fix(fast rebuild): handle added an deleted markdown correctly (#921) * Handle added files correctly * Handle deletes properly * addGraph renamed to mergeGraph * fix(ci): autotag * pkg: bump to 4.2.3 * ci: fix autotag * ci: tag as a separate step * ci: fix typo in runs-on * ci: also checkout and install node before tagging * docs: fix tag page oops (#925) * chore(types): update correct annotations for pages (#928) * chore(type): export attribute for theme key (#933) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(deps): bump preact from 10.19.5 to 10.19.6 (#935) Bumps [preact](https://github.com/preactjs/preact) from 10.19.5 to 10.19.6. - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.19.5...10.19.6) --- updated-dependencies: - dependency-name: preact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump chokidar from 3.5.3 to 3.6.0 (#937) Bumps [chokidar](https://github.com/paulmillr/chokidar) from 3.5.3 to 3.6.0. - [Release notes](https://github.com/paulmillr/chokidar/releases) - [Commits](https://github.com/paulmillr/chokidar/compare/3.5.3...3.6.0) --- updated-dependencies: - dependency-name: chokidar dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: Clarifications in the Explorer Docs (#938) add example to filter by tags. * fix: correct umami host for self-hosted (#939) * fixed umami script path for self-hosted version * Update quartz/plugins/emitters/componentResources.ts Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> --------- Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> * feat(i18n): add Vietnamese translation (#950) * fix(callout): reorder the plugins to render latex on callout title (closes #952) (#934) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(deps): bump remark-smartypants from 2.0.0 to 2.1.0 (#755) Bumps [remark-smartypants](https://github.com/silvenon/remark-smartypants) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/silvenon/remark-smartypants/releases) - [Commits](https://github.com/silvenon/remark-smartypants/compare/v2.0.0...v2.1.0) --- updated-dependencies: - dependency-name: remark-smartypants dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: support transcluding codeblocks and blockquotes (closes #940) * fix(docs): correct ExplicitPublish as filters instead of transformers (#953) * feat(frontmatter): configure max length for description (#946) * Sentence length check * Replace external links with domain name. * Updated documentation. * Updated replacement values. * Updated Regex based on feedback. * Check description for undefined * Updated external url transform regex. * Updated formatting * feat(graph): focusOnHover (#954) by default, globalGraph will enable focusOnHover, similar to Obsidian. --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * chore(deps): bump lightningcss from 1.23.0 to 1.24.0 (#961) Bumps [lightningcss](https://github.com/parcel-bundler/lightningcss) from 1.23.0 to 1.24.0. - [Release notes](https://github.com/parcel-bundler/lightningcss/releases) - [Commits](https://github.com/parcel-bundler/lightningcss/compare/v1.23.0...v1.24.0) --- updated-dependencies: - dependency-name: lightningcss dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump preact-render-to-string from 6.3.1 to 6.4.0 (#960) Bumps [preact-render-to-string](https://github.com/developit/preact-render-to-string) from 6.3.1 to 6.4.0. - [Release notes](https://github.com/developit/preact-render-to-string/releases) - [Changelog](https://github.com/preactjs/preact-render-to-string/blob/main/CHANGELOG.md) - [Commits](https://github.com/developit/preact-render-to-string/compare/v6.3.1...6.4.0) --- updated-dependencies: - dependency-name: preact-render-to-string dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump shiki from 1.1.6 to 1.1.7 (#959) Bumps [shiki](https://github.com/shikijs/shiki/tree/HEAD/packages/shiki) from 1.1.6 to 1.1.7. - [Release notes](https://github.com/shikijs/shiki/releases) - [Changelog](https://github.com/shikijs/shiki/blob/main/CHANGELOG.md) - [Commits](https://github.com/shikijs/shiki/commits/v1.1.7/packages/shiki) --- updated-dependencies: - dependency-name: shiki dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * revert: "fix(callout): reorder the plugins to render latex on callout… (#965) This reverts commit018c6358c4. * fix: transclude all subsections for embedded call (closes #963) (#964) * chore(deps-dev): bump @types/node from 20.11.19 to 20.11.24 (#958) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.11.19 to 20.11.24. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: transclude subsection without dynamic regex construction * feat: support youtube playlist iframe (#968) * feat: support youtube playlist iframe * chore: updated Youtube embed documentation to include playlists * fix(tag): move hash to sass styling only (#930) * fix(tag): remove hash on main page (#969) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix: remove extra # from tag content * feat(analytics): Goatcounter support (#956) * Add options to support goatcounter analytics * goatcounter: support self-hosted * Add to configuration docs for goatcounter settings * use https instead of protocol-relative link for goatcounter js * fix(description): make sure to we join space correctly (#970) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> * fix(description): counts characters instead of words (#972) * fix(description): make sure description counts characters instead of words * ref: removed duplicate ternary * fix(i18n): make sure to use correct fileData for manual localization (#975) Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> --------- Signed-off-by: Aaron <29749331+aarnphm@users.noreply.github.com> Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Eiko Wagenknecht <git@eiko-wagenknecht.de> Signed-off-by: Leonardo Ledda <leonardoledda@gmail.com> Co-authored-by: ikorihn <16367098+ikorihn@users.noreply.github.com> Co-authored-by: Jacky Zhao <j.zhao2k19@gmail.com> Co-authored-by: kabirgh <15871468+kabirgh@users.noreply.github.com> Co-authored-by: sean <146651411+tuta-amb@users.noreply.github.com> Co-authored-by: Matthew Bailin <matthewdbailin@gmail.com> Co-authored-by: LUCASTUCIOUS <peterlucas2804@gmail.com> Co-authored-by: Aaron Pham <29749331+aarnphm@users.noreply.github.com> Co-authored-by: Xinyang Yu <47915643+xy-241@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mara-Li <lili.simonetti@outlook.fr> Co-authored-by: Mara-Li <mara-li@outlook.fr> Co-authored-by: Justin Fowler <justin.fowler@hey.com> Co-authored-by: 1900 <me@1900.live> Co-authored-by: Luis Michaelis <me@lmichaelis.de> Co-authored-by: Mats Fangohr <83273529+MatsFangohr@users.noreply.github.com> Co-authored-by: 松浦 知也 Matsuura Tomoya <me@matsuuratomoya.com> Co-authored-by: Emile Bangma <ewjbangma@hotmail.com> Co-authored-by: Silviu Lorenț <124451350+smilorent@users.noreply.github.com> Co-authored-by: Miguel Pimentel <contact@miguelpimentel.do> Co-authored-by: Serhii Stets <stets.serhii@gmail.com> Co-authored-by: Alq <ahmed.elq53@gmail.com> Co-authored-by: Neel Shah <neelshah.1998@gmail.com> Co-authored-by: Lin <git@compilin.dev> Co-authored-by: Lauréline Nevin <laureline.nevin@unicaen.fr> Co-authored-by: Aaron Bull Schaefer <aaron@elasticdog.com> Co-authored-by: David Fischer <david@konst.fish> Co-authored-by: makondratev <69584771+makondratev@users.noreply.github.com> Co-authored-by: JONG HWAN KIM <99215801+JongDeug@users.noreply.github.com> Co-authored-by: s-crypt <41712656+s-crypt@users.noreply.github.com> Co-authored-by: Eiko Wagenknecht <git@eiko-wagenknecht.de> Co-authored-by: Leonardo Ledda <35930217+LeddaZ@users.noreply.github.com> Co-authored-by: kon-foo <25391223+kon-foo@users.noreply.github.com> Co-authored-by: KylinDC <solder-hulls.06@icloud.com> Co-authored-by: Aster Hu <asterhu17@gmail.com> Co-authored-by: HakuGuen <80277109+HakuGuen@users.noreply.github.com> Co-authored-by: sventec <sventec@users.noreply.github.com> Co-authored-by: Matt Vogel <mainmoniker@googlemail.com> Co-authored-by: Tyler Funk <tcfunk25@gmail.com>
545 lines
16 KiB
JavaScript
545 lines
16 KiB
JavaScript
import { promises } from "fs"
|
|
import path from "path"
|
|
import esbuild from "esbuild"
|
|
import chalk from "chalk"
|
|
import { sassPlugin } from "esbuild-sass-plugin"
|
|
import fs from "fs"
|
|
import { intro, outro, select, text } from "@clack/prompts"
|
|
import { rimraf } from "rimraf"
|
|
import chokidar from "chokidar"
|
|
import prettyBytes from "pretty-bytes"
|
|
import { execSync, spawnSync } from "child_process"
|
|
import http from "http"
|
|
import serveHandler from "serve-handler"
|
|
import { WebSocketServer } from "ws"
|
|
import { randomUUID } from "crypto"
|
|
import { Mutex } from "async-mutex"
|
|
import { CreateArgv } from "./args.js"
|
|
import {
|
|
exitIfCancel,
|
|
escapePath,
|
|
gitPull,
|
|
popContentFolder,
|
|
stashContentFolder,
|
|
} from "./helpers.js"
|
|
import {
|
|
UPSTREAM_NAME,
|
|
QUARTZ_SOURCE_BRANCH,
|
|
ORIGIN_NAME,
|
|
version,
|
|
fp,
|
|
cacheFile,
|
|
cwd,
|
|
} from "./constants.js"
|
|
|
|
/**
|
|
* Handles `npx quartz create`
|
|
* @param {*} argv arguments for `create`
|
|
*/
|
|
export async function handleCreate(argv) {
|
|
console.log()
|
|
intro(chalk.bgGreen.black(` Quartz v${version} `))
|
|
const contentFolder = path.join(cwd, argv.directory)
|
|
let setupStrategy = argv.strategy?.toLowerCase()
|
|
let linkResolutionStrategy = argv.links?.toLowerCase()
|
|
const sourceDirectory = argv.source
|
|
|
|
// If all cmd arguments were provided, check if theyre valid
|
|
if (setupStrategy && linkResolutionStrategy) {
|
|
// If setup isn't, "new", source argument is required
|
|
if (setupStrategy !== "new") {
|
|
// Error handling
|
|
if (!sourceDirectory) {
|
|
outro(
|
|
chalk.red(
|
|
`Setup strategies (arg '${chalk.yellow(
|
|
`-${CreateArgv.strategy.alias[0]}`,
|
|
)}') other than '${chalk.yellow(
|
|
"new",
|
|
)}' require content folder argument ('${chalk.yellow(
|
|
`-${CreateArgv.source.alias[0]}`,
|
|
)}') to be set`,
|
|
),
|
|
)
|
|
process.exit(1)
|
|
} else {
|
|
if (!fs.existsSync(sourceDirectory)) {
|
|
outro(
|
|
chalk.red(
|
|
`Input directory to copy/symlink 'content' from not found ('${chalk.yellow(
|
|
sourceDirectory,
|
|
)}', invalid argument "${chalk.yellow(`-${CreateArgv.source.alias[0]}`)})`,
|
|
),
|
|
)
|
|
process.exit(1)
|
|
} else if (!fs.lstatSync(sourceDirectory).isDirectory()) {
|
|
outro(
|
|
chalk.red(
|
|
`Source directory to copy/symlink 'content' from is not a directory (found file at '${chalk.yellow(
|
|
sourceDirectory,
|
|
)}', invalid argument ${chalk.yellow(`-${CreateArgv.source.alias[0]}`)}")`,
|
|
),
|
|
)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Use cli process if cmd args werent provided
|
|
if (!setupStrategy) {
|
|
setupStrategy = exitIfCancel(
|
|
await select({
|
|
message: `Choose how to initialize the content in \`${contentFolder}\``,
|
|
options: [
|
|
{ value: "new", label: "Empty Quartz" },
|
|
{ value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" },
|
|
{
|
|
value: "symlink",
|
|
label: "Symlink an existing folder",
|
|
hint: "don't select this unless you know what you are doing!",
|
|
},
|
|
],
|
|
}),
|
|
)
|
|
}
|
|
|
|
async function rmContentFolder() {
|
|
const contentStat = await fs.promises.lstat(contentFolder)
|
|
if (contentStat.isSymbolicLink()) {
|
|
await fs.promises.unlink(contentFolder)
|
|
} else {
|
|
await rimraf(contentFolder)
|
|
}
|
|
}
|
|
|
|
const gitkeepPath = path.join(contentFolder, ".gitkeep")
|
|
if (fs.existsSync(gitkeepPath)) {
|
|
await fs.promises.unlink(gitkeepPath)
|
|
}
|
|
if (setupStrategy === "copy" || setupStrategy === "symlink") {
|
|
let originalFolder = sourceDirectory
|
|
|
|
// If input directory was not passed, use cli
|
|
if (!sourceDirectory) {
|
|
originalFolder = escapePath(
|
|
exitIfCancel(
|
|
await text({
|
|
message: "Enter the full path to existing content folder",
|
|
placeholder:
|
|
"On most terminal emulators, you can drag and drop a folder into the window and it will paste the full path",
|
|
validate(fp) {
|
|
const fullPath = escapePath(fp)
|
|
if (!fs.existsSync(fullPath)) {
|
|
return "The given path doesn't exist"
|
|
} else if (!fs.lstatSync(fullPath).isDirectory()) {
|
|
return "The given path is not a folder"
|
|
}
|
|
},
|
|
}),
|
|
),
|
|
)
|
|
}
|
|
|
|
await rmContentFolder()
|
|
if (setupStrategy === "copy") {
|
|
await fs.promises.cp(originalFolder, contentFolder, {
|
|
recursive: true,
|
|
preserveTimestamps: true,
|
|
})
|
|
} else if (setupStrategy === "symlink") {
|
|
await fs.promises.symlink(originalFolder, contentFolder, "dir")
|
|
}
|
|
} else if (setupStrategy === "new") {
|
|
await fs.promises.writeFile(
|
|
path.join(contentFolder, "index.md"),
|
|
`---
|
|
title: Welcome to Quartz
|
|
---
|
|
|
|
This is a blank Quartz installation.
|
|
See the [documentation](https://quartz.jzhao.xyz) for how to get started.
|
|
`,
|
|
)
|
|
}
|
|
|
|
// Use cli process if cmd args werent provided
|
|
if (!linkResolutionStrategy) {
|
|
// get a preferred link resolution strategy
|
|
linkResolutionStrategy = exitIfCancel(
|
|
await select({
|
|
message: `Choose how Quartz should resolve links in your content. This should match Obsidian's link format. You can change this later in \`quartz.config.ts\`.`,
|
|
options: [
|
|
{
|
|
value: "shortest",
|
|
label: "Treat links as shortest path",
|
|
hint: "(default)",
|
|
},
|
|
{
|
|
value: "absolute",
|
|
label: "Treat links as absolute path",
|
|
},
|
|
{
|
|
value: "relative",
|
|
label: "Treat links as relative paths",
|
|
},
|
|
],
|
|
}),
|
|
)
|
|
}
|
|
|
|
// now, do config changes
|
|
const configFilePath = path.join(cwd, "quartz.config.ts")
|
|
let configContent = await fs.promises.readFile(configFilePath, { encoding: "utf-8" })
|
|
configContent = configContent.replace(
|
|
/markdownLinkResolution: '(.+)'/,
|
|
`markdownLinkResolution: '${linkResolutionStrategy}'`,
|
|
)
|
|
await fs.promises.writeFile(configFilePath, configContent)
|
|
|
|
// setup remote
|
|
execSync(
|
|
`git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`,
|
|
{ stdio: "ignore" },
|
|
)
|
|
|
|
outro(`You're all set! Not sure what to do next? Try:
|
|
• Customizing Quartz a bit more by editing \`quartz.config.ts\`
|
|
• Running \`npx quartz build --serve\` to preview your Quartz locally
|
|
• Hosting your Quartz online (see: https://quartz.jzhao.xyz/hosting)
|
|
`)
|
|
}
|
|
|
|
/**
|
|
* Handles `npx quartz build`
|
|
* @param {*} argv arguments for `build`
|
|
*/
|
|
export async function handleBuild(argv) {
|
|
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
|
|
const ctx = await esbuild.context({
|
|
entryPoints: [fp],
|
|
outfile: cacheFile,
|
|
bundle: true,
|
|
keepNames: true,
|
|
minifyWhitespace: true,
|
|
minifySyntax: true,
|
|
platform: "node",
|
|
format: "esm",
|
|
jsx: "automatic",
|
|
jsxImportSource: "preact",
|
|
packages: "external",
|
|
metafile: true,
|
|
sourcemap: true,
|
|
sourcesContent: false,
|
|
plugins: [
|
|
sassPlugin({
|
|
type: "css-text",
|
|
cssImports: true,
|
|
}),
|
|
{
|
|
name: "inline-script-loader",
|
|
setup(build) {
|
|
build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => {
|
|
let text = await promises.readFile(args.path, "utf8")
|
|
|
|
// remove default exports that we manually inserted
|
|
text = text.replace("export default", "")
|
|
text = text.replace("export", "")
|
|
|
|
const sourcefile = path.relative(path.resolve("."), args.path)
|
|
const resolveDir = path.dirname(sourcefile)
|
|
const transpiled = await esbuild.build({
|
|
stdin: {
|
|
contents: text,
|
|
loader: "ts",
|
|
resolveDir,
|
|
sourcefile,
|
|
},
|
|
write: false,
|
|
bundle: true,
|
|
minify: true,
|
|
platform: "browser",
|
|
format: "esm",
|
|
})
|
|
const rawMod = transpiled.outputFiles[0].text
|
|
return {
|
|
contents: rawMod,
|
|
loader: "text",
|
|
}
|
|
})
|
|
},
|
|
},
|
|
],
|
|
})
|
|
|
|
const buildMutex = new Mutex()
|
|
let lastBuildMs = 0
|
|
let cleanupBuild = null
|
|
const build = async (clientRefresh) => {
|
|
const buildStart = new Date().getTime()
|
|
lastBuildMs = buildStart
|
|
const release = await buildMutex.acquire()
|
|
if (lastBuildMs > buildStart) {
|
|
release()
|
|
return
|
|
}
|
|
|
|
if (cleanupBuild) {
|
|
await cleanupBuild()
|
|
console.log(chalk.yellow("Detected a source code change, doing a hard rebuild..."))
|
|
}
|
|
|
|
const result = await ctx.rebuild().catch((err) => {
|
|
console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`)
|
|
console.log(`Reason: ${chalk.grey(err)}`)
|
|
process.exit(1)
|
|
})
|
|
release()
|
|
|
|
if (argv.bundleInfo) {
|
|
const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs"
|
|
const meta = result.metafile.outputs[outputFileName]
|
|
console.log(
|
|
`Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes(
|
|
meta.bytes,
|
|
)})`,
|
|
)
|
|
console.log(await esbuild.analyzeMetafile(result.metafile, { color: true }))
|
|
}
|
|
|
|
// bypass module cache
|
|
// https://github.com/nodejs/modules/issues/307
|
|
const { default: buildQuartz } = await import(`../../${cacheFile}?update=${randomUUID()}`)
|
|
// ^ this import is relative, so base "cacheFile" path can't be used
|
|
|
|
cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh)
|
|
clientRefresh()
|
|
}
|
|
|
|
if (argv.serve) {
|
|
const connections = []
|
|
const clientRefresh = () => connections.forEach((conn) => conn.send("rebuild"))
|
|
|
|
if (argv.baseDir !== "" && !argv.baseDir.startsWith("/")) {
|
|
argv.baseDir = "/" + argv.baseDir
|
|
}
|
|
|
|
await build(clientRefresh)
|
|
const server = http.createServer(async (req, res) => {
|
|
if (argv.baseDir && !req.url?.startsWith(argv.baseDir)) {
|
|
console.log(
|
|
chalk.red(
|
|
`[404] ${req.url} (warning: link outside of site, this is likely a Quartz bug)`,
|
|
),
|
|
)
|
|
res.writeHead(404)
|
|
res.end()
|
|
return
|
|
}
|
|
|
|
// strip baseDir prefix
|
|
req.url = req.url?.slice(argv.baseDir.length)
|
|
|
|
const serve = async () => {
|
|
const release = await buildMutex.acquire()
|
|
await serveHandler(req, res, {
|
|
public: argv.output,
|
|
directoryListing: false,
|
|
headers: [
|
|
{
|
|
source: "**/*.*",
|
|
headers: [{ key: "Content-Disposition", value: "inline" }],
|
|
},
|
|
],
|
|
})
|
|
const status = res.statusCode
|
|
const statusString =
|
|
status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`)
|
|
console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`))
|
|
release()
|
|
}
|
|
|
|
const redirect = (newFp) => {
|
|
newFp = argv.baseDir + newFp
|
|
res.writeHead(302, {
|
|
Location: newFp,
|
|
})
|
|
console.log(chalk.yellow("[302]") + chalk.grey(` ${argv.baseDir}${req.url} -> ${newFp}`))
|
|
res.end()
|
|
}
|
|
|
|
let fp = req.url?.split("?")[0] ?? "/"
|
|
|
|
// handle redirects
|
|
if (fp.endsWith("/")) {
|
|
// /trailing/
|
|
// does /trailing/index.html exist? if so, serve it
|
|
const indexFp = path.posix.join(fp, "index.html")
|
|
if (fs.existsSync(path.posix.join(argv.output, indexFp))) {
|
|
req.url = fp
|
|
return serve()
|
|
}
|
|
|
|
// does /trailing.html exist? if so, redirect to /trailing
|
|
let base = fp.slice(0, -1)
|
|
if (path.extname(base) === "") {
|
|
base += ".html"
|
|
}
|
|
if (fs.existsSync(path.posix.join(argv.output, base))) {
|
|
return redirect(fp.slice(0, -1))
|
|
}
|
|
} else {
|
|
// /regular
|
|
// does /regular.html exist? if so, serve it
|
|
let base = fp
|
|
if (path.extname(base) === "") {
|
|
base += ".html"
|
|
}
|
|
if (fs.existsSync(path.posix.join(argv.output, base))) {
|
|
req.url = fp
|
|
return serve()
|
|
}
|
|
|
|
// does /regular/index.html exist? if so, redirect to /regular/
|
|
let indexFp = path.posix.join(fp, "index.html")
|
|
if (fs.existsSync(path.posix.join(argv.output, indexFp))) {
|
|
return redirect(fp + "/")
|
|
}
|
|
}
|
|
|
|
return serve()
|
|
})
|
|
server.listen(argv.port)
|
|
const wss = new WebSocketServer({ port: argv.wsPort })
|
|
wss.on("connection", (ws) => connections.push(ws))
|
|
console.log(
|
|
chalk.cyan(
|
|
`Started a Quartz server listening at http://localhost:${argv.port}${argv.baseDir}`,
|
|
),
|
|
)
|
|
console.log("hint: exit with ctrl+c")
|
|
chokidar
|
|
.watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], {
|
|
ignoreInitial: true,
|
|
})
|
|
.on("all", async () => {
|
|
build(clientRefresh)
|
|
})
|
|
} else {
|
|
await build(() => {})
|
|
ctx.dispose()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles `npx quartz update`
|
|
* @param {*} argv arguments for `update`
|
|
*/
|
|
export async function handleUpdate(argv) {
|
|
const contentFolder = path.join(cwd, argv.directory)
|
|
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
|
|
console.log("Backing up your content")
|
|
execSync(
|
|
`git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`,
|
|
)
|
|
await stashContentFolder(contentFolder)
|
|
console.log(
|
|
"Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.",
|
|
)
|
|
|
|
try {
|
|
gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH)
|
|
} catch {
|
|
console.log(chalk.red("An error occurred above while pulling updates."))
|
|
await popContentFolder(contentFolder)
|
|
return
|
|
}
|
|
|
|
await popContentFolder(contentFolder)
|
|
console.log("Ensuring dependencies are up to date")
|
|
const res = spawnSync("npm", ["i"], { stdio: "inherit" })
|
|
if (res.status === 0) {
|
|
console.log(chalk.green("Done!"))
|
|
} else {
|
|
console.log(chalk.red("An error occurred above while installing dependencies."))
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles `npx quartz restore`
|
|
* @param {*} argv arguments for `restore`
|
|
*/
|
|
export async function handleRestore(argv) {
|
|
const contentFolder = path.join(cwd, argv.directory)
|
|
await popContentFolder(contentFolder)
|
|
}
|
|
|
|
/**
|
|
* Handles `npx quartz sync`
|
|
* @param {*} argv arguments for `sync`
|
|
*/
|
|
export async function handleSync(argv) {
|
|
const contentFolder = path.join(cwd, argv.directory)
|
|
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
|
|
console.log("Backing up your content")
|
|
|
|
if (argv.commit) {
|
|
const contentStat = await fs.promises.lstat(contentFolder)
|
|
if (contentStat.isSymbolicLink()) {
|
|
const linkTarg = await fs.promises.readlink(contentFolder)
|
|
console.log(chalk.yellow("Detected symlink, trying to dereference before committing"))
|
|
|
|
// stash symlink file
|
|
await stashContentFolder(contentFolder)
|
|
|
|
// follow symlink and copy content
|
|
await fs.promises.cp(linkTarg, contentFolder, {
|
|
recursive: true,
|
|
preserveTimestamps: true,
|
|
})
|
|
}
|
|
|
|
const currentTimestamp = new Date().toLocaleString("en-US", {
|
|
dateStyle: "medium",
|
|
timeStyle: "short",
|
|
})
|
|
const commitMessage = argv.message ?? `Quartz sync: ${currentTimestamp}`
|
|
spawnSync("git", ["add", "."], { stdio: "inherit" })
|
|
spawnSync("git", ["commit", "-m", commitMessage], { stdio: "inherit" })
|
|
|
|
if (contentStat.isSymbolicLink()) {
|
|
// put symlink back
|
|
await popContentFolder(contentFolder)
|
|
}
|
|
}
|
|
|
|
await stashContentFolder(contentFolder)
|
|
|
|
if (argv.pull) {
|
|
console.log(
|
|
"Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.",
|
|
)
|
|
try {
|
|
gitPull(ORIGIN_NAME, QUARTZ_SOURCE_BRANCH)
|
|
} catch {
|
|
console.log(chalk.red("An error occurred above while pulling updates."))
|
|
await popContentFolder(contentFolder)
|
|
return
|
|
}
|
|
}
|
|
|
|
await popContentFolder(contentFolder)
|
|
if (argv.push) {
|
|
console.log("Pushing your changes")
|
|
const res = spawnSync("git", ["push", "-uf", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], {
|
|
stdio: "inherit",
|
|
})
|
|
if (res.status !== 0) {
|
|
console.log(chalk.red(`An error occurred above while pushing to remote ${ORIGIN_NAME}.`))
|
|
return
|
|
}
|
|
}
|
|
|
|
console.log(chalk.green("Done!"))
|
|
}
|