livemark 0.10.4 → 0.11.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/{target → build}/actions/changelog/build.d.ts +4 -1
- package/build/actions/changelog/build.js +192 -0
- package/build/actions/config/load.d.ts +12 -0
- package/build/actions/config/load.js +41 -0
- package/build/actions/config/load.unit.js +39 -0
- package/build/actions/target/build.d.ts +29 -0
- package/build/actions/target/build.js +87 -0
- package/build/commands/build.js +15 -0
- package/{target → build}/commands/escape.d.ts +1 -1
- package/build/commands/escape.js +62 -0
- package/build/commands/preview.js +19 -0
- package/build/commands/start.js +20 -0
- package/build/components/Breadcrumbs.js +14 -0
- package/build/components/Layout.js +66 -0
- package/build/components/SidebarArticles.js +46 -0
- package/build/components/SidebarLinks.js +27 -0
- package/build/components/SidebarSections.js +37 -0
- package/build/components/SiteTitle.js +13 -0
- package/build/content/article.js +55 -0
- package/build/content/tag.js +31 -0
- package/build/content-collections.js +218 -0
- package/{target → build}/models/config.d.ts +17 -1
- package/build/models/config.js +38 -0
- package/build/plugins/vite-livemark.d.ts +12 -0
- package/build/plugins/vite-livemark.js +165 -0
- package/build/routes/__root.js +68 -0
- package/build/settings.d.ts +9 -0
- package/build/settings.js +25 -0
- package/build/vite.config.js +30 -0
- package/package.json +15 -9
- package/source/actions/changelog/build.ts +11 -6
- package/source/actions/config/load.ts +21 -6
- package/source/actions/config/load.unit.ts +19 -2
- package/source/actions/target/build.ts +89 -0
- package/source/commands/build.ts +1 -0
- package/source/commands/escape.ts +18 -11
- package/source/commands/preview.ts +1 -0
- package/source/commands/start.ts +1 -0
- package/source/components/Breadcrumbs.tsx +2 -1
- package/source/components/Layout.tsx +3 -2
- package/source/components/SidebarArticles.tsx +2 -1
- package/source/components/SidebarLinks.tsx +2 -1
- package/source/components/SidebarSections.tsx +2 -1
- package/source/components/SiteTitle.tsx +5 -10
- package/source/content/article.ts +2 -1
- package/source/content/tag.ts +2 -1
- package/source/content-collections.ts +1 -1
- package/source/env.d.ts +2 -2
- package/source/models/config.ts +22 -1
- package/source/plugins/vite-livemark.ts +168 -94
- package/source/routeTree.gen.ts +86 -0
- package/source/routes/__root.tsx +7 -9
- package/source/settings.ts +13 -2
- package/source/vite.config.ts +4 -73
- package/target/actions/changelog/build.js +0 -187
- package/target/actions/config/load.d.ts +0 -5
- package/target/actions/config/load.js +0 -25
- package/target/actions/config/load.unit.js +0 -25
- package/target/commands/build.js +0 -14
- package/target/commands/escape.js +0 -56
- package/target/commands/preview.js +0 -18
- package/target/commands/start.js +0 -19
- package/target/components/Breadcrumbs.js +0 -13
- package/target/components/Layout.js +0 -65
- package/target/components/SidebarArticles.js +0 -45
- package/target/components/SidebarLinks.js +0 -26
- package/target/components/SidebarSections.js +0 -36
- package/target/components/SiteTitle.js +0 -12
- package/target/content/article.js +0 -54
- package/target/content/tag.js +0 -30
- package/target/content-collections.js +0 -218
- package/target/models/config.js +0 -34
- package/target/plugins/vite-livemark.d.ts +0 -18
- package/target/plugins/vite-livemark.js +0 -111
- package/target/routes/__root.js +0 -69
- package/target/settings.d.ts +0 -5
- package/target/settings.js +0 -15
- package/target/vite.config.js +0 -90
- /package/{target → build}/actions/changelog/build.unit.d.ts +0 -0
- /package/{target → build}/actions/changelog/build.unit.js +0 -0
- /package/{target → build}/actions/config/define.d.ts +0 -0
- /package/{target → build}/actions/config/define.js +0 -0
- /package/{target → build}/actions/config/define.unit.d.ts +0 -0
- /package/{target → build}/actions/config/define.unit.js +0 -0
- /package/{target → build}/actions/config/load.unit.d.ts +0 -0
- /package/{target → build}/client.d.ts +0 -0
- /package/{target → build}/client.js +0 -0
- /package/{target → build}/commands/build.d.ts +0 -0
- /package/{target → build}/commands/preview.d.ts +0 -0
- /package/{target → build}/commands/start.d.ts +0 -0
- /package/{target → build}/components/Abbr.d.ts +0 -0
- /package/{target → build}/components/Abbr.js +0 -0
- /package/{target → build}/components/AnsiCode.d.ts +0 -0
- /package/{target → build}/components/AnsiCode.js +0 -0
- /package/{target → build}/components/Article.d.ts +0 -0
- /package/{target → build}/components/Article.js +0 -0
- /package/{target → build}/components/BackToTop.d.ts +0 -0
- /package/{target → build}/components/BackToTop.js +0 -0
- /package/{target → build}/components/Banner.d.ts +0 -0
- /package/{target → build}/components/Banner.js +0 -0
- /package/{target → build}/components/BlogIndex.d.ts +0 -0
- /package/{target → build}/components/BlogIndex.js +0 -0
- /package/{target → build}/components/Breadcrumbs.d.ts +0 -0
- /package/{target → build}/components/Callout.d.ts +0 -0
- /package/{target → build}/components/Callout.js +0 -0
- /package/{target → build}/components/Card.d.ts +0 -0
- /package/{target → build}/components/Card.js +0 -0
- /package/{target → build}/components/Cards.d.ts +0 -0
- /package/{target → build}/components/Cards.js +0 -0
- /package/{target → build}/components/ChangelogIndex.d.ts +0 -0
- /package/{target → build}/components/ChangelogIndex.js +0 -0
- /package/{target → build}/components/CodeBlock.d.ts +0 -0
- /package/{target → build}/components/CodeBlock.js +0 -0
- /package/{target → build}/components/CodeTabs.d.ts +0 -0
- /package/{target → build}/components/CodeTabs.js +0 -0
- /package/{target → build}/components/Column.d.ts +0 -0
- /package/{target → build}/components/Column.js +0 -0
- /package/{target → build}/components/Columns.d.ts +0 -0
- /package/{target → build}/components/Columns.js +0 -0
- /package/{target → build}/components/Content.d.ts +0 -0
- /package/{target → build}/components/Content.js +0 -0
- /package/{target → build}/components/ContentTab.d.ts +0 -0
- /package/{target → build}/components/ContentTab.js +0 -0
- /package/{target → build}/components/ContentTabs.d.ts +0 -0
- /package/{target → build}/components/ContentTabs.js +0 -0
- /package/{target → build}/components/DefaultCatchBoundary.d.ts +0 -0
- /package/{target → build}/components/DefaultCatchBoundary.js +0 -0
- /package/{target → build}/components/DefinitionList.d.ts +0 -0
- /package/{target → build}/components/DefinitionList.js +0 -0
- /package/{target → build}/components/Details.d.ts +0 -0
- /package/{target → build}/components/Details.js +0 -0
- /package/{target → build}/components/FileTree.d.ts +0 -0
- /package/{target → build}/components/FileTree.js +0 -0
- /package/{target → build}/components/Footer.d.ts +0 -0
- /package/{target → build}/components/Footer.js +0 -0
- /package/{target → build}/components/FootnoteRef.d.ts +0 -0
- /package/{target → build}/components/FootnoteRef.js +0 -0
- /package/{target → build}/components/Heading.d.ts +0 -0
- /package/{target → build}/components/Heading.js +0 -0
- /package/{target → build}/components/InlineBadge.d.ts +0 -0
- /package/{target → build}/components/InlineBadge.js +0 -0
- /package/{target → build}/components/InlineIcon.d.ts +0 -0
- /package/{target → build}/components/InlineIcon.js +0 -0
- /package/{target → build}/components/InlineToc.d.ts +0 -0
- /package/{target → build}/components/InlineToc.js +0 -0
- /package/{target → build}/components/Layout.d.ts +0 -0
- /package/{target → build}/components/LinkButton.d.ts +0 -0
- /package/{target → build}/components/LinkButton.js +0 -0
- /package/{target → build}/components/Mermaid.d.ts +0 -0
- /package/{target → build}/components/Mermaid.js +0 -0
- /package/{target → build}/components/MermaidRenderer.d.ts +0 -0
- /package/{target → build}/components/MermaidRenderer.js +0 -0
- /package/{target → build}/components/NotFound.d.ts +0 -0
- /package/{target → build}/components/NotFound.js +0 -0
- /package/{target → build}/components/PackageTabs.d.ts +0 -0
- /package/{target → build}/components/PackageTabs.js +0 -0
- /package/{target → build}/components/PageToolbar.d.ts +0 -0
- /package/{target → build}/components/PageToolbar.js +0 -0
- /package/{target → build}/components/PrevNext.d.ts +0 -0
- /package/{target → build}/components/PrevNext.js +0 -0
- /package/{target → build}/components/Search.d.ts +0 -0
- /package/{target → build}/components/Search.js +0 -0
- /package/{target → build}/components/SearchDialog.d.ts +0 -0
- /package/{target → build}/components/SearchDialog.js +0 -0
- /package/{target → build}/components/Section.d.ts +0 -0
- /package/{target → build}/components/Section.js +0 -0
- /package/{target → build}/components/SectionHeader.d.ts +0 -0
- /package/{target → build}/components/SectionHeader.js +0 -0
- /package/{target → build}/components/Sidebar.d.ts +0 -0
- /package/{target → build}/components/Sidebar.js +0 -0
- /package/{target → build}/components/SidebarArticles.d.ts +0 -0
- /package/{target → build}/components/SidebarLinks.d.ts +0 -0
- /package/{target → build}/components/SidebarPosts.d.ts +0 -0
- /package/{target → build}/components/SidebarPosts.js +0 -0
- /package/{target → build}/components/SidebarReleases.d.ts +0 -0
- /package/{target → build}/components/SidebarReleases.js +0 -0
- /package/{target → build}/components/SidebarSections.d.ts +0 -0
- /package/{target → build}/components/SiteTitle.d.ts +0 -0
- /package/{target → build}/components/SortableTable.d.ts +0 -0
- /package/{target → build}/components/SortableTable.js +0 -0
- /package/{target → build}/components/SoundCloud.d.ts +0 -0
- /package/{target → build}/components/SoundCloud.js +0 -0
- /package/{target → build}/components/TagIndex.d.ts +0 -0
- /package/{target → build}/components/TagIndex.js +0 -0
- /package/{target → build}/components/Theme.d.ts +0 -0
- /package/{target → build}/components/Theme.js +0 -0
- /package/{target → build}/components/Toc.d.ts +0 -0
- /package/{target → build}/components/Toc.js +0 -0
- /package/{target → build}/components/YouTube.d.ts +0 -0
- /package/{target → build}/components/YouTube.js +0 -0
- /package/{target → build}/components/ZoomImage.d.ts +0 -0
- /package/{target → build}/components/ZoomImage.js +0 -0
- /package/{target → build}/content/article.d.ts +0 -0
- /package/{target → build}/content/tag.d.ts +0 -0
- /package/{target → build}/content-collections.d.ts +0 -0
- /package/{target → build}/elements/accordion.d.ts +0 -0
- /package/{target → build}/elements/accordion.js +0 -0
- /package/{target → build}/elements/alert-dialog.d.ts +0 -0
- /package/{target → build}/elements/alert-dialog.js +0 -0
- /package/{target → build}/elements/alert.d.ts +0 -0
- /package/{target → build}/elements/alert.js +0 -0
- /package/{target → build}/elements/aspect-ratio.d.ts +0 -0
- /package/{target → build}/elements/aspect-ratio.js +0 -0
- /package/{target → build}/elements/avatar.d.ts +0 -0
- /package/{target → build}/elements/avatar.js +0 -0
- /package/{target → build}/elements/badge.d.ts +0 -0
- /package/{target → build}/elements/badge.js +0 -0
- /package/{target → build}/elements/breadcrumb.d.ts +0 -0
- /package/{target → build}/elements/breadcrumb.js +0 -0
- /package/{target → build}/elements/button-group.d.ts +0 -0
- /package/{target → build}/elements/button-group.js +0 -0
- /package/{target → build}/elements/button.d.ts +0 -0
- /package/{target → build}/elements/button.js +0 -0
- /package/{target → build}/elements/calendar.d.ts +0 -0
- /package/{target → build}/elements/calendar.js +0 -0
- /package/{target → build}/elements/card.d.ts +0 -0
- /package/{target → build}/elements/card.js +0 -0
- /package/{target → build}/elements/carousel.d.ts +0 -0
- /package/{target → build}/elements/carousel.js +0 -0
- /package/{target → build}/elements/chart.d.ts +0 -0
- /package/{target → build}/elements/chart.js +0 -0
- /package/{target → build}/elements/checkbox.d.ts +0 -0
- /package/{target → build}/elements/checkbox.js +0 -0
- /package/{target → build}/elements/collapsible.d.ts +0 -0
- /package/{target → build}/elements/collapsible.js +0 -0
- /package/{target → build}/elements/command.d.ts +0 -0
- /package/{target → build}/elements/command.js +0 -0
- /package/{target → build}/elements/context-menu.d.ts +0 -0
- /package/{target → build}/elements/context-menu.js +0 -0
- /package/{target → build}/elements/dialog.d.ts +0 -0
- /package/{target → build}/elements/dialog.js +0 -0
- /package/{target → build}/elements/direction.d.ts +0 -0
- /package/{target → build}/elements/direction.js +0 -0
- /package/{target → build}/elements/drawer.d.ts +0 -0
- /package/{target → build}/elements/drawer.js +0 -0
- /package/{target → build}/elements/dropdown-menu.d.ts +0 -0
- /package/{target → build}/elements/dropdown-menu.js +0 -0
- /package/{target → build}/elements/empty.d.ts +0 -0
- /package/{target → build}/elements/empty.js +0 -0
- /package/{target → build}/elements/field.d.ts +0 -0
- /package/{target → build}/elements/field.js +0 -0
- /package/{target → build}/elements/hover-card.d.ts +0 -0
- /package/{target → build}/elements/hover-card.js +0 -0
- /package/{target → build}/elements/input-group.d.ts +0 -0
- /package/{target → build}/elements/input-group.js +0 -0
- /package/{target → build}/elements/input-otp.d.ts +0 -0
- /package/{target → build}/elements/input-otp.js +0 -0
- /package/{target → build}/elements/input.d.ts +0 -0
- /package/{target → build}/elements/input.js +0 -0
- /package/{target → build}/elements/item.d.ts +0 -0
- /package/{target → build}/elements/item.js +0 -0
- /package/{target → build}/elements/kbd.d.ts +0 -0
- /package/{target → build}/elements/kbd.js +0 -0
- /package/{target → build}/elements/label.d.ts +0 -0
- /package/{target → build}/elements/label.js +0 -0
- /package/{target → build}/elements/menubar.d.ts +0 -0
- /package/{target → build}/elements/menubar.js +0 -0
- /package/{target → build}/elements/native-select.d.ts +0 -0
- /package/{target → build}/elements/native-select.js +0 -0
- /package/{target → build}/elements/navigation-menu.d.ts +0 -0
- /package/{target → build}/elements/navigation-menu.js +0 -0
- /package/{target → build}/elements/pagination.d.ts +0 -0
- /package/{target → build}/elements/pagination.js +0 -0
- /package/{target → build}/elements/popover.d.ts +0 -0
- /package/{target → build}/elements/popover.js +0 -0
- /package/{target → build}/elements/progress.d.ts +0 -0
- /package/{target → build}/elements/progress.js +0 -0
- /package/{target → build}/elements/radio-group.d.ts +0 -0
- /package/{target → build}/elements/radio-group.js +0 -0
- /package/{target → build}/elements/resizable.d.ts +0 -0
- /package/{target → build}/elements/resizable.js +0 -0
- /package/{target → build}/elements/scroll-area.d.ts +0 -0
- /package/{target → build}/elements/scroll-area.js +0 -0
- /package/{target → build}/elements/select.d.ts +0 -0
- /package/{target → build}/elements/select.js +0 -0
- /package/{target → build}/elements/separator.d.ts +0 -0
- /package/{target → build}/elements/separator.js +0 -0
- /package/{target → build}/elements/sheet.d.ts +0 -0
- /package/{target → build}/elements/sheet.js +0 -0
- /package/{target → build}/elements/sidebar.d.ts +0 -0
- /package/{target → build}/elements/sidebar.js +0 -0
- /package/{target → build}/elements/skeleton.d.ts +0 -0
- /package/{target → build}/elements/skeleton.js +0 -0
- /package/{target → build}/elements/slider.d.ts +0 -0
- /package/{target → build}/elements/slider.js +0 -0
- /package/{target → build}/elements/sonner.d.ts +0 -0
- /package/{target → build}/elements/sonner.js +0 -0
- /package/{target → build}/elements/spinner.d.ts +0 -0
- /package/{target → build}/elements/spinner.js +0 -0
- /package/{target → build}/elements/switch.d.ts +0 -0
- /package/{target → build}/elements/switch.js +0 -0
- /package/{target → build}/elements/table.d.ts +0 -0
- /package/{target → build}/elements/table.js +0 -0
- /package/{target → build}/elements/tabs.d.ts +0 -0
- /package/{target → build}/elements/tabs.js +0 -0
- /package/{target → build}/elements/textarea.d.ts +0 -0
- /package/{target → build}/elements/textarea.js +0 -0
- /package/{target → build}/elements/toggle-group.d.ts +0 -0
- /package/{target → build}/elements/toggle-group.js +0 -0
- /package/{target → build}/elements/toggle.d.ts +0 -0
- /package/{target → build}/elements/toggle.js +0 -0
- /package/{target → build}/elements/tooltip.d.ts +0 -0
- /package/{target → build}/elements/tooltip.js +0 -0
- /package/{target → build}/entrypoints/main.d.ts +0 -0
- /package/{target → build}/entrypoints/main.js +0 -0
- /package/{target → build}/helpers/article-icon.d.ts +0 -0
- /package/{target → build}/helpers/article-icon.js +0 -0
- /package/{target → build}/helpers/article.d.ts +0 -0
- /package/{target → build}/helpers/article.js +0 -0
- /package/{target → build}/helpers/changelog-source.d.ts +0 -0
- /package/{target → build}/helpers/changelog-source.js +0 -0
- /package/{target → build}/helpers/changelog-source.unit.d.ts +0 -0
- /package/{target → build}/helpers/changelog-source.unit.js +0 -0
- /package/{target → build}/helpers/dynamic-icon-resolver.d.ts +0 -0
- /package/{target → build}/helpers/dynamic-icon-resolver.js +0 -0
- /package/{target → build}/helpers/dynamic-icon.d.ts +0 -0
- /package/{target → build}/helpers/dynamic-icon.js +0 -0
- /package/{target → build}/helpers/favicon.d.ts +0 -0
- /package/{target → build}/helpers/favicon.js +0 -0
- /package/{target → build}/helpers/model.d.ts +0 -0
- /package/{target → build}/helpers/model.js +0 -0
- /package/{target → build}/helpers/program.d.ts +0 -0
- /package/{target → build}/helpers/program.js +0 -0
- /package/{target → build}/helpers/resolve-asset-path.d.ts +0 -0
- /package/{target → build}/helpers/resolve-asset-path.js +0 -0
- /package/{target → build}/helpers/resolve-includes.d.ts +0 -0
- /package/{target → build}/helpers/resolve-includes.js +0 -0
- /package/{target → build}/helpers/resolve-includes.unit.d.ts +0 -0
- /package/{target → build}/helpers/resolve-includes.unit.js +0 -0
- /package/{target → build}/helpers/search-text.d.ts +0 -0
- /package/{target → build}/helpers/search-text.js +0 -0
- /package/{target → build}/helpers/section.d.ts +0 -0
- /package/{target → build}/helpers/section.js +0 -0
- /package/{target → build}/helpers/section.unit.d.ts +0 -0
- /package/{target → build}/helpers/section.unit.js +0 -0
- /package/{target → build}/helpers/theme.d.ts +0 -0
- /package/{target → build}/helpers/theme.js +0 -0
- /package/{target → build}/helpers/toc-context.d.ts +0 -0
- /package/{target → build}/helpers/toc-context.js +0 -0
- /package/{target → build}/helpers/toc.d.ts +0 -0
- /package/{target → build}/helpers/toc.js +0 -0
- /package/{target → build}/helpers/toc.unit.d.ts +0 -0
- /package/{target → build}/helpers/toc.unit.js +0 -0
- /package/{target → build}/hooks/in-view.d.ts +0 -0
- /package/{target → build}/hooks/in-view.js +0 -0
- /package/{target → build}/hooks/media.d.ts +0 -0
- /package/{target → build}/hooks/media.js +0 -0
- /package/{target → build}/index.d.ts +0 -0
- /package/{target → build}/index.js +0 -0
- /package/{target → build}/models/article.d.ts +0 -0
- /package/{target → build}/models/article.js +0 -0
- /package/{target → build}/models/link.d.ts +0 -0
- /package/{target → build}/models/link.js +0 -0
- /package/{target → build}/models/patch.d.ts +0 -0
- /package/{target → build}/models/patch.js +0 -0
- /package/{target → build}/models/section.d.ts +0 -0
- /package/{target → build}/models/section.js +0 -0
- /package/{target → build}/models/theme.d.ts +0 -0
- /package/{target → build}/models/theme.js +0 -0
- /package/{target → build}/models/toc.d.ts +0 -0
- /package/{target → build}/models/toc.js +0 -0
- /package/{target → build}/plugins/rehype-inline-code.d.ts +0 -0
- /package/{target → build}/plugins/rehype-inline-code.js +0 -0
- /package/{target → build}/plugins/rehype-task-list-a11y.d.ts +0 -0
- /package/{target → build}/plugins/rehype-task-list-a11y.js +0 -0
- /package/{target → build}/plugins/remark-abbr.d.ts +0 -0
- /package/{target → build}/plugins/remark-abbr.js +0 -0
- /package/{target → build}/plugins/remark-abbr.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-abbr.unit.js +0 -0
- /package/{target → build}/plugins/remark-ansi.d.ts +0 -0
- /package/{target → build}/plugins/remark-ansi.js +0 -0
- /package/{target → build}/plugins/remark-ansi.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-ansi.unit.js +0 -0
- /package/{target → build}/plugins/remark-badge.d.ts +0 -0
- /package/{target → build}/plugins/remark-badge.js +0 -0
- /package/{target → build}/plugins/remark-badge.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-badge.unit.js +0 -0
- /package/{target → build}/plugins/remark-button.d.ts +0 -0
- /package/{target → build}/plugins/remark-button.js +0 -0
- /package/{target → build}/plugins/remark-button.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-button.unit.js +0 -0
- /package/{target → build}/plugins/remark-callout.d.ts +0 -0
- /package/{target → build}/plugins/remark-callout.js +0 -0
- /package/{target → build}/plugins/remark-card.d.ts +0 -0
- /package/{target → build}/plugins/remark-card.js +0 -0
- /package/{target → build}/plugins/remark-code-tabs.d.ts +0 -0
- /package/{target → build}/plugins/remark-code-tabs.js +0 -0
- /package/{target → build}/plugins/remark-columns.d.ts +0 -0
- /package/{target → build}/plugins/remark-columns.js +0 -0
- /package/{target → build}/plugins/remark-custom-heading-id.d.ts +0 -0
- /package/{target → build}/plugins/remark-custom-heading-id.js +0 -0
- /package/{target → build}/plugins/remark-custom-heading-id.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-custom-heading-id.unit.js +0 -0
- /package/{target → build}/plugins/remark-deflist.d.ts +0 -0
- /package/{target → build}/plugins/remark-deflist.js +0 -0
- /package/{target → build}/plugins/remark-details.d.ts +0 -0
- /package/{target → build}/plugins/remark-details.js +0 -0
- /package/{target → build}/plugins/remark-filetree.d.ts +0 -0
- /package/{target → build}/plugins/remark-filetree.js +0 -0
- /package/{target → build}/plugins/remark-filetree.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-filetree.unit.js +0 -0
- /package/{target → build}/plugins/remark-github-callout.d.ts +0 -0
- /package/{target → build}/plugins/remark-github-callout.js +0 -0
- /package/{target → build}/plugins/remark-icon.d.ts +0 -0
- /package/{target → build}/plugins/remark-icon.js +0 -0
- /package/{target → build}/plugins/remark-image.d.ts +0 -0
- /package/{target → build}/plugins/remark-image.js +0 -0
- /package/{target → build}/plugins/remark-media.d.ts +0 -0
- /package/{target → build}/plugins/remark-media.js +0 -0
- /package/{target → build}/plugins/remark-media.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-media.unit.js +0 -0
- /package/{target → build}/plugins/remark-mermaid.d.ts +0 -0
- /package/{target → build}/plugins/remark-mermaid.js +0 -0
- /package/{target → build}/plugins/remark-npm.d.ts +0 -0
- /package/{target → build}/plugins/remark-npm.js +0 -0
- /package/{target → build}/plugins/remark-passthrough-directive.d.ts +0 -0
- /package/{target → build}/plugins/remark-passthrough-directive.js +0 -0
- /package/{target → build}/plugins/remark-steps.d.ts +0 -0
- /package/{target → build}/plugins/remark-steps.js +0 -0
- /package/{target → build}/plugins/remark-steps.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-steps.unit.js +0 -0
- /package/{target → build}/plugins/remark-tab.d.ts +0 -0
- /package/{target → build}/plugins/remark-tab.js +0 -0
- /package/{target → build}/plugins/remark-tab.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-tab.unit.js +0 -0
- /package/{target → build}/plugins/remark-toc.d.ts +0 -0
- /package/{target → build}/plugins/remark-toc.js +0 -0
- /package/{target → build}/plugins/remark-toc.unit.d.ts +0 -0
- /package/{target → build}/plugins/remark-toc.unit.js +0 -0
- /package/{target → build}/plugins/shiki-icon.d.ts +0 -0
- /package/{target → build}/plugins/shiki-icon.js +0 -0
- /package/{target → build}/plugins/shiki-line-highlight.d.ts +0 -0
- /package/{target → build}/plugins/shiki-line-highlight.js +0 -0
- /package/{target → build}/program.d.ts +0 -0
- /package/{target → build}/program.js +0 -0
- /package/{target → build}/routeTree.gen.d.ts +0 -0
- /package/{target → build}/routeTree.gen.js +0 -0
- /package/{target → build}/router.d.ts +0 -0
- /package/{target → build}/router.js +0 -0
- /package/{target → build}/routes/$.d.ts +0 -0
- /package/{target → build}/routes/$.js +0 -0
- /package/{target → build}/routes/__root.d.ts +0 -0
- /package/{target → build}/server.d.ts +0 -0
- /package/{target → build}/server.js +0 -0
- /package/{target → build}/utils/style.d.ts +0 -0
- /package/{target → build}/utils/style.js +0 -0
- /package/{target → build}/vite.config.d.ts +0 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { basename, relative, resolve } from "node:path";
|
|
4
|
+
import { DEFAULT_EXCLUDES } from "./settings.js";
|
|
5
|
+
import { defineCollection, defineConfig } from "@content-collections/core";
|
|
6
|
+
import { compileMDX } from "@content-collections/mdx";
|
|
7
|
+
import rehypeShiki from "@shikijs/rehype";
|
|
8
|
+
import { transformerTwoslash } from "@shikijs/twoslash";
|
|
9
|
+
import rehypeKatex from "rehype-katex";
|
|
10
|
+
import rehypeSlug from "rehype-slug";
|
|
11
|
+
import remarkDefinitionList from "remark-definition-list";
|
|
12
|
+
import remarkDirective from "remark-directive";
|
|
13
|
+
import remarkGemoji from "remark-gemoji";
|
|
14
|
+
import remarkGfm from "remark-gfm";
|
|
15
|
+
import remarkMath from "remark-math";
|
|
16
|
+
import { loadConfig } from "./actions/config/load.js";
|
|
17
|
+
import { buildChangelog, cacheIncludeGlob } from "./actions/changelog/build.js";
|
|
18
|
+
import { Article } from "./models/article.js";
|
|
19
|
+
import { pickDefaultIcon } from "./helpers/article-icon.js";
|
|
20
|
+
import slugify from "@sindresorhus/slugify";
|
|
21
|
+
import remarkCustomHeadingId from "./plugins/remark-custom-heading-id.js";
|
|
22
|
+
import { remarkCallout } from "./plugins/remark-callout.js";
|
|
23
|
+
import { remarkCard } from "./plugins/remark-card.js";
|
|
24
|
+
import { remarkColumns } from "./plugins/remark-columns.js";
|
|
25
|
+
import { remarkTab } from "./plugins/remark-tab.js";
|
|
26
|
+
import { remarkBadge } from "./plugins/remark-badge.js";
|
|
27
|
+
import { remarkButton } from "./plugins/remark-button.js";
|
|
28
|
+
import { remarkAbbr } from "./plugins/remark-abbr.js";
|
|
29
|
+
import { remarkDeflist } from "./plugins/remark-deflist.js";
|
|
30
|
+
import { remarkDetails } from "./plugins/remark-details.js";
|
|
31
|
+
import { remarkFiletree } from "./plugins/remark-filetree.js";
|
|
32
|
+
import { remarkIcon } from "./plugins/remark-icon.js";
|
|
33
|
+
import { remarkCodeTabs } from "./plugins/remark-code-tabs.js";
|
|
34
|
+
import { remarkGithubCallout } from "./plugins/remark-github-callout.js";
|
|
35
|
+
import { remarkImage } from "./plugins/remark-image.js";
|
|
36
|
+
import { remarkMedia } from "./plugins/remark-media.js";
|
|
37
|
+
import { remarkAnsi } from "./plugins/remark-ansi.js";
|
|
38
|
+
import { remarkMermaid } from "./plugins/remark-mermaid.js";
|
|
39
|
+
import { remarkToc } from "./plugins/remark-toc.js";
|
|
40
|
+
import { remarkNpm } from "./plugins/remark-npm.js";
|
|
41
|
+
import { remarkSteps } from "./plugins/remark-steps.js";
|
|
42
|
+
import { remarkPassthroughDirective } from "./plugins/remark-passthrough-directive.js";
|
|
43
|
+
import { transformerLineHighlight, transformerNotations, } from "./plugins/shiki-line-highlight.js";
|
|
44
|
+
import { rehypeInlineCode } from "./plugins/rehype-inline-code.js";
|
|
45
|
+
import { rehypeTaskListA11y } from "./plugins/rehype-task-list-a11y.js";
|
|
46
|
+
import { transformerIcon } from "./plugins/shiki-icon.js";
|
|
47
|
+
import { resolveAssetPath } from "./helpers/resolve-asset-path.js";
|
|
48
|
+
import { resolveIncludes } from "./helpers/resolve-includes.js";
|
|
49
|
+
import { extractSearchText } from "./helpers/search-text.js";
|
|
50
|
+
import { extractToc } from "./helpers/toc.js";
|
|
51
|
+
const config = await loadConfig();
|
|
52
|
+
const changelogSections = config.sections?.filter(s => s.type === "changelog") ?? [];
|
|
53
|
+
for (const section of changelogSections) {
|
|
54
|
+
await buildChangelog(section, config);
|
|
55
|
+
}
|
|
56
|
+
const configInclude = Array.isArray(config.include)
|
|
57
|
+
? config.include
|
|
58
|
+
: [config.include];
|
|
59
|
+
const include = changelogSections.length
|
|
60
|
+
? [...configInclude, cacheIncludeGlob(config)]
|
|
61
|
+
: configInclude;
|
|
62
|
+
const userExclude = config.exclude
|
|
63
|
+
? Array.isArray(config.exclude)
|
|
64
|
+
? config.exclude
|
|
65
|
+
: [config.exclude]
|
|
66
|
+
: [];
|
|
67
|
+
// When the consumer doesn't have a .gitignore, fall back to a sensible
|
|
68
|
+
// floor so `**/*.md` doesn't sweep up every README.md under node_modules,
|
|
69
|
+
// build outputs, etc. With a .gitignore present we trust the user.
|
|
70
|
+
const hasGitignore = existsSync(resolve(config.root, ".gitignore"));
|
|
71
|
+
const defaultExclude = hasGitignore ? [] : [...DEFAULT_EXCLUDES];
|
|
72
|
+
const exclude = [...defaultExclude, ...userExclude];
|
|
73
|
+
// content-collections compiles this file to .content-collections/cache/;
|
|
74
|
+
// going up 2 levels reconstructs the baseDirectory it uses for path resolution
|
|
75
|
+
const baseDir = resolve(import.meta.dirname, "../..");
|
|
76
|
+
const directory = relative(baseDir, config.root) || ".";
|
|
77
|
+
function toPath(filePath) {
|
|
78
|
+
const name = basename(filePath).replace(/\.\w+$/, "");
|
|
79
|
+
return slugify(name);
|
|
80
|
+
}
|
|
81
|
+
function getLastUpdated(filePath) {
|
|
82
|
+
try {
|
|
83
|
+
const timestamp = execSync(`git log -1 --format=%cI -- "${filePath}"`, {
|
|
84
|
+
cwd: config.root,
|
|
85
|
+
encoding: "utf-8",
|
|
86
|
+
}).trim();
|
|
87
|
+
return timestamp || undefined;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function stripLeadingH1(content) {
|
|
94
|
+
return content.replace(/^[ \t]*#\s+[^\n]*\n+/, "");
|
|
95
|
+
}
|
|
96
|
+
function extractTitle(content, path) {
|
|
97
|
+
const match = /^#\s+(.+)$/m.exec(content);
|
|
98
|
+
if (match)
|
|
99
|
+
return match[1];
|
|
100
|
+
return (path
|
|
101
|
+
.split("/")
|
|
102
|
+
.pop()
|
|
103
|
+
?.replace(/\.\w+$/, "") ?? path);
|
|
104
|
+
}
|
|
105
|
+
const articles = defineCollection({
|
|
106
|
+
name: "articles",
|
|
107
|
+
directory,
|
|
108
|
+
include,
|
|
109
|
+
exclude,
|
|
110
|
+
schema: Article,
|
|
111
|
+
transform: async (document, context) => {
|
|
112
|
+
const patch = config.patches?.find(p => p.file === document._meta.filePath);
|
|
113
|
+
const doc = patch ? { ...document, ...patch.article } : document;
|
|
114
|
+
const filePath = resolve(config.root, doc._meta.filePath);
|
|
115
|
+
const content = resolveIncludes(doc.content, filePath);
|
|
116
|
+
const title = doc.title ?? extractTitle(content, doc._meta.path);
|
|
117
|
+
const icon = doc.icon ?? pickDefaultIcon(doc._meta.path);
|
|
118
|
+
const path = doc.path ?? toPath(doc._meta.filePath);
|
|
119
|
+
// The article's h1 is rendered from `title` by the layout, so strip any
|
|
120
|
+
// leading h1 in the body to avoid two h1s side-by-side (especially when
|
|
121
|
+
// a content patch overrides the title to something different from the
|
|
122
|
+
// body's own heading).
|
|
123
|
+
const bodyContent = stripLeadingH1(content);
|
|
124
|
+
const mdx = await compileMDX(context, { ...doc, content: bodyContent }, {
|
|
125
|
+
remarkPlugins: [
|
|
126
|
+
remarkGfm,
|
|
127
|
+
remarkGemoji,
|
|
128
|
+
remarkDefinitionList,
|
|
129
|
+
remarkDeflist,
|
|
130
|
+
remarkMath,
|
|
131
|
+
remarkDirective,
|
|
132
|
+
remarkCallout,
|
|
133
|
+
remarkCard,
|
|
134
|
+
remarkColumns,
|
|
135
|
+
remarkTab,
|
|
136
|
+
remarkDetails,
|
|
137
|
+
remarkFiletree,
|
|
138
|
+
remarkIcon,
|
|
139
|
+
remarkBadge,
|
|
140
|
+
remarkButton,
|
|
141
|
+
remarkAbbr,
|
|
142
|
+
remarkGithubCallout,
|
|
143
|
+
[
|
|
144
|
+
remarkImage,
|
|
145
|
+
{
|
|
146
|
+
filePath: resolve(config.root, doc._meta.filePath),
|
|
147
|
+
root: config.root,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
remarkAnsi,
|
|
151
|
+
remarkMermaid,
|
|
152
|
+
remarkMedia,
|
|
153
|
+
remarkToc,
|
|
154
|
+
remarkNpm,
|
|
155
|
+
remarkCodeTabs,
|
|
156
|
+
remarkSteps,
|
|
157
|
+
remarkCustomHeadingId,
|
|
158
|
+
// Run last: anything still typed as a directive after every handler
|
|
159
|
+
// above is unintended (e.g. `3.2:1`, `port:8080`) — passthrough as
|
|
160
|
+
// plain text so it doesn't render as an empty span/div.
|
|
161
|
+
remarkPassthroughDirective,
|
|
162
|
+
],
|
|
163
|
+
rehypePlugins: [
|
|
164
|
+
[
|
|
165
|
+
rehypeShiki,
|
|
166
|
+
{
|
|
167
|
+
themes: {
|
|
168
|
+
light: config.codeThemeLight,
|
|
169
|
+
dark: config.codeThemeDark,
|
|
170
|
+
},
|
|
171
|
+
// Darken catppuccin-latte's green (the colour used for strings and
|
|
172
|
+
// some comments) — the theme default #40A02B lands at 3.2:1 on the
|
|
173
|
+
// code-block background, below the WCAG AA 4.5:1 threshold.
|
|
174
|
+
colorReplacements: {
|
|
175
|
+
"catppuccin-latte": {
|
|
176
|
+
"#40a02b": "#2a7e16",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
transformers: [
|
|
180
|
+
transformerTwoslash({ explicitTrigger: true }),
|
|
181
|
+
transformerIcon(),
|
|
182
|
+
transformerNotations(),
|
|
183
|
+
transformerLineHighlight(),
|
|
184
|
+
],
|
|
185
|
+
parseMetaString: (meta) => ({ "data-meta": meta }),
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
rehypeInlineCode,
|
|
189
|
+
rehypeSlug,
|
|
190
|
+
rehypeKatex,
|
|
191
|
+
rehypeTaskListA11y,
|
|
192
|
+
],
|
|
193
|
+
});
|
|
194
|
+
const tocItems = extractToc(content);
|
|
195
|
+
const searchText = extractSearchText(content);
|
|
196
|
+
const lastUpdated = getLastUpdated(doc._meta.filePath);
|
|
197
|
+
const image = doc.image
|
|
198
|
+
? resolveAssetPath(doc.image, filePath, config.root)
|
|
199
|
+
: undefined;
|
|
200
|
+
return {
|
|
201
|
+
...doc,
|
|
202
|
+
file: doc._meta.filePath,
|
|
203
|
+
lastUpdated,
|
|
204
|
+
image,
|
|
205
|
+
title,
|
|
206
|
+
icon,
|
|
207
|
+
path,
|
|
208
|
+
tocItems,
|
|
209
|
+
searchText,
|
|
210
|
+
mdx,
|
|
211
|
+
};
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
export default defineConfig({
|
|
215
|
+
// @ts-expect-error tsgo picks wrong overload when rehype-slug augments unified types
|
|
216
|
+
content: [articles],
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1jb2xsZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9jb250ZW50LWNvbGxlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLFdBQVcsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN2RCxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUE7QUFDdEMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sb0JBQW9CLE1BQU0sd0JBQXdCLENBQUE7QUFDekQsT0FBTyxlQUFlLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFBO0FBQ3hDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFB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QUMsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUs7WUFDckIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUNiLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVc7WUFDWCxLQUFLO1lBQ0wsS0FBSztZQUNMLElBQUk7WUFDSixJQUFJO1lBQ0osUUFBUTtZQUNSLFVBQVU7WUFDVixHQUFHO1NBQ0osQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFDLENBQUE7QUFFRixlQUFlLFlBQVksQ0FBQztJQUMxQixxRkFBcUY7SUFDckYsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0NBQ3BCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgYmFzZW5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBERUZBVUxUX0VYQ0xVREVTIH0gZnJvbSBcIi4vc2V0dGluZ3MudHNcIlxuaW1wb3J0IHsgZGVmaW5lQ29sbGVjdGlvbiwgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIkBjb250ZW50LWNvbGxlY3Rpb25zL2NvcmVcIlxuaW1wb3J0IHsgY29tcGlsZU1EWCB9IGZyb20gXCJAY29udGVudC1jb2xsZWN0aW9ucy9tZHhcIlxuaW1wb3J0IHJlaHlwZVNoaWtpIGZyb20gXCJAc2hpa2lqcy9yZWh5cGVcIlxuaW1wb3J0IHsgdHJhbnNmb3JtZXJUd29zbGFzaCB9IGZyb20gXCJAc2hpa2lqcy90d29zbGFzaFwiXG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSBcInJlaHlwZS1rYXRleFwiXG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tIFwicmVoeXBlLXNsdWdcIlxuaW1wb3J0IHJlbWFya0RlZmluaXRpb25MaXN0IGZyb20gXCJyZW1hcmstZGVmaW5pdGlvbi1saXN0XCJcbmltcG9ydCByZW1hcmtEaXJlY3RpdmUgZnJvbSBcInJlbWFyay1kaXJlY3RpdmVcIlxuaW1wb3J0IHJlbWFya0dlbW9qaSBmcm9tIFwicmVtYXJrLWdlbW9qaVwiXG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gXCJyZW1hcmstZ2ZtXCJcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gXCJyZW1hcmstbWF0aFwiXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4vYWN0aW9ucy9jb25maWcvbG9hZC50c1wiXG5pbXBvcnQgeyBidWlsZENoYW5nZWxvZywgY2FjaGVJbmNsdWRlR2xvYiB9IGZyb20gXCIuL2FjdGlvbnMvY2hhbmdlbG9nL2J1aWxkLnRzXCJcbmltcG9ydCB7IEFydGljbGUgfSBmcm9tIFwiLi9tb2RlbHMvYXJ0aWNsZS50c1wiXG5pbXBvcnQgeyBwaWNrRGVmYXVsdEljb24gfSBmcm9tIFwiLi9oZWxwZXJzL2FydGljbGUtaWNvbi50c1wiXG5pbXBvcnQgc2x1Z2lmeSBmcm9tIFwiQHNpbmRyZXNvcmh1cy9zbHVnaWZ5XCJcbmltcG9ydCByZW1hcmtDdXN0b21IZWFkaW5nSWQgZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstY3VzdG9tLWhlYWRpbmctaWQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ2FsbG91dCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNhbGxvdXQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ2FyZCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNhcmQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ29sdW1ucyB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNvbHVtbnMudHNcIlxuaW1wb3J0IHsgcmVtYXJrVGFiIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstdGFiLnRzXCJcbmltcG9ydCB7IHJlbWFya0JhZGdlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYmFkZ2UudHNcIlxuaW1wb3J0IHsgcmVtYXJrQnV0dG9uIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYnV0dG9uLnRzXCJcbmltcG9ydCB7IHJlbWFya0FiYnIgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1hYmJyLnRzXCJcbmltcG9ydCB7IHJlbWFya0RlZmxpc3QgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1kZWZsaXN0LnRzXCJcbmltcG9ydCB7IHJlbWFya0RldGFpbHMgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1kZXRhaWxzLnRzXCJcbmltcG9ydCB7IHJlbWFya0ZpbGV0cmVlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstZmlsZXRyZWUudHNcIlxuaW1wb3J0IHsgcmVtYXJrSWNvbiB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWljb24udHNcIlxuaW1wb3J0IHsgcmVtYXJrQ29kZVRhYnMgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1jb2RlLXRhYnMudHNcIlxuaW1wb3J0IHsgcmVtYXJrR2l0aHViQ2FsbG91dCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWdpdGh1Yi1jYWxsb3V0LnRzXCJcbmltcG9ydCB7IHJlbWFya0ltYWdlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstaW1hZ2UudHNcIlxuaW1wb3J0IHsgcmVtYXJrTWVkaWEgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1tZWRpYS50c1wiXG5pbXBvcnQgeyByZW1hcmtBbnNpIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYW5zaS50c1wiXG5pbXBvcnQgeyByZW1hcmtNZXJtYWlkIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstbWVybWFpZC50c1wiXG5pbXBvcnQgeyByZW1hcmtUb2MgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay10b2MudHNcIlxuaW1wb3J0IHsgcmVtYXJrTnBtIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstbnBtLnRzXCJcbmltcG9ydCB7IHJlbWFya1N0ZXBzIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstc3RlcHMudHNcIlxuaW1wb3J0IHsgcmVtYXJrUGFzc3Rocm91Z2hEaXJlY3RpdmUgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1wYXNzdGhyb3VnaC1kaXJlY3RpdmUudHNcIlxuaW1wb3J0IHtcbiAgdHJhbnNmb3JtZXJMaW5lSGlnaGxpZ2h0LFxuICB0cmFuc2Zvcm1lck5vdGF0aW9ucyxcbn0gZnJvbSBcIi4vcGx1Z2lucy9zaGlraS1saW5lLWhpZ2hsaWdodC50c1wiXG5pbXBvcnQgeyByZWh5cGVJbmxpbmVDb2RlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZWh5cGUtaW5saW5lLWNvZGUudHNcIlxuaW1wb3J0IHsgcmVoeXBlVGFza0xpc3RBMTF5IH0gZnJvbSBcIi4vcGx1Z2lucy9yZWh5cGUtdGFzay1saXN0LWExMXkudHNcIlxuaW1wb3J0IHsgdHJhbnNmb3JtZXJJY29uIH0gZnJvbSBcIi4vcGx1Z2lucy9zaGlraS1pY29uLnRzXCJcbmltcG9ydCB7IHJlc29sdmVBc3NldFBhdGggfSBmcm9tIFwiLi9oZWxwZXJzL3Jlc29sdmUtYXNzZXQtcGF0aC50c1wiXG5pbXBvcnQgeyByZXNvbHZlSW5jbHVkZXMgfSBmcm9tIFwiLi9oZWxwZXJzL3Jlc29sdmUtaW5jbHVkZXMudHNcIlxuaW1wb3J0IHsgZXh0cmFjdFNlYXJjaFRleHQgfSBmcm9tIFwiLi9oZWxwZXJzL3NlYXJjaC10ZXh0LnRzXCJcbmltcG9ydCB7IGV4dHJhY3RUb2MgfSBmcm9tIFwiLi9oZWxwZXJzL3RvYy50c1wiXG5cbmNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKVxuXG5jb25zdCBjaGFuZ2Vsb2dTZWN0aW9ucyA9XG4gIGNvbmZpZy5zZWN0aW9ucz8uZmlsdGVyKHMgPT4gcy50eXBlID09PSBcImNoYW5nZWxvZ1wiKSA/PyBbXVxuZm9yIChjb25zdCBzZWN0aW9uIG9mIGNoYW5nZWxvZ1NlY3Rpb25zKSB7XG4gIGF3YWl0IGJ1aWxkQ2hhbmdlbG9nKHNlY3Rpb24sIGNvbmZpZylcbn1cblxuY29uc3QgY29uZmlnSW5jbHVkZSA9IEFycmF5LmlzQXJyYXkoY29uZmlnLmluY2x1ZGUpXG4gID8gY29uZmlnLmluY2x1ZGVcbiAgOiBbY29uZmlnLmluY2x1ZGVdXG5jb25zdCBpbmNsdWRlID0gY2hhbmdlbG9nU2VjdGlvbnMubGVuZ3RoXG4gID8gWy4uLmNvbmZpZ0luY2x1ZGUsIGNhY2hlSW5jbHVkZUdsb2IoY29uZmlnKV1cbiAgOiBjb25maWdJbmNsdWRlXG5cbmNvbnN0IHVzZXJFeGNsdWRlID0gY29uZmlnLmV4Y2x1ZGVcbiAgPyBBcnJheS5pc0FycmF5KGNvbmZpZy5leGNsdWRlKVxuICAgID8gY29uZmlnLmV4Y2x1ZGVcbiAgICA6IFtjb25maWcuZXhjbHVkZV1cbiAgOiBbXVxuLy8gV2hlbiB0aGUgY29uc3VtZXIgZG9lc24ndCBoYXZlIGEgLmdpdGlnbm9yZSwgZmFsbCBiYWNrIHRvIGEgc2Vuc2libGVcbi8vIGZsb29yIHNvIGAqKi8qLm1kYCBkb2Vzbid0IHN3ZWVwIHVwIGV2ZXJ5IFJFQURNRS5tZCB1bmRlciBub2RlX21vZHVsZXMsXG4vLyBidWlsZCBvdXRwdXRzLCBldGMuIFdpdGggYSAuZ2l0aWdub3JlIHByZXNlbnQgd2UgdHJ1c3QgdGhlIHVzZXIuXG5jb25zdCBoYXNHaXRpZ25vcmUgPSBleGlzdHNTeW5jKHJlc29sdmUoY29uZmlnLnJvb3QsIFwiLmdpdGlnbm9yZVwiKSlcbmNvbnN0IGRlZmF1bHRFeGNsdWRlID0gaGFzR2l0aWdub3JlID8gW10gOiBbLi4uREVGQVVMVF9FWENMVURFU11cbmNvbnN0IGV4Y2x1ZGUgPSBbLi4uZGVmYXVsdEV4Y2x1ZGUsIC4uLnVzZXJFeGNsdWRlXVxuXG4vLyBjb250ZW50LWNvbGxlY3Rpb25zIGNvbXBpbGVzIHRoaXMgZmlsZSB0byAuY29udGVudC1jb2xsZWN0aW9ucy9jYWNoZS87XG4vLyBnb2luZyB1cCAyIGxldmVscyByZWNvbnN0cnVjdHMgdGhlIGJhc2VEaXJlY3RvcnkgaXQgdXNlcyBmb3IgcGF0aCByZXNvbHV0aW9uXG5jb25zdCBiYXNlRGlyID0gcmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uLy4uXCIpXG5jb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZShiYXNlRGlyLCBjb25maWcucm9vdCkgfHwgXCIuXCJcblxuZnVuY3Rpb24gdG9QYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKS5yZXBsYWNlKC9cXC5cXHcrJC8sIFwiXCIpXG4gIHJldHVybiBzbHVnaWZ5KG5hbWUpXG59XG5cbmZ1bmN0aW9uIGdldExhc3RVcGRhdGVkKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBleGVjU3luYyhgZ2l0IGxvZyAtMSAtLWZvcm1hdD0lY0kgLS0gXCIke2ZpbGVQYXRofVwiYCwge1xuICAgICAgY3dkOiBjb25maWcucm9vdCxcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgfSkudHJpbSgpXG4gICAgcmV0dXJuIHRpbWVzdGFtcCB8fCB1bmRlZmluZWRcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ0gxKGNvbnRlbnQ6IHN0cmluZykge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9eWyBcXHRdKiNcXHMrW15cXG5dKlxcbisvLCBcIlwiKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VGl0bGUoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXiNcXHMrKC4rKSQvbS5leGVjKGNvbnRlbnQpXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdIVxuICByZXR1cm4gKFxuICAgIHBhdGhcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5wb3AoKVxuICAgICAgPy5yZXBsYWNlKC9cXC5cXHcrJC8sIFwiXCIpID8/IHBhdGhcbiAgKVxufVxuXG5jb25zdCBhcnRpY2xlcyA9IGRlZmluZUNvbGxlY3Rpb24oe1xuICBuYW1lOiBcImFydGljbGVzXCIsXG4gIGRpcmVjdG9yeSxcbiAgaW5jbHVkZSxcbiAgZXhjbHVkZSxcbiAgc2NoZW1hOiBBcnRpY2xlLFxuICB0cmFuc2Zvcm06IGFzeW5jIChkb2N1bWVudCwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHBhdGNoID0gY29uZmlnLnBhdGNoZXM/LmZpbmQocCA9PiBwLmZpbGUgPT09IGRvY3VtZW50Ll9tZXRhLmZpbGVQYXRoKVxuICAgIGNvbnN0IGRvYyA9IHBhdGNoID8geyAuLi5kb2N1bWVudCwgLi4ucGF0Y2guYXJ0aWNsZSB9IDogZG9jdW1lbnRcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnJvb3QsIGRvYy5fbWV0YS5maWxlUGF0aClcbiAgICBjb25zdCBjb250ZW50ID0gcmVzb2x2ZUluY2x1ZGVzKGRvYy5jb250ZW50LCBmaWxlUGF0aClcbiAgICBjb25zdCB0aXRsZSA9IGRvYy50aXRsZSA/PyBleHRyYWN0VGl0bGUoY29udGVudCwgZG9jLl9tZXRhLnBhdGgpXG4gICAgY29uc3QgaWNvbiA9IGRvYy5pY29uID8/IHBpY2tEZWZhdWx0SWNvbihkb2MuX21ldGEucGF0aClcbiAgICBjb25zdCBwYXRoID0gZG9jLnBhdGggPz8gdG9QYXRoKGRvYy5fbWV0YS5maWxlUGF0aClcbiAgICAvLyBUaGUgYXJ0aWNsZSdzIGgxIGlzIHJlbmRlcmVkIGZyb20gYHRpdGxlYCBieSB0aGUgbGF5b3V0LCBzbyBzdHJpcCBhbnlcbiAgICAvLyBsZWFkaW5nIGgxIGluIHRoZSBib2R5IHRvIGF2b2lkIHR3byBoMXMgc2lkZS1ieS1zaWRlIChlc3BlY2lhbGx5IHdoZW5cbiAgICAvLyBhIGNvbnRlbnQgcGF0Y2ggb3ZlcnJpZGVzIHRoZSB0aXRsZSB0byBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gdGhlXG4gICAgLy8gYm9keSdzIG93biBoZWFkaW5nKS5cbiAgICBjb25zdCBib2R5Q29udGVudCA9IHN0cmlwTGVhZGluZ0gxKGNvbnRlbnQpXG4gICAgY29uc3QgbWR4ID0gYXdhaXQgY29tcGlsZU1EWChcbiAgICAgIGNvbnRleHQsXG4gICAgICB7IC4uLmRvYywgY29udGVudDogYm9keUNvbnRlbnQgfSxcbiAgICAgIHtcbiAgICAgICAgcmVtYXJrUGx1Z2luczogW1xuICAgICAgICAgIHJlbWFya0dmbSxcbiAgICAgICAgICByZW1hcmtHZW1vamksXG4gICAgICAgICAgcmVtYXJrRGVmaW5pdGlvbkxpc3QsXG4gICAgICAgICAgcmVtYXJrRGVmbGlzdCxcbiAgICAgICAgICByZW1hcmtNYXRoLFxuICAgICAgICAgIHJlbWFya0RpcmVjdGl2ZSxcbiAgICAgICAgICByZW1hcmtDYWxsb3V0LFxuICAgICAgICAgIHJlbWFya0NhcmQsXG4gICAgICAgICAgcmVtYXJrQ29sdW1ucyxcbiAgICAgICAgICByZW1hcmtUYWIsXG4gICAgICAgICAgcmVtYXJrRGV0YWlscyxcbiAgICAgICAgICByZW1hcmtGaWxldHJlZSxcbiAgICAgICAgICByZW1hcmtJY29uLFxuICAgICAgICAgIHJlbWFya0JhZGdlLFxuICAgICAgICAgIHJlbWFya0J1dHRvbixcbiAgICAgICAgICByZW1hcmtBYmJyLFxuICAgICAgICAgIHJlbWFya0dpdGh1YkNhbGxvdXQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgcmVtYXJrSW1hZ2UsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbGVQYXRoOiByZXNvbHZlKGNvbmZpZy5yb290LCBkb2MuX21ldGEuZmlsZVBhdGgpLFxuICAgICAgICAgICAgICByb290OiBjb25maWcucm9vdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZW1hcmtBbnNpLFxuICAgICAgICAgIHJlbWFya01lcm1haWQsXG4gICAgICAgICAgcmVtYXJrTWVkaWEsXG4gICAgICAgICAgcmVtYXJrVG9jLFxuICAgICAgICAgIHJlbWFya05wbSxcbiAgICAgICAgICByZW1hcmtDb2RlVGFicyxcbiAgICAgICAgICByZW1hcmtTdGVwcyxcbiAgICAgICAgICByZW1hcmtDdXN0b21IZWFkaW5nSWQsXG4gICAgICAgICAgLy8gUnVuIGxhc3Q6IGFueXRoaW5nIHN0aWxsIHR5cGVkIGFzIGEgZGlyZWN0aXZlIGFmdGVyIGV2ZXJ5IGhhbmRsZXJcbiAgICAgICAgICAvLyBhYm92ZSBpcyB1bmludGVuZGVkIChlLmcuIGAzLjI6MWAsIGBwb3J0OjgwODBgKSDigJQgcGFzc3Rocm91Z2ggYXNcbiAgICAgICAgICAvLyBwbGFpbiB0ZXh0IHNvIGl0IGRvZXNuJ3QgcmVuZGVyIGFzIGFuIGVtcHR5IHNwYW4vZGl2LlxuICAgICAgICAgIHJlbWFya1Bhc3N0aHJvdWdoRGlyZWN0aXZlLFxuICAgICAgICBdLFxuICAgICAgICByZWh5cGVQbHVnaW5zOiBbXG4gICAgICAgICAgW1xuICAgICAgICAgICAgcmVoeXBlU2hpa2ksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoZW1lczoge1xuICAgICAgICAgICAgICAgIGxpZ2h0OiBjb25maWcuY29kZVRoZW1lTGlnaHQsXG4gICAgICAgICAgICAgICAgZGFyazogY29uZmlnLmNvZGVUaGVtZURhcmssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIERhcmtlbiBjYXRwcHVjY2luLWxhdHRlJ3MgZ3JlZW4gKHRoZSBjb2xvdXIgdXNlZCBmb3Igc3RyaW5ncyBhbmRcbiAgICAgICAgICAgICAgLy8gc29tZSBjb21tZW50cykg4oCUIHRoZSB0aGVtZSBkZWZhdWx0ICM0MEEwMkIgbGFuZHMgYXQgMy4yOjEgb24gdGhlXG4gICAgICAgICAgICAgIC8vIGNvZGUtYmxvY2sgYmFja2dyb3VuZCwgYmVsb3cgdGhlIFdDQUcgQUEgNC41OjEgdGhyZXNob2xkLlxuICAgICAgICAgICAgICBjb2xvclJlcGxhY2VtZW50czoge1xuICAgICAgICAgICAgICAgIFwiY2F0cHB1Y2Npbi1sYXR0ZVwiOiB7XG4gICAgICAgICAgICAgICAgICBcIiM0MGEwMmJcIjogXCIjMmE3ZTE2XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZXJzOiBbXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXJUd29zbGFzaCh7IGV4cGxpY2l0VHJpZ2dlcjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lckljb24oKSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lck5vdGF0aW9ucygpLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyTGluZUhpZ2hsaWdodCgpLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBwYXJzZU1ldGFTdHJpbmc6IChtZXRhOiBzdHJpbmcpID0+ICh7IFwiZGF0YS1tZXRhXCI6IG1ldGEgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVoeXBlSW5saW5lQ29kZSxcbiAgICAgICAgICByZWh5cGVTbHVnLFxuICAgICAgICAgIHJlaHlwZUthdGV4LFxuICAgICAgICAgIHJlaHlwZVRhc2tMaXN0QTExeSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKVxuICAgIGNvbnN0IHRvY0l0ZW1zID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSBleHRyYWN0U2VhcmNoVGV4dChjb250ZW50KVxuICAgIGNvbnN0IGxhc3RVcGRhdGVkID0gZ2V0TGFzdFVwZGF0ZWQoZG9jLl9tZXRhLmZpbGVQYXRoKVxuICAgIGNvbnN0IGltYWdlID0gZG9jLmltYWdlXG4gICAgICA/IHJlc29sdmVBc3NldFBhdGgoZG9jLmltYWdlLCBmaWxlUGF0aCwgY29uZmlnLnJvb3QpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHJldHVybiB7XG4gICAgICAuLi5kb2MsXG4gICAgICBmaWxlOiBkb2MuX21ldGEuZmlsZVBhdGgsXG4gICAgICBsYXN0VXBkYXRlZCxcbiAgICAgIGltYWdlLFxuICAgICAgdGl0bGUsXG4gICAgICBpY29uLFxuICAgICAgcGF0aCxcbiAgICAgIHRvY0l0ZW1zLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIG1keCxcbiAgICB9XG4gIH0sXG59KVxuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRzZ28gcGlja3Mgd3Jvbmcgb3ZlcmxvYWQgd2hlbiByZWh5cGUtc2x1ZyBhdWdtZW50cyB1bmlmaWVkIHR5cGVzXG4gIGNvbnRlbnQ6IFthcnRpY2xlc10sXG59KVxuIl19
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import type { ConfigEnv, UserConfig as ViteUserConfig } from "vite";
|
|
3
|
+
/** Escape hatch for arbitrary Vite config — accepts either a config
|
|
4
|
+
* object (simple overrides) or a function form (`(env) => config`,
|
|
5
|
+
* matching Vite's own `defineConfig`). Merged on top of livemark's
|
|
6
|
+
* defaults via `mergeConfig`, so plugin arrays concatenate, defines
|
|
7
|
+
* merge, etc. Use this for deployment-target tweaks (e.g. CF Workers
|
|
8
|
+
* via `environments.ssr.resolve.conditions: ["workerd", ...]`). */
|
|
9
|
+
export type ViteOverride = ViteUserConfig | ((env: ConfigEnv) => ViteUserConfig | Promise<ViteUserConfig>);
|
|
2
10
|
/**
|
|
3
11
|
* User-provided configuration for Livemark.
|
|
4
12
|
*/
|
|
5
|
-
export type UserConfig = z.infer<typeof UserConfig
|
|
13
|
+
export type UserConfig = Omit<z.infer<typeof UserConfig>, "vite"> & {
|
|
14
|
+
vite?: ViteOverride;
|
|
15
|
+
};
|
|
6
16
|
export declare const UserConfig: z.ZodObject<{
|
|
7
17
|
site: z.ZodOptional<z.ZodString>;
|
|
8
18
|
favicon: z.ZodOptional<z.ZodString>;
|
|
@@ -143,6 +153,7 @@ export declare const UserConfig: z.ZodObject<{
|
|
|
143
153
|
}>>>;
|
|
144
154
|
}, z.core.$strict>;
|
|
145
155
|
}, z.core.$strip>>>;
|
|
156
|
+
vite: z.ZodOptional<z.ZodUnknown>;
|
|
146
157
|
}, z.core.$strip>;
|
|
147
158
|
/** Website configuration injected at build time via Vite define */
|
|
148
159
|
export type WebsiteConfig = z.infer<typeof WebsiteConfig>;
|
|
@@ -203,6 +214,10 @@ export declare const SystemConfig: z.ZodObject<{
|
|
|
203
214
|
}, z.core.$strip>;
|
|
204
215
|
/**
|
|
205
216
|
* Fully resolved Livemark configuration.
|
|
217
|
+
*
|
|
218
|
+
* `vite` stays `unknown` here because that's what the runtime schema
|
|
219
|
+
* produces — consumer-facing typing happens via {@link UserConfig} so
|
|
220
|
+
* `defineConfig` shows the right shape in editors.
|
|
206
221
|
*/
|
|
207
222
|
export type Config = z.infer<typeof Config>;
|
|
208
223
|
export declare const Config: z.ZodObject<{
|
|
@@ -345,6 +360,7 @@ export declare const Config: z.ZodObject<{
|
|
|
345
360
|
}>>>;
|
|
346
361
|
}, z.core.$strict>;
|
|
347
362
|
}, z.core.$strip>>>;
|
|
363
|
+
vite: z.ZodOptional<z.ZodUnknown>;
|
|
348
364
|
root: z.ZodString;
|
|
349
365
|
configPath: z.ZodString;
|
|
350
366
|
}, z.core.$strip>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Link } from "./link.js";
|
|
3
|
+
import { Patch } from "./patch.js";
|
|
4
|
+
import { Section } from "./section.js";
|
|
5
|
+
import { CodeThemeDark, CodeThemeLight } from "./theme.js";
|
|
6
|
+
export const UserConfig = z.object({
|
|
7
|
+
site: z.string().optional(),
|
|
8
|
+
favicon: z.string().optional(),
|
|
9
|
+
logo: z.string().optional(),
|
|
10
|
+
title: z.string().default("Livemark"),
|
|
11
|
+
description: z.string().default("Markdown site generator"),
|
|
12
|
+
include: z.union([z.string(), z.array(z.string())]).default("**/*.md"),
|
|
13
|
+
exclude: z.union([z.string(), z.array(z.string())]).optional(),
|
|
14
|
+
codeThemeLight: CodeThemeLight.default("catppuccin-latte"),
|
|
15
|
+
codeThemeDark: CodeThemeDark.default("catppuccin-mocha"),
|
|
16
|
+
links: z.array(Link).optional(),
|
|
17
|
+
sections: z.array(Section).optional(),
|
|
18
|
+
patches: z.array(Patch).optional(),
|
|
19
|
+
// Stored as `unknown` in the schema (zod can't type a Vite UserConfig
|
|
20
|
+
// or a function returning one meaningfully); the public TypeScript
|
|
21
|
+
// surface above lifts it back to ViteOverride for editor support.
|
|
22
|
+
vite: z.unknown().optional(),
|
|
23
|
+
});
|
|
24
|
+
export const WebsiteConfig = UserConfig.pick({
|
|
25
|
+
title: true,
|
|
26
|
+
description: true,
|
|
27
|
+
site: true,
|
|
28
|
+
favicon: true,
|
|
29
|
+
logo: true,
|
|
30
|
+
links: true,
|
|
31
|
+
sections: true,
|
|
32
|
+
});
|
|
33
|
+
export const SystemConfig = z.object({
|
|
34
|
+
root: z.string(),
|
|
35
|
+
configPath: z.string(),
|
|
36
|
+
});
|
|
37
|
+
export const Config = UserConfig.merge(SystemConfig);
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQWtCMUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDOUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3JDLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0lBQzFELE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDdEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlELGNBQWMsRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBQzFELGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBQ3hELEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMvQixRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ2xDLHNFQUFzRTtJQUN0RSxtRUFBbUU7SUFDbkUsa0VBQWtFO0lBQ2xFLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdCLENBQUMsQ0FBQTtBQUlGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzNDLEtBQUssRUFBRSxJQUFJO0lBQ1gsV0FBVyxFQUFFLElBQUk7SUFDakIsSUFBSSxFQUFFLElBQUk7SUFDVixPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUMsQ0FBQTtBQU1GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQTtBQVVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSBcIi4vbGluay50c1wiXG5pbXBvcnQgeyBQYXRjaCB9IGZyb20gXCIuL3BhdGNoLnRzXCJcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tIFwiLi9zZWN0aW9uLnRzXCJcbmltcG9ydCB7IENvZGVUaGVtZURhcmssIENvZGVUaGVtZUxpZ2h0IH0gZnJvbSBcIi4vdGhlbWUudHNcIlxuXG4vKiogRXNjYXBlIGhhdGNoIGZvciBhcmJpdHJhcnkgVml0ZSBjb25maWcg4oCUIGFjY2VwdHMgZWl0aGVyIGEgY29uZmlnXG4gKiAgb2JqZWN0IChzaW1wbGUgb3ZlcnJpZGVzKSBvciBhIGZ1bmN0aW9uIGZvcm0gKGAoZW52KSA9PiBjb25maWdgLFxuICogIG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLiBNZXJnZWQgb24gdG9wIG9mIGxpdmVtYXJrJ3NcbiAqICBkZWZhdWx0cyB2aWEgYG1lcmdlQ29uZmlnYCwgc28gcGx1Z2luIGFycmF5cyBjb25jYXRlbmF0ZSwgZGVmaW5lc1xuICogIG1lcmdlLCBldGMuIFVzZSB0aGlzIGZvciBkZXBsb3ltZW50LXRhcmdldCB0d2Vha3MgKGUuZy4gQ0YgV29ya2Vyc1xuICogIHZpYSBgZW52aXJvbm1lbnRzLnNzci5yZXNvbHZlLmNvbmRpdGlvbnM6IFtcIndvcmtlcmRcIiwgLi4uXWApLiAqL1xuZXhwb3J0IHR5cGUgVml0ZU92ZXJyaWRlID1cbiAgfCBWaXRlVXNlckNvbmZpZ1xuICB8ICgoZW52OiBDb25maWdFbnYpID0+IFZpdGVVc2VyQ29uZmlnIHwgUHJvbWlzZTxWaXRlVXNlckNvbmZpZz4pXG5cbi8qKlxuICogVXNlci1wcm92aWRlZCBjb25maWd1cmF0aW9uIGZvciBMaXZlbWFyay5cbiAqL1xuZXhwb3J0IHR5cGUgVXNlckNvbmZpZyA9IE9taXQ8ei5pbmZlcjx0eXBlb2YgVXNlckNvbmZpZz4sIFwidml0ZVwiPiAmIHtcbiAgdml0ZT86IFZpdGVPdmVycmlkZVxufVxuZXhwb3J0IGNvbnN0IFVzZXJDb25maWcgPSB6Lm9iamVjdCh7XG4gIHNpdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZmF2aWNvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBsb2dvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMaXZlbWFya1wiKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkuZGVmYXVsdChcIk1hcmtkb3duIHNpdGUgZ2VuZXJhdG9yXCIpLFxuICBpbmNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSkuZGVmYXVsdChcIioqLyoubWRcIiksXG4gIGV4Y2x1ZGU6IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKS5vcHRpb25hbCgpLFxuICBjb2RlVGhlbWVMaWdodDogQ29kZVRoZW1lTGlnaHQuZGVmYXVsdChcImNhdHBwdWNjaW4tbGF0dGVcIiksXG4gIGNvZGVUaGVtZURhcms6IENvZGVUaGVtZURhcmsuZGVmYXVsdChcImNhdHBwdWNjaW4tbW9jaGFcIiksXG4gIGxpbmtzOiB6LmFycmF5KExpbmspLm9wdGlvbmFsKCksXG4gIHNlY3Rpb25zOiB6LmFycmF5KFNlY3Rpb24pLm9wdGlvbmFsKCksXG4gIHBhdGNoZXM6IHouYXJyYXkoUGF0Y2gpLm9wdGlvbmFsKCksXG4gIC8vIFN0b3JlZCBhcyBgdW5rbm93bmAgaW4gdGhlIHNjaGVtYSAoem9kIGNhbid0IHR5cGUgYSBWaXRlIFVzZXJDb25maWdcbiAgLy8gb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgb25lIG1lYW5pbmdmdWxseSk7IHRoZSBwdWJsaWMgVHlwZVNjcmlwdFxuICAvLyBzdXJmYWNlIGFib3ZlIGxpZnRzIGl0IGJhY2sgdG8gVml0ZU92ZXJyaWRlIGZvciBlZGl0b3Igc3VwcG9ydC5cbiAgdml0ZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKiBXZWJzaXRlIGNvbmZpZ3VyYXRpb24gaW5qZWN0ZWQgYXQgYnVpbGQgdGltZSB2aWEgVml0ZSBkZWZpbmUgKi9cbmV4cG9ydCB0eXBlIFdlYnNpdGVDb25maWcgPSB6LmluZmVyPHR5cGVvZiBXZWJzaXRlQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFdlYnNpdGVDb25maWcgPSBVc2VyQ29uZmlnLnBpY2soe1xuICB0aXRsZTogdHJ1ZSxcbiAgZGVzY3JpcHRpb246IHRydWUsXG4gIHNpdGU6IHRydWUsXG4gIGZhdmljb246IHRydWUsXG4gIGxvZ286IHRydWUsXG4gIGxpbmtzOiB0cnVlLFxuICBzZWN0aW9uczogdHJ1ZSxcbn0pXG5cbi8qKlxuICogU3lzdGVtLWNvbXB1dGVkIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBjb25maWcgZmlsZSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgU3lzdGVtQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgU3lzdGVtQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFN5c3RlbUNvbmZpZyA9IHoub2JqZWN0KHtcbiAgcm9vdDogei5zdHJpbmcoKSxcbiAgY29uZmlnUGF0aDogei5zdHJpbmcoKSxcbn0pXG5cbi8qKlxuICogRnVsbHkgcmVzb2x2ZWQgTGl2ZW1hcmsgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBgdml0ZWAgc3RheXMgYHVua25vd25gIGhlcmUgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGUgcnVudGltZSBzY2hlbWFcbiAqIHByb2R1Y2VzIOKAlCBjb25zdW1lci1mYWNpbmcgdHlwaW5nIGhhcHBlbnMgdmlhIHtAbGluayBVc2VyQ29uZmlnfSBzb1xuICogYGRlZmluZUNvbmZpZ2Agc2hvd3MgdGhlIHJpZ2h0IHNoYXBlIGluIGVkaXRvcnMuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHouaW5mZXI8dHlwZW9mIENvbmZpZz5cbmV4cG9ydCBjb25zdCBDb25maWcgPSBVc2VyQ29uZmlnLm1lcmdlKFN5c3RlbUNvbmZpZylcbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import type { Config } from "../models/config.ts";
|
|
3
|
+
export interface LivemarkOptions {
|
|
4
|
+
config: Config;
|
|
5
|
+
}
|
|
6
|
+
/** Owns the per-consumer `targets/<hash>/` mount: synthesizes it via
|
|
7
|
+
* `buildTarget()`, returns the Vite config that anchors there, and
|
|
8
|
+
* watches the consumer's `.livemark/` (plus livemark's `source/` in
|
|
9
|
+
* dev) for changes that need to be re-copied into the target. The
|
|
10
|
+
* override mechanism is pure file-system (full copies) — no resolveId
|
|
11
|
+
* redirection, no realpath surprises. */
|
|
12
|
+
export declare function livemark(opts: LivemarkOptions): Plugin;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { cpSync, existsSync, rmSync } from "node:fs";
|
|
2
|
+
import { join, sep } from "node:path";
|
|
3
|
+
import { mergeConfig } from "vite";
|
|
4
|
+
import { buildTarget } from "../actions/target/build.js";
|
|
5
|
+
import { WebsiteConfig } from "../models/config.js";
|
|
6
|
+
import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
|
|
7
|
+
const SOURCE_DIR = join(import.meta.dirname, "..");
|
|
8
|
+
/** Single virtual module exposing livemark's runtime values to consumer
|
|
9
|
+
* override files via named exports:
|
|
10
|
+
*
|
|
11
|
+
* import { config } from "livemark:virtual"
|
|
12
|
+
*
|
|
13
|
+
* Currently exports `config` (validated `WebsiteConfig`); future
|
|
14
|
+
* additions (e.g. `articles`, `sections`) land here as new named
|
|
15
|
+
* exports without consumers changing their import statements.
|
|
16
|
+
*
|
|
17
|
+
* The `\0` prefix on the resolved id is Vite's convention to signal
|
|
18
|
+
* "this is a virtual module — no other plugin should try to resolve
|
|
19
|
+
* or load it from disk". */
|
|
20
|
+
const VIRTUAL_ID = "livemark:virtual";
|
|
21
|
+
const VIRTUAL_RESOLVED_ID = `\0${VIRTUAL_ID}`;
|
|
22
|
+
/** Owns the per-consumer `targets/<hash>/` mount: synthesizes it via
|
|
23
|
+
* `buildTarget()`, returns the Vite config that anchors there, and
|
|
24
|
+
* watches the consumer's `.livemark/` (plus livemark's `source/` in
|
|
25
|
+
* dev) for changes that need to be re-copied into the target. The
|
|
26
|
+
* override mechanism is pure file-system (full copies) — no resolveId
|
|
27
|
+
* redirection, no realpath surprises. */
|
|
28
|
+
export function livemark(opts) {
|
|
29
|
+
const overridesRoot = join(opts.config.root, ".livemark");
|
|
30
|
+
let targetDir = "";
|
|
31
|
+
return {
|
|
32
|
+
name: "livemark",
|
|
33
|
+
enforce: "pre",
|
|
34
|
+
async config(_, env) {
|
|
35
|
+
targetDir = buildTarget(opts.config.configPath);
|
|
36
|
+
const base = {
|
|
37
|
+
root: targetDir,
|
|
38
|
+
// outDir lives outside the target root (in the consumer's
|
|
39
|
+
// .livemark/) so the consumer can find their deployable output
|
|
40
|
+
// without digging into node_modules. Vite's default refusal to
|
|
41
|
+
// empty out-of-root directories doesn't apply here because the
|
|
42
|
+
// target/ root is livemark's, not the consumer's.
|
|
43
|
+
build: { outDir: join(overridesRoot, "build"), emptyOutDir: true },
|
|
44
|
+
resolve: { dedupe: ["react", "react-dom"] },
|
|
45
|
+
};
|
|
46
|
+
const override = await resolveViteOverride(opts.config.vite, env);
|
|
47
|
+
return override ? mergeConfig(base, override) : base;
|
|
48
|
+
},
|
|
49
|
+
resolveId(id) {
|
|
50
|
+
if (id === VIRTUAL_ID)
|
|
51
|
+
return VIRTUAL_RESOLVED_ID;
|
|
52
|
+
return null;
|
|
53
|
+
},
|
|
54
|
+
load(id) {
|
|
55
|
+
if (id !== VIRTUAL_RESOLVED_ID)
|
|
56
|
+
return null;
|
|
57
|
+
const config = WebsiteConfig.parse(opts.config);
|
|
58
|
+
return `export const config = ${JSON.stringify(config)}`;
|
|
59
|
+
},
|
|
60
|
+
configureServer(server) {
|
|
61
|
+
server.watcher.add(opts.config.configPath);
|
|
62
|
+
server.watcher.add(join(overridesRoot, "**", "*"));
|
|
63
|
+
server.watcher.add(join(SOURCE_DIR, "**", "*"));
|
|
64
|
+
server.watcher.on("change", file => onChange(file, "change"));
|
|
65
|
+
server.watcher.on("add", file => onChange(file, "add"));
|
|
66
|
+
server.watcher.on("unlink", file => onChange(file, "unlink"));
|
|
67
|
+
function onChange(file, kind) {
|
|
68
|
+
if (file === opts.config.configPath) {
|
|
69
|
+
server.restart();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const overlayHit = matchOverlay(file, overridesRoot);
|
|
73
|
+
if (overlayHit) {
|
|
74
|
+
syncOverlay(overlayHit, kind, targetDir, overridesRoot);
|
|
75
|
+
if (kind !== "change")
|
|
76
|
+
fullReload(server);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const sourceHit = matchSource(file);
|
|
80
|
+
if (sourceHit) {
|
|
81
|
+
syncSource(sourceHit, kind, targetDir, overridesRoot);
|
|
82
|
+
if (kind !== "change")
|
|
83
|
+
fullReload(server);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function matchOverlay(file, overridesRoot) {
|
|
90
|
+
const prefix = `${overridesRoot}${sep}`;
|
|
91
|
+
if (!file.startsWith(prefix))
|
|
92
|
+
return null;
|
|
93
|
+
const rel = file.slice(prefix.length);
|
|
94
|
+
return { rel, category: classify(rel) };
|
|
95
|
+
}
|
|
96
|
+
function matchSource(file) {
|
|
97
|
+
const prefix = `${SOURCE_DIR}${sep}`;
|
|
98
|
+
if (!file.startsWith(prefix))
|
|
99
|
+
return null;
|
|
100
|
+
// Skip the targets/ output dir itself (sibling of source/) and any
|
|
101
|
+
// `.gen.ts` files that downstream tools regenerate inside the target.
|
|
102
|
+
const rel = file.slice(prefix.length);
|
|
103
|
+
if (rel === "" || rel.includes("routeTree.gen.ts"))
|
|
104
|
+
return null;
|
|
105
|
+
return { rel, category: classify(rel) };
|
|
106
|
+
}
|
|
107
|
+
function classify(rel) {
|
|
108
|
+
const [head] = rel.split(sep);
|
|
109
|
+
if (head && ESCAPABLE_FOLDERS.includes(head))
|
|
110
|
+
return "folder";
|
|
111
|
+
if (ESCAPABLE_FILES.includes(rel))
|
|
112
|
+
return "file";
|
|
113
|
+
// Non-escapable source files still need to flow into target during
|
|
114
|
+
// livemark's own dev — the user is editing the canonical source.
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
function syncOverlay(hit, kind, targetDir, overridesRoot) {
|
|
118
|
+
if (!hit.category)
|
|
119
|
+
return;
|
|
120
|
+
const dest = join(targetDir, hit.rel);
|
|
121
|
+
const source = join(SOURCE_DIR, hit.rel);
|
|
122
|
+
if (kind === "unlink") {
|
|
123
|
+
rmSync(dest, { force: true, recursive: true });
|
|
124
|
+
if (existsSync(source))
|
|
125
|
+
cpSync(source, dest, { recursive: true, force: true });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const overlay = join(overridesRoot, hit.rel);
|
|
129
|
+
if (existsSync(overlay))
|
|
130
|
+
cpSync(overlay, dest, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
function syncSource(hit, kind, targetDir, overridesRoot) {
|
|
133
|
+
// If the consumer has an overlay for this file (and it's escapable),
|
|
134
|
+
// the overlay wins — ignore source changes.
|
|
135
|
+
if (hit.category && existsSync(join(overridesRoot, hit.rel)))
|
|
136
|
+
return;
|
|
137
|
+
const dest = join(targetDir, hit.rel);
|
|
138
|
+
const source = join(SOURCE_DIR, hit.rel);
|
|
139
|
+
if (kind === "unlink") {
|
|
140
|
+
rmSync(dest, { force: true, recursive: true });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (existsSync(source))
|
|
144
|
+
cpSync(source, dest, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
function fullReload(server) {
|
|
147
|
+
server.ws.send({ type: "full-reload" });
|
|
148
|
+
}
|
|
149
|
+
/** Resolve livemark.config.ts's `vite` field — either a config object
|
|
150
|
+
* or a function `(env) => config` (matching Vite's own `defineConfig`).
|
|
151
|
+
* Schema stores it as `unknown`; typing for the consumer's editor
|
|
152
|
+
* lives on {@link ViteOverride}. */
|
|
153
|
+
async function resolveViteOverride(vite, env) {
|
|
154
|
+
if (!vite)
|
|
155
|
+
return null;
|
|
156
|
+
if (typeof vite === "function") {
|
|
157
|
+
const result = await Reflect.apply(vite, undefined, [env]);
|
|
158
|
+
return isObject(result) ? result : null;
|
|
159
|
+
}
|
|
160
|
+
return isObject(vite) ? vite : null;
|
|
161
|
+
}
|
|
162
|
+
function isObject(v) {
|
|
163
|
+
return v !== null && typeof v === "object";
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBT3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUVsRDs7Ozs7Ozs7Ozs7NkJBVzZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7Ozs7MENBSzBDO0FBQzFDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBcUI7SUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3pELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHO1lBQ2pCLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FB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LEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZyxcbiAgVml0ZURldlNlcnZlcixcbn0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgbWVyZ2VDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBidWlsZFRhcmdldCB9IGZyb20gXCIuLi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1wiXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBFU0NBUEFCTEVfRklMRVMsIEVTQ0FQQUJMRV9GT0xERVJTIH0gZnJvbSBcIi4uL3NldHRpbmdzLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlbWFya09wdGlvbnMge1xuICBjb25maWc6IENvbmZpZ1xufVxuXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIpXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwZXItY29uc3VtZXIgYHRhcmdldHMvPGhhc2g+L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICB3YXRjaGVzIHRoZSBjb25zdW1lcidzIGAubGl2ZW1hcmsvYCAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpblxuICogIGRldikgZm9yIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIHJlLWNvcGllZCBpbnRvIHRoZSB0YXJnZXQuIFRoZVxuICogIG92ZXJyaWRlIG1lY2hhbmlzbSBpcyBwdXJlIGZpbGUtc3lzdGVtIChmdWxsIGNvcGllcykg4oCUIG5vIHJlc29sdmVJZFxuICogIHJlZGlyZWN0aW9uLCBubyByZWFscGF0aCBzdXJwcmlzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgbGV0IHRhcmdldERpciA9IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImxpdmVtYXJrXCIsXG4gICAgZW5mb3JjZTogXCJwcmVcIixcbiAgICBhc3luYyBjb25maWcoXywgZW52KSB7XG4gICAgICB0YXJnZXREaXIgPSBidWlsZFRhcmdldChvcHRzLmNvbmZpZy5jb25maWdQYXRoKVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290IChpbiB0aGUgY29uc3VtZXInc1xuICAgICAgICAvLyAubGl2ZW1hcmsvKSBzbyB0aGUgY29uc3VtZXIgY2FuIGZpbmQgdGhlaXIgZGVwbG95YWJsZSBvdXRwdXRcbiAgICAgICAgLy8gd2l0aG91dCBkaWdnaW5nIGludG8gbm9kZV9tb2R1bGVzLiBWaXRlJ3MgZGVmYXVsdCByZWZ1c2FsIHRvXG4gICAgICAgIC8vIGVtcHR5IG91dC1vZi1yb290IGRpcmVjdG9yaWVzIGRvZXNuJ3QgYXBwbHkgaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyB0YXJnZXQvIHJvb3QgaXMgbGl2ZW1hcmsncywgbm90IHRoZSBjb25zdW1lcidzLlxuICAgICAgICBidWlsZDogeyBvdXREaXI6IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKSwgZW1wdHlPdXREaXI6IHRydWUgfSxcbiAgICAgICAgcmVzb2x2ZTogeyBkZWR1cGU6IFtcInJlYWN0XCIsIFwicmVhY3QtZG9tXCJdIH0sXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IFZJUlRVQUxfSUQpIHJldHVybiBWSVJUVUFMX1JFU09MVkVEX0lEXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkICE9PSBWSVJUVUFMX1JFU09MVkVEX0lEKSByZXR1cm4gbnVsbFxuICAgICAgY29uc3QgY29uZmlnID0gV2Vic2l0ZUNvbmZpZy5wYXJzZShvcHRzLmNvbmZpZylcbiAgICAgIHJldHVybiBgZXhwb3J0IGNvbnN0IGNvbmZpZyA9ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnKX1gXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIud2F0Y2hlci5hZGQob3B0cy5jb25maWcuY29uZmlnUGF0aClcbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChqb2luKG92ZXJyaWRlc1Jvb3QsIFwiKipcIiwgXCIqXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKGpvaW4oU09VUkNFX0RJUiwgXCIqKlwiLCBcIipcIikpXG5cbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJjaGFuZ2VcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcImFkZFwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiYWRkXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKGZpbGUgPT09IG9wdHMuY29uZmlnLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3ZlcmxheUhpdCA9IG1hdGNoT3ZlcmxheShmaWxlLCBvdmVycmlkZXNSb290KVxuICAgICAgICBpZiAob3ZlcmxheUhpdCkge1xuICAgICAgICAgIHN5bmNPdmVybGF5KG92ZXJsYXlIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgICBpZiAoa2luZCAhPT0gXCJjaGFuZ2VcIikgZnVsbFJlbG9hZChzZXJ2ZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hTb3VyY2UoZmlsZSlcbiAgICAgICAgaWYgKHNvdXJjZUhpdCkge1xuICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgaWYgKGtpbmQgIT09IFwiY2hhbmdlXCIpIGZ1bGxSZWxvYWQoc2VydmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5pbnRlcmZhY2UgSGl0IHtcbiAgcmVsOiBzdHJpbmdcbiAgY2F0ZWdvcnk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGxcbn1cblxuZnVuY3Rpb24gbWF0Y2hPdmVybGF5KGZpbGU6IHN0cmluZywgb3ZlcnJpZGVzUm9vdDogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGNvbnN0IHByZWZpeCA9IGAke292ZXJyaWRlc1Jvb3R9JHtzZXB9YFxuICBpZiAoIWZpbGUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gbnVsbFxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFNvdXJjZShmaWxlOiBzdHJpbmcpOiBIaXQgfCBudWxsIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7U09VUkNFX0RJUn0ke3NlcH1gXG4gIGlmICghZmlsZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiBudWxsXG4gIC8vIFNraXAgdGhlIHRhcmdldHMvIG91dHB1dCBkaXIgaXRzZWxmIChzaWJsaW5nIG9mIHNvdXJjZS8pIGFuZCBhbnlcbiAgLy8gYC5nZW4udHNgIGZpbGVzIHRoYXQgZG93bnN0cmVhbSB0b29scyByZWdlbmVyYXRlIGluc2lkZSB0aGUgdGFyZ2V0LlxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIGlmIChyZWwgPT09IFwiXCIgfHwgcmVsLmluY2x1ZGVzKFwicm91dGVUcmVlLmdlbi50c1wiKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHsgcmVsLCBjYXRlZ29yeTogY2xhc3NpZnkocmVsKSB9XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5KHJlbDogc3RyaW5nKTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbCB7XG4gIGNvbnN0IFtoZWFkXSA9IHJlbC5zcGxpdChzZXApXG4gIGlmIChoZWFkICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGhlYWQpKSByZXR1cm4gXCJmb2xkZXJcIlxuICBpZiAoRVNDQVBBQkxFX0ZJTEVTLmluY2x1ZGVzKHJlbCkpIHJldHVybiBcImZpbGVcIlxuICAvLyBOb24tZXNjYXBhYmxlIHNvdXJjZSBmaWxlcyBzdGlsbCBuZWVkIHRvIGZsb3cgaW50byB0YXJnZXQgZHVyaW5nXG4gIC8vIGxpdmVtYXJrJ3Mgb3duIGRldiDigJQgdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgY2Fub25pY2FsIHNvdXJjZS5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gc3luY092ZXJsYXkoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFoaXQuY2F0ZWdvcnkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSlcbiAgICAgIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpXG4gIGlmIChleGlzdHNTeW5jKG92ZXJsYXkpKVxuICAgIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIGZ1bGxSZWxvYWQoc2VydmVyOiBWaXRlRGV2U2VydmVyKSB7XG4gIHNlcnZlci53cy5zZW5kKHsgdHlwZTogXCJmdWxsLXJlbG9hZFwiIH0pXG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==
|