livemark 0.10.5 → 0.11.1
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/build/actions/changelog/build.d.ts +22 -0
- package/build/actions/changelog/build.js +198 -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 +9 -7
- package/source/actions/changelog/build.ts +26 -9
- 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 -78
- package/target/actions/changelog/build.d.ts +0 -15
- 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 -89
- 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 +5 -5
- /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,22 @@
|
|
|
1
|
+
import type { Config } from "../../models/config.ts";
|
|
2
|
+
import type { ChangelogSection } from "../../models/section.ts";
|
|
3
|
+
interface ChangelogEntry {
|
|
4
|
+
slug: string;
|
|
5
|
+
title: string;
|
|
6
|
+
date?: string;
|
|
7
|
+
body: string;
|
|
8
|
+
sourceUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Glob (absolute path) covering all cached changelog markdown files for
|
|
11
|
+
* a given consumer. Used by content-collections to include them in the
|
|
12
|
+
* article scan. */
|
|
13
|
+
export declare function cacheIncludeGlob(config: Config): string;
|
|
14
|
+
/** Build the per-version changelog cache files. Livemark allows one
|
|
15
|
+
* changelog per project, so all cache state lives in a single
|
|
16
|
+
* `cache/changelog/`: the rendered `.md` entries plus a `meta.json`
|
|
17
|
+
* holding the etag for conditional GETs. On refresh we wipe only the
|
|
18
|
+
* `.md` files, leaving meta intact. */
|
|
19
|
+
export declare function buildChangelog(section: ChangelogSection, config: Config): Promise<void>;
|
|
20
|
+
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
21
|
+
export declare function splitLocalChangelog(body: string): ChangelogEntry[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { access, mkdir, readFile, readdir, rm, writeFile, } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import slugify from "@sindresorhus/slugify";
|
|
4
|
+
import { toString as mdastToString } from "mdast-util-to-string";
|
|
5
|
+
import remarkParse from "remark-parse";
|
|
6
|
+
import remarkStringify from "remark-stringify";
|
|
7
|
+
import { unified } from "unified";
|
|
8
|
+
import { visit } from "unist-util-visit";
|
|
9
|
+
import { isGitHubUrl, parseGitHubRepo } from "../../helpers/changelog-source.js";
|
|
10
|
+
import { targetDirFor } from "../target/build.js";
|
|
11
|
+
const CACHE_SUBDIR = "cache/changelog";
|
|
12
|
+
const parser = unified().use(remarkParse);
|
|
13
|
+
const stringifier = unified().use(remarkStringify, {
|
|
14
|
+
bullet: "-",
|
|
15
|
+
fences: true,
|
|
16
|
+
emphasis: "_",
|
|
17
|
+
});
|
|
18
|
+
/** Glob (absolute path) covering all cached changelog markdown files for
|
|
19
|
+
* a given consumer. Used by content-collections to include them in the
|
|
20
|
+
* article scan. */
|
|
21
|
+
export function cacheIncludeGlob(config) {
|
|
22
|
+
return join(targetDirFor(config.configPath), CACHE_SUBDIR, "**", "*.md");
|
|
23
|
+
}
|
|
24
|
+
/** Build the per-version changelog cache files. Livemark allows one
|
|
25
|
+
* changelog per project, so all cache state lives in a single
|
|
26
|
+
* `cache/changelog/`: the rendered `.md` entries plus a `meta.json`
|
|
27
|
+
* holding the etag for conditional GETs. On refresh we wipe only the
|
|
28
|
+
* `.md` files, leaving meta intact. */
|
|
29
|
+
export async function buildChangelog(section, config) {
|
|
30
|
+
const targetDir = targetDirFor(config.configPath);
|
|
31
|
+
const cacheDir = join(targetDir, CACHE_SUBDIR);
|
|
32
|
+
const metaPath = join(cacheDir, "meta.json");
|
|
33
|
+
const entries = isGitHubUrl(section.source)
|
|
34
|
+
? await buildFromGitHub(section.source, metaPath, cacheDir)
|
|
35
|
+
: await buildFromLocal(section.source, config.root);
|
|
36
|
+
if (entries === undefined)
|
|
37
|
+
return;
|
|
38
|
+
await mkdir(cacheDir, { recursive: true });
|
|
39
|
+
for (const f of await readdir(cacheDir).catch(() => [])) {
|
|
40
|
+
if (f.endsWith(".md"))
|
|
41
|
+
await rm(join(cacheDir, f), { force: true });
|
|
42
|
+
}
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
const markdown = wrapFrontmatter(entry, section);
|
|
45
|
+
await writeFile(join(cacheDir, `${entry.slug}.md`), markdown, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function buildFromLocal(source, root) {
|
|
49
|
+
const filePath = resolve(root, source);
|
|
50
|
+
const body = await readFile(filePath, "utf-8");
|
|
51
|
+
return splitLocalChangelog(body);
|
|
52
|
+
}
|
|
53
|
+
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
54
|
+
export function splitLocalChangelog(body) {
|
|
55
|
+
const tree = parser.parse(body);
|
|
56
|
+
const entries = [];
|
|
57
|
+
let current;
|
|
58
|
+
for (const child of tree.children) {
|
|
59
|
+
if (child.type === "heading" && child.depth === 2) {
|
|
60
|
+
if (current)
|
|
61
|
+
entries.push(finalizeEntry(current));
|
|
62
|
+
current = { heading: mdastToString(child), children: [] };
|
|
63
|
+
}
|
|
64
|
+
else if (current) {
|
|
65
|
+
current.children.push(child);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (current)
|
|
69
|
+
entries.push(finalizeEntry(current));
|
|
70
|
+
return entries;
|
|
71
|
+
}
|
|
72
|
+
function finalizeEntry(input) {
|
|
73
|
+
const versionMatch = input.heading.match(/^\[?([^\]\s]+)\]?/);
|
|
74
|
+
const version = versionMatch?.[1] ?? input.heading;
|
|
75
|
+
const dateMatch = input.heading.match(/\d{4}-\d{2}-\d{2}/);
|
|
76
|
+
const body = renderEntryBody(input.children);
|
|
77
|
+
return {
|
|
78
|
+
slug: slugify(version),
|
|
79
|
+
title: version,
|
|
80
|
+
date: dateMatch?.[0],
|
|
81
|
+
body,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Serialize an entry's mdast children back to markdown */
|
|
85
|
+
function renderEntryBody(children) {
|
|
86
|
+
const root = { type: "root", children };
|
|
87
|
+
return stringifier.stringify(root).trimEnd();
|
|
88
|
+
}
|
|
89
|
+
/** Drop the body's leading h1 (typically the conventional-changelog
|
|
90
|
+
* `# 0.7.2 (2026-04-25)` boilerplate that duplicates the article's title),
|
|
91
|
+
* shift h2–h6 up by one so subsection headings become h1 / h2 / …, and
|
|
92
|
+
* escape stray `<` outside code so MDX doesn't mistake them for JSX. */
|
|
93
|
+
function processBody(body) {
|
|
94
|
+
const tree = parser.parse(body);
|
|
95
|
+
visit(tree, "heading", node => {
|
|
96
|
+
if (node.depth > 1)
|
|
97
|
+
node.depth = (node.depth - 1);
|
|
98
|
+
});
|
|
99
|
+
if (tree.children[0]?.type === "heading" && tree.children[0].depth === 1) {
|
|
100
|
+
tree.children.shift();
|
|
101
|
+
}
|
|
102
|
+
return escapeMdxAngles(stringifier.stringify(tree).trimEnd());
|
|
103
|
+
}
|
|
104
|
+
/** Escape `<` to `\<` outside fenced code blocks and inline backtick spans
|
|
105
|
+
* so commit messages with placeholders like `<subdir>` don't get parsed as
|
|
106
|
+
* JSX by MDX. */
|
|
107
|
+
function escapeMdxAngles(markdown) {
|
|
108
|
+
let inFence = false;
|
|
109
|
+
return markdown
|
|
110
|
+
.split("\n")
|
|
111
|
+
.map(line => {
|
|
112
|
+
if (line.startsWith("```")) {
|
|
113
|
+
inFence = !inFence;
|
|
114
|
+
return line;
|
|
115
|
+
}
|
|
116
|
+
if (inFence)
|
|
117
|
+
return line;
|
|
118
|
+
return line.replace(/`[^`]*`|</g, match => match === "<" ? "\\<" : match);
|
|
119
|
+
})
|
|
120
|
+
.join("\n");
|
|
121
|
+
}
|
|
122
|
+
async function buildFromGitHub(source, metaPath, cacheDir) {
|
|
123
|
+
const parsed = parseGitHubRepo(source);
|
|
124
|
+
if (!parsed) {
|
|
125
|
+
throw new Error(`Could not parse GitHub repo from source: ${source}`);
|
|
126
|
+
}
|
|
127
|
+
const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/releases?per_page=100`;
|
|
128
|
+
const headers = {
|
|
129
|
+
Accept: "application/vnd.github+json",
|
|
130
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
131
|
+
};
|
|
132
|
+
const token = process.env.GITHUB_TOKEN;
|
|
133
|
+
if (token)
|
|
134
|
+
headers.Authorization = `Bearer ${token}`;
|
|
135
|
+
const meta = await readMeta(metaPath);
|
|
136
|
+
const hasCache = await exists(cacheDir);
|
|
137
|
+
if (meta && hasCache)
|
|
138
|
+
headers["If-None-Match"] = meta.etag;
|
|
139
|
+
const res = await fetch(url, { headers });
|
|
140
|
+
if (res.status === 304)
|
|
141
|
+
return undefined;
|
|
142
|
+
if (!res.ok) {
|
|
143
|
+
const remaining = res.headers.get("x-ratelimit-remaining");
|
|
144
|
+
const reset = res.headers.get("x-ratelimit-reset");
|
|
145
|
+
const msg = `GitHub API ${res.status} ${res.statusText} (rate-limit remaining: ${remaining ?? "?"}, reset: ${reset ?? "?"})`;
|
|
146
|
+
if (hasCache) {
|
|
147
|
+
console.warn(`${msg} — falling back to cached changelog`);
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
throw new Error(msg);
|
|
151
|
+
}
|
|
152
|
+
const releases = (await res.json());
|
|
153
|
+
const etag = res.headers.get("etag");
|
|
154
|
+
if (etag) {
|
|
155
|
+
await mkdir(dirname(metaPath), { recursive: true });
|
|
156
|
+
await writeFile(metaPath, JSON.stringify({ etag, fetchedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
157
|
+
}
|
|
158
|
+
return releases.map(release => ({
|
|
159
|
+
slug: slugify(release.tag_name),
|
|
160
|
+
title: release.tag_name,
|
|
161
|
+
date: release.published_at ?? undefined,
|
|
162
|
+
body: (release.body ?? "").trim(),
|
|
163
|
+
sourceUrl: release.html_url ?? undefined,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
function wrapFrontmatter(entry, section) {
|
|
167
|
+
const lines = [
|
|
168
|
+
"---",
|
|
169
|
+
`title: ${entry.title}`,
|
|
170
|
+
`path: ${section.prefix}${entry.slug}/`,
|
|
171
|
+
];
|
|
172
|
+
if (entry.date)
|
|
173
|
+
lines.push(`date: ${entry.date}`);
|
|
174
|
+
if (entry.sourceUrl) {
|
|
175
|
+
lines.push(`sourceUrl: ${entry.sourceUrl}`, "sourceAction: view");
|
|
176
|
+
}
|
|
177
|
+
lines.push("---", "", `# ${entry.title}`, "", processBody(entry.body));
|
|
178
|
+
return lines.join("\n");
|
|
179
|
+
}
|
|
180
|
+
async function readMeta(metaPath) {
|
|
181
|
+
try {
|
|
182
|
+
const raw = await readFile(metaPath, "utf-8");
|
|
183
|
+
return JSON.parse(raw);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function exists(path) {
|
|
190
|
+
try {
|
|
191
|
+
await access(path);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYWN0aW9ucy9jaGFuZ2Vsb2cvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE9BQU8sRUFDUCxFQUFFLEVBQ0YsU0FBUyxHQUNWLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2xELE9BQU8sT0FBTyxNQUFNLHVCQUF1QixDQUFBO0FBRTNDLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDaEUsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFBO0FBQ3RDLE9BQU8sZUFBZSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBR3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBdUJqRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQTtBQUV0QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRTtJQUNqRCxNQUFNLEVBQUUsR0FBRztJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLEdBQUc7Q0FDZCxDQUFDLENBQUE7QUFFRjs7b0JBRW9CO0FBQ3BCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFjO0lBQzdDLE9BQU8sSUFBSSxD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QUMsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHJlYWRkaXIsXG4gIHJtLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzbHVnaWZ5IGZyb20gXCJAc2luZHJlc29yaHVzL3NsdWdpZnlcIlxuaW1wb3J0IHR5cGUgeyBSb290LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiXG5pbXBvcnQgeyB0b1N0cmluZyBhcyBtZGFzdFRvU3RyaW5nIH0gZnJvbSBcIm1kYXN0LXV0aWwtdG8tc3RyaW5nXCJcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCJcbmltcG9ydCByZW1hcmtTdHJpbmdpZnkgZnJvbSBcInJlbWFyay1zdHJpbmdpZnlcIlxuaW1wb3J0IHsgdW5pZmllZCB9IGZyb20gXCJ1bmlmaWVkXCJcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSBcInVuaXN0LXV0aWwtdmlzaXRcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgdHlwZSB7IENoYW5nZWxvZ1NlY3Rpb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NlY3Rpb24udHNcIlxuaW1wb3J0IHsgaXNHaXRIdWJVcmwsIHBhcnNlR2l0SHViUmVwbyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL2NoYW5nZWxvZy1zb3VyY2UudHNcIlxuaW1wb3J0IHsgdGFyZ2V0RGlyRm9yIH0gZnJvbSBcIi4uL3RhcmdldC9idWlsZC50c1wiXG5cbmludGVyZmFjZSBSZWxlYXNlIHtcbiAgdGFnX25hbWU6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICBwdWJsaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIGJvZHk/OiBzdHJpbmcgfCBudWxsXG4gIGh0bWxfdXJsPzogc3RyaW5nIHwgbnVsbFxufVxuXG5pbnRlcmZhY2UgQ2FjaGVNZXRhIHtcbiAgZXRhZzogc3RyaW5nXG4gIGZldGNoZWRBdDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDaGFuZ2Vsb2dFbnRyeSB7XG4gIHNsdWc6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIGRhdGU/OiBzdHJpbmdcbiAgYm9keTogc3RyaW5nXG4gIHNvdXJjZVVybD86IHN0cmluZ1xufVxuXG5jb25zdCBDQUNIRV9TVUJESVIgPSBcImNhY2hlL2NoYW5nZWxvZ1wiXG5cbmNvbnN0IHBhcnNlciA9IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpXG5jb25zdCBzdHJpbmdpZmllciA9IHVuaWZpZWQoKS51c2UocmVtYXJrU3RyaW5naWZ5LCB7XG4gIGJ1bGxldDogXCItXCIsXG4gIGZlbmNlczogdHJ1ZSxcbiAgZW1waGFzaXM6IFwiX1wiLFxufSlcblxuLyoqIEdsb2IgKGFic29sdXRlIHBhdGgpIGNvdmVyaW5nIGFsbCBjYWNoZWQgY2hhbmdlbG9nIG1hcmtkb3duIGZpbGVzIGZvclxuICogIGEgZ2l2ZW4gY29uc3VtZXIuIFVzZWQgYnkgY29udGVudC1jb2xsZWN0aW9ucyB0byBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gKiAgYXJ0aWNsZSBzY2FuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlSW5jbHVkZUdsb2IoY29uZmlnOiBDb25maWcpIHtcbiAgcmV0dXJuIGpvaW4odGFyZ2V0RGlyRm9yKGNvbmZpZy5jb25maWdQYXRoKSwgQ0FDSEVfU1VCRElSLCBcIioqXCIsIFwiKi5tZFwiKVxufVxuXG4vKiogQnVpbGQgdGhlIHBlci12ZXJzaW9uIGNoYW5nZWxvZyBjYWNoZSBmaWxlcy4gTGl2ZW1hcmsgYWxsb3dzIG9uZVxuICogIGNoYW5nZWxvZyBwZXIgcHJvamVjdCwgc28gYWxsIGNhY2hlIHN0YXRlIGxpdmVzIGluIGEgc2luZ2xlXG4gKiAgYGNhY2hlL2NoYW5nZWxvZy9gOiB0aGUgcmVuZGVyZWQgYC5tZGAgZW50cmllcyBwbHVzIGEgYG1ldGEuanNvbmBcbiAqICBob2xkaW5nIHRoZSBldGFnIGZvciBjb25kaXRpb25hbCBHRVRzLiBPbiByZWZyZXNoIHdlIHdpcGUgb25seSB0aGVcbiAqICBgLm1kYCBmaWxlcywgbGVhdmluZyBtZXRhIGludGFjdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENoYW5nZWxvZyhcbiAgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbixcbiAgY29uZmlnOiBDb25maWcsXG4pIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZy5jb25maWdQYXRoKVxuICBjb25zdCBjYWNoZURpciA9IGpvaW4odGFyZ2V0RGlyLCBDQUNIRV9TVUJESVIpXG4gIGNvbnN0IG1ldGFQYXRoID0gam9pbihjYWNoZURpciwgXCJtZXRhLmpzb25cIilcblxuICBjb25zdCBlbnRyaWVzID0gaXNHaXRIdWJVcmwoc2VjdGlvbi5zb3VyY2UpXG4gICAgPyBhd2FpdCBidWlsZEZyb21HaXRIdWIoc2VjdGlvbi5zb3VyY2UsIG1ldGFQYXRoLCBjYWNoZURpcilcbiAgICA6IGF3YWl0IGJ1aWxkRnJvbUxvY2FsKHNlY3Rpb24uc291cmNlLCBjb25maWcucm9vdClcblxuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICBhd2FpdCBta2RpcihjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgZm9yIChjb25zdCBmIG9mIGF3YWl0IHJlYWRkaXIoY2FjaGVEaXIpLmNhdGNoKCgpID0+IFtdKSkge1xuICAgIGlmIChmLmVuZHNXaXRoKFwiLm1kXCIpKSBhd2FpdCBybShqb2luKGNhY2hlRGlyLCBmKSwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWFya2Rvd24gPSB3cmFwRnJvbnRtYXR0ZXIoZW50cnksIHNlY3Rpb24pXG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oY2FjaGVEaXIsIGAke2VudHJ5LnNsdWd9Lm1kYCksIG1hcmtkb3duLCBcInV0Zi04XCIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRGcm9tTG9jYWwoc291cmNlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUocm9vdCwgc291cmNlKVxuICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsIFwidXRmLThcIilcbiAgcmV0dXJuIHNwbGl0TG9jYWxDaGFuZ2Vsb2coYm9keSlcbn1cblxuLyoqIFBhcnNlIENIQU5HRUxPRy5tZCBpbnRvIHBlci12ZXJzaW9uIGVudHJpZXMgdXNpbmcgbWRhc3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdExvY2FsQ2hhbmdlbG9nKGJvZHk6IHN0cmluZyk6IENoYW5nZWxvZ0VudHJ5W10ge1xuICBjb25zdCB0cmVlID0gcGFyc2VyLnBhcnNlKGJvZHkpIGFzIFJvb3RcbiAgY29uc3QgZW50cmllczogQ2hhbmdlbG9nRW50cnlbXSA9IFtdXG4gIGxldCBjdXJyZW50OiB7IGhlYWRpbmc6IHN0cmluZzsgY2hpbGRyZW46IFJvb3RDb250ZW50W10gfSB8IHVuZGVmaW5lZFxuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgdHJlZS5jaGlsZHJlbikge1xuICAgIGlmIChjaGlsZC50eXBlID09PSBcImhlYWRpbmdcIiAmJiBjaGlsZC5kZXB0aCA9PT0gMikge1xuICAgICAgaWYgKGN1cnJlbnQpIGVudHJpZXMucHVzaChmaW5hbGl6ZUVudHJ5KGN1cnJlbnQpKVxuICAgICAgY3VycmVudCA9IHsgaGVhZGluZzogbWRhc3RUb1N0cmluZyhjaGlsZCksIGNoaWxkcmVuOiBbXSB9XG4gICAgfSBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICBjdXJyZW50LmNoaWxkcmVuLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50KSBlbnRyaWVzLnB1c2goZmluYWxpemVFbnRyeShjdXJyZW50KSlcbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuZnVuY3Rpb24gZmluYWxpemVFbnRyeShpbnB1dDoge1xuICBoZWFkaW5nOiBzdHJpbmdcbiAgY2hpbGRyZW46IFJvb3RDb250ZW50W11cbn0pOiBDaGFuZ2Vsb2dFbnRyeSB7XG4gIGNvbnN0IHZlcnNpb25NYXRjaCA9IGlucHV0LmhlYWRpbmcubWF0Y2goL15cXFs/KFteXFxdXFxzXSspXFxdPy8pXG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uTWF0Y2g/LlsxXSA/PyBpbnB1dC5oZWFkaW5nXG4gIGNvbnN0IGRhdGVNYXRjaCA9IGlucHV0LmhlYWRpbmcubWF0Y2goL1xcZHs0fS1cXGR7Mn0tXFxkezJ9LylcbiAgY29uc3QgYm9keSA9IHJlbmRlckVudHJ5Qm9keShpbnB1dC5jaGlsZHJlbilcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBzbHVnaWZ5KHZlcnNpb24pLFxuICAgIHRpdGxlOiB2ZXJzaW9uLFxuICAgIGRhdGU6IGRhdGVNYXRjaD8uWzBdLFxuICAgIGJvZHksXG4gIH1cbn1cblxuLyoqIFNlcmlhbGl6ZSBhbiBlbnRyeSdzIG1kYXN0IGNoaWxkcmVuIGJhY2sgdG8gbWFya2Rvd24gKi9cbmZ1bmN0aW9uIHJlbmRlckVudHJ5Qm9keShjaGlsZHJlbjogUm9vdENvbnRlbnRbXSkge1xuICBjb25zdCByb290OiBSb290ID0geyB0eXBlOiBcInJvb3RcIiwgY2hpbGRyZW4gfVxuICByZXR1cm4gc3RyaW5naWZpZXIuc3RyaW5naWZ5KHJvb3QpLnRyaW1FbmQoKVxufVxuXG4vKiogRHJvcCB0aGUgYm9keSdzIGxlYWRpbmcgaDEgKHR5cGljYWxseSB0aGUgY29udmVudGlvbmFsLWNoYW5nZWxvZ1xuICogYCMgMC43LjIgKDIwMjYtMDQtMjUpYCBib2lsZXJwbGF0ZSB0aGF0IGR1cGxpY2F0ZXMgdGhlIGFydGljbGUncyB0aXRsZSksXG4gKiBzaGlmdCBoMuKAk2g2IHVwIGJ5IG9uZSBzbyBzdWJzZWN0aW9uIGhlYWRpbmdzIGJlY29tZSBoMSAvIGgyIC8g4oCmLCBhbmRcbiAqIGVzY2FwZSBzdHJheSBgPGAgb3V0c2lkZSBjb2RlIHNvIE1EWCBkb2Vzbid0IG1pc3Rha2UgdGhlbSBmb3IgSlNYLiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0JvZHkoYm9keTogc3RyaW5nKSB7XG4gIGNvbnN0IHRyZWUgPSBwYXJzZXIucGFyc2UoYm9keSkgYXMgUm9vdFxuICB2aXNpdCh0cmVlLCBcImhlYWRpbmdcIiwgbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUuZGVwdGggPiAxKSBub2RlLmRlcHRoID0gKG5vZGUuZGVwdGggLSAxKSBhcyAxIHwgMiB8IDMgfCA0IHwgNVxuICB9KVxuICBpZiAodHJlZS5jaGlsZHJlblswXT8udHlwZSA9PT0gXCJoZWFkaW5nXCIgJiYgdHJlZS5jaGlsZHJlblswXS5kZXB0aCA9PT0gMSkge1xuICAgIHRyZWUuY2hpbGRyZW4uc2hpZnQoKVxuICB9XG4gIHJldHVybiBlc2NhcGVNZHhBbmdsZXMoc3RyaW5naWZpZXIuc3RyaW5naWZ5KHRyZWUpLnRyaW1FbmQoKSlcbn1cblxuLyoqIEVzY2FwZSBgPGAgdG8gYFxcPGAgb3V0c2lkZSBmZW5jZWQgY29kZSBibG9ja3MgYW5kIGlubGluZSBiYWNrdGljayBzcGFuc1xuICogc28gY29tbWl0IG1lc3NhZ2VzIHdpdGggcGxhY2Vob2xkZXJzIGxpa2UgYDxzdWJkaXI+YCBkb24ndCBnZXQgcGFyc2VkIGFzXG4gKiBKU1ggYnkgTURYLiAqL1xuZnVuY3Rpb24gZXNjYXBlTWR4QW5nbGVzKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgbGV0IGluRmVuY2UgPSBmYWxzZVxuICByZXR1cm4gbWFya2Rvd25cbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcImBgYFwiKSkge1xuICAgICAgICBpbkZlbmNlID0gIWluRmVuY2VcbiAgICAgICAgcmV0dXJuIGxpbmVcbiAgICAgIH1cbiAgICAgIGlmIChpbkZlbmNlKSByZXR1cm4gbGluZVxuICAgICAgcmV0dXJuIGxpbmUucmVwbGFjZSgvYFteYF0qYHw8L2csIG1hdGNoID0+XG4gICAgICAgIG1hdGNoID09PSBcIjxcIiA/IFwiXFxcXDxcIiA6IG1hdGNoLFxuICAgICAgKVxuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIilcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRGcm9tR2l0SHViKFxuICBzb3VyY2U6IHN0cmluZyxcbiAgbWV0YVBhdGg6IHN0cmluZyxcbiAgY2FjaGVEaXI6IHN0cmluZyxcbik6IFByb21pc2U8Q2hhbmdlbG9nRW50cnlbXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUdpdEh1YlJlcG8oc291cmNlKVxuICBpZiAoIXBhcnNlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEdpdEh1YiByZXBvIGZyb20gc291cmNlOiAke3NvdXJjZX1gKVxuICB9XG5cbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtwYXJzZWQub3duZXJ9LyR7cGFyc2VkLnJlcG99L3JlbGVhc2VzP3Blcl9wYWdlPTEwMGBcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uXCIsXG4gICAgXCJYLUdpdEh1Yi1BcGktVmVyc2lvblwiOiBcIjIwMjItMTEtMjhcIixcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gIGlmICh0b2tlbikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEJlYXJlciAke3Rva2VufWBcblxuICBjb25zdCBtZXRhID0gYXdhaXQgcmVhZE1ldGEobWV0YVBhdGgpXG4gIGNvbnN0IGhhc0NhY2hlID0gYXdhaXQgZXhpc3RzKGNhY2hlRGlyKVxuICBpZiAobWV0YSAmJiBoYXNDYWNoZSkgaGVhZGVyc1tcIklmLU5vbmUtTWF0Y2hcIl0gPSBtZXRhLmV0YWdcblxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KVxuXG4gIGlmIChyZXMuc3RhdHVzID09PSAzMDQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHJlcy5oZWFkZXJzLmdldChcIngtcmF0ZWxpbWl0LXJlbWFpbmluZ1wiKVxuICAgIGNvbnN0IHJlc2V0ID0gcmVzLmhlYWRlcnMuZ2V0KFwieC1yYXRlbGltaXQtcmVzZXRcIilcbiAgICBjb25zdCBtc2cgPSBgR2l0SHViIEFQSSAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9IChyYXRlLWxpbWl0IHJlbWFpbmluZzogJHtyZW1haW5pbmcgPz8gXCI/XCJ9LCByZXNldDogJHtyZXNldCA/PyBcIj9cIn0pYFxuICAgIGlmIChoYXNDYWNoZSkge1xuICAgICAgY29uc29sZS53YXJuKGAke21zZ30g4oCUIGZhbGxpbmcgYmFjayB0byBjYWNoZWQgY2hhbmdlbG9nYClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGNvbnN0IHJlbGVhc2VzID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJlbGVhc2VbXVxuICBjb25zdCBldGFnID0gcmVzLmhlYWRlcnMuZ2V0KFwiZXRhZ1wiKVxuICBpZiAoZXRhZykge1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobWV0YVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgIG1ldGFQYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHsgZXRhZywgZmV0Y2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSBzYXRpc2ZpZXMgQ2FjaGVNZXRhLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKSxcbiAgICAgIFwidXRmLThcIixcbiAgICApXG4gIH1cblxuICByZXR1cm4gcmVsZWFzZXMubWFwKHJlbGVhc2UgPT4gKHtcbiAgICBzbHVnOiBzbHVnaWZ5KHJlbGVhc2UudGFnX25hbWUpLFxuICAgIHRpdGxlOiByZWxlYXNlLnRhZ19uYW1lLFxuICAgIGRhdGU6IHJlbGVhc2UucHVibGlzaGVkX2F0ID8/IHVuZGVmaW5lZCxcbiAgICBib2R5OiAocmVsZWFzZS5ib2R5ID8/IFwiXCIpLnRyaW0oKSxcbiAgICBzb3VyY2VVcmw6IHJlbGVhc2UuaHRtbF91cmwgPz8gdW5kZWZpbmVkLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gd3JhcEZyb250bWF0dGVyKGVudHJ5OiBDaGFuZ2Vsb2dFbnRyeSwgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBcIi0tLVwiLFxuICAgIGB0aXRsZTogJHtlbnRyeS50aXRsZX1gLFxuICAgIGBwYXRoOiAke3NlY3Rpb24ucHJlZml4fSR7ZW50cnkuc2x1Z30vYCxcbiAgXVxuICBpZiAoZW50cnkuZGF0ZSkgbGluZXMucHVzaChgZGF0ZTogJHtlbnRyeS5kYXRlfWApXG4gIGlmIChlbnRyeS5zb3VyY2VVcmwpIHtcbiAgICBsaW5lcy5wdXNoKGBzb3VyY2VVcmw6ICR7ZW50cnkuc291cmNlVXJsfWAsIFwic291cmNlQWN0aW9uOiB2aWV3XCIpXG4gIH1cbiAgbGluZXMucHVzaChcIi0tLVwiLCBcIlwiLCBgIyAke2VudHJ5LnRpdGxlfWAsIFwiXCIsIHByb2Nlc3NCb2R5KGVudHJ5LmJvZHkpKVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWV0YShtZXRhUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDYWNoZU1ldGEgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShtZXRhUGF0aCwgXCJ1dGYtOFwiKVxuICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2FjaGVNZXRhXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGlzdHMocGF0aDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKHBhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Config } from "../../models/config.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Load and validate a config file, checking --config/-c CLI arg, then cwd.
|
|
4
|
+
*
|
|
5
|
+
* If a path is provided explicitly (arg or `--config`/`-c`) and the
|
|
6
|
+
* file is missing, throws — the user asked for a specific config and
|
|
7
|
+
* it isn't there. If no path is provided and no `livemark.config.ts`
|
|
8
|
+
* exists in cwd, falls back to the default config with a synthesized
|
|
9
|
+
* `configPath = <cwd>/livemark.config.ts` so downstream code (target
|
|
10
|
+
* hash, watcher) still has a stable per-project key.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadConfig(path?: string): Promise<Config>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
import { dirname, resolve } from "node:path";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
import { defineConfig } from "./define.js";
|
|
13
|
+
/**
|
|
14
|
+
* Load and validate a config file, checking --config/-c CLI arg, then cwd.
|
|
15
|
+
*
|
|
16
|
+
* If a path is provided explicitly (arg or `--config`/`-c`) and the
|
|
17
|
+
* file is missing, throws — the user asked for a specific config and
|
|
18
|
+
* it isn't there. If no path is provided and no `livemark.config.ts`
|
|
19
|
+
* exists in cwd, falls back to the default config with a synthesized
|
|
20
|
+
* `configPath = <cwd>/livemark.config.ts` so downstream code (target
|
|
21
|
+
* hash, watcher) still has a stable per-project key.
|
|
22
|
+
*/
|
|
23
|
+
export async function loadConfig(path) {
|
|
24
|
+
const configIndex = process.argv.findIndex(a => a === "-c" || a === "--config");
|
|
25
|
+
const cliPath = configIndex !== -1 ? process.argv[configIndex + 1] : undefined;
|
|
26
|
+
const explicit = path ?? cliPath;
|
|
27
|
+
const resolved = resolve(explicit ?? "livemark.config.ts");
|
|
28
|
+
let input = {};
|
|
29
|
+
if (existsSync(resolved)) {
|
|
30
|
+
// Cache-bust the ESM import so dev-server restart reloads edits on disk.
|
|
31
|
+
const url = `${pathToFileURL(resolved).href}?t=${Date.now()}`;
|
|
32
|
+
const module = await import(__rewriteRelativeImportExtension(url));
|
|
33
|
+
input = module.default ?? {};
|
|
34
|
+
}
|
|
35
|
+
else if (explicit) {
|
|
36
|
+
throw new Error(`Config file not found: ${resolved}`);
|
|
37
|
+
}
|
|
38
|
+
const validated = defineConfig(input);
|
|
39
|
+
return { ...validated, root: dirname(resolved), configPath: resolved };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL2NvbmZpZy9sb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFMUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBYTtJQUM1QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxVQUFVLENBQ3BDLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDOUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLG9CQUFvQixDQUFDLENBQUE7SUFDMUQsSUFBSSxLQUFLLEdBQStCLEVBQUUsQ0FBQTtJQUMxQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pCLHlFQUF5RTtRQUN6RSxNQUFNLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUE7UUFDN0QsTUFBTSxNQUFNLEdBQTRCLE1BQU0sTUFBTSxrQ0FBQyxHQUFHLEVBQUMsQ0FBQTtRQUN6RCxLQUFLLEdBQUksTUFBTSxDQUFDLE9BQXNDLElBQUksRUFBRSxDQUFBO0lBQzlELENBQUM7U0FBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNyQyxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUE7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBVc2VyQ29uZmlnIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vZGVmaW5lLnRzXCJcblxuLyoqXG4gKiBMb2FkIGFuZCB2YWxpZGF0ZSBhIGNvbmZpZyBmaWxlLCBjaGVja2luZyAtLWNvbmZpZy8tYyBDTEkgYXJnLCB0aGVuIGN3ZC5cbiAqXG4gKiBJZiBhIHBhdGggaXMgcHJvdmlkZWQgZXhwbGljaXRseSAoYXJnIG9yIGAtLWNvbmZpZ2AvYC1jYCkgYW5kIHRoZVxuICogZmlsZSBpcyBtaXNzaW5nLCB0aHJvd3Mg4oCUIHRoZSB1c2VyIGFza2VkIGZvciBhIHNwZWNpZmljIGNvbmZpZyBhbmRcbiAqIGl0IGlzbid0IHRoZXJlLiBJZiBubyBwYXRoIGlzIHByb3ZpZGVkIGFuZCBubyBgbGl2ZW1hcmsuY29uZmlnLnRzYFxuICogZXhpc3RzIGluIGN3ZCwgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBjb25maWcgd2l0aCBhIHN5bnRoZXNpemVkXG4gKiBgY29uZmlnUGF0aCA9IDxjd2Q+L2xpdmVtYXJrLmNvbmZpZy50c2Agc28gZG93bnN0cmVhbSBjb2RlICh0YXJnZXRcbiAqIGhhc2gsIHdhdGNoZXIpIHN0aWxsIGhhcyBhIHN0YWJsZSBwZXItcHJvamVjdCBrZXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKHBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZz4ge1xuICBjb25zdCBjb25maWdJbmRleCA9IHByb2Nlc3MuYXJndi5maW5kSW5kZXgoXG4gICAgYSA9PiBhID09PSBcIi1jXCIgfHwgYSA9PT0gXCItLWNvbmZpZ1wiLFxuICApXG4gIGNvbnN0IGNsaVBhdGggPSBjb25maWdJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3ZbY29uZmlnSW5kZXggKyAxXSA6IHVuZGVmaW5lZFxuICBjb25zdCBleHBsaWNpdCA9IHBhdGggPz8gY2xpUGF0aFxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoZXhwbGljaXQgPz8gXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgbGV0IGlucHV0OiB6LmlucHV0PHR5cGVvZiBVc2VyQ29uZmlnPiA9IHt9XG4gIGlmIChleGlzdHNTeW5jKHJlc29sdmVkKSkge1xuICAgIC8vIENhY2hlLWJ1c3QgdGhlIEVTTSBpbXBvcnQgc28gZGV2LXNlcnZlciByZXN0YXJ0IHJlbG9hZHMgZWRpdHMgb24gZGlzay5cbiAgICBjb25zdCB1cmwgPSBgJHtwYXRoVG9GaWxlVVJMKHJlc29sdmVkKS5ocmVmfT90PSR7RGF0ZS5ub3coKX1gXG4gICAgY29uc3QgbW9kdWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgaW5wdXQgPSAobW9kdWxlLmRlZmF1bHQgYXMgei5pbnB1dDx0eXBlb2YgVXNlckNvbmZpZz4pID8/IHt9XG4gIH0gZWxzZSBpZiAoZXhwbGljaXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBmaWxlIG5vdCBmb3VuZDogJHtyZXNvbHZlZH1gKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRlZCA9IGRlZmluZUNvbmZpZyhpbnB1dClcbiAgcmV0dXJuIHsgLi4udmFsaWRhdGVkLCByb290OiBkaXJuYW1lKHJlc29sdmVkKSwgY29uZmlnUGF0aDogcmVzb2x2ZWQgfVxufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { temporaryDirectoryTask } from "tempy";
|
|
4
|
+
import { describe, expect, it } from "vite-plus/test";
|
|
5
|
+
import { loadConfig } from "./load.js";
|
|
6
|
+
describe("loadConfig", () => {
|
|
7
|
+
it("should throw when an explicit path points at a missing file", async () => {
|
|
8
|
+
await expect(loadConfig("/nonexistent/config.ts")).rejects.toThrow(/not found/);
|
|
9
|
+
});
|
|
10
|
+
it("should return defaults when no path is given and cwd has no config", () => temporaryDirectoryTask(async (tmpDir) => {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
try {
|
|
13
|
+
process.chdir(tmpDir);
|
|
14
|
+
const config = await loadConfig();
|
|
15
|
+
expect(config.title).toBe("Livemark");
|
|
16
|
+
expect(config.include).toBe("**/*.md");
|
|
17
|
+
expect(config.root).toBe(tmpDir);
|
|
18
|
+
expect(config.configPath).toBe(join(tmpDir, "livemark.config.ts"));
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
process.chdir(cwd);
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
24
|
+
it("should load config from explicit path", () => temporaryDirectoryTask(async (tmpDir) => {
|
|
25
|
+
const configPath = join(tmpDir, "livemark.config.ts");
|
|
26
|
+
fs.writeFileSync(configPath, 'export default { include: "articles/**/*.mdx" }\n');
|
|
27
|
+
const config = await loadConfig(configPath);
|
|
28
|
+
expect(config.include).toBe("articles/**/*.mdx");
|
|
29
|
+
expect(config.root).toBe(tmpDir);
|
|
30
|
+
}));
|
|
31
|
+
it("should apply defaults when fields are omitted", () => temporaryDirectoryTask(async (tmpDir) => {
|
|
32
|
+
const configPath = join(tmpDir, "livemark.config.ts");
|
|
33
|
+
fs.writeFileSync(configPath, "export default {}\n");
|
|
34
|
+
const config = await loadConfig(configPath);
|
|
35
|
+
expect(config.include).toBe("**/*.md");
|
|
36
|
+
expect(config.title).toBe("Livemark");
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL2FjdGlvbnMvY29uZmlnL2xvYWQudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV0QyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixFQUFFLENBQUMsNkRBQTZELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0UsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNoRSxXQUFXLENBQ1osQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRSxDQUM1RSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQTtZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtRQUNwRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRUwsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRSxDQUMvQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3JELEVBQUUsQ0FBQyxhQUFhLENBQ2QsVUFBVSxFQUNWLG1EQUFtRCxDQUNwRCxDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRUwsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRSxDQUN2RCxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3JELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDdkMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeVRhc2sgfSBmcm9tIFwidGVtcHlcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5kZXNjcmliZShcImxvYWRDb25maWdcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCB0aHJvdyB3aGVuIGFuIGV4cGxpY2l0IHBhdGggcG9pbnRzIGF0IGEgbWlzc2luZyBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBleHBlY3QobG9hZENvbmZpZyhcIi9ub25leGlzdGVudC9jb25maWcudHNcIikpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIC9ub3QgZm91bmQvLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gZGVmYXVsdHMgd2hlbiBubyBwYXRoIGlzIGdpdmVuIGFuZCBjd2QgaGFzIG5vIGNvbmZpZ1wiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIodG1wRGlyKVxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKClcbiAgICAgICAgZXhwZWN0KGNvbmZpZy50aXRsZSkudG9CZShcIkxpdmVtYXJrXCIpXG4gICAgICAgIGV4cGVjdChjb25maWcuaW5jbHVkZSkudG9CZShcIioqLyoubWRcIilcbiAgICAgICAgZXhwZWN0KGNvbmZpZy5yb290KS50b0JlKHRtcERpcilcbiAgICAgICAgZXhwZWN0KGNvbmZpZy5jb25maWdQYXRoKS50b0JlKGpvaW4odG1wRGlyLCBcImxpdmVtYXJrLmNvbmZpZy50c1wiKSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIoY3dkKVxuICAgICAgfVxuICAgIH0pKVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgY29uZmlnIGZyb20gZXhwbGljaXQgcGF0aFwiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRtcERpciwgXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIGNvbmZpZ1BhdGgsXG4gICAgICAgICdleHBvcnQgZGVmYXVsdCB7IGluY2x1ZGU6IFwiYXJ0aWNsZXMvKiovKi5tZHhcIiB9XFxuJyxcbiAgICAgIClcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoY29uZmlnUGF0aClcbiAgICAgIGV4cGVjdChjb25maWcuaW5jbHVkZSkudG9CZShcImFydGljbGVzLyoqLyoubWR4XCIpXG4gICAgICBleHBlY3QoY29uZmlnLnJvb3QpLnRvQmUodG1wRGlyKVxuICAgIH0pKVxuXG4gIGl0KFwic2hvdWxkIGFwcGx5IGRlZmF1bHRzIHdoZW4gZmllbGRzIGFyZSBvbWl0dGVkXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyB0bXBEaXIgPT4ge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4odG1wRGlyLCBcImxpdmVtYXJrLmNvbmZpZy50c1wiKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBcImV4cG9ydCBkZWZhdWx0IHt9XFxuXCIpXG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKGNvbmZpZ1BhdGgpXG4gICAgICBleHBlY3QoY29uZmlnLmluY2x1ZGUpLnRvQmUoXCIqKi8qLm1kXCIpXG4gICAgICBleHBlY3QoY29uZmlnLnRpdGxlKS50b0JlKFwiTGl2ZW1hcmtcIilcbiAgICB9KSlcbn0pXG4iXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize a fully self-contained per-consumer Vite mount at
|
|
3
|
+
* `<livemark-pkg>/targets/<hash>/`.
|
|
4
|
+
*
|
|
5
|
+
* The mount is built by copying livemark's `source/` wholesale, then
|
|
6
|
+
* overlaying any matching files from the consumer's `.livemark/`. Every
|
|
7
|
+
* file lives at its target path as a real file — no symlinks — so
|
|
8
|
+
* Vite's relative-import and bare-specifier resolution all anchor
|
|
9
|
+
* inside the target dir, where node_modules walks reach livemark's pnpm
|
|
10
|
+
* subtree natively.
|
|
11
|
+
*
|
|
12
|
+
* Behavior:
|
|
13
|
+
* - First run (target dir missing): full source copy + overlay.
|
|
14
|
+
* - Subsequent runs: skip the source copy. Source is immutable in
|
|
15
|
+
* installed mode; in livemark's own dev the watcher keeps the target
|
|
16
|
+
* in sync. Only the `.livemark/` overlay is re-applied each time —
|
|
17
|
+
* cheap, and may have changed between runs.
|
|
18
|
+
* - With `--clear` in argv: wipe the entire target dir (including
|
|
19
|
+
* downstream caches like `.vite/`, `.content-collections/`,
|
|
20
|
+
* `cache/`, `routeTree.gen.ts`) and rebuild from scratch. Use this
|
|
21
|
+
* to recover from a stale or corrupted cache.
|
|
22
|
+
*
|
|
23
|
+
* Returns the absolute path to the target dir.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildTarget(configPath: string): string;
|
|
26
|
+
/** Compute the target dir for a given consumer config path without
|
|
27
|
+
* rebuilding it. Used by code that needs to write into the target
|
|
28
|
+
* (e.g. cache writers) outside of `buildTarget`'s setup phase. */
|
|
29
|
+
export declare function targetDirFor(configPath: string): string;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../../settings.js";
|
|
5
|
+
// This file ships at <livemark-pkg>/source/actions/target/build.ts AND
|
|
6
|
+
// gets copied into <livemark-pkg>/targets/<hash>/actions/target/build.ts
|
|
7
|
+
// as part of every per-consumer mount. content-collections loads the
|
|
8
|
+
// COPIED version, so `import.meta.dirname` can land inside `targets/`.
|
|
9
|
+
// Walk up to the first directory holding livemark's `package.json` so
|
|
10
|
+
// SOURCE_DIR / TARGETS_ROOT always anchor at the package, never at a
|
|
11
|
+
// per-consumer dir.
|
|
12
|
+
const LIVEMARK_PKG = findLivemarkPkg(import.meta.dirname);
|
|
13
|
+
const SOURCE_DIR = join(LIVEMARK_PKG, "source");
|
|
14
|
+
const TARGETS_ROOT = join(LIVEMARK_PKG, "targets");
|
|
15
|
+
function findLivemarkPkg(start) {
|
|
16
|
+
let cur = start;
|
|
17
|
+
while (cur !== dirname(cur)) {
|
|
18
|
+
if (existsSync(join(cur, "package.json")))
|
|
19
|
+
return cur;
|
|
20
|
+
cur = dirname(cur);
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Could not locate livemark package root from ${start}`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Synthesize a fully self-contained per-consumer Vite mount at
|
|
26
|
+
* `<livemark-pkg>/targets/<hash>/`.
|
|
27
|
+
*
|
|
28
|
+
* The mount is built by copying livemark's `source/` wholesale, then
|
|
29
|
+
* overlaying any matching files from the consumer's `.livemark/`. Every
|
|
30
|
+
* file lives at its target path as a real file — no symlinks — so
|
|
31
|
+
* Vite's relative-import and bare-specifier resolution all anchor
|
|
32
|
+
* inside the target dir, where node_modules walks reach livemark's pnpm
|
|
33
|
+
* subtree natively.
|
|
34
|
+
*
|
|
35
|
+
* Behavior:
|
|
36
|
+
* - First run (target dir missing): full source copy + overlay.
|
|
37
|
+
* - Subsequent runs: skip the source copy. Source is immutable in
|
|
38
|
+
* installed mode; in livemark's own dev the watcher keeps the target
|
|
39
|
+
* in sync. Only the `.livemark/` overlay is re-applied each time —
|
|
40
|
+
* cheap, and may have changed between runs.
|
|
41
|
+
* - With `--clear` in argv: wipe the entire target dir (including
|
|
42
|
+
* downstream caches like `.vite/`, `.content-collections/`,
|
|
43
|
+
* `cache/`, `routeTree.gen.ts`) and rebuild from scratch. Use this
|
|
44
|
+
* to recover from a stale or corrupted cache.
|
|
45
|
+
*
|
|
46
|
+
* Returns the absolute path to the target dir.
|
|
47
|
+
*/
|
|
48
|
+
export function buildTarget(configPath) {
|
|
49
|
+
const targetDir = targetDirFor(configPath);
|
|
50
|
+
const overridesRoot = join(dirname(configPath), ".livemark");
|
|
51
|
+
const clear = process.argv.includes("--clear");
|
|
52
|
+
if (clear)
|
|
53
|
+
rmSync(targetDir, { recursive: true, force: true });
|
|
54
|
+
if (!existsSync(targetDir)) {
|
|
55
|
+
mkdirSync(targetDir, { recursive: true });
|
|
56
|
+
cpSync(SOURCE_DIR, targetDir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
for (const folder of ESCAPABLE_FOLDERS) {
|
|
59
|
+
const overlay = join(overridesRoot, folder);
|
|
60
|
+
if (!existsSync(overlay))
|
|
61
|
+
continue;
|
|
62
|
+
const dest = join(targetDir, folder);
|
|
63
|
+
if (!existsSync(dest))
|
|
64
|
+
mkdirSync(dest, { recursive: true });
|
|
65
|
+
for (const f of readdirSync(overlay)) {
|
|
66
|
+
cpSync(join(overlay, f), join(dest, f), { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const file of ESCAPABLE_FILES) {
|
|
70
|
+
const overlay = join(overridesRoot, file);
|
|
71
|
+
if (!existsSync(overlay))
|
|
72
|
+
continue;
|
|
73
|
+
cpSync(overlay, join(targetDir, file), { force: true });
|
|
74
|
+
}
|
|
75
|
+
return targetDir;
|
|
76
|
+
}
|
|
77
|
+
/** Compute the target dir for a given consumer config path without
|
|
78
|
+
* rebuilding it. Used by code that needs to write into the target
|
|
79
|
+
* (e.g. cache writers) outside of `buildTarget`'s setup phase. */
|
|
80
|
+
export function targetDirFor(configPath) {
|
|
81
|
+
const hash = createHash("sha256")
|
|
82
|
+
.update(configPath)
|
|
83
|
+
.digest("hex")
|
|
84
|
+
.slice(0, 16);
|
|
85
|
+
return join(TARGETS_ROOT, hash);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYWN0aW9ucy90YXJnZXQvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFdEUsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSxxRUFBcUU7QUFDckUsdUVBQXVFO0FBQ3ZFLHNFQUFzRTtBQUN0RSxxRUFBcUU7QUFDckUsb0JBQW9CO0FBQ3BCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN6RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFFbEQsU0FBUyxlQUFlLENBQUMsS0FBYTtJQUNwQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUE7SUFDZixPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUE7UUFDckQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUN6RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFrQjtJQUM1QyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM1RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUU5QyxJQUFJLEtBQUs7UUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQUUsU0FBUTtRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzNELEtBQUssTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFBRSxTQUFRO1FBQ2xDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O21FQUVtRTtBQUNuRSxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQWtCO0lBQzdDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDOUIsTUFBTSxDQUFDLFVBQVUsQ0FBQztTQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MudHNcIlxuXG4vLyBUaGlzIGZpbGUgc2hpcHMgYXQgPGxpdmVtYXJrLXBrZz4vc291cmNlL2FjdGlvbnMvdGFyZ2V0L2J1aWxkLnRzIEFORFxuLy8gZ2V0cyBjb3BpZWQgaW50byA8bGl2ZW1hcmstcGtnPi90YXJnZXRzLzxoYXNoPi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1xuLy8gYXMgcGFydCBvZiBldmVyeSBwZXItY29uc3VtZXIgbW91bnQuIGNvbnRlbnQtY29sbGVjdGlvbnMgbG9hZHMgdGhlXG4vLyBDT1BJRUQgdmVyc2lvbiwgc28gYGltcG9ydC5tZXRhLmRpcm5hbWVgIGNhbiBsYW5kIGluc2lkZSBgdGFyZ2V0cy9gLlxuLy8gV2FsayB1cCB0byB0aGUgZmlyc3QgZGlyZWN0b3J5IGhvbGRpbmcgbGl2ZW1hcmsncyBgcGFja2FnZS5qc29uYCBzb1xuLy8gU09VUkNFX0RJUiAvIFRBUkdFVFNfUk9PVCBhbHdheXMgYW5jaG9yIGF0IHRoZSBwYWNrYWdlLCBuZXZlciBhdCBhXG4vLyBwZXItY29uc3VtZXIgZGlyLlxuY29uc3QgTElWRU1BUktfUEtHID0gZmluZExpdmVtYXJrUGtnKGltcG9ydC5tZXRhLmRpcm5hbWUpXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihMSVZFTUFSS19QS0csIFwic291cmNlXCIpXG5jb25zdCBUQVJHRVRTX1JPT1QgPSBqb2luKExJVkVNQVJLX1BLRywgXCJ0YXJnZXRzXCIpXG5cbmZ1bmN0aW9uIGZpbmRMaXZlbWFya1BrZyhzdGFydDogc3RyaW5nKSB7XG4gIGxldCBjdXIgPSBzdGFydFxuICB3aGlsZSAoY3VyICE9PSBkaXJuYW1lKGN1cikpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGN1ciwgXCJwYWNrYWdlLmpzb25cIikpKSByZXR1cm4gY3VyXG4gICAgY3VyID0gZGlybmFtZShjdXIpXG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIGxpdmVtYXJrIHBhY2thZ2Ugcm9vdCBmcm9tICR7c3RhcnR9YClcbn1cblxuLyoqXG4gKiBTeW50aGVzaXplIGEgZnVsbHkgc2VsZi1jb250YWluZWQgcGVyLWNvbnN1bWVyIFZpdGUgbW91bnQgYXRcbiAqIGA8bGl2ZW1hcmstcGtnPi90YXJnZXRzLzxoYXNoPi9gLlxuICpcbiAqIFRoZSBtb3VudCBpcyBidWlsdCBieSBjb3B5aW5nIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIHdob2xlc2FsZSwgdGhlblxuICogb3ZlcmxheWluZyBhbnkgbWF0Y2hpbmcgZmlsZXMgZnJvbSB0aGUgY29uc3VtZXIncyBgLmxpdmVtYXJrL2AuIEV2ZXJ5XG4gKiBmaWxlIGxpdmVzIGF0IGl0cyB0YXJnZXQgcGF0aCBhcyBhIHJlYWwgZmlsZSDigJQgbm8gc3ltbGlua3Mg4oCUIHNvXG4gKiBWaXRlJ3MgcmVsYXRpdmUtaW1wb3J0IGFuZCBiYXJlLXNwZWNpZmllciByZXNvbHV0aW9uIGFsbCBhbmNob3JcbiAqIGluc2lkZSB0aGUgdGFyZ2V0IGRpciwgd2hlcmUgbm9kZV9tb2R1bGVzIHdhbGtzIHJlYWNoIGxpdmVtYXJrJ3MgcG5wbVxuICogc3VidHJlZSBuYXRpdmVseS5cbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gRmlyc3QgcnVuICh0YXJnZXQgZGlyIG1pc3NpbmcpOiBmdWxsIHNvdXJjZSBjb3B5ICsgb3ZlcmxheS5cbiAqIC0gU3Vic2VxdWVudCBydW5zOiBza2lwIHRoZSBzb3VyY2UgY29weS4gU291cmNlIGlzIGltbXV0YWJsZSBpblxuICogICBpbnN0YWxsZWQgbW9kZTsgaW4gbGl2ZW1hcmsncyBvd24gZGV2IHRoZSB3YXRjaGVyIGtlZXBzIHRoZSB0YXJnZXRcbiAqICAgaW4gc3luYy4gT25seSB0aGUgYC5saXZlbWFyay9gIG92ZXJsYXkgaXMgcmUtYXBwbGllZCBlYWNoIHRpbWUg4oCUXG4gKiAgIGNoZWFwLCBhbmQgbWF5IGhhdmUgY2hhbmdlZCBiZXR3ZWVuIHJ1bnMuXG4gKiAtIFdpdGggYC0tY2xlYXJgIGluIGFyZ3Y6IHdpcGUgdGhlIGVudGlyZSB0YXJnZXQgZGlyIChpbmNsdWRpbmdcbiAqICAgZG93bnN0cmVhbSBjYWNoZXMgbGlrZSBgLnZpdGUvYCwgYC5jb250ZW50LWNvbGxlY3Rpb25zL2AsXG4gKiAgIGBjYWNoZS9gLCBgcm91dGVUcmVlLmdlbi50c2ApIGFuZCByZWJ1aWxkIGZyb20gc2NyYXRjaC4gVXNlIHRoaXNcbiAqICAgdG8gcmVjb3ZlciBmcm9tIGEgc3RhbGUgb3IgY29ycnVwdGVkIGNhY2hlLlxuICpcbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCBkaXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRhcmdldChjb25maWdQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZ1BhdGgpXG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKGRpcm5hbWUoY29uZmlnUGF0aCksIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IGNsZWFyID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiLS1jbGVhclwiKVxuXG4gIGlmIChjbGVhcikgcm1TeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG5cbiAgaWYgKCFleGlzdHNTeW5jKHRhcmdldERpcikpIHtcbiAgICBta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIGNwU3luYyhTT1VSQ0VfRElSLCB0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IGZvbGRlciBvZiBFU0NBUEFCTEVfRk9MREVSUykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGZvbGRlcilcbiAgICBpZiAoIWV4aXN0c1N5bmMob3ZlcmxheSkpIGNvbnRpbnVlXG4gICAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBmb2xkZXIpXG4gICAgaWYgKCFleGlzdHNTeW5jKGRlc3QpKSBta2RpclN5bmMoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICBmb3IgKGNvbnN0IGYgb2YgcmVhZGRpclN5bmMob3ZlcmxheSkpIHtcbiAgICAgIGNwU3luYyhqb2luKG92ZXJsYXksIGYpLCBqb2luKGRlc3QsIGYpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBmaWxlIG9mIEVTQ0FQQUJMRV9GSUxFUykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGZpbGUpXG4gICAgaWYgKCFleGlzdHNTeW5jKG92ZXJsYXkpKSBjb250aW51ZVxuICAgIGNwU3luYyhvdmVybGF5LCBqb2luKHRhcmdldERpciwgZmlsZSksIHsgZm9yY2U6IHRydWUgfSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXREaXJcbn1cblxuLyoqIENvbXB1dGUgdGhlIHRhcmdldCBkaXIgZm9yIGEgZ2l2ZW4gY29uc3VtZXIgY29uZmlnIHBhdGggd2l0aG91dFxuICogIHJlYnVpbGRpbmcgaXQuIFVzZWQgYnkgY29kZSB0aGF0IG5lZWRzIHRvIHdyaXRlIGludG8gdGhlIHRhcmdldFxuICogIChlLmcuIGNhY2hlIHdyaXRlcnMpIG91dHNpZGUgb2YgYGJ1aWxkVGFyZ2V0YCdzIHNldHVwIHBoYXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhcmdldERpckZvcihjb25maWdQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKGNvbmZpZ1BhdGgpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNilcbiAgcmV0dXJuIGpvaW4oVEFSR0VUU19ST09ULCBoYXNoKVxufVxuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { createBuilder } from "vite";
|
|
4
|
+
const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts");
|
|
5
|
+
/**
|
|
6
|
+
* Build the site for production.
|
|
7
|
+
*/
|
|
8
|
+
export const build = new Command("build")
|
|
9
|
+
.description("Build the site for production")
|
|
10
|
+
.option("--clear", "Wipe and fully rebuild the runtime target dir")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const builder = await createBuilder({ configFile });
|
|
13
|
+
await builder.buildApp();
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQ25CLElBQUksRUFDSixJQUFJLEVBQ0osUUFBUSxFQUNSLGdCQUFnQixDQUNqQixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ3RDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQztLQUM1QyxNQUFNLENBQUMsU0FBUyxFQUFFLCtDQUErQyxDQUFDO0tBQ2xFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDMUIsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVCdWlsZGVyIH0gZnJvbSBcInZpdGVcIlxuXG5jb25zdCBjb25maWdGaWxlID0gam9pbihcbiAgaW1wb3J0Lm1ldGEuZGlybmFtZSxcbiAgXCIuLlwiLFxuICBcIi4uXCIsXG4gIFwic291cmNlXCIsXG4gIFwidml0ZS5jb25maWcudHNcIixcbilcblxuLyoqXG4gKiBCdWlsZCB0aGUgc2l0ZSBmb3IgcHJvZHVjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkID0gbmV3IENvbW1hbmQoXCJidWlsZFwiKVxuICAuZGVzY3JpcHRpb24oXCJCdWlsZCB0aGUgc2l0ZSBmb3IgcHJvZHVjdGlvblwiKVxuICAub3B0aW9uKFwiLS1jbGVhclwiLCBcIldpcGUgYW5kIGZ1bGx5IHJlYnVpbGQgdGhlIHJ1bnRpbWUgdGFyZ2V0IGRpclwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gYXdhaXQgY3JlYXRlQnVpbGRlcih7IGNvbmZpZ0ZpbGUgfSlcbiAgICBhd2FpdCBidWlsZGVyLmJ1aWxkQXBwKClcbiAgfSlcbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
/**
|
|
3
|
-
* List or copy
|
|
3
|
+
* List or copy escapable livemark files into `.livemark/`.
|
|
4
4
|
*
|
|
5
5
|
* Without an argument, prints every file you can shadow. With a path, copies
|
|
6
6
|
* the default from the livemark package into `.livemark/<path>`; fails if the
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
|
|
6
|
+
const defaultsRoot = join(import.meta.dirname, "..", "..", "source");
|
|
7
|
+
/**
|
|
8
|
+
* List or copy escapable livemark files into `.livemark/`.
|
|
9
|
+
*
|
|
10
|
+
* Without an argument, prints every file you can shadow. With a path, copies
|
|
11
|
+
* the default from the livemark package into `.livemark/<path>`; fails if the
|
|
12
|
+
* destination already exists.
|
|
13
|
+
*/
|
|
14
|
+
export const escape = new Command("escape")
|
|
15
|
+
.description("List or copy escapable livemark files into .livemark/")
|
|
16
|
+
.argument("[path]", "path relative to .livemark/ (e.g. components/Footer.tsx, client.tsx)")
|
|
17
|
+
.action((relPath) => {
|
|
18
|
+
if (!relPath) {
|
|
19
|
+
for (const file of listEscapable())
|
|
20
|
+
console.log(file);
|
|
21
|
+
console.log(pc.dim("\nRun 'livemark escape <path>' to copy a file into .livemark/"));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const isTopLevelFile = !relPath.includes("/") && ESCAPABLE_FILES.includes(relPath);
|
|
25
|
+
const [first] = relPath.split("/");
|
|
26
|
+
const isFolderPath = !!first && ESCAPABLE_FOLDERS.includes(first) && !relPath.includes("..");
|
|
27
|
+
if (!isTopLevelFile && !isFolderPath) {
|
|
28
|
+
console.error(pc.red(`Error: '${relPath}' is not escapable (folders: ${ESCAPABLE_FOLDERS.join(", ")}; files: ${ESCAPABLE_FILES.join(", ")})`));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const src = join(defaultsRoot, relPath);
|
|
32
|
+
if (!existsSync(src) || !statSync(src).isFile()) {
|
|
33
|
+
console.error(pc.red(`Error: '${relPath}' is not a livemark file`));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const dest = join(process.cwd(), ".livemark", relPath);
|
|
37
|
+
if (existsSync(dest)) {
|
|
38
|
+
console.error(pc.red(`Error: .livemark/${relPath} already exists`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
42
|
+
writeFileSync(dest, readFileSync(src));
|
|
43
|
+
console.log(`Copied ${pc.dim(relPath)} → ${pc.green(`.livemark/${relPath}`)}`);
|
|
44
|
+
});
|
|
45
|
+
function listEscapable() {
|
|
46
|
+
const files = [];
|
|
47
|
+
for (const folder of ESCAPABLE_FOLDERS) {
|
|
48
|
+
const dir = join(defaultsRoot, folder);
|
|
49
|
+
if (!existsSync(dir))
|
|
50
|
+
continue;
|
|
51
|
+
for (const entry of readdirSync(dir)) {
|
|
52
|
+
if (statSync(join(dir, entry)).isFile())
|
|
53
|
+
files.push(`${folder}/${entry}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const file of ESCAPABLE_FILES) {
|
|
57
|
+
if (existsSync(join(defaultsRoot, file)))
|
|
58
|
+
files.push(file);
|
|
59
|
+
}
|
|
60
|
+
return files.sort();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbW1hbmRzL2VzY2FwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFFBQVEsRUFDUixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRW5FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUVwRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3hDLFdBQVcsQ0FBQyx1REFBdUQsQ0FBQztLQUNwRSxRQUFRLENBQ1AsUUFBUSxFQUNSLHNFQUFzRSxDQUN2RTtLQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxFQUFFLENBQUMsR0FBRyxDQUFDLCtEQUErRCxDQUFDLENBQ3hFLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUNsQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFD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SSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmNvbnN0IGRlZmF1bHRzUm9vdCA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwic291cmNlXCIpXG5cbi8qKlxuICogTGlzdCBvciBjb3B5IGVzY2FwYWJsZSBsaXZlbWFyayBmaWxlcyBpbnRvIGAubGl2ZW1hcmsvYC5cbiAqXG4gKiBXaXRob3V0IGFuIGFyZ3VtZW50LCBwcmludHMgZXZlcnkgZmlsZSB5b3UgY2FuIHNoYWRvdy4gV2l0aCBhIHBhdGgsIGNvcGllc1xuICogdGhlIGRlZmF1bHQgZnJvbSB0aGUgbGl2ZW1hcmsgcGFja2FnZSBpbnRvIGAubGl2ZW1hcmsvPHBhdGg+YDsgZmFpbHMgaWYgdGhlXG4gKiBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZSA9IG5ldyBDb21tYW5kKFwiZXNjYXBlXCIpXG4gIC5kZXNjcmlwdGlvbihcIkxpc3Qgb3IgY29weSBlc2NhcGFibGUgbGl2ZW1hcmsgZmlsZXMgaW50byAubGl2ZW1hcmsvXCIpXG4gIC5hcmd1bWVudChcbiAgICBcIltwYXRoXVwiLFxuICAgIFwicGF0aCByZWxhdGl2ZSB0byAubGl2ZW1hcmsvIChlLmcuIGNvbXBvbmVudHMvRm9vdGVyLnRzeCwgY2xpZW50LnRzeClcIixcbiAgKVxuICAuYWN0aW9uKChyZWxQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFyZWxQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbGlzdEVzY2FwYWJsZSgpKSBjb25zb2xlLmxvZyhmaWxlKVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIHBjLmRpbShcIlxcblJ1biAnbGl2ZW1hcmsgZXNjYXBlIDxwYXRoPicgdG8gY29weSBhIGZpbGUgaW50byAubGl2ZW1hcmsvXCIpLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNUb3BMZXZlbEZpbGUgPVxuICAgICAgIXJlbFBhdGguaW5jbHVkZXMoXCIvXCIpICYmIEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWxQYXRoKVxuICAgIGNvbnN0IFtmaXJzdF0gPSByZWxQYXRoLnNwbGl0KFwiL1wiKVxuICAgIGNvbnN0IGlzRm9sZGVyUGF0aCA9XG4gICAgICAhIWZpcnN0ICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGZpcnN0KSAmJiAhcmVsUGF0aC5pbmNsdWRlcyhcIi4uXCIpXG4gICAgaWYgKCFpc1RvcExldmVsRmlsZSAmJiAhaXNGb2xkZXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBwYy5yZWQoXG4gICAgICAgICAgYEVycm9yOiAnJHtyZWxQYXRofScgaXMgbm90IGVzY2FwYWJsZSAoZm9sZGVyczogJHtFU0NBUEFCTEVfRk9MREVSUy5qb2luKFwiLCBcIil9OyBmaWxlczogJHtFU0NBUEFCTEVfRklMRVMuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3JjID0gam9pbihkZWZhdWx0c1Jvb3QsIHJlbFBhdGgpXG4gICAgaWYgKCFleGlzdHNTeW5jKHNyYykgfHwgIXN0YXRTeW5jKHNyYykuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogJyR7cmVsUGF0aH0nIGlzIG5vdCBhIGxpdmVtYXJrIGZpbGVgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiLmxpdmVtYXJrXCIsIHJlbFBhdGgpXG4gICAgaWYgKGV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogLmxpdmVtYXJrLyR7cmVsUGF0aH0gYWxyZWFkeSBleGlzdHNgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIG1rZGlyU3luYyhkaXJuYW1lKGRlc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHdyaXRlRmlsZVN5bmMoZGVzdCwgcmVhZEZpbGVTeW5jKHNyYykpXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQ29waWVkICR7cGMuZGltKHJlbFBhdGgpfSDihpIgJHtwYy5ncmVlbihgLmxpdmVtYXJrLyR7cmVsUGF0aH1gKX1gLFxuICAgIClcbiAgfSlcblxuZnVuY3Rpb24gbGlzdEVzY2FwYWJsZSgpIHtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgRVNDQVBBQkxFX0ZPTERFUlMpIHtcbiAgICBjb25zdCBkaXIgPSBqb2luKGRlZmF1bHRzUm9vdCwgZm9sZGVyKVxuICAgIGlmICghZXhpc3RzU3luYyhkaXIpKSBjb250aW51ZVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyKSkge1xuICAgICAgaWYgKHN0YXRTeW5jKGpvaW4oZGlyLCBlbnRyeSkpLmlzRmlsZSgpKSBmaWxlcy5wdXNoKGAke2ZvbGRlcn0vJHtlbnRyeX1gKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgRVNDQVBBQkxFX0ZJTEVTKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkZWZhdWx0c1Jvb3QsIGZpbGUpKSkgZmlsZXMucHVzaChmaWxlKVxuICB9XG4gIHJldHVybiBmaWxlcy5zb3J0KClcbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { preview as vitePreview } from "vite";
|
|
4
|
+
const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts");
|
|
5
|
+
/**
|
|
6
|
+
* Preview the production build locally.
|
|
7
|
+
*/
|
|
8
|
+
export const preview = new Command("preview")
|
|
9
|
+
.description("Preview the production build locally")
|
|
10
|
+
.option("--clear", "Wipe and fully rebuild the runtime target dir")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const server = await vitePreview({
|
|
13
|
+
configFile,
|
|
14
|
+
preview: { port: 8000, host: true },
|
|
15
|
+
});
|
|
16
|
+
server.printUrls();
|
|
17
|
+
server.bindCLIShortcuts({ print: true });
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21tYW5kcy9wcmV2aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUU3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFDbkIsSUFBSSxFQUNKLElBQUksRUFDSixRQUFRLEVBQ1IsZ0JBQWdCLENBQ2pCLENBQUE7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDMUMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELE1BQU0sQ0FBQyxTQUFTLEVBQUUsK0NBQStDLENBQUM7S0FDbEUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDO1FBQy9CLFVBQVU7UUFDVixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7S0FDcEMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcHJldmlldyBhcyB2aXRlUHJldmlldyB9IGZyb20gXCJ2aXRlXCJcblxuY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oXG4gIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gIFwiLi5cIixcbiAgXCIuLlwiLFxuICBcInNvdXJjZVwiLFxuICBcInZpdGUuY29uZmlnLnRzXCIsXG4pXG5cbi8qKlxuICogUHJldmlldyB0aGUgcHJvZHVjdGlvbiBidWlsZCBsb2NhbGx5LlxuICovXG5leHBvcnQgY29uc3QgcHJldmlldyA9IG5ldyBDb21tYW5kKFwicHJldmlld1wiKVxuICAuZGVzY3JpcHRpb24oXCJQcmV2aWV3IHRoZSBwcm9kdWN0aW9uIGJ1aWxkIGxvY2FsbHlcIilcbiAgLm9wdGlvbihcIi0tY2xlYXJcIiwgXCJXaXBlIGFuZCBmdWxseSByZWJ1aWxkIHRoZSBydW50aW1lIHRhcmdldCBkaXJcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdml0ZVByZXZpZXcoe1xuICAgICAgY29uZmlnRmlsZSxcbiAgICAgIHByZXZpZXc6IHsgcG9ydDogODAwMCwgaG9zdDogdHJ1ZSB9LFxuICAgIH0pXG4gICAgc2VydmVyLnByaW50VXJscygpXG4gICAgc2VydmVyLmJpbmRDTElTaG9ydGN1dHMoeyBwcmludDogdHJ1ZSB9KVxuICB9KVxuIl19
|