livemark 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +14 -14
- package/source/actions/changelog/build.ts +245 -0
- package/source/actions/changelog/build.unit.ts +69 -0
- package/source/actions/config/define.ts +11 -0
- package/source/actions/config/define.unit.ts +33 -0
- package/source/actions/config/load.ts +22 -0
- package/source/actions/config/load.unit.ts +30 -0
- package/source/commands/build.ts +21 -0
- package/source/commands/escape.ts +77 -0
- package/source/commands/preview.ts +25 -0
- package/source/commands/start.ts +26 -0
- package/{build/website → source}/components/Article.tsx +12 -2
- package/{build/website → source}/components/Callout.tsx +1 -1
- package/{build/website → source}/components/Layout.tsx +3 -14
- package/{build/website → source}/components/LinkButton.tsx +1 -1
- package/{build/website → source}/components/PageToolbar.tsx +21 -8
- package/{build/website → source}/components/Section.tsx +1 -1
- package/{build/website → source}/components/SectionHeader.tsx +1 -1
- package/{build/website/components/MiniSidebar.tsx → source/components/Sidebar.tsx} +21 -5
- package/{build/website/components/Sidebar.tsx → source/components/SidebarArticles.tsx} +22 -55
- package/source/components/SidebarPosts.tsx +129 -0
- package/source/components/SidebarReleases.tsx +85 -0
- package/{build/website → source}/content-collections.ts +2 -2
- package/{build/website → source}/elements/accordion.tsx +1 -1
- package/{build/website → source}/elements/alert-dialog.tsx +1 -1
- package/{build/website → source}/elements/alert.tsx +1 -1
- package/{build/website → source}/elements/aspect-ratio.tsx +1 -1
- package/{build/website → source}/elements/avatar.tsx +1 -1
- package/{build/website → source}/elements/badge.tsx +1 -1
- package/{build/website → source}/elements/breadcrumb.tsx +1 -1
- package/{build/website → source}/elements/button-group.tsx +1 -1
- package/{build/website → source}/elements/button.tsx +1 -1
- package/{build/website → source}/elements/calendar.tsx +1 -1
- package/{build/website → source}/elements/card.tsx +1 -1
- package/{build/website → source}/elements/carousel.tsx +1 -1
- package/{build/website → source}/elements/chart.tsx +1 -1
- package/{build/website → source}/elements/checkbox.tsx +1 -1
- package/{build/website → source}/elements/command.tsx +1 -1
- package/{build/website → source}/elements/context-menu.tsx +1 -1
- package/{build/website → source}/elements/dialog.tsx +1 -1
- package/{build/website → source}/elements/drawer.tsx +1 -1
- package/{build/website → source}/elements/dropdown-menu.tsx +1 -1
- package/{build/website → source}/elements/empty.tsx +1 -1
- package/{build/website → source}/elements/field.tsx +1 -1
- package/{build/website → source}/elements/hover-card.tsx +1 -1
- package/{build/website → source}/elements/input-group.tsx +1 -1
- package/{build/website → source}/elements/input-otp.tsx +1 -1
- package/{build/website → source}/elements/input.tsx +1 -1
- package/{build/website → source}/elements/item.tsx +1 -1
- package/{build/website → source}/elements/kbd.tsx +1 -1
- package/{build/website → source}/elements/label.tsx +1 -1
- package/{build/website → source}/elements/menubar.tsx +1 -1
- package/{build/website → source}/elements/native-select.tsx +1 -1
- package/{build/website → source}/elements/navigation-menu.tsx +1 -1
- package/{build/website → source}/elements/pagination.tsx +1 -1
- package/{build/website → source}/elements/popover.tsx +1 -1
- package/{build/website → source}/elements/progress.tsx +1 -1
- package/{build/website → source}/elements/radio-group.tsx +1 -1
- package/{build/website → source}/elements/resizable.tsx +1 -1
- package/{build/website → source}/elements/scroll-area.tsx +1 -1
- package/{build/website → source}/elements/select.tsx +1 -1
- package/{build/website → source}/elements/separator.tsx +1 -1
- package/{build/website → source}/elements/sheet.tsx +1 -1
- package/{build/website → source}/elements/sidebar.tsx +7 -4
- package/{build/website → source}/elements/skeleton.tsx +1 -1
- package/{build/website → source}/elements/slider.tsx +1 -1
- package/{build/website → source}/elements/spinner.tsx +1 -1
- package/{build/website → source}/elements/switch.tsx +1 -1
- package/{build/website → source}/elements/table.tsx +1 -1
- package/{build/website → source}/elements/tabs.tsx +1 -1
- package/{build/website → source}/elements/textarea.tsx +1 -1
- package/{build/website → source}/elements/toggle-group.tsx +1 -1
- package/{build/website → source}/elements/toggle.tsx +1 -1
- package/{build/website → source}/elements/tooltip.tsx +1 -1
- package/source/entrypoints/main.ts +12 -0
- package/{build/website → source}/env.d.ts +1 -1
- package/source/helpers/program.ts +6 -0
- package/{build/website → source}/helpers/section.ts +1 -1
- package/source/hooks/media.ts +29 -0
- package/source/index.ts +1 -0
- package/{build/website → source}/models/article.ts +4 -0
- package/source/models/config.ts +51 -0
- package/source/models/link.ts +11 -0
- package/source/models/patch.ts +9 -0
- package/source/models/section.ts +45 -0
- package/source/models/theme.ts +74 -0
- package/{build/website → source}/plugins/vite-livemark.ts +0 -7
- package/source/program.ts +18 -0
- package/source/settings.ts +6 -0
- package/{build/website → source}/vite.config.ts +4 -3
- package/{build → target}/actions/changelog/build.d.ts +1 -0
- package/target/actions/changelog/build.js +187 -0
- package/target/actions/changelog/build.unit.js +66 -0
- package/target/actions/config/define.js +8 -0
- package/target/actions/config/define.unit.js +29 -0
- package/target/actions/config/load.js +25 -0
- package/target/actions/config/load.unit.js +23 -0
- package/target/client.d.ts +1 -0
- package/target/client.js +6 -0
- package/target/commands/build.js +14 -0
- package/target/commands/escape.js +56 -0
- package/target/commands/preview.js +18 -0
- package/target/commands/start.js +19 -0
- package/target/components/Abbr.d.ts +5 -0
- package/target/components/Abbr.js +9 -0
- package/target/components/AnsiCode.d.ts +4 -0
- package/target/components/AnsiCode.js +6 -0
- package/target/components/Article.d.ts +5 -0
- package/target/components/Article.js +105 -0
- package/target/components/BackToTop.d.ts +3 -0
- package/target/components/BackToTop.js +19 -0
- package/target/components/Banner.d.ts +2 -0
- package/target/components/Banner.js +12 -0
- package/target/components/BlogIndex.d.ts +4 -0
- package/target/components/BlogIndex.js +62 -0
- package/target/components/Breadcrumbs.d.ts +1 -0
- package/target/components/Breadcrumbs.js +13 -0
- package/target/components/Callout.d.ts +8 -0
- package/target/components/Callout.js +43 -0
- package/target/components/Card.d.ts +7 -0
- package/target/components/Card.js +17 -0
- package/target/components/Cards.d.ts +4 -0
- package/target/components/Cards.js +6 -0
- package/target/components/ChangelogIndex.d.ts +4 -0
- package/target/components/ChangelogIndex.js +57 -0
- package/target/components/CodeBlock.d.ts +1 -0
- package/target/components/CodeBlock.js +47 -0
- package/target/components/CodeTabs.d.ts +6 -0
- package/target/components/CodeTabs.js +49 -0
- package/target/components/Column.d.ts +4 -0
- package/target/components/Column.js +6 -0
- package/target/components/Columns.d.ts +5 -0
- package/target/components/Columns.js +10 -0
- package/target/components/Content.d.ts +3 -0
- package/target/components/Content.js +5 -0
- package/target/components/ContentTab.d.ts +5 -0
- package/target/components/ContentTab.js +6 -0
- package/target/components/ContentTabs.d.ts +5 -0
- package/target/components/ContentTabs.js +47 -0
- package/target/components/DefaultCatchBoundary.d.ts +2 -0
- package/target/components/DefaultCatchBoundary.js +20 -0
- package/target/components/DefinitionList.d.ts +7 -0
- package/target/components/DefinitionList.js +14 -0
- package/target/components/Details.d.ts +5 -0
- package/target/components/Details.js +13 -0
- package/target/components/FileTree.d.ts +4 -0
- package/target/components/FileTree.js +17 -0
- package/target/components/Footer.d.ts +2 -0
- package/target/components/Footer.js +9 -0
- package/target/components/FootnoteRef.d.ts +3 -0
- package/target/components/FootnoteRef.js +31 -0
- package/target/components/Heading.d.ts +8 -0
- package/target/components/Heading.js +18 -0
- package/target/components/InlineBadge.d.ts +5 -0
- package/target/components/InlineBadge.js +7 -0
- package/target/components/InlineIcon.d.ts +5 -0
- package/target/components/InlineIcon.js +10 -0
- package/target/components/InlineToc.d.ts +4 -0
- package/target/components/InlineToc.js +14 -0
- package/target/components/Layout.d.ts +4 -0
- package/target/components/Layout.js +65 -0
- package/target/components/LinkButton.d.ts +7 -0
- package/target/components/LinkButton.js +11 -0
- package/target/components/Mermaid.d.ts +4 -0
- package/target/components/Mermaid.js +8 -0
- package/target/components/MermaidRenderer.d.ts +4 -0
- package/target/components/MermaidRenderer.js +32 -0
- package/target/components/NotFound.d.ts +3 -0
- package/target/components/NotFound.js +10 -0
- package/target/components/PackageTabs.d.ts +9 -0
- package/target/components/PackageTabs.js +28 -0
- package/target/components/PageToolbar.d.ts +7 -0
- package/target/components/PageToolbar.js +34 -0
- package/target/components/PrevNext.d.ts +4 -0
- package/target/components/PrevNext.js +34 -0
- package/target/components/Search.d.ts +2 -0
- package/target/components/Search.js +16 -0
- package/target/components/SearchDialog.d.ts +5 -0
- package/target/components/SearchDialog.js +139 -0
- package/target/components/Section.d.ts +5 -0
- package/target/components/Section.js +8 -0
- package/target/components/SectionHeader.d.ts +7 -0
- package/target/components/SectionHeader.js +7 -0
- package/target/components/Sidebar.d.ts +4 -0
- package/target/components/Sidebar.js +33 -0
- package/target/components/SidebarArticles.d.ts +2 -0
- package/target/components/SidebarArticles.js +45 -0
- package/target/components/SidebarLinks.d.ts +4 -0
- package/target/components/SidebarLinks.js +26 -0
- package/target/components/SidebarPosts.d.ts +2 -0
- package/target/components/SidebarPosts.js +53 -0
- package/target/components/SidebarReleases.d.ts +2 -0
- package/target/components/SidebarReleases.js +35 -0
- package/target/components/SidebarSections.d.ts +4 -0
- package/target/components/SidebarSections.js +36 -0
- package/target/components/SiteTitle.d.ts +2 -0
- package/target/components/SiteTitle.js +12 -0
- package/target/components/SortableTable.d.ts +5 -0
- package/target/components/SortableTable.js +63 -0
- package/target/components/SoundCloud.d.ts +4 -0
- package/target/components/SoundCloud.js +7 -0
- package/target/components/TagIndex.d.ts +5 -0
- package/target/components/TagIndex.js +64 -0
- package/target/components/Theme.d.ts +1 -0
- package/target/components/Theme.js +21 -0
- package/target/components/Toc.d.ts +12 -0
- package/target/components/Toc.js +128 -0
- package/target/components/YouTube.d.ts +4 -0
- package/target/components/YouTube.js +6 -0
- package/target/components/ZoomImage.d.ts +4 -0
- package/target/components/ZoomImage.js +26 -0
- package/target/content/article.d.ts +43 -0
- package/target/content/article.js +54 -0
- package/target/content/tag.d.ts +2 -0
- package/target/content/tag.js +30 -0
- package/target/content-collections.d.ts +2 -0
- package/target/content-collections.js +192 -0
- package/target/elements/accordion.d.ts +6 -0
- package/target/elements/accordion.js +19 -0
- package/target/elements/alert-dialog.d.ts +18 -0
- package/target/elements/alert-dialog.js +44 -0
- package/target/elements/alert.d.ts +9 -0
- package/target/elements/alert.js +28 -0
- package/target/elements/aspect-ratio.d.ts +4 -0
- package/target/elements/aspect-ratio.js +9 -0
- package/target/elements/avatar.d.ts +11 -0
- package/target/elements/avatar.js +23 -0
- package/target/elements/badge.d.ts +7 -0
- package/target/elements/badge.js +34 -0
- package/target/elements/breadcrumb.d.ts +9 -0
- package/target/elements/breadcrumb.js +39 -0
- package/target/elements/button-group.d.ts +10 -0
- package/target/elements/button-group.js +37 -0
- package/target/elements/button.d.ts +8 -0
- package/target/elements/button.js +35 -0
- package/target/elements/calendar.d.ts +10 -0
- package/target/elements/calendar.js +76 -0
- package/target/elements/card.d.ts +11 -0
- package/target/elements/card.js +25 -0
- package/target/elements/carousel.d.ts +28 -0
- package/target/elements/carousel.js +95 -0
- package/target/elements/chart.d.ts +44 -0
- package/target/elements/chart.js +140 -0
- package/target/elements/checkbox.d.ts +3 -0
- package/target/elements/checkbox.js +9 -0
- package/target/elements/collapsible.d.ts +5 -0
- package/target/elements/collapsible.js +13 -0
- package/target/elements/command.d.ts +23 -0
- package/target/elements/command.js +42 -0
- package/target/elements/context-menu.d.ts +29 -0
- package/target/elements/context-menu.js +54 -0
- package/target/elements/dialog.d.ts +16 -0
- package/target/elements/dialog.js +41 -0
- package/target/elements/direction.d.ts +1 -0
- package/target/elements/direction.js +2 -0
- package/target/elements/drawer.d.ts +12 -0
- package/target/elements/drawer.js +38 -0
- package/target/elements/dropdown-menu.d.ts +24 -0
- package/target/elements/dropdown-menu.js +54 -0
- package/target/elements/empty.d.ts +11 -0
- package/target/elements/empty.js +34 -0
- package/target/elements/field.d.ts +24 -0
- package/target/elements/field.js +69 -0
- package/target/elements/hover-card.d.ts +5 -0
- package/target/elements/hover-card.js +14 -0
- package/target/elements/input-group.d.ts +18 -0
- package/target/elements/input-group.js +60 -0
- package/target/elements/input-otp.d.ts +11 -0
- package/target/elements/input-otp.js +21 -0
- package/target/elements/input.d.ts +2 -0
- package/target/elements/input.js +8 -0
- package/target/elements/item.d.ts +21 -0
- package/target/elements/item.js +79 -0
- package/target/elements/kbd.d.ts +3 -0
- package/target/elements/kbd.js +10 -0
- package/target/elements/label.d.ts +2 -0
- package/target/elements/label.js +8 -0
- package/target/elements/menubar.d.ts +29 -0
- package/target/elements/menubar.js +58 -0
- package/target/elements/native-select.d.ts +8 -0
- package/target/elements/native-select.js +16 -0
- package/target/elements/navigation-menu.d.ts +11 -0
- package/target/elements/navigation-menu.js +34 -0
- package/target/elements/pagination.d.ts +17 -0
- package/target/elements/pagination.js +33 -0
- package/target/elements/popover.d.ts +9 -0
- package/target/elements/popover.js +23 -0
- package/target/elements/progress.d.ts +7 -0
- package/target/elements/progress.js +21 -0
- package/target/elements/radio-group.d.ts +5 -0
- package/target/elements/radio-group.js +12 -0
- package/target/elements/resizable.d.ts +7 -0
- package/target/elements/resizable.js +14 -0
- package/target/elements/scroll-area.d.ts +4 -0
- package/target/elements/scroll-area.js +13 -0
- package/target/elements/select.d.ts +15 -0
- package/target/elements/select.js +39 -0
- package/target/elements/separator.d.ts +3 -0
- package/target/elements/separator.js +8 -0
- package/target/elements/sheet.d.ts +13 -0
- package/target/elements/sheet.js +41 -0
- package/target/elements/sidebar.d.ts +63 -0
- package/target/elements/sidebar.js +272 -0
- package/target/elements/skeleton.d.ts +2 -0
- package/target/elements/skeleton.js +7 -0
- package/target/elements/slider.d.ts +3 -0
- package/target/elements/slider.js +15 -0
- package/target/elements/sonner.d.ts +3 -0
- package/target/elements/sonner.js +23 -0
- package/target/elements/spinner.d.ts +2 -0
- package/target/elements/spinner.js +8 -0
- package/target/elements/switch.d.ts +5 -0
- package/target/elements/switch.js +8 -0
- package/target/elements/table.d.ts +9 -0
- package/target/elements/table.js +28 -0
- package/target/elements/tabs.d.ts +10 -0
- package/target/elements/tabs.js +29 -0
- package/target/elements/textarea.d.ts +2 -0
- package/target/elements/textarea.js +7 -0
- package/target/elements/toggle-group.d.ts +10 -0
- package/target/elements/toggle-group.js +24 -0
- package/target/elements/toggle.d.ts +8 -0
- package/target/elements/toggle.js +26 -0
- package/target/elements/tooltip.d.ts +6 -0
- package/target/elements/tooltip.js +18 -0
- package/target/entrypoints/main.js +12 -0
- package/target/helpers/article-icon.d.ts +3 -0
- package/target/helpers/article-icon.js +34 -0
- package/target/helpers/article.d.ts +24 -0
- package/target/helpers/article.js +73 -0
- package/target/helpers/changelog-source.d.ts +7 -0
- package/target/helpers/changelog-source.js +16 -0
- package/target/helpers/changelog-source.unit.d.ts +1 -0
- package/target/helpers/changelog-source.unit.js +33 -0
- package/target/helpers/dynamic-icon-resolver.d.ts +5 -0
- package/target/helpers/dynamic-icon-resolver.js +17 -0
- package/target/helpers/dynamic-icon.d.ts +5 -0
- package/target/helpers/dynamic-icon.js +8 -0
- package/target/helpers/favicon.d.ts +2 -0
- package/target/helpers/favicon.js +11 -0
- package/target/helpers/model.d.ts +3 -0
- package/target/helpers/model.js +4 -0
- package/target/helpers/program.js +5 -0
- package/target/helpers/resolve-asset-path.d.ts +2 -0
- package/target/helpers/resolve-asset-path.js +9 -0
- package/target/helpers/resolve-includes.d.ts +2 -0
- package/target/helpers/resolve-includes.js +113 -0
- package/target/helpers/resolve-includes.unit.d.ts +1 -0
- package/target/helpers/resolve-includes.unit.js +76 -0
- package/target/helpers/search-text.d.ts +2 -0
- package/target/helpers/search-text.js +16 -0
- package/target/helpers/section.d.ts +13 -0
- package/target/helpers/section.js +39 -0
- package/target/helpers/section.unit.d.ts +1 -0
- package/target/helpers/section.unit.js +62 -0
- package/target/helpers/theme.d.ts +5 -0
- package/target/helpers/theme.js +23 -0
- package/target/helpers/toc-context.d.ts +5 -0
- package/target/helpers/toc-context.js +8 -0
- package/target/helpers/toc.d.ts +3 -0
- package/target/helpers/toc.js +41 -0
- package/target/helpers/toc.unit.d.ts +1 -0
- package/target/helpers/toc.unit.js +65 -0
- package/target/hooks/in-view.d.ts +4 -0
- package/target/hooks/in-view.js +23 -0
- package/target/hooks/media.d.ts +6 -0
- package/target/hooks/media.js +25 -0
- package/target/index.js +2 -0
- package/target/models/article.d.ts +57 -0
- package/target/models/article.js +21 -0
- package/{build → target}/models/config.d.ts +10 -0
- package/target/models/config.js +34 -0
- package/target/models/link.js +9 -0
- package/{build → target}/models/patch.d.ts +5 -0
- package/target/models/patch.js +7 -0
- package/target/models/section.js +26 -0
- package/target/models/theme.js +73 -0
- package/target/models/toc.d.ts +5 -0
- package/target/models/toc.js +2 -0
- package/target/plugins/rehype-inline-code.d.ts +19 -0
- package/target/plugins/rehype-inline-code.js +55 -0
- package/target/plugins/rehype-task-list-a11y.d.ts +10 -0
- package/target/plugins/rehype-task-list-a11y.js +29 -0
- package/target/plugins/remark-abbr.d.ts +6 -0
- package/target/plugins/remark-abbr.js +39 -0
- package/target/plugins/remark-abbr.unit.d.ts +1 -0
- package/target/plugins/remark-abbr.unit.js +79 -0
- package/target/plugins/remark-ansi.d.ts +8 -0
- package/target/plugins/remark-ansi.js +239 -0
- package/target/plugins/remark-ansi.unit.d.ts +1 -0
- package/target/plugins/remark-ansi.unit.js +134 -0
- package/target/plugins/remark-badge.d.ts +6 -0
- package/target/plugins/remark-badge.js +43 -0
- package/target/plugins/remark-badge.unit.d.ts +1 -0
- package/target/plugins/remark-badge.unit.js +76 -0
- package/target/plugins/remark-button.d.ts +6 -0
- package/target/plugins/remark-button.js +52 -0
- package/target/plugins/remark-button.unit.d.ts +1 -0
- package/target/plugins/remark-button.unit.js +105 -0
- package/target/plugins/remark-callout.d.ts +4 -0
- package/target/plugins/remark-callout.js +39 -0
- package/target/plugins/remark-card.d.ts +4 -0
- package/target/plugins/remark-card.js +66 -0
- package/target/plugins/remark-code-tabs.d.ts +4 -0
- package/target/plugins/remark-code-tabs.js +72 -0
- package/target/plugins/remark-columns.d.ts +4 -0
- package/target/plugins/remark-columns.js +54 -0
- package/target/plugins/remark-custom-heading-id.d.ts +14 -0
- package/target/plugins/remark-custom-heading-id.js +54 -0
- package/target/plugins/remark-custom-heading-id.unit.d.ts +1 -0
- package/target/plugins/remark-custom-heading-id.unit.js +91 -0
- package/target/plugins/remark-deflist.d.ts +4 -0
- package/target/plugins/remark-deflist.js +31 -0
- package/target/plugins/remark-details.d.ts +4 -0
- package/target/plugins/remark-details.js +33 -0
- package/target/plugins/remark-filetree.d.ts +12 -0
- package/target/plugins/remark-filetree.js +61 -0
- package/target/plugins/remark-filetree.unit.d.ts +1 -0
- package/target/plugins/remark-filetree.unit.js +87 -0
- package/target/plugins/remark-github-callout.d.ts +4 -0
- package/target/plugins/remark-github-callout.js +62 -0
- package/target/plugins/remark-icon.d.ts +4 -0
- package/target/plugins/remark-icon.js +36 -0
- package/target/plugins/remark-image.d.ts +9 -0
- package/target/plugins/remark-image.js +26 -0
- package/target/plugins/remark-media.d.ts +6 -0
- package/target/plugins/remark-media.js +52 -0
- package/target/plugins/remark-media.unit.d.ts +1 -0
- package/target/plugins/remark-media.unit.js +54 -0
- package/target/plugins/remark-mermaid.d.ts +4 -0
- package/target/plugins/remark-mermaid.js +20 -0
- package/target/plugins/remark-npm.d.ts +4 -0
- package/target/plugins/remark-npm.js +32 -0
- package/target/plugins/remark-steps.d.ts +6 -0
- package/target/plugins/remark-steps.js +30 -0
- package/target/plugins/remark-steps.unit.d.ts +1 -0
- package/target/plugins/remark-steps.unit.js +65 -0
- package/target/plugins/remark-tab.d.ts +6 -0
- package/target/plugins/remark-tab.js +76 -0
- package/target/plugins/remark-tab.unit.d.ts +1 -0
- package/target/plugins/remark-tab.unit.js +156 -0
- package/target/plugins/remark-toc.d.ts +6 -0
- package/target/plugins/remark-toc.js +33 -0
- package/target/plugins/remark-toc.unit.d.ts +1 -0
- package/target/plugins/remark-toc.unit.js +57 -0
- package/target/plugins/shiki-icon.d.ts +16 -0
- package/target/plugins/shiki-icon.js +66 -0
- package/target/plugins/shiki-line-highlight.d.ts +27 -0
- package/target/plugins/shiki-line-highlight.js +140 -0
- package/target/plugins/vite-livemark.d.ts +13 -0
- package/target/plugins/vite-livemark.js +76 -0
- package/target/program.js +18 -0
- package/target/routeTree.gen.d.ts +57 -0
- package/target/routeTree.gen.js +27 -0
- package/target/router.d.ts +6 -0
- package/target/router.js +26 -0
- package/target/routes/$.d.ts +1 -0
- package/target/routes/$.js +85 -0
- package/target/routes/__root.d.ts +1 -0
- package/target/routes/__root.js +69 -0
- package/target/server.d.ts +2 -0
- package/target/server.js +7 -0
- package/target/settings.d.ts +2 -0
- package/target/settings.js +7 -0
- package/target/utils/style.d.ts +2 -0
- package/target/utils/style.js +6 -0
- package/target/vite.config.d.ts +2 -0
- package/target/vite.config.js +64 -0
- package/build/actions/changelog/build.js +0 -158
- package/build/actions/changelog/build.unit.js +0 -66
- package/build/actions/config/define.js +0 -8
- package/build/actions/config/define.unit.js +0 -29
- package/build/actions/config/load.js +0 -25
- package/build/actions/config/load.unit.js +0 -23
- package/build/commands/build.js +0 -14
- package/build/commands/escape.js +0 -56
- package/build/commands/preview.js +0 -18
- package/build/commands/start.js +0 -19
- package/build/docs/markdown/includes/example.d.ts +0 -58
- package/build/docs/markdown/includes/example.js +0 -5
- package/build/entrypoints/main.js +0 -12
- package/build/helpers/program.js +0 -5
- package/build/index.js +0 -2
- package/build/livemark.config.d.ts +0 -58
- package/build/livemark.config.js +0 -25
- package/build/models/config.js +0 -34
- package/build/models/link.js +0 -9
- package/build/models/patch.js +0 -7
- package/build/models/section.js +0 -26
- package/build/models/theme.js +0 -73
- package/build/program.js +0 -16
- package/build/vite.config.d.ts +0 -2
- package/build/vite.config.js +0 -48
- package/build/website/components/BlogSidebar.tsx +0 -162
- package/build/website/components/ChangelogSidebar.tsx +0 -120
- package/build/website/hooks/media.ts +0 -19
- /package/{build/website → source}/assets/logo.svg +0 -0
- /package/{build/website → source}/client.tsx +0 -0
- /package/{build/website → source}/components/Abbr.tsx +0 -0
- /package/{build/website → source}/components/AnsiCode.tsx +0 -0
- /package/{build/website → source}/components/BackToTop.tsx +0 -0
- /package/{build/website → source}/components/Banner.tsx +0 -0
- /package/{build/website → source}/components/BlogIndex.tsx +0 -0
- /package/{build/website → source}/components/Breadcrumbs.tsx +0 -0
- /package/{build/website → source}/components/Card.tsx +0 -0
- /package/{build/website → source}/components/Cards.tsx +0 -0
- /package/{build/website → source}/components/ChangelogIndex.tsx +0 -0
- /package/{build/website → source}/components/CodeBlock.tsx +0 -0
- /package/{build/website → source}/components/CodeTabs.tsx +0 -0
- /package/{build/website → source}/components/Column.tsx +0 -0
- /package/{build/website → source}/components/Columns.tsx +0 -0
- /package/{build/website → source}/components/Content.tsx +0 -0
- /package/{build/website → source}/components/ContentTab.tsx +0 -0
- /package/{build/website → source}/components/ContentTabs.tsx +0 -0
- /package/{build/website → source}/components/DefaultCatchBoundary.tsx +0 -0
- /package/{build/website → source}/components/DefinitionList.tsx +0 -0
- /package/{build/website → source}/components/Details.tsx +0 -0
- /package/{build/website → source}/components/FileTree.tsx +0 -0
- /package/{build/website → source}/components/Footer.tsx +0 -0
- /package/{build/website → source}/components/FootnoteRef.tsx +0 -0
- /package/{build/website → source}/components/Heading.tsx +0 -0
- /package/{build/website → source}/components/InlineBadge.tsx +0 -0
- /package/{build/website → source}/components/InlineIcon.tsx +0 -0
- /package/{build/website → source}/components/InlineToc.tsx +0 -0
- /package/{build/website → source}/components/Mermaid.tsx +0 -0
- /package/{build/website → source}/components/MermaidRenderer.tsx +0 -0
- /package/{build/website → source}/components/NotFound.tsx +0 -0
- /package/{build/website → source}/components/PackageTabs.tsx +0 -0
- /package/{build/website → source}/components/PrevNext.tsx +0 -0
- /package/{build/website → source}/components/Search.tsx +0 -0
- /package/{build/website → source}/components/SearchDialog.tsx +0 -0
- /package/{build/website → source}/components/SidebarLinks.tsx +0 -0
- /package/{build/website → source}/components/SidebarSections.tsx +0 -0
- /package/{build/website → source}/components/SiteTitle.tsx +0 -0
- /package/{build/website → source}/components/SortableTable.tsx +0 -0
- /package/{build/website → source}/components/SoundCloud.tsx +0 -0
- /package/{build/website → source}/components/TagIndex.tsx +0 -0
- /package/{build/website → source}/components/Theme.tsx +0 -0
- /package/{build/website → source}/components/Toc.tsx +0 -0
- /package/{build/website → source}/components/YouTube.tsx +0 -0
- /package/{build/website → source}/components/ZoomImage.tsx +0 -0
- /package/{build/website → source}/content/article.ts +0 -0
- /package/{build/website → source}/content/tag.ts +0 -0
- /package/{build/website → source}/elements/collapsible.tsx +0 -0
- /package/{build/website → source}/elements/direction.tsx +0 -0
- /package/{build/website → source}/elements/sonner.tsx +0 -0
- /package/{build/website → source}/helpers/article-icon.ts +0 -0
- /package/{build/website → source}/helpers/article.ts +0 -0
- /package/{build/website → source}/helpers/changelog-source.ts +0 -0
- /package/{build/website → source}/helpers/changelog-source.unit.ts +0 -0
- /package/{build/website → source}/helpers/dynamic-icon-resolver.tsx +0 -0
- /package/{build/website → source}/helpers/dynamic-icon.tsx +0 -0
- /package/{build/website → source}/helpers/favicon.ts +0 -0
- /package/{build/website → source}/helpers/model.ts +0 -0
- /package/{build/website → source}/helpers/resolve-asset-path.ts +0 -0
- /package/{build/website → source}/helpers/resolve-includes.ts +0 -0
- /package/{build/website → source}/helpers/resolve-includes.unit.ts +0 -0
- /package/{build/website → source}/helpers/search-text.ts +0 -0
- /package/{build/website → source}/helpers/section.unit.ts +0 -0
- /package/{build/website → source}/helpers/theme.ts +0 -0
- /package/{build/website → source}/helpers/toc-context.ts +0 -0
- /package/{build/website → source}/helpers/toc.ts +0 -0
- /package/{build/website → source}/helpers/toc.unit.ts +0 -0
- /package/{build/website → source}/hooks/in-view.ts +0 -0
- /package/{build/website → source}/models/toc.ts +0 -0
- /package/{build/website → source}/plugins/rehype-inline-code.ts +0 -0
- /package/{build/website → source}/plugins/rehype-task-list-a11y.ts +0 -0
- /package/{build/website → source}/plugins/remark-abbr.ts +0 -0
- /package/{build/website → source}/plugins/remark-abbr.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-ansi.ts +0 -0
- /package/{build/website → source}/plugins/remark-ansi.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-badge.ts +0 -0
- /package/{build/website → source}/plugins/remark-badge.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-button.ts +0 -0
- /package/{build/website → source}/plugins/remark-button.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-callout.ts +0 -0
- /package/{build/website → source}/plugins/remark-card.ts +0 -0
- /package/{build/website → source}/plugins/remark-code-tabs.ts +0 -0
- /package/{build/website → source}/plugins/remark-columns.ts +0 -0
- /package/{build/website → source}/plugins/remark-custom-heading-id.ts +0 -0
- /package/{build/website → source}/plugins/remark-custom-heading-id.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-deflist.ts +0 -0
- /package/{build/website → source}/plugins/remark-details.ts +0 -0
- /package/{build/website → source}/plugins/remark-filetree.ts +0 -0
- /package/{build/website → source}/plugins/remark-filetree.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-github-callout.ts +0 -0
- /package/{build/website → source}/plugins/remark-icon.ts +0 -0
- /package/{build/website → source}/plugins/remark-image.ts +0 -0
- /package/{build/website → source}/plugins/remark-media.ts +0 -0
- /package/{build/website → source}/plugins/remark-media.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-mermaid.ts +0 -0
- /package/{build/website → source}/plugins/remark-npm.ts +0 -0
- /package/{build/website → source}/plugins/remark-steps.ts +0 -0
- /package/{build/website → source}/plugins/remark-steps.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-tab.ts +0 -0
- /package/{build/website → source}/plugins/remark-tab.unit.ts +0 -0
- /package/{build/website → source}/plugins/remark-toc.ts +0 -0
- /package/{build/website → source}/plugins/remark-toc.unit.ts +0 -0
- /package/{build/website → source}/plugins/shiki-icon.ts +0 -0
- /package/{build/website → source}/plugins/shiki-line-highlight.ts +0 -0
- /package/{build/website → source}/routeTree.gen.ts +0 -0
- /package/{build/website → source}/router.tsx +0 -0
- /package/{build/website → source}/routes/$.tsx +0 -0
- /package/{build/website → source}/routes/__root.tsx +0 -0
- /package/{build/website → source}/server.ts +0 -0
- /package/{build/website → source}/styles/general.css +0 -0
- /package/{build/website → source}/styles/markdown.css +0 -0
- /package/{build/website/helpers → source/utils}/style.ts +0 -0
- /package/{build → target}/actions/changelog/build.unit.d.ts +0 -0
- /package/{build → target}/actions/config/define.d.ts +0 -0
- /package/{build → target}/actions/config/define.unit.d.ts +0 -0
- /package/{build → target}/actions/config/load.d.ts +0 -0
- /package/{build → target}/actions/config/load.unit.d.ts +0 -0
- /package/{build → target}/commands/build.d.ts +0 -0
- /package/{build → target}/commands/escape.d.ts +0 -0
- /package/{build → target}/commands/preview.d.ts +0 -0
- /package/{build → target}/commands/start.d.ts +0 -0
- /package/{build → target}/entrypoints/main.d.ts +0 -0
- /package/{build → target}/helpers/program.d.ts +0 -0
- /package/{build → target}/index.d.ts +0 -0
- /package/{build → target}/models/link.d.ts +0 -0
- /package/{build → target}/models/section.d.ts +0 -0
- /package/{build → target}/models/theme.d.ts +0 -0
- /package/{build → target}/program.d.ts +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, extname, resolve } from "node:path";
|
|
3
|
+
const INCLUDE_RE = /^::include\{(.+)\}$/;
|
|
4
|
+
const FRONTMATTER_RE = /^---\n[\s\S]*?\n---\n?/;
|
|
5
|
+
const FENCE_RE = /^(`{3,}|~{3,})/;
|
|
6
|
+
const extToLang = {
|
|
7
|
+
".ts": "typescript",
|
|
8
|
+
".tsx": "tsx",
|
|
9
|
+
".js": "javascript",
|
|
10
|
+
".jsx": "jsx",
|
|
11
|
+
".py": "python",
|
|
12
|
+
".rs": "rust",
|
|
13
|
+
".go": "go",
|
|
14
|
+
".rb": "ruby",
|
|
15
|
+
".java": "java",
|
|
16
|
+
".kt": "kotlin",
|
|
17
|
+
".swift": "swift",
|
|
18
|
+
".c": "c",
|
|
19
|
+
".cpp": "cpp",
|
|
20
|
+
".h": "c",
|
|
21
|
+
".cs": "csharp",
|
|
22
|
+
".css": "css",
|
|
23
|
+
".scss": "scss",
|
|
24
|
+
".html": "html",
|
|
25
|
+
".json": "json",
|
|
26
|
+
".yaml": "yaml",
|
|
27
|
+
".yml": "yaml",
|
|
28
|
+
".toml": "toml",
|
|
29
|
+
".xml": "xml",
|
|
30
|
+
".sql": "sql",
|
|
31
|
+
".sh": "bash",
|
|
32
|
+
".bash": "bash",
|
|
33
|
+
".zsh": "zsh",
|
|
34
|
+
".fish": "fish",
|
|
35
|
+
".ps1": "powershell",
|
|
36
|
+
".dockerfile": "dockerfile",
|
|
37
|
+
".graphql": "graphql",
|
|
38
|
+
".proto": "protobuf",
|
|
39
|
+
".lua": "lua",
|
|
40
|
+
".php": "php",
|
|
41
|
+
".r": "r",
|
|
42
|
+
".zig": "zig",
|
|
43
|
+
".ex": "elixir",
|
|
44
|
+
".exs": "elixir",
|
|
45
|
+
};
|
|
46
|
+
function parseAttributes(raw) {
|
|
47
|
+
const attrs = {};
|
|
48
|
+
const re = /(\w+)="([^"]+)"/g;
|
|
49
|
+
let m = null;
|
|
50
|
+
while ((m = re.exec(raw)) !== null) {
|
|
51
|
+
attrs[m[1]] = m[2];
|
|
52
|
+
}
|
|
53
|
+
return attrs;
|
|
54
|
+
}
|
|
55
|
+
function resolveDirective(rawAttrs, fileDir, depth) {
|
|
56
|
+
const attrs = parseAttributes(rawAttrs);
|
|
57
|
+
const file = attrs.file;
|
|
58
|
+
if (!file)
|
|
59
|
+
return undefined;
|
|
60
|
+
const absolutePath = resolve(fileDir, file);
|
|
61
|
+
try {
|
|
62
|
+
let included = readFileSync(absolutePath, "utf-8");
|
|
63
|
+
const ext = extname(file).toLowerCase();
|
|
64
|
+
const lang = extToLang[ext];
|
|
65
|
+
if (lang && !file.endsWith(".md")) {
|
|
66
|
+
const filename = file.split("/").pop();
|
|
67
|
+
const title = `title="${filename}"`;
|
|
68
|
+
const meta = attrs.meta ? ` ${attrs.meta}` : "";
|
|
69
|
+
return ("```" + lang + " " + title + meta + "\n" + included.trimEnd() + "\n```");
|
|
70
|
+
}
|
|
71
|
+
included = included.replace(FRONTMATTER_RE, "");
|
|
72
|
+
return resolveIncludes(included.trim(), absolutePath, depth + 1);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Resolves ::include{file="..."} directives by replacing them with referenced file contents */
|
|
79
|
+
export function resolveIncludes(content, filePath, depth = 0) {
|
|
80
|
+
if (depth > 5)
|
|
81
|
+
return content;
|
|
82
|
+
const fileDir = dirname(filePath);
|
|
83
|
+
const lines = content.split("\n");
|
|
84
|
+
const result = [];
|
|
85
|
+
let fenceMarker;
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
const fenceMatch = FENCE_RE.exec(line);
|
|
88
|
+
if (fenceMatch) {
|
|
89
|
+
if (!fenceMarker) {
|
|
90
|
+
fenceMarker = fenceMatch[1];
|
|
91
|
+
}
|
|
92
|
+
else if (line.startsWith(fenceMarker)) {
|
|
93
|
+
fenceMarker = undefined;
|
|
94
|
+
}
|
|
95
|
+
result.push(line);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (fenceMarker) {
|
|
99
|
+
result.push(line);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const includeMatch = INCLUDE_RE.exec(line);
|
|
103
|
+
if (includeMatch) {
|
|
104
|
+
const resolved = resolveDirective(includeMatch[1], fileDir, depth);
|
|
105
|
+
result.push(resolved ?? line);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
result.push(line);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result.join("\n");
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1pbmNsdWRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3Jlc29sdmUtaW5jbHVkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFckQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUE7QUFDeEMsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUE7QUFDL0MsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUE7QUFFakMsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEtBQUssRUFBRSxZQUFZO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0lBQ2IsS0FBSyxFQUFFLFlBQVk7SUFDbkIsTUFBTSxFQUFFLEtBQUs7SUFDYixLQUFLLEVBQUUsUUFBUTtJQUNmLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxLQUFLLEVBQUUsTUFBTTtJQUNiLE9BQU8sRUFBRSxNQUFNO0lBQ2YsS0FBSyxFQUFFLFFBQVE7SUFDZixRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsR0FBRztJQUNULE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLEdBQUc7SUFDVCxLQUFLLEVBQUUsUUFBUTtJQUNmLE1BQU0sRUFBRSxLQUFLO0lBQ2IsT0FBTyxFQUFFLE1BQU07SUFDZixPQUFPLEVBQUUsTUFBTTtJQUNmLE9BQU8sRUFBRSxNQUFNO0lBQ2YsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsTUFBTTtJQUNkLE9BQU8sRUFBRSxNQUFNO0lBQ2YsTUFBTSxFQUFFLEtBQUs7SUFDYixNQUFNLEVBQUUsS0FBSztJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsS0FB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bm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmNvbnN0IElOQ0xVREVfUkUgPSAvXjo6aW5jbHVkZVxceyguKylcXH0kL1xuY29uc3QgRlJPTlRNQVRURVJfUkUgPSAvXi0tLVxcbltcXHNcXFNdKj9cXG4tLS1cXG4/L1xuY29uc3QgRkVOQ0VfUkUgPSAvXihgezMsfXx+ezMsfSkvXG5cbmNvbnN0IGV4dFRvTGFuZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgXCIudHNcIjogXCJ0eXBlc2NyaXB0XCIsXG4gIFwiLnRzeFwiOiBcInRzeFwiLFxuICBcIi5qc1wiOiBcImphdmFzY3JpcHRcIixcbiAgXCIuanN4XCI6IFwianN4XCIsXG4gIFwiLnB5XCI6IFwicHl0aG9uXCIsXG4gIFwiLnJzXCI6IFwicnVzdFwiLFxuICBcIi5nb1wiOiBcImdvXCIsXG4gIFwiLnJiXCI6IFwicnVieVwiLFxuICBcIi5qYXZhXCI6IFwiamF2YVwiLFxuICBcIi5rdFwiOiBcImtvdGxpblwiLFxuICBcIi5zd2lmdFwiOiBcInN3aWZ0XCIsXG4gIFwiLmNcIjogXCJjXCIsXG4gIFwiLmNwcFwiOiBcImNwcFwiLFxuICBcIi5oXCI6IFwiY1wiLFxuICBcIi5jc1wiOiBcImNzaGFycFwiLFxuICBcIi5jc3NcIjogXCJjc3NcIixcbiAgXCIuc2Nzc1wiOiBcInNjc3NcIixcbiAgXCIuaHRtbFwiOiBcImh0bWxcIixcbiAgXCIuanNvblwiOiBcImpzb25cIixcbiAgXCIueWFtbFwiOiBcInlhbWxcIixcbiAgXCIueW1sXCI6IFwieWFtbFwiLFxuICBcIi50b21sXCI6IFwidG9tbFwiLFxuICBcIi54bWxcIjogXCJ4bWxcIixcbiAgXCIuc3FsXCI6IFwic3FsXCIsXG4gIFwiLnNoXCI6IFwiYmFzaFwiLFxuICBcIi5iYXNoXCI6IFwiYmFzaFwiLFxuICBcIi56c2hcIjogXCJ6c2hcIixcbiAgXCIuZmlzaFwiOiBcImZpc2hcIixcbiAgXCIucHMxXCI6IFwicG93ZXJzaGVsbFwiLFxuICBcIi5kb2NrZXJmaWxlXCI6IFwiZG9ja2VyZmlsZVwiLFxuICBcIi5ncmFwaHFsXCI6IFwiZ3JhcGhxbFwiLFxuICBcIi5wcm90b1wiOiBcInByb3RvYnVmXCIsXG4gIFwiLmx1YVwiOiBcImx1YVwiLFxuICBcIi5waHBcIjogXCJwaHBcIixcbiAgXCIuclwiOiBcInJcIixcbiAgXCIuemlnXCI6IFwiemlnXCIsXG4gIFwiLmV4XCI6IFwiZWxpeGlyXCIsXG4gIFwiLmV4c1wiOiBcImVsaXhpclwiLFxufVxuXG5mdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMocmF3OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBjb25zdCByZSA9IC8oXFx3Kyk9XCIoW15cIl0rKVwiL2dcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBudWxsXG4gIHdoaWxlICgobSA9IHJlLmV4ZWMocmF3KSkgIT09IG51bGwpIHtcbiAgICBhdHRyc1ttWzFdIV0gPSBtWzJdIVxuICB9XG4gIHJldHVybiBhdHRyc1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICByYXdBdHRyczogc3RyaW5nLFxuICBmaWxlRGlyOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdHRycyA9IHBhcnNlQXR0cmlidXRlcyhyYXdBdHRycylcbiAgY29uc3QgZmlsZSA9IGF0dHJzLmZpbGVcbiAgaWYgKCFmaWxlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcmVzb2x2ZShmaWxlRGlyLCBmaWxlKVxuICB0cnkge1xuICAgIGxldCBpbmNsdWRlZCA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmLThcIilcblxuICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGxhbmcgPSBleHRUb0xhbmdbZXh0XVxuXG4gICAgaWYgKGxhbmcgJiYgIWZpbGUuZW5kc1dpdGgoXCIubWRcIikpIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZS5zcGxpdChcIi9cIikucG9wKCkhXG4gICAgICBjb25zdCB0aXRsZSA9IGB0aXRsZT1cIiR7ZmlsZW5hbWV9XCJgXG4gICAgICBjb25zdCBtZXRhID0gYXR0cnMubWV0YSA/IGAgJHthdHRycy5tZXRhfWAgOiBcIlwiXG4gICAgICByZXR1cm4gKFxuICAgICAgICBcImBgYFwiICsgbGFuZyArIFwiIFwiICsgdGl0bGUgKyBtZXRhICsgXCJcXG5cIiArIGluY2x1ZGVkLnRyaW1FbmQoKSArIFwiXFxuYGBgXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBpbmNsdWRlZCA9IGluY2x1ZGVkLnJlcGxhY2UoRlJPTlRNQVRURVJfUkUsIFwiXCIpXG4gICAgcmV0dXJuIHJlc29sdmVJbmNsdWRlcyhpbmNsdWRlZC50cmltKCksIGFic29sdXRlUGF0aCwgZGVwdGggKyAxKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqIFJlc29sdmVzIDo6aW5jbHVkZXtmaWxlPVwiLi4uXCJ9IGRpcmVjdGl2ZXMgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCByZWZlcmVuY2VkIGZpbGUgY29udGVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW5jbHVkZXMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVwdGggPSAwLFxuKTogc3RyaW5nIHtcbiAgaWYgKGRlcHRoID4gNSkgcmV0dXJuIGNvbnRlbnRcblxuICBjb25zdCBmaWxlRGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICBsZXQgZmVuY2VNYXJrZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGZlbmNlTWF0Y2ggPSBGRU5DRV9SRS5leGVjKGxpbmUpXG4gICAgaWYgKGZlbmNlTWF0Y2gpIHtcbiAgICAgIGlmICghZmVuY2VNYXJrZXIpIHtcbiAgICAgICAgZmVuY2VNYXJrZXIgPSBmZW5jZU1hdGNoWzFdIVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoZmVuY2VNYXJrZXIpKSB7XG4gICAgICAgIGZlbmNlTWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChsaW5lKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZmVuY2VNYXJrZXIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVNYXRjaCA9IElOQ0xVREVfUkUuZXhlYyhsaW5lKVxuICAgIGlmIChpbmNsdWRlTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZURpcmVjdGl2ZShpbmNsdWRlTWF0Y2hbMV0hLCBmaWxlRGlyLCBkZXB0aClcbiAgICAgIHJlc3VsdC5wdXNoKHJlc29sdmVkID8/IGxpbmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
4
|
+
import { temporaryDirectory } from "tempy";
|
|
5
|
+
import { resolveIncludes } from "./resolve-includes.js";
|
|
6
|
+
describe("resolveIncludes", () => {
|
|
7
|
+
it("should replace include directive with file content", () => {
|
|
8
|
+
const dir = temporaryDirectory();
|
|
9
|
+
writeFileSync(join(dir, "snippet.md"), "Hello from snippet");
|
|
10
|
+
const result = resolveIncludes('::include{file="snippet.md"}', join(dir, "main.md"));
|
|
11
|
+
expect(result).toBe("Hello from snippet");
|
|
12
|
+
});
|
|
13
|
+
it("should strip frontmatter from included files", () => {
|
|
14
|
+
const dir = temporaryDirectory();
|
|
15
|
+
writeFileSync(join(dir, "snippet.md"), "---\ntitle: Test\n---\nContent here");
|
|
16
|
+
const result = resolveIncludes('::include{file="snippet.md"}', join(dir, "main.md"));
|
|
17
|
+
expect(result).toBe("Content here");
|
|
18
|
+
});
|
|
19
|
+
it("should preserve surrounding content", () => {
|
|
20
|
+
const dir = temporaryDirectory();
|
|
21
|
+
writeFileSync(join(dir, "snippet.md"), "Included text");
|
|
22
|
+
const result = resolveIncludes('Before\n\n::include{file="snippet.md"}\n\nAfter', join(dir, "main.md"));
|
|
23
|
+
expect(result).toBe("Before\n\nIncluded text\n\nAfter");
|
|
24
|
+
});
|
|
25
|
+
it("should keep directive when file is missing", () => {
|
|
26
|
+
const result = resolveIncludes('::include{file="nonexistent.md"}', "/tmp/main.md");
|
|
27
|
+
expect(result).toBe('::include{file="nonexistent.md"}');
|
|
28
|
+
});
|
|
29
|
+
it("should resolve nested includes", () => {
|
|
30
|
+
const dir = temporaryDirectory();
|
|
31
|
+
writeFileSync(join(dir, "inner.md"), "Inner content");
|
|
32
|
+
writeFileSync(join(dir, "outer.md"), '::include{file="inner.md"}');
|
|
33
|
+
const result = resolveIncludes('::include{file="outer.md"}', join(dir, "main.md"));
|
|
34
|
+
expect(result).toBe("Inner content");
|
|
35
|
+
});
|
|
36
|
+
it("should limit recursion depth", () => {
|
|
37
|
+
const dir = temporaryDirectory();
|
|
38
|
+
writeFileSync(join(dir, "recursive.md"), '::include{file="recursive.md"}');
|
|
39
|
+
const result = resolveIncludes('::include{file="recursive.md"}', join(dir, "main.md"));
|
|
40
|
+
expect(result).toBe('::include{file="recursive.md"}');
|
|
41
|
+
});
|
|
42
|
+
it("should resolve relative paths from included file location", () => {
|
|
43
|
+
const dir = temporaryDirectory();
|
|
44
|
+
mkdirSync(join(dir, "sub"));
|
|
45
|
+
writeFileSync(join(dir, "sub", "child.md"), "Child content");
|
|
46
|
+
writeFileSync(join(dir, "parent.md"), '::include{file="sub/child.md"}');
|
|
47
|
+
const result = resolveIncludes('::include{file="parent.md"}', join(dir, "main.md"));
|
|
48
|
+
expect(result).toBe("Child content");
|
|
49
|
+
});
|
|
50
|
+
it("should handle multiple includes in one file", () => {
|
|
51
|
+
const dir = temporaryDirectory();
|
|
52
|
+
writeFileSync(join(dir, "a.md"), "Alpha");
|
|
53
|
+
writeFileSync(join(dir, "b.md"), "Beta");
|
|
54
|
+
const result = resolveIncludes('::include{file="a.md"}\n\n::include{file="b.md"}', join(dir, "main.md"));
|
|
55
|
+
expect(result).toBe("Alpha\n\nBeta");
|
|
56
|
+
});
|
|
57
|
+
it("should wrap code files in fenced blocks", () => {
|
|
58
|
+
const dir = temporaryDirectory();
|
|
59
|
+
writeFileSync(join(dir, "example.ts"), 'const x = 1\nconst y = "hello"');
|
|
60
|
+
const result = resolveIncludes('::include{file="example.ts"}', join(dir, "main.md"));
|
|
61
|
+
expect(result).toBe('```typescript title="example.ts"\nconst x = 1\nconst y = "hello"\n```');
|
|
62
|
+
});
|
|
63
|
+
it("should pass meta to code fence", () => {
|
|
64
|
+
const dir = temporaryDirectory();
|
|
65
|
+
writeFileSync(join(dir, "app.tsx"), "export default function App() {}");
|
|
66
|
+
const result = resolveIncludes('::include{file="app.tsx" meta="{1} lineNumbers"}', join(dir, "main.md"));
|
|
67
|
+
expect(result).toBe('```tsx title="app.tsx" {1} lineNumbers\nexport default function App() {}\n```');
|
|
68
|
+
});
|
|
69
|
+
it("should treat unknown extensions as markdown", () => {
|
|
70
|
+
const dir = temporaryDirectory();
|
|
71
|
+
writeFileSync(join(dir, "notes.txt"), "Plain text");
|
|
72
|
+
const result = resolveIncludes('::include{file="notes.txt"}', join(dir, "main.md"));
|
|
73
|
+
expect(result).toBe("Plain text");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1pbmNsdWRlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvcmVzb2x2ZS1pbmNsdWRlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUV2RCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDNUQsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtRQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQzVELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FDNUIsOEJBQThCLEVBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQ3JCLENBQUE7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sR0FBRyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDaEMsYUFBYSxDQUNYLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQ3ZCLHFDQUFxQyxDQUN0QyxDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsZUFB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Q0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELE1BQU0sR0FBRyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDaEMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUM1Qiw2QkFBNkIsRUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FDckIsQ0FBQTtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeSB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyByZXNvbHZlSW5jbHVkZXMgfSBmcm9tIFwiLi9yZXNvbHZlLWluY2x1ZGVzLnRzXCJcblxuZGVzY3JpYmUoXCJyZXNvbHZlSW5jbHVkZXNcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCByZXBsYWNlIGluY2x1ZGUgZGlyZWN0aXZlIHdpdGggZmlsZSBjb250ZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwic25pcHBldC5tZFwiKSwgXCJIZWxsbyBmcm9tIHNuaXBwZXRcIilcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJzbmlwcGV0Lm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJIZWxsbyBmcm9tIHNuaXBwZXRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBzdHJpcCBmcm9udG1hdHRlciBmcm9tIGluY2x1ZGVkIGZpbGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBqb2luKGRpciwgXCJzbmlwcGV0Lm1kXCIpLFxuICAgICAgXCItLS1cXG50aXRsZTogVGVzdFxcbi0tLVxcbkNvbnRlbnQgaGVyZVwiLFxuICAgIClcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJzbmlwcGV0Lm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJDb250ZW50IGhlcmVcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBzdXJyb3VuZGluZyBjb250ZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwic25pcHBldC5tZFwiKSwgXCJJbmNsdWRlZCB0ZXh0XCIpXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJ0JlZm9yZVxcblxcbjo6aW5jbHVkZXtmaWxlPVwic25pcHBldC5tZFwifVxcblxcbkFmdGVyJyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJCZWZvcmVcXG5cXG5JbmNsdWRlZCB0ZXh0XFxuXFxuQWZ0ZXJcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBrZWVwIGRpcmVjdGl2ZSB3aGVuIGZpbGUgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJzo6aW5jbHVkZXtmaWxlPVwibm9uZXhpc3RlbnQubWRcIn0nLFxuICAgICAgXCIvdG1wL21haW4ubWRcIixcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnOjppbmNsdWRle2ZpbGU9XCJub25leGlzdGVudC5tZFwifScpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVzb2x2ZSBuZXN0ZWQgaW5jbHVkZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJpbm5lci5tZFwiKSwgXCJJbm5lciBjb250ZW50XCIpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJvdXRlci5tZFwiKSwgJzo6aW5jbHVkZXtmaWxlPVwiaW5uZXIubWRcIn0nKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cIm91dGVyLm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJJbm5lciBjb250ZW50XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbGltaXQgcmVjdXJzaW9uIGRlcHRoXCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwicmVjdXJzaXZlLm1kXCIpLCAnOjppbmNsdWRle2ZpbGU9XCJyZWN1cnNpdmUubWRcIn0nKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cInJlY3Vyc2l2ZS5tZFwifScsXG4gICAgICBqb2luKGRpciwgXCJtYWluLm1kXCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKCc6OmluY2x1ZGV7ZmlsZT1cInJlY3Vyc2l2ZS5tZFwifScpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVzb2x2ZSByZWxhdGl2ZSBwYXRocyBmcm9tIGluY2x1ZGVkIGZpbGUgbG9jYXRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgbWtkaXJTeW5jKGpvaW4oZGlyLCBcInN1YlwiKSlcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcInN1YlwiLCBcImNoaWxkLm1kXCIpLCBcIkNoaWxkIGNvbnRlbnRcIilcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcInBhcmVudC5tZFwiKSwgJzo6aW5jbHVkZXtmaWxlPVwic3ViL2NoaWxkLm1kXCJ9JylcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJwYXJlbnQubWRcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIkNoaWxkIGNvbnRlbnRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaW5jbHVkZXMgaW4gb25lIGZpbGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJhLm1kXCIpLCBcIkFscGhhXCIpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJiLm1kXCIpLCBcIkJldGFcIilcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJhLm1kXCJ9XFxuXFxuOjppbmNsdWRle2ZpbGU9XCJiLm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJBbHBoYVxcblxcbkJldGFcIilcbiAgfSlcblxuICBpdChcInNob3VsZCB3cmFwIGNvZGUgZmlsZXMgaW4gZmVuY2VkIGJsb2Nrc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgZGlyID0gdGVtcG9yYXJ5RGlyZWN0b3J5KClcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcImV4YW1wbGUudHNcIiksICdjb25zdCB4ID0gMVxcbmNvbnN0IHkgPSBcImhlbGxvXCInKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cImV4YW1wbGUudHNcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcbiAgICAgICdgYGB0eXBlc2NyaXB0IHRpdGxlPVwiZXhhbXBsZS50c1wiXFxuY29uc3QgeCA9IDFcXG5jb25zdCB5ID0gXCJoZWxsb1wiXFxuYGBgJyxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcGFzcyBtZXRhIHRvIGNvZGUgZmVuY2VcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJhcHAudHN4XCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHt9XCIpXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJzo6aW5jbHVkZXtmaWxlPVwiYXBwLnRzeFwiIG1ldGE9XCJ7MX0gbGluZU51bWJlcnNcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcbiAgICAgICdgYGB0c3ggdGl0bGU9XCJhcHAudHN4XCIgezF9IGxpbmVOdW1iZXJzXFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge31cXG5gYGAnLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCB0cmVhdCB1bmtub3duIGV4dGVuc2lvbnMgYXMgbWFya2Rvd25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJub3Rlcy50eHRcIiksIFwiUGxhaW4gdGV4dFwiKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cIm5vdGVzLnR4dFwifScsXG4gICAgICBqb2luKGRpciwgXCJtYWluLm1kXCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKFwiUGxhaW4gdGV4dFwiKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Strip markdown syntax to extract plain searchable text */
|
|
2
|
+
export function extractSearchText(markdown) {
|
|
3
|
+
return markdown
|
|
4
|
+
.replace(/^---[\s\S]*?---\n*/m, "")
|
|
5
|
+
.replace(/```[\s\S]*?```/g, "")
|
|
6
|
+
.replace(/:::\w+[\s\S]*?:::/g, "")
|
|
7
|
+
.replace(/::\w+(?:\[.*?\])?(?:\{.*?\})?/g, "")
|
|
8
|
+
.replace(/!\[.*?\]\(.*?\)/g, "")
|
|
9
|
+
.replace(/\[([^\]]*)\]\(.*?\)/g, "$1")
|
|
10
|
+
.replace(/<[^>]+>/g, "")
|
|
11
|
+
.replace(/#{1,6}\s*/g, "")
|
|
12
|
+
.replace(/[*_~`>|]/g, "")
|
|
13
|
+
.replace(/\n{2,}/g, "\n")
|
|
14
|
+
.trim();
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy9zZWFyY2gtdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQWdCO0lBQ2hELE9BQU8sUUFBUTtTQUNaLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7U0FDbEMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztTQUM5QixPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1NBQ2pDLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLENBQUM7U0FDN0MsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztTQUMvQixPQUFPLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDO1NBQ3JDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1NBQ3hCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1NBQ3hCLElBQUksRUFBRSxDQUFBO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTdHJpcCBtYXJrZG93biBzeW50YXggdG8gZXh0cmFjdCBwbGFpbiBzZWFyY2hhYmxlIHRleHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VhcmNoVGV4dChtYXJrZG93bjogc3RyaW5nKSB7XG4gIHJldHVybiBtYXJrZG93blxuICAgIC5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxcbiovbSwgXCJcIilcbiAgICAucmVwbGFjZSgvYGBgW1xcc1xcU10qP2BgYC9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC86OjpcXHcrW1xcc1xcU10qPzo6Oi9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC86OlxcdysoPzpcXFsuKj9cXF0pPyg/Olxcey4qP1xcfSk/L2csIFwiXCIpXG4gICAgLnJlcGxhY2UoLyFcXFsuKj9cXF1cXCguKj9cXCkvZywgXCJcIilcbiAgICAucmVwbGFjZSgvXFxbKFteXFxdXSopXFxdXFwoLio/XFwpL2csIFwiJDFcIilcbiAgICAucmVwbGFjZSgvPFtePl0rPi9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8jezEsNn1cXHMqL2csIFwiXCIpXG4gICAgLnJlcGxhY2UoL1sqX35gPnxdL2csIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcbnsyLH0vZywgXCJcXG5cIilcbiAgICAudHJpbSgpXG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Section } from "../models/section.ts";
|
|
2
|
+
/** Return the section's icon, falling back to a type-based default */
|
|
3
|
+
export declare function sectionIcon(section: Pick<Section, "icon" | "type">): string;
|
|
4
|
+
/** Find the section whose prefix is the longest prefix of the article path */
|
|
5
|
+
export declare function matchSection<S extends {
|
|
6
|
+
prefix: string;
|
|
7
|
+
}>(articlePath: string, sections: S[]): S | undefined;
|
|
8
|
+
/** Split articles into per-section buckets. Unmatched articles go to "__default__" */
|
|
9
|
+
export declare function partitionBySection<T extends {
|
|
10
|
+
path: string;
|
|
11
|
+
}>(articles: T[], sections: {
|
|
12
|
+
prefix: string;
|
|
13
|
+
}[]): Map<string, T[]>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const DEFAULT_ICONS = {
|
|
2
|
+
article: "book-open",
|
|
3
|
+
blog: "rss",
|
|
4
|
+
changelog: "history",
|
|
5
|
+
};
|
|
6
|
+
/** Return the section's icon, falling back to a type-based default */
|
|
7
|
+
export function sectionIcon(section) {
|
|
8
|
+
return section.icon ?? DEFAULT_ICONS[section.type];
|
|
9
|
+
}
|
|
10
|
+
/** Find the section whose prefix is the longest prefix of the article path */
|
|
11
|
+
export function matchSection(articlePath, sections) {
|
|
12
|
+
let best;
|
|
13
|
+
let bestLen = 0;
|
|
14
|
+
for (const section of sections) {
|
|
15
|
+
if (articlePath.startsWith(section.prefix) &&
|
|
16
|
+
section.prefix.length > bestLen) {
|
|
17
|
+
best = section;
|
|
18
|
+
bestLen = section.prefix.length;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return best;
|
|
22
|
+
}
|
|
23
|
+
/** Split articles into per-section buckets. Unmatched articles go to "__default__" */
|
|
24
|
+
export function partitionBySection(articles, sections) {
|
|
25
|
+
const buckets = new Map();
|
|
26
|
+
for (const article of articles) {
|
|
27
|
+
const section = matchSection(article.path, sections);
|
|
28
|
+
const key = section?.prefix ?? "__default__";
|
|
29
|
+
const bucket = buckets.get(key);
|
|
30
|
+
if (bucket) {
|
|
31
|
+
bucket.push(article);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
buckets.set(key, [article]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return buckets;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3NlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxhQUFhLEdBQW9DO0lBQ3JELE9BQU8sRUFBRSxXQUFXO0lBQ3BCLElBQUksRUFBRSxLQUFLO0lBQ1gsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQTtBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQXVDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsV0FBbUIsRUFDbkIsUUFBYTtJQUViLElBQUksSUFBbUIsQ0FBQTtJQUN2QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7SUFDZixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQ0UsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFDL0IsQ0FBQztZQUNELElBQUksR0FBRyxPQUFPLENBQUE7WUFDZCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUE7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxRQUFhLEVBQ2IsUUFBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQTtJQUN0QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksYUFBYSxDQUFBO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTZWN0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZWN0aW9uLnRzXCJcblxuY29uc3QgREVGQVVMVF9JQ09OUzogUmVjb3JkPFNlY3Rpb25bXCJ0eXBlXCJdLCBzdHJpbmc+ID0ge1xuICBhcnRpY2xlOiBcImJvb2stb3BlblwiLFxuICBibG9nOiBcInJzc1wiLFxuICBjaGFuZ2Vsb2c6IFwiaGlzdG9yeVwiLFxufVxuXG4vKiogUmV0dXJuIHRoZSBzZWN0aW9uJ3MgaWNvbiwgZmFsbGluZyBiYWNrIHRvIGEgdHlwZS1iYXNlZCBkZWZhdWx0ICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkljb24oc2VjdGlvbjogUGljazxTZWN0aW9uLCBcImljb25cIiB8IFwidHlwZVwiPikge1xuICByZXR1cm4gc2VjdGlvbi5pY29uID8/IERFRkFVTFRfSUNPTlNbc2VjdGlvbi50eXBlXVxufVxuXG4vKiogRmluZCB0aGUgc2VjdGlvbiB3aG9zZSBwcmVmaXggaXMgdGhlIGxvbmdlc3QgcHJlZml4IG9mIHRoZSBhcnRpY2xlIHBhdGggKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFNlY3Rpb248UyBleHRlbmRzIHsgcHJlZml4OiBzdHJpbmcgfT4oXG4gIGFydGljbGVQYXRoOiBzdHJpbmcsXG4gIHNlY3Rpb25zOiBTW10sXG4pOiBTIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGJlc3Q6IFMgfCB1bmRlZmluZWRcbiAgbGV0IGJlc3RMZW4gPSAwXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgIGlmIChcbiAgICAgIGFydGljbGVQYXRoLnN0YXJ0c1dpdGgoc2VjdGlvbi5wcmVmaXgpICYmXG4gICAgICBzZWN0aW9uLnByZWZpeC5sZW5ndGggPiBiZXN0TGVuXG4gICAgKSB7XG4gICAgICBiZXN0ID0gc2VjdGlvblxuICAgICAgYmVzdExlbiA9IHNlY3Rpb24ucHJlZml4Lmxlbmd0aFxuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdFxufVxuXG4vKiogU3BsaXQgYXJ0aWNsZXMgaW50byBwZXItc2VjdGlvbiBidWNrZXRzLiBVbm1hdGNoZWQgYXJ0aWNsZXMgZ28gdG8gXCJfX2RlZmF1bHRfX1wiICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uQnlTZWN0aW9uPFQgZXh0ZW5kcyB7IHBhdGg6IHN0cmluZyB9PihcbiAgYXJ0aWNsZXM6IFRbXSxcbiAgc2VjdGlvbnM6IHsgcHJlZml4OiBzdHJpbmcgfVtdLFxuKTogTWFwPHN0cmluZywgVFtdPiB7XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgVFtdPigpXG4gIGZvciAoY29uc3QgYXJ0aWNsZSBvZiBhcnRpY2xlcykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBtYXRjaFNlY3Rpb24oYXJ0aWNsZS5wYXRoLCBzZWN0aW9ucylcbiAgICBjb25zdCBrZXkgPSBzZWN0aW9uPy5wcmVmaXggPz8gXCJfX2RlZmF1bHRfX1wiXG4gICAgY29uc3QgYnVja2V0ID0gYnVja2V0cy5nZXQoa2V5KVxuICAgIGlmIChidWNrZXQpIHtcbiAgICAgIGJ1Y2tldC5wdXNoKGFydGljbGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Y2tldHMuc2V0KGtleSwgW2FydGljbGVdKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYnVja2V0c1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { matchSection, partitionBySection } from "./section.js";
|
|
3
|
+
describe("matchSection", () => {
|
|
4
|
+
const sections = [
|
|
5
|
+
{ title: "Docs", prefix: "/" },
|
|
6
|
+
{ title: "API", prefix: "/api/" },
|
|
7
|
+
{ title: "API Auth", prefix: "/api/auth/" },
|
|
8
|
+
];
|
|
9
|
+
it("should match the most specific prefix", () => {
|
|
10
|
+
expect(matchSection("/api/auth/login/", sections)?.title).toBe("API Auth");
|
|
11
|
+
});
|
|
12
|
+
it("should match a less specific prefix when no deeper match", () => {
|
|
13
|
+
expect(matchSection("/api/users/", sections)?.title).toBe("API");
|
|
14
|
+
});
|
|
15
|
+
it("should match root section as fallback", () => {
|
|
16
|
+
expect(matchSection("/getting-started/", sections)?.title).toBe("Docs");
|
|
17
|
+
});
|
|
18
|
+
it("should return undefined when no section matches", () => {
|
|
19
|
+
const narrow = [{ title: "API", prefix: "/api/" }];
|
|
20
|
+
expect(matchSection("/getting-started/", narrow)).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
it("should match a single root section for all articles", () => {
|
|
23
|
+
const root = [{ title: "Docs", prefix: "/" }];
|
|
24
|
+
expect(matchSection("/anything/deep/path/", root)?.title).toBe("Docs");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("partitionBySection", () => {
|
|
28
|
+
const sections = [
|
|
29
|
+
{ title: "Docs", prefix: "/" },
|
|
30
|
+
{ title: "API", prefix: "/api/" },
|
|
31
|
+
];
|
|
32
|
+
const articles = [
|
|
33
|
+
{ path: "/getting-started/" },
|
|
34
|
+
{ path: "/guide/" },
|
|
35
|
+
{ path: "/api/users/" },
|
|
36
|
+
{ path: "/api/auth/" },
|
|
37
|
+
];
|
|
38
|
+
it("should split articles into section buckets", () => {
|
|
39
|
+
const result = partitionBySection(articles, sections);
|
|
40
|
+
expect(result.get("/")?.map(a => a.path)).toEqual([
|
|
41
|
+
"/getting-started/",
|
|
42
|
+
"/guide/",
|
|
43
|
+
]);
|
|
44
|
+
expect(result.get("/api/")?.map(a => a.path)).toEqual([
|
|
45
|
+
"/api/users/",
|
|
46
|
+
"/api/auth/",
|
|
47
|
+
]);
|
|
48
|
+
});
|
|
49
|
+
it("should put unmatched articles in __default__ bucket", () => {
|
|
50
|
+
const narrow = [{ title: "API", prefix: "/api/" }];
|
|
51
|
+
const result = partitionBySection(articles, narrow);
|
|
52
|
+
expect(result.get("__default__")?.map(a => a.path)).toEqual([
|
|
53
|
+
"/getting-started/",
|
|
54
|
+
"/guide/",
|
|
55
|
+
]);
|
|
56
|
+
expect(result.get("/api/")?.map(a => a.path)).toEqual([
|
|
57
|
+
"/api/users/",
|
|
58
|
+
"/api/auth/",
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvc2VjdGlvbi51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFL0QsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsTUFBTSxRQUFRLEdBQUc7UUFDZixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUM5QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtRQUNqQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRTtLQUM1QyxDQUFBO0lBRUQsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6RSxD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cmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBtYXRjaFNlY3Rpb24sIHBhcnRpdGlvbkJ5U2VjdGlvbiB9IGZyb20gXCIuL3NlY3Rpb24udHNcIlxuXG5kZXNjcmliZShcIm1hdGNoU2VjdGlvblwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgIHsgdGl0bGU6IFwiRG9jc1wiLCBwcmVmaXg6IFwiL1wiIH0sXG4gICAgeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfSxcbiAgICB7IHRpdGxlOiBcIkFQSSBBdXRoXCIsIHByZWZpeDogXCIvYXBpL2F1dGgvXCIgfSxcbiAgXVxuXG4gIGl0KFwic2hvdWxkIG1hdGNoIHRoZSBtb3N0IHNwZWNpZmljIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG1hdGNoU2VjdGlvbihcIi9hcGkvYXV0aC9sb2dpbi9cIiwgc2VjdGlvbnMpPy50aXRsZSkudG9CZShcIkFQSSBBdXRoXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbWF0Y2ggYSBsZXNzIHNwZWNpZmljIHByZWZpeCB3aGVuIG5vIGRlZXBlciBtYXRjaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG1hdGNoU2VjdGlvbihcIi9hcGkvdXNlcnMvXCIsIHNlY3Rpb25zKT8udGl0bGUpLnRvQmUoXCJBUElcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBtYXRjaCByb290IHNlY3Rpb24gYXMgZmFsbGJhY2tcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvZ2V0dGluZy1zdGFydGVkL1wiLCBzZWN0aW9ucyk/LnRpdGxlKS50b0JlKFwiRG9jc1wiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiBubyBzZWN0aW9uIG1hdGNoZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG5hcnJvdyA9IFt7IHRpdGxlOiBcIkFQSVwiLCBwcmVmaXg6IFwiL2FwaS9cIiB9XVxuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvZ2V0dGluZy1zdGFydGVkL1wiLCBuYXJyb3cpKS50b0JlVW5kZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBtYXRjaCBhIHNpbmdsZSByb290IHNlY3Rpb24gZm9yIGFsbCBhcnRpY2xlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IFt7IHRpdGxlOiBcIkRvY3NcIiwgcHJlZml4OiBcIi9cIiB9XVxuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvYW55dGhpbmcvZGVlcC9wYXRoL1wiLCByb290KT8udGl0bGUpLnRvQmUoXCJEb2NzXCIpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInBhcnRpdGlvbkJ5U2VjdGlvblwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgIHsgdGl0bGU6IFwiRG9jc1wiLCBwcmVmaXg6IFwiL1wiIH0sXG4gICAgeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfSxcbiAgXVxuXG4gIGNvbnN0IGFydGljbGVzID0gW1xuICAgIHsgcGF0aDogXCIvZ2V0dGluZy1zdGFydGVkL1wiIH0sXG4gICAgeyBwYXRoOiBcIi9ndWlkZS9cIiB9LFxuICAgIHsgcGF0aDogXCIvYXBpL3VzZXJzL1wiIH0sXG4gICAgeyBwYXRoOiBcIi9hcGkvYXV0aC9cIiB9LFxuICBdXG5cbiAgaXQoXCJzaG91bGQgc3BsaXQgYXJ0aWNsZXMgaW50byBzZWN0aW9uIGJ1Y2tldHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnRpdGlvbkJ5U2VjdGlvbihhcnRpY2xlcywgc2VjdGlvbnMpXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvXCIpPy5tYXAoYSA9PiBhLnBhdGgpKS50b0VxdWFsKFtcbiAgICAgIFwiL2dldHRpbmctc3RhcnRlZC9cIixcbiAgICAgIFwiL2d1aWRlL1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvYXBpL1wiKT8ubWFwKGEgPT4gYS5wYXRoKSkudG9FcXVhbChbXG4gICAgICBcIi9hcGkvdXNlcnMvXCIsXG4gICAgICBcIi9hcGkvYXV0aC9cIixcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHB1dCB1bm1hdGNoZWQgYXJ0aWNsZXMgaW4gX19kZWZhdWx0X18gYnVja2V0XCIsICgpID0+IHtcbiAgICBjb25zdCBuYXJyb3cgPSBbeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfV1cbiAgICBjb25zdCByZXN1bHQgPSBwYXJ0aXRpb25CeVNlY3Rpb24oYXJ0aWNsZXMsIG5hcnJvdylcbiAgICBleHBlY3QocmVzdWx0LmdldChcIl9fZGVmYXVsdF9fXCIpPy5tYXAoYSA9PiBhLnBhdGgpKS50b0VxdWFsKFtcbiAgICAgIFwiL2dldHRpbmctc3RhcnRlZC9cIixcbiAgICAgIFwiL2d1aWRlL1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvYXBpL1wiKT8ubWFwKGEgPT4gYS5wYXRoKSkudG9FcXVhbChbXG4gICAgICBcIi9hcGkvdXNlcnMvXCIsXG4gICAgICBcIi9hcGkvYXV0aC9cIixcbiAgICBdKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const STORAGE_KEY = "livemark-theme";
|
|
2
|
+
export function detectClientTheme() {
|
|
3
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
4
|
+
return stored || "light";
|
|
5
|
+
}
|
|
6
|
+
export function activateTheme(theme) {
|
|
7
|
+
if (theme === "dark") {
|
|
8
|
+
globalThis.document.documentElement.classList.add("dark");
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
globalThis.document.documentElement.classList.remove("dark");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function getCurrentTheme() {
|
|
15
|
+
return globalThis.document?.documentElement.classList.contains("dark")
|
|
16
|
+
? "dark"
|
|
17
|
+
: "light";
|
|
18
|
+
}
|
|
19
|
+
export function setTheme(theme) {
|
|
20
|
+
activateTheme(theme);
|
|
21
|
+
localStorage.setItem(STORAGE_KEY, theme);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy90aGVtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFpQixDQUFBO0lBQ2hFLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBQTtBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFZO0lBQ3hDLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0QsQ0FBQztTQUFNLENBQUM7UUFDTixVQUFVLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzlELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNwRSxDQUFDLENBQUMsTUFBTTtRQUNSLENBQUMsQ0FBQyxPQUFPLENBQUE7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFZO0lBQ25DLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQixZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU1RPUkFHRV9LRVkgPSBcImxpdmVtYXJrLXRoZW1lXCJcblxuZXhwb3J0IHR5cGUgVGhlbWUgPSBcImxpZ2h0XCIgfCBcImRhcmtcIlxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Q2xpZW50VGhlbWUoKTogVGhlbWUge1xuICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSkgYXMgVGhlbWUgfCBudWxsXG4gIHJldHVybiBzdG9yZWQgfHwgXCJsaWdodFwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZVRoZW1lKHRoZW1lOiBUaGVtZSkge1xuICBpZiAodGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgZ2xvYmFsVGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRhcmtcIilcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWxUaGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZGFya1wiKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VGhlbWUoKTogVGhlbWUge1xuICByZXR1cm4gZ2xvYmFsVGhpcy5kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImRhcmtcIilcbiAgICA/IFwiZGFya1wiXG4gICAgOiBcImxpZ2h0XCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRoZW1lKHRoZW1lOiBUaGVtZSkge1xuICBhY3RpdmF0ZVRoZW1lKHRoZW1lKVxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgdGhlbWUpXG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TocItem } from "../models/toc.ts";
|
|
2
|
+
/** React context that provides TOC items to inline components */
|
|
3
|
+
export declare const TocContext: import("react").Context<TocItem[]>;
|
|
4
|
+
/** Consume the TOC items from the nearest TocContext provider */
|
|
5
|
+
export declare function useTocItems(): TocItem[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
/** React context that provides TOC items to inline components */
|
|
3
|
+
export const TocContext = createContext([]);
|
|
4
|
+
/** Consume the TOC items from the nearest TocContext provider */
|
|
5
|
+
export function useTocItems() {
|
|
6
|
+
return useContext(TocContext);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy90b2MtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUdqRCxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBWSxFQUFFLENBQUMsQ0FBQTtBQUV0RCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLFdBQVc7SUFDekIsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHR5cGUgeyBUb2NJdGVtIH0gZnJvbSBcIi4uL21vZGVscy90b2MudHNcIlxuXG4vKiogUmVhY3QgY29udGV4dCB0aGF0IHByb3ZpZGVzIFRPQyBpdGVtcyB0byBpbmxpbmUgY29tcG9uZW50cyAqL1xuZXhwb3J0IGNvbnN0IFRvY0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFRvY0l0ZW1bXT4oW10pXG5cbi8qKiBDb25zdW1lIHRoZSBUT0MgaXRlbXMgZnJvbSB0aGUgbmVhcmVzdCBUb2NDb250ZXh0IHByb3ZpZGVyICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9jSXRlbXMoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KFRvY0NvbnRleHQpXG59XG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import GithubSlugger from "github-slugger";
|
|
2
|
+
const CUSTOM_ID_PATTERN = /\s*\[#([^\]]+)\]\s*$/;
|
|
3
|
+
const TOC_HIDDEN_PATTERN = /\s*\[!toc\]\s*$/;
|
|
4
|
+
const TOC_ONLY_PATTERN = /\s*\[toc\]\s*$/;
|
|
5
|
+
const STEP_PATTERN = /\s*\[step\]\s*$/;
|
|
6
|
+
/** Extract TOC headings from raw markdown content */
|
|
7
|
+
export function extractToc(content) {
|
|
8
|
+
const slugger = new GithubSlugger();
|
|
9
|
+
const items = [];
|
|
10
|
+
const headingRegex = /^(#{2,4})\s+(.+)$/;
|
|
11
|
+
const lines = content.split("\n");
|
|
12
|
+
let inCodeBlock = false;
|
|
13
|
+
for (const line of lines) {
|
|
14
|
+
if (line.startsWith("```") || line.startsWith("````")) {
|
|
15
|
+
inCodeBlock = !inCodeBlock;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (inCodeBlock)
|
|
19
|
+
continue;
|
|
20
|
+
const match = headingRegex.exec(line);
|
|
21
|
+
if (!match)
|
|
22
|
+
continue;
|
|
23
|
+
const depth = match[1].length;
|
|
24
|
+
const rawTitle = match[2];
|
|
25
|
+
if (TOC_HIDDEN_PATTERN.test(rawTitle))
|
|
26
|
+
continue;
|
|
27
|
+
if (STEP_PATTERN.test(rawTitle))
|
|
28
|
+
continue;
|
|
29
|
+
const idMatch = CUSTOM_ID_PATTERN.exec(rawTitle);
|
|
30
|
+
const title = rawTitle
|
|
31
|
+
.replace(CUSTOM_ID_PATTERN, "")
|
|
32
|
+
.replace(TOC_ONLY_PATTERN, "")
|
|
33
|
+
.replace(STEP_PATTERN, "")
|
|
34
|
+
.replace(/\*\*(.+?)\*\*/g, "$1")
|
|
35
|
+
.replace(/`(.+?)`/g, "$1");
|
|
36
|
+
const slug = idMatch?.[1] ?? slugger.slug(title);
|
|
37
|
+
items.push({ url: `#${slug}`, title, depth });
|
|
38
|
+
}
|
|
39
|
+
return items;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLGdCQUFnQixDQUFBO0FBRzFDLE1BQU0saUJBQWlCLEdBQUcsc0JBQXNCLENBQUE7QUFDaEQsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQTtBQUM1QyxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFBO0FBRXRDLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQTtJQUNuQyxNQUFNLEtBQUssR0FBYyxFQUFFLENBQUE7SUFDM0IsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUE7SUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUE7SUFFdkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RELFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQTtZQUMxQixTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksV0FBVztZQUFFLFNBQVE7UUFFekIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsS0FBSztZQUFFLFNBQVE7UUFFcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLE1BQU0sQ0FBQTtRQUM5QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUE7UUFFMUIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUTtRQUMvQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUTtRQUV6QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEQsTUFBTSxLQUFLLEdBQUcsUUFBUTthQUNuQixPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2FBQzlCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7YUFDN0IsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7YUFDekIsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQzthQUMvQixPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR2l0aHViU2x1Z2dlciBmcm9tIFwiZ2l0aHViLXNsdWdnZXJcIlxuaW1wb3J0IHR5cGUgeyBUb2NJdGVtIH0gZnJvbSBcIi4uL21vZGVscy90b2MudHNcIlxuXG5jb25zdCBDVVNUT01fSURfUEFUVEVSTiA9IC9cXHMqXFxbIyhbXlxcXV0rKVxcXVxccyokL1xuY29uc3QgVE9DX0hJRERFTl9QQVRURVJOID0gL1xccypcXFshdG9jXFxdXFxzKiQvXG5jb25zdCBUT0NfT05MWV9QQVRURVJOID0gL1xccypcXFt0b2NcXF1cXHMqJC9cbmNvbnN0IFNURVBfUEFUVEVSTiA9IC9cXHMqXFxbc3RlcFxcXVxccyokL1xuXG4vKiogRXh0cmFjdCBUT0MgaGVhZGluZ3MgZnJvbSByYXcgbWFya2Rvd24gY29udGVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUb2MoY29udGVudDogc3RyaW5nKTogVG9jSXRlbVtdIHtcbiAgY29uc3Qgc2x1Z2dlciA9IG5ldyBHaXRodWJTbHVnZ2VyKClcbiAgY29uc3QgaXRlbXM6IFRvY0l0ZW1bXSA9IFtdXG4gIGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCN7Miw0fSlcXHMrKC4rKSQvXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKVxuICBsZXQgaW5Db2RlQmxvY2sgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJgYGBcIikgfHwgbGluZS5zdGFydHNXaXRoKFwiYGBgYFwiKSkge1xuICAgICAgaW5Db2RlQmxvY2sgPSAhaW5Db2RlQmxvY2tcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChpbkNvZGVCbG9jaykgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gaGVhZGluZ1JlZ2V4LmV4ZWMobGluZSlcbiAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgY29uc3QgZGVwdGggPSBtYXRjaFsxXSEubGVuZ3RoXG4gICAgY29uc3QgcmF3VGl0bGUgPSBtYXRjaFsyXSFcblxuICAgIGlmIChUT0NfSElEREVOX1BBVFRFUk4udGVzdChyYXdUaXRsZSkpIGNvbnRpbnVlXG4gICAgaWYgKFNURVBfUEFUVEVSTi50ZXN0KHJhd1RpdGxlKSkgY29udGludWVcblxuICAgIGNvbnN0IGlkTWF0Y2ggPSBDVVNUT01fSURfUEFUVEVSTi5leGVjKHJhd1RpdGxlKVxuICAgIGNvbnN0IHRpdGxlID0gcmF3VGl0bGVcbiAgICAgIC5yZXBsYWNlKENVU1RPTV9JRF9QQVRURVJOLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoVE9DX09OTFlfUEFUVEVSTiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFNURVBfUEFUVEVSTiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCBcIiQxXCIpXG4gICAgICAucmVwbGFjZSgvYCguKz8pYC9nLCBcIiQxXCIpXG4gICAgY29uc3Qgc2x1ZyA9IGlkTWF0Y2g/LlsxXSA/PyBzbHVnZ2VyLnNsdWcodGl0bGUpXG5cbiAgICBpdGVtcy5wdXNoKHsgdXJsOiBgIyR7c2x1Z31gLCB0aXRsZSwgZGVwdGggfSlcbiAgfVxuXG4gIHJldHVybiBpdGVtc1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
2
|
+
import { extractToc } from "./toc.js";
|
|
3
|
+
describe("extractToc", () => {
|
|
4
|
+
it("should extract headings with auto-generated slugs", () => {
|
|
5
|
+
const content = "## Introduction\n\n### Getting Started";
|
|
6
|
+
const toc = extractToc(content);
|
|
7
|
+
expect(toc).toEqual([
|
|
8
|
+
{ url: "#introduction", title: "Introduction", depth: 2 },
|
|
9
|
+
{ url: "#getting-started", title: "Getting Started", depth: 3 },
|
|
10
|
+
]);
|
|
11
|
+
});
|
|
12
|
+
it("should use custom id when [#custom-id] syntax is present", () => {
|
|
13
|
+
const content = "## My Section [#custom-id]\n\n### Sub Section";
|
|
14
|
+
const toc = extractToc(content);
|
|
15
|
+
expect(toc).toEqual([
|
|
16
|
+
{ url: "#custom-id", title: "My Section", depth: 2 },
|
|
17
|
+
{ url: "#sub-section", title: "Sub Section", depth: 3 },
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
20
|
+
it("should strip [#id] from the displayed title", () => {
|
|
21
|
+
const content = "## Installation [#install]";
|
|
22
|
+
const toc = extractToc(content);
|
|
23
|
+
expect(toc).toEqual([{ url: "#install", title: "Installation", depth: 2 }]);
|
|
24
|
+
});
|
|
25
|
+
it("should handle inline formatting with custom ids", () => {
|
|
26
|
+
const content = "## **Bold** Title [#bold-title]";
|
|
27
|
+
const toc = extractToc(content);
|
|
28
|
+
expect(toc).toEqual([{ url: "#bold-title", title: "Bold Title", depth: 2 }]);
|
|
29
|
+
});
|
|
30
|
+
it("should handle code formatting with custom ids", () => {
|
|
31
|
+
const content = "## `config` Options [#config-opts]";
|
|
32
|
+
const toc = extractToc(content);
|
|
33
|
+
expect(toc).toEqual([
|
|
34
|
+
{ url: "#config-opts", title: "config Options", depth: 2 },
|
|
35
|
+
]);
|
|
36
|
+
});
|
|
37
|
+
it("should skip h1 headings", () => {
|
|
38
|
+
const content = "# Title\n\n## Section";
|
|
39
|
+
const toc = extractToc(content);
|
|
40
|
+
expect(toc).toEqual([{ url: "#section", title: "Section", depth: 2 }]);
|
|
41
|
+
});
|
|
42
|
+
it("should exclude [step] headings from TOC", () => {
|
|
43
|
+
const content = "## Overview\n\n### Install Dependencies [step]\n\n### Configure Project [step]";
|
|
44
|
+
const toc = extractToc(content);
|
|
45
|
+
expect(toc).toEqual([{ url: "#overview", title: "Overview", depth: 2 }]);
|
|
46
|
+
});
|
|
47
|
+
it("should skip headings with [!toc] annotation", () => {
|
|
48
|
+
const content = "## Visible\n\n## Hidden From TOC [!toc]\n\n## Also Visible";
|
|
49
|
+
const toc = extractToc(content);
|
|
50
|
+
expect(toc).toEqual([
|
|
51
|
+
{ url: "#visible", title: "Visible", depth: 2 },
|
|
52
|
+
{ url: "#also-visible", title: "Also Visible", depth: 2 },
|
|
53
|
+
]);
|
|
54
|
+
});
|
|
55
|
+
it("should include [toc] headings with annotation stripped from title", () => {
|
|
56
|
+
const content = "## Regular\n\n## TOC Only [toc]\n\n## Another";
|
|
57
|
+
const toc = extractToc(content);
|
|
58
|
+
expect(toc).toEqual([
|
|
59
|
+
{ url: "#regular", title: "Regular", depth: 2 },
|
|
60
|
+
{ url: "#toc-only", title: "TOC Only", depth: 2 },
|
|
61
|
+
{ url: "#another", title: "Another", depth: 2 },
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLnVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy90b2MudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXJDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzFCLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxHQUFHLEVBQUU7UUFDM0QsTUFBTSxPQUFPLEdBQUcsd0NBQXdDLENBQUE7UUFDeEQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbEIsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUN6RCxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUNoRSxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsK0NBQStDLENBQUE7UUFDL0QsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbEIsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUNwRCxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NB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QUE7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNsQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQy9DLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDakQsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUNoRCxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgZXh0cmFjdFRvYyB9IGZyb20gXCIuL3RvYy50c1wiXG5cbmRlc2NyaWJlKFwiZXh0cmFjdFRvY1wiLCAoKSA9PiB7XG4gIGl0KFwic2hvdWxkIGV4dHJhY3QgaGVhZGluZ3Mgd2l0aCBhdXRvLWdlbmVyYXRlZCBzbHVnc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IFwiIyMgSW50cm9kdWN0aW9uXFxuXFxuIyMjIEdldHRpbmcgU3RhcnRlZFwiXG4gICAgY29uc3QgdG9jID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGV4cGVjdCh0b2MpLnRvRXF1YWwoW1xuICAgICAgeyB1cmw6IFwiI2ludHJvZHVjdGlvblwiLCB0aXRsZTogXCJJbnRyb2R1Y3Rpb25cIiwgZGVwdGg6IDIgfSxcbiAgICAgIHsgdXJsOiBcIiNnZXR0aW5nLXN0YXJ0ZWRcIiwgdGl0bGU6IFwiR2V0dGluZyBTdGFydGVkXCIsIGRlcHRoOiAzIH0sXG4gICAgXSlcbiAgfSlcblxuICBpdChcInNob3VsZCB1c2UgY3VzdG9tIGlkIHdoZW4gWyNjdXN0b20taWRdIHN5bnRheCBpcyBwcmVzZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gXCIjIyBNeSBTZWN0aW9uIFsjY3VzdG9tLWlkXVxcblxcbiMjIyBTdWIgU2VjdGlvblwiXG4gICAgY29uc3QgdG9jID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGV4cGVjdCh0b2MpLnRvRXF1YWwoW1xuICAgICAgeyB1cmw6IFwiI2N1c3RvbS1pZFwiLCB0aXRsZTogXCJNeSBTZWN0aW9uXCIsIGRlcHRoOiAyIH0sXG4gICAgICB7IHVybDogXCIjc3ViLXNlY3Rpb25cIiwgdGl0bGU6IFwiU3ViIFNlY3Rpb25cIiwgZGVwdGg6IDMgfSxcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHN0cmlwIFsjaWRdIGZyb20gdGhlIGRpc3BsYXllZCB0aXRsZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IFwiIyMgSW5zdGFsbGF0aW9uIFsjaW5zdGFsbF1cIlxuICAgIGNvbnN0IHRvYyA9IGV4dHJhY3RUb2MoY29udGVudClcbiAgICBleHBlY3QodG9jKS50b0VxdWFsKFt7IHVybDogXCIjaW5zdGFsbFwiLCB0aXRsZTogXCJJbnN0YWxsYXRpb25cIiwgZGVwdGg6IDIgfV0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGlubGluZSBmb3JtYXR0aW5nIHdpdGggY3VzdG9tIGlkc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IFwiIyMgKipCb2xkKiogVGl0bGUgWyNib2xkLXRpdGxlXVwiXG4gICAgY29uc3QgdG9jID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGV4cGVjdCh0b2MpLnRvRXF1YWwoW3sgdXJsOiBcIiNib2xkLXRpdGxlXCIsIHRpdGxlOiBcIkJvbGQgVGl0bGVcIiwgZGVwdGg6IDIgfV0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIGNvZGUgZm9ybWF0dGluZyB3aXRoIGN1c3RvbSBpZHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBcIiMjIGBjb25maWdgIE9wdGlvbnMgWyNjb25maWctb3B0c11cIlxuICAgIGNvbnN0IHRvYyA9IGV4dHJhY3RUb2MoY29udGVudClcbiAgICBleHBlY3QodG9jKS50b0VxdWFsKFtcbiAgICAgIHsgdXJsOiBcIiNjb25maWctb3B0c1wiLCB0aXRsZTogXCJjb25maWcgT3B0aW9uc1wiLCBkZXB0aDogMiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgc2tpcCBoMSBoZWFkaW5nc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IFwiIyBUaXRsZVxcblxcbiMjIFNlY3Rpb25cIlxuICAgIGNvbnN0IHRvYyA9IGV4dHJhY3RUb2MoY29udGVudClcbiAgICBleHBlY3QodG9jKS50b0VxdWFsKFt7IHVybDogXCIjc2VjdGlvblwiLCB0aXRsZTogXCJTZWN0aW9uXCIsIGRlcHRoOiAyIH1dKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGV4Y2x1ZGUgW3N0ZXBdIGhlYWRpbmdzIGZyb20gVE9DXCIsICgpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIFwiIyMgT3ZlcnZpZXdcXG5cXG4jIyMgSW5zdGFsbCBEZXBlbmRlbmNpZXMgW3N0ZXBdXFxuXFxuIyMjIENvbmZpZ3VyZSBQcm9qZWN0IFtzdGVwXVwiXG4gICAgY29uc3QgdG9jID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGV4cGVjdCh0b2MpLnRvRXF1YWwoW3sgdXJsOiBcIiNvdmVydmlld1wiLCB0aXRsZTogXCJPdmVydmlld1wiLCBkZXB0aDogMiB9XSlcbiAgfSlcblxuICBpdChcInNob3VsZCBza2lwIGhlYWRpbmdzIHdpdGggWyF0b2NdIGFubm90YXRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBcIiMjIFZpc2libGVcXG5cXG4jIyBIaWRkZW4gRnJvbSBUT0MgWyF0b2NdXFxuXFxuIyMgQWxzbyBWaXNpYmxlXCJcbiAgICBjb25zdCB0b2MgPSBleHRyYWN0VG9jKGNvbnRlbnQpXG4gICAgZXhwZWN0KHRvYykudG9FcXVhbChbXG4gICAgICB7IHVybDogXCIjdmlzaWJsZVwiLCB0aXRsZTogXCJWaXNpYmxlXCIsIGRlcHRoOiAyIH0sXG4gICAgICB7IHVybDogXCIjYWxzby12aXNpYmxlXCIsIHRpdGxlOiBcIkFsc28gVmlzaWJsZVwiLCBkZXB0aDogMiB9LFxuICAgIF0pXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaW5jbHVkZSBbdG9jXSBoZWFkaW5ncyB3aXRoIGFubm90YXRpb24gc3RyaXBwZWQgZnJvbSB0aXRsZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IFwiIyMgUmVndWxhclxcblxcbiMjIFRPQyBPbmx5IFt0b2NdXFxuXFxuIyMgQW5vdGhlclwiXG4gICAgY29uc3QgdG9jID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGV4cGVjdCh0b2MpLnRvRXF1YWwoW1xuICAgICAgeyB1cmw6IFwiI3JlZ3VsYXJcIiwgdGl0bGU6IFwiUmVndWxhclwiLCBkZXB0aDogMiB9LFxuICAgICAgeyB1cmw6IFwiI3RvYy1vbmx5XCIsIHRpdGxlOiBcIlRPQyBPbmx5XCIsIGRlcHRoOiAyIH0sXG4gICAgICB7IHVybDogXCIjYW5vdGhlclwiLCB0aXRsZTogXCJBbm90aGVyXCIsIGRlcHRoOiAyIH0sXG4gICAgXSlcbiAgfSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
export function useInView() {
|
|
3
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
4
|
+
const elementRef = useRef(null);
|
|
5
|
+
const ref = useCallback((node) => {
|
|
6
|
+
elementRef.current = node;
|
|
7
|
+
}, []);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const node = elementRef.current;
|
|
10
|
+
if (!node)
|
|
11
|
+
return;
|
|
12
|
+
const observer = new IntersectionObserver(entries => {
|
|
13
|
+
if (entries[0]?.isIntersecting) {
|
|
14
|
+
setIsVisible(true);
|
|
15
|
+
observer.disconnect();
|
|
16
|
+
}
|
|
17
|
+
}, { threshold: 0.1 });
|
|
18
|
+
observer.observe(node);
|
|
19
|
+
return () => observer.disconnect();
|
|
20
|
+
}, []);
|
|
21
|
+
return { ref, isVisible };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9ob29rcy9pbi12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFFaEUsTUFBTSxVQUFVLFNBQVM7SUFDdkIsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDakQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQTtJQUUvQyxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFvQixFQUFFLEVBQUU7UUFDL0MsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7SUFDM0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRU4sU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDL0IsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFNO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksb0JBQW9CLENBQ3ZDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQy9CLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDbEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQ3ZCLENBQUM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQ25CLENBQUE7UUFFRCxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ3BDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUVOLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gdXNlSW5WaWV3KCkge1xuICBjb25zdCBbaXNWaXNpYmxlLCBzZXRJc1Zpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGVsZW1lbnRSZWYgPSB1c2VSZWY8RWxlbWVudCB8IG51bGw+KG51bGwpXG5cbiAgY29uc3QgcmVmID0gdXNlQ2FsbGJhY2soKG5vZGU6IEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgZWxlbWVudFJlZi5jdXJyZW50ID0gbm9kZVxuICB9LCBbXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50UmVmLmN1cnJlbnRcbiAgICBpZiAoIW5vZGUpIHJldHVyblxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICBlbnRyaWVzID0+IHtcbiAgICAgICAgaWYgKGVudHJpZXNbMF0/LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgc2V0SXNWaXNpYmxlKHRydWUpXG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IHRocmVzaG9sZDogMC4xIH0sXG4gICAgKVxuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlKVxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW10pXG5cbiAgcmV0dXJuIHsgcmVmLCBpc1Zpc2libGUgfVxufVxuIl19
|