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
|
@@ -7,7 +7,10 @@ interface ChangelogEntry {
|
|
|
7
7
|
body: string;
|
|
8
8
|
sourceUrl?: string;
|
|
9
9
|
}
|
|
10
|
-
|
|
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;
|
|
11
14
|
/** Build the per-version changelog cache files for a changelog section */
|
|
12
15
|
export declare function buildChangelog(section: ChangelogSection, config: Config): Promise<void>;
|
|
13
16
|
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { access, mkdir, readFile, 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 META_SUBPATH = "cache/changelog.meta.json";
|
|
13
|
+
const parser = unified().use(remarkParse);
|
|
14
|
+
const stringifier = unified().use(remarkStringify, {
|
|
15
|
+
bullet: "-",
|
|
16
|
+
fences: true,
|
|
17
|
+
emphasis: "_",
|
|
18
|
+
});
|
|
19
|
+
/** Glob (absolute path) covering all cached changelog markdown files for
|
|
20
|
+
* a given consumer. Used by content-collections to include them in the
|
|
21
|
+
* article scan. */
|
|
22
|
+
export function cacheIncludeGlob(config) {
|
|
23
|
+
return join(targetDirFor(config.configPath), CACHE_SUBDIR, "**", "*.md");
|
|
24
|
+
}
|
|
25
|
+
/** Build the per-version changelog cache files for a changelog section */
|
|
26
|
+
export async function buildChangelog(section, config) {
|
|
27
|
+
const targetDir = targetDirFor(config.configPath);
|
|
28
|
+
const cacheDir = join(targetDir, CACHE_SUBDIR);
|
|
29
|
+
const metaPath = join(targetDir, META_SUBPATH);
|
|
30
|
+
const entries = isGitHubUrl(section.source)
|
|
31
|
+
? await buildFromGitHub(section.source, metaPath, cacheDir)
|
|
32
|
+
: await buildFromLocal(section.source, config.root);
|
|
33
|
+
if (entries === undefined)
|
|
34
|
+
return;
|
|
35
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
36
|
+
await mkdir(cacheDir, { recursive: true });
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
const markdown = wrapFrontmatter(entry, section);
|
|
39
|
+
await writeFile(join(cacheDir, `${entry.slug}.md`), markdown, "utf-8");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function buildFromLocal(source, root) {
|
|
43
|
+
const filePath = resolve(root, source);
|
|
44
|
+
const body = await readFile(filePath, "utf-8");
|
|
45
|
+
return splitLocalChangelog(body);
|
|
46
|
+
}
|
|
47
|
+
/** Parse CHANGELOG.md into per-version entries using mdast */
|
|
48
|
+
export function splitLocalChangelog(body) {
|
|
49
|
+
const tree = parser.parse(body);
|
|
50
|
+
const entries = [];
|
|
51
|
+
let current;
|
|
52
|
+
for (const child of tree.children) {
|
|
53
|
+
if (child.type === "heading" && child.depth === 2) {
|
|
54
|
+
if (current)
|
|
55
|
+
entries.push(finalizeEntry(current));
|
|
56
|
+
current = { heading: mdastToString(child), children: [] };
|
|
57
|
+
}
|
|
58
|
+
else if (current) {
|
|
59
|
+
current.children.push(child);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (current)
|
|
63
|
+
entries.push(finalizeEntry(current));
|
|
64
|
+
return entries;
|
|
65
|
+
}
|
|
66
|
+
function finalizeEntry(input) {
|
|
67
|
+
const versionMatch = input.heading.match(/^\[?([^\]\s]+)\]?/);
|
|
68
|
+
const version = versionMatch?.[1] ?? input.heading;
|
|
69
|
+
const dateMatch = input.heading.match(/\d{4}-\d{2}-\d{2}/);
|
|
70
|
+
const body = renderEntryBody(input.children);
|
|
71
|
+
return {
|
|
72
|
+
slug: slugify(version),
|
|
73
|
+
title: version,
|
|
74
|
+
date: dateMatch?.[0],
|
|
75
|
+
body,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Serialize an entry's mdast children back to markdown */
|
|
79
|
+
function renderEntryBody(children) {
|
|
80
|
+
const root = { type: "root", children };
|
|
81
|
+
return stringifier.stringify(root).trimEnd();
|
|
82
|
+
}
|
|
83
|
+
/** Drop the body's leading h1 (typically the conventional-changelog
|
|
84
|
+
* `# 0.7.2 (2026-04-25)` boilerplate that duplicates the article's title),
|
|
85
|
+
* shift h2–h6 up by one so subsection headings become h1 / h2 / …, and
|
|
86
|
+
* escape stray `<` outside code so MDX doesn't mistake them for JSX. */
|
|
87
|
+
function processBody(body) {
|
|
88
|
+
const tree = parser.parse(body);
|
|
89
|
+
visit(tree, "heading", node => {
|
|
90
|
+
if (node.depth > 1)
|
|
91
|
+
node.depth = (node.depth - 1);
|
|
92
|
+
});
|
|
93
|
+
if (tree.children[0]?.type === "heading" && tree.children[0].depth === 1) {
|
|
94
|
+
tree.children.shift();
|
|
95
|
+
}
|
|
96
|
+
return escapeMdxAngles(stringifier.stringify(tree).trimEnd());
|
|
97
|
+
}
|
|
98
|
+
/** Escape `<` to `\<` outside fenced code blocks and inline backtick spans
|
|
99
|
+
* so commit messages with placeholders like `<subdir>` don't get parsed as
|
|
100
|
+
* JSX by MDX. */
|
|
101
|
+
function escapeMdxAngles(markdown) {
|
|
102
|
+
let inFence = false;
|
|
103
|
+
return markdown
|
|
104
|
+
.split("\n")
|
|
105
|
+
.map(line => {
|
|
106
|
+
if (line.startsWith("```")) {
|
|
107
|
+
inFence = !inFence;
|
|
108
|
+
return line;
|
|
109
|
+
}
|
|
110
|
+
if (inFence)
|
|
111
|
+
return line;
|
|
112
|
+
return line.replace(/`[^`]*`|</g, match => match === "<" ? "\\<" : match);
|
|
113
|
+
})
|
|
114
|
+
.join("\n");
|
|
115
|
+
}
|
|
116
|
+
async function buildFromGitHub(source, metaPath, cacheDir) {
|
|
117
|
+
const parsed = parseGitHubRepo(source);
|
|
118
|
+
if (!parsed) {
|
|
119
|
+
throw new Error(`Could not parse GitHub repo from source: ${source}`);
|
|
120
|
+
}
|
|
121
|
+
const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/releases?per_page=100`;
|
|
122
|
+
const headers = {
|
|
123
|
+
Accept: "application/vnd.github+json",
|
|
124
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
125
|
+
};
|
|
126
|
+
const token = process.env.GITHUB_TOKEN;
|
|
127
|
+
if (token)
|
|
128
|
+
headers.Authorization = `Bearer ${token}`;
|
|
129
|
+
const meta = await readMeta(metaPath);
|
|
130
|
+
const hasCache = await exists(cacheDir);
|
|
131
|
+
if (meta && hasCache)
|
|
132
|
+
headers["If-None-Match"] = meta.etag;
|
|
133
|
+
const res = await fetch(url, { headers });
|
|
134
|
+
if (res.status === 304)
|
|
135
|
+
return undefined;
|
|
136
|
+
if (!res.ok) {
|
|
137
|
+
const remaining = res.headers.get("x-ratelimit-remaining");
|
|
138
|
+
const reset = res.headers.get("x-ratelimit-reset");
|
|
139
|
+
const msg = `GitHub API ${res.status} ${res.statusText} (rate-limit remaining: ${remaining ?? "?"}, reset: ${reset ?? "?"})`;
|
|
140
|
+
if (hasCache) {
|
|
141
|
+
console.warn(`${msg} — falling back to cached changelog`);
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
throw new Error(msg);
|
|
145
|
+
}
|
|
146
|
+
const releases = (await res.json());
|
|
147
|
+
const etag = res.headers.get("etag");
|
|
148
|
+
if (etag) {
|
|
149
|
+
await mkdir(dirname(metaPath), { recursive: true });
|
|
150
|
+
await writeFile(metaPath, JSON.stringify({ etag, fetchedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
151
|
+
}
|
|
152
|
+
return releases.map(release => ({
|
|
153
|
+
slug: slugify(release.tag_name),
|
|
154
|
+
title: release.tag_name,
|
|
155
|
+
date: release.published_at ?? undefined,
|
|
156
|
+
body: (release.body ?? "").trim(),
|
|
157
|
+
sourceUrl: release.html_url ?? undefined,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
function wrapFrontmatter(entry, section) {
|
|
161
|
+
const lines = [
|
|
162
|
+
"---",
|
|
163
|
+
`title: ${entry.title}`,
|
|
164
|
+
`path: ${section.prefix}${entry.slug}/`,
|
|
165
|
+
];
|
|
166
|
+
if (entry.date)
|
|
167
|
+
lines.push(`date: ${entry.date}`);
|
|
168
|
+
if (entry.sourceUrl) {
|
|
169
|
+
lines.push(`sourceUrl: ${entry.sourceUrl}`, "sourceAction: view");
|
|
170
|
+
}
|
|
171
|
+
lines.push("---", "", `# ${entry.title}`, "", processBody(entry.body));
|
|
172
|
+
return lines.join("\n");
|
|
173
|
+
}
|
|
174
|
+
async function readMeta(metaPath) {
|
|
175
|
+
try {
|
|
176
|
+
const raw = await readFile(metaPath, "utf-8");
|
|
177
|
+
return JSON.parse(raw);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function exists(path) {
|
|
184
|
+
try {
|
|
185
|
+
await access(path);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYWN0aW9ucy9jaGFuZ2Vsb2cvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbEQsT0FBTyxPQUFPLE1BQU0sdUJBQXVCLENBQUE7QUFFM0MsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNoRSxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUE7QUFDdEMsT0FBTyxlQUFlLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFHeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUF1QmpELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFBO0FBQ3RDLE1BQU0sWUFBWSxHQUFHLDJCQUEyQixDQUFBO0FBRWhELE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUN6QyxNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFO0lBQ2pELE1BQU0sRUFBRSxHQUFHO0lBQ1gsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsR0FBRztDQUNkLENBQUMsQ0FBQTtBQUVGOztvQkFFb0I7QUFDcEIsTUFBTSxVQUFVLGdCQUFnQixDQUFD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LCByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzbHVnaWZ5IGZyb20gXCJAc2luZHJlc29yaHVzL3NsdWdpZnlcIlxuaW1wb3J0IHR5cGUgeyBSb290LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiXG5pbXBvcnQgeyB0b1N0cmluZyBhcyBtZGFzdFRvU3RyaW5nIH0gZnJvbSBcIm1kYXN0LXV0aWwtdG8tc3RyaW5nXCJcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCJcbmltcG9ydCByZW1hcmtTdHJpbmdpZnkgZnJvbSBcInJlbWFyay1zdHJpbmdpZnlcIlxuaW1wb3J0IHsgdW5pZmllZCB9IGZyb20gXCJ1bmlmaWVkXCJcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSBcInVuaXN0LXV0aWwtdmlzaXRcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgdHlwZSB7IENoYW5nZWxvZ1NlY3Rpb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NlY3Rpb24udHNcIlxuaW1wb3J0IHsgaXNHaXRIdWJVcmwsIHBhcnNlR2l0SHViUmVwbyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL2NoYW5nZWxvZy1zb3VyY2UudHNcIlxuaW1wb3J0IHsgdGFyZ2V0RGlyRm9yIH0gZnJvbSBcIi4uL3RhcmdldC9idWlsZC50c1wiXG5cbmludGVyZmFjZSBSZWxlYXNlIHtcbiAgdGFnX25hbWU6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICBwdWJsaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIGJvZHk/OiBzdHJpbmcgfCBudWxsXG4gIGh0bWxfdXJsPzogc3RyaW5nIHwgbnVsbFxufVxuXG5pbnRlcmZhY2UgQ2FjaGVNZXRhIHtcbiAgZXRhZzogc3RyaW5nXG4gIGZldGNoZWRBdDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDaGFuZ2Vsb2dFbnRyeSB7XG4gIHNsdWc6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIGRhdGU/OiBzdHJpbmdcbiAgYm9keTogc3RyaW5nXG4gIHNvdXJjZVVybD86IHN0cmluZ1xufVxuXG5jb25zdCBDQUNIRV9TVUJESVIgPSBcImNhY2hlL2NoYW5nZWxvZ1wiXG5jb25zdCBNRVRBX1NVQlBBVEggPSBcImNhY2hlL2NoYW5nZWxvZy5tZXRhLmpzb25cIlxuXG5jb25zdCBwYXJzZXIgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKVxuY29uc3Qgc3RyaW5naWZpZXIgPSB1bmlmaWVkKCkudXNlKHJlbWFya1N0cmluZ2lmeSwge1xuICBidWxsZXQ6IFwiLVwiLFxuICBmZW5jZXM6IHRydWUsXG4gIGVtcGhhc2lzOiBcIl9cIixcbn0pXG5cbi8qKiBHbG9iIChhYnNvbHV0ZSBwYXRoKSBjb3ZlcmluZyBhbGwgY2FjaGVkIGNoYW5nZWxvZyBtYXJrZG93biBmaWxlcyBmb3JcbiAqICBhIGdpdmVuIGNvbnN1bWVyLiBVc2VkIGJ5IGNvbnRlbnQtY29sbGVjdGlvbnMgdG8gaW5jbHVkZSB0aGVtIGluIHRoZVxuICogIGFydGljbGUgc2Nhbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUluY2x1ZGVHbG9iKGNvbmZpZzogQ29uZmlnKSB7XG4gIHJldHVybiBqb2luKHRhcmdldERpckZvcihjb25maWcuY29uZmlnUGF0aCksIENBQ0hFX1NVQkRJUiwgXCIqKlwiLCBcIioubWRcIilcbn1cblxuLyoqIEJ1aWxkIHRoZSBwZXItdmVyc2lvbiBjaGFuZ2Vsb2cgY2FjaGUgZmlsZXMgZm9yIGEgY2hhbmdlbG9nIHNlY3Rpb24gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENoYW5nZWxvZyhcbiAgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbixcbiAgY29uZmlnOiBDb25maWcsXG4pIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZy5jb25maWdQYXRoKVxuICBjb25zdCBjYWNoZURpciA9IGpvaW4odGFyZ2V0RGlyLCBDQUNIRV9TVUJESVIpXG4gIGNvbnN0IG1ldGFQYXRoID0gam9pbih0YXJnZXREaXIsIE1FVEFfU1VCUEFUSClcblxuICBjb25zdCBlbnRyaWVzID0gaXNHaXRIdWJVcmwoc2VjdGlvbi5zb3VyY2UpXG4gICAgPyBhd2FpdCBidWlsZEZyb21HaXRIdWIoc2VjdGlvbi5zb3VyY2UsIG1ldGFQYXRoLCBjYWNoZURpcilcbiAgICA6IGF3YWl0IGJ1aWxkRnJvbUxvY2FsKHNlY3Rpb24uc291cmNlLCBjb25maWcucm9vdClcblxuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICBhd2FpdCBybShjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gIGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG1hcmtkb3duID0gd3JhcEZyb250bWF0dGVyKGVudHJ5LCBzZWN0aW9uKVxuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGNhY2hlRGlyLCBgJHtlbnRyeS5zbHVnfS5tZGApLCBtYXJrZG93biwgXCJ1dGYtOFwiKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRnJvbUxvY2FsKHNvdXJjZTogc3RyaW5nLCByb290OiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKHJvb3QsIHNvdXJjZSlcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpXG4gIHJldHVybiBzcGxpdExvY2FsQ2hhbmdlbG9nKGJvZHkpXG59XG5cbi8qKiBQYXJzZSBDSEFOR0VMT0cubWQgaW50byBwZXItdmVyc2lvbiBlbnRyaWVzIHVzaW5nIG1kYXN0ICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRMb2NhbENoYW5nZWxvZyhib2R5OiBzdHJpbmcpOiBDaGFuZ2Vsb2dFbnRyeVtdIHtcbiAgY29uc3QgdHJlZSA9IHBhcnNlci5wYXJzZShib2R5KSBhcyBSb290XG4gIGNvbnN0IGVudHJpZXM6IENoYW5nZWxvZ0VudHJ5W10gPSBbXVxuICBsZXQgY3VycmVudDogeyBoZWFkaW5nOiBzdHJpbmc7IGNoaWxkcmVuOiBSb290Q29udGVudFtdIH0gfCB1bmRlZmluZWRcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRyZWUuY2hpbGRyZW4pIHtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gXCJoZWFkaW5nXCIgJiYgY2hpbGQuZGVwdGggPT09IDIpIHtcbiAgICAgIGlmIChjdXJyZW50KSBlbnRyaWVzLnB1c2goZmluYWxpemVFbnRyeShjdXJyZW50KSlcbiAgICAgIGN1cnJlbnQgPSB7IGhlYWRpbmc6IG1kYXN0VG9TdHJpbmcoY2hpbGQpLCBjaGlsZHJlbjogW10gfVxuICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgY3VycmVudC5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudCkgZW50cmllcy5wdXNoKGZpbmFsaXplRW50cnkoY3VycmVudCkpXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGZpbmFsaXplRW50cnkoaW5wdXQ6IHtcbiAgaGVhZGluZzogc3RyaW5nXG4gIGNoaWxkcmVuOiBSb290Q29udGVudFtdXG59KTogQ2hhbmdlbG9nRW50cnkge1xuICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBpbnB1dC5oZWFkaW5nLm1hdGNoKC9eXFxbPyhbXlxcXVxcc10rKVxcXT8vKVxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk1hdGNoPy5bMV0gPz8gaW5wdXQuaGVhZGluZ1xuICBjb25zdCBkYXRlTWF0Y2ggPSBpbnB1dC5oZWFkaW5nLm1hdGNoKC9cXGR7NH0tXFxkezJ9LVxcZHsyfS8pXG4gIGNvbnN0IGJvZHkgPSByZW5kZXJFbnRyeUJvZHkoaW5wdXQuY2hpbGRyZW4pXG4gIHJldHVybiB7XG4gICAgc2x1Zzogc2x1Z2lmeSh2ZXJzaW9uKSxcbiAgICB0aXRsZTogdmVyc2lvbixcbiAgICBkYXRlOiBkYXRlTWF0Y2g/LlswXSxcbiAgICBib2R5LFxuICB9XG59XG5cbi8qKiBTZXJpYWxpemUgYW4gZW50cnkncyBtZGFzdCBjaGlsZHJlbiBiYWNrIHRvIG1hcmtkb3duICovXG5mdW5jdGlvbiByZW5kZXJFbnRyeUJvZHkoY2hpbGRyZW46IFJvb3RDb250ZW50W10pIHtcbiAgY29uc3Qgcm9vdDogUm9vdCA9IHsgdHlwZTogXCJyb290XCIsIGNoaWxkcmVuIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVyLnN0cmluZ2lmeShyb290KS50cmltRW5kKClcbn1cblxuLyoqIERyb3AgdGhlIGJvZHkncyBsZWFkaW5nIGgxICh0eXBpY2FsbHkgdGhlIGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2dcbiAqIGAjIDAuNy4yICgyMDI2LTA0LTI1KWAgYm9pbGVycGxhdGUgdGhhdCBkdXBsaWNhdGVzIHRoZSBhcnRpY2xlJ3MgdGl0bGUpLFxuICogc2hpZnQgaDLigJNoNiB1cCBieSBvbmUgc28gc3Vic2VjdGlvbiBoZWFkaW5ncyBiZWNvbWUgaDEgLyBoMiAvIOKApiwgYW5kXG4gKiBlc2NhcGUgc3RyYXkgYDxgIG91dHNpZGUgY29kZSBzbyBNRFggZG9lc24ndCBtaXN0YWtlIHRoZW0gZm9yIEpTWC4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NCb2R5KGJvZHk6IHN0cmluZykge1xuICBjb25zdCB0cmVlID0gcGFyc2VyLnBhcnNlKGJvZHkpIGFzIFJvb3RcbiAgdmlzaXQodHJlZSwgXCJoZWFkaW5nXCIsIG5vZGUgPT4ge1xuICAgIGlmIChub2RlLmRlcHRoID4gMSkgbm9kZS5kZXB0aCA9IChub2RlLmRlcHRoIC0gMSkgYXMgMSB8IDIgfCAzIHwgNCB8IDVcbiAgfSlcbiAgaWYgKHRyZWUuY2hpbGRyZW5bMF0/LnR5cGUgPT09IFwiaGVhZGluZ1wiICYmIHRyZWUuY2hpbGRyZW5bMF0uZGVwdGggPT09IDEpIHtcbiAgICB0cmVlLmNoaWxkcmVuLnNoaWZ0KClcbiAgfVxuICByZXR1cm4gZXNjYXBlTWR4QW5nbGVzKHN0cmluZ2lmaWVyLnN0cmluZ2lmeSh0cmVlKS50cmltRW5kKCkpXG59XG5cbi8qKiBFc2NhcGUgYDxgIHRvIGBcXDxgIG91dHNpZGUgZmVuY2VkIGNvZGUgYmxvY2tzIGFuZCBpbmxpbmUgYmFja3RpY2sgc3BhbnNcbiAqIHNvIGNvbW1pdCBtZXNzYWdlcyB3aXRoIHBsYWNlaG9sZGVycyBsaWtlIGA8c3ViZGlyPmAgZG9uJ3QgZ2V0IHBhcnNlZCBhc1xuICogSlNYIGJ5IE1EWC4gKi9cbmZ1bmN0aW9uIGVzY2FwZU1keEFuZ2xlcyhtYXJrZG93bjogc3RyaW5nKSB7XG4gIGxldCBpbkZlbmNlID0gZmFsc2VcbiAgcmV0dXJuIG1hcmtkb3duXG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLm1hcChsaW5lID0+IHtcbiAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJgYGBcIikpIHtcbiAgICAgICAgaW5GZW5jZSA9ICFpbkZlbmNlXG4gICAgICAgIHJldHVybiBsaW5lXG4gICAgICB9XG4gICAgICBpZiAoaW5GZW5jZSkgcmV0dXJuIGxpbmVcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2UoL2BbXmBdKmB8PC9nLCBtYXRjaCA9PlxuICAgICAgICBtYXRjaCA9PT0gXCI8XCIgPyBcIlxcXFw8XCIgOiBtYXRjaCxcbiAgICAgIClcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRnJvbUdpdEh1YihcbiAgc291cmNlOiBzdHJpbmcsXG4gIG1ldGFQYXRoOiBzdHJpbmcsXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPENoYW5nZWxvZ0VudHJ5W10gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VHaXRIdWJSZXBvKHNvdXJjZSlcbiAgaWYgKCFwYXJzZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBHaXRIdWIgcmVwbyBmcm9tIHNvdXJjZTogJHtzb3VyY2V9YClcbiAgfVxuXG4gIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cGFyc2VkLm93bmVyfS8ke3BhcnNlZC5yZXBvfS9yZWxlYXNlcz9wZXJfcGFnZT0xMDBgXG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvblwiLFxuICAgIFwiWC1HaXRIdWItQXBpLVZlcnNpb25cIjogXCIyMDIyLTExLTI4XCIsXG4gIH1cblxuICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICBpZiAodG9rZW4pIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gXG5cbiAgY29uc3QgbWV0YSA9IGF3YWl0IHJlYWRNZXRhKG1ldGFQYXRoKVxuICBjb25zdCBoYXNDYWNoZSA9IGF3YWl0IGV4aXN0cyhjYWNoZURpcilcbiAgaWYgKG1ldGEgJiYgaGFzQ2FjaGUpIGhlYWRlcnNbXCJJZi1Ob25lLU1hdGNoXCJdID0gbWV0YS5ldGFnXG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSlcblxuICBpZiAocmVzLnN0YXR1cyA9PT0gMzA0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSByZXMuaGVhZGVycy5nZXQoXCJ4LXJhdGVsaW1pdC1yZW1haW5pbmdcIilcbiAgICBjb25zdCByZXNldCA9IHJlcy5oZWFkZXJzLmdldChcIngtcmF0ZWxpbWl0LXJlc2V0XCIpXG4gICAgY29uc3QgbXNnID0gYEdpdEh1YiBBUEkgJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fSAocmF0ZS1saW1pdCByZW1haW5pbmc6ICR7cmVtYWluaW5nID8/IFwiP1wifSwgcmVzZXQ6ICR7cmVzZXQgPz8gXCI/XCJ9KWBcbiAgICBpZiAoaGFzQ2FjaGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHttc2d9IOKAlCBmYWxsaW5nIGJhY2sgdG8gY2FjaGVkIGNoYW5nZWxvZ2ApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpXG4gIH1cblxuICBjb25zdCByZWxlYXNlcyA9IChhd2FpdCByZXMuanNvbigpKSBhcyBSZWxlYXNlW11cbiAgY29uc3QgZXRhZyA9IHJlcy5oZWFkZXJzLmdldChcImV0YWdcIilcbiAgaWYgKGV0YWcpIHtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG1ldGFQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBtZXRhUGF0aCxcbiAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7IGV0YWcsIGZldGNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0gc2F0aXNmaWVzIENhY2hlTWV0YSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICksXG4gICAgICBcInV0Zi04XCIsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VzLm1hcChyZWxlYXNlID0+ICh7XG4gICAgc2x1Zzogc2x1Z2lmeShyZWxlYXNlLnRhZ19uYW1lKSxcbiAgICB0aXRsZTogcmVsZWFzZS50YWdfbmFtZSxcbiAgICBkYXRlOiByZWxlYXNlLnB1Ymxpc2hlZF9hdCA/PyB1bmRlZmluZWQsXG4gICAgYm9keTogKHJlbGVhc2UuYm9keSA/PyBcIlwiKS50cmltKCksXG4gICAgc291cmNlVXJsOiByZWxlYXNlLmh0bWxfdXJsID8/IHVuZGVmaW5lZCxcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIHdyYXBGcm9udG1hdHRlcihlbnRyeTogQ2hhbmdlbG9nRW50cnksIHNlY3Rpb246IENoYW5nZWxvZ1NlY3Rpb24pIHtcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgXCItLS1cIixcbiAgICBgdGl0bGU6ICR7ZW50cnkudGl0bGV9YCxcbiAgICBgcGF0aDogJHtzZWN0aW9uLnByZWZpeH0ke2VudHJ5LnNsdWd9L2AsXG4gIF1cbiAgaWYgKGVudHJ5LmRhdGUpIGxpbmVzLnB1c2goYGRhdGU6ICR7ZW50cnkuZGF0ZX1gKVxuICBpZiAoZW50cnkuc291cmNlVXJsKSB7XG4gICAgbGluZXMucHVzaChgc291cmNlVXJsOiAke2VudHJ5LnNvdXJjZVVybH1gLCBcInNvdXJjZUFjdGlvbjogdmlld1wiKVxuICB9XG4gIGxpbmVzLnB1c2goXCItLS1cIiwgXCJcIiwgYCMgJHtlbnRyeS50aXRsZX1gLCBcIlwiLCBwcm9jZXNzQm9keShlbnRyeS5ib2R5KSlcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIilcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1ldGEobWV0YVBhdGg6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVNZXRhIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUobWV0YVBhdGgsIFwidXRmLThcIilcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIENhY2hlTWV0YVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhpc3RzKHBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGFjY2VzcyhwYXRoKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iXX0=
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbW1hbmRzL2VzY2FwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFFBQVEsRUFDUixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRW5FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUVwRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3hDLFdBQVcsQ0FBQyx1REFBdUQsQ0FBQztLQUNwRSxRQUFRLENBQ1AsUUFBUSxFQUNSLHNFQUFzRSxDQUN2RTtLQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxFQUFFLENBQUMsR0FBRyxDQUFDLCtEQUErRCxDQUFDLENBQ3hFLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUNsQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3RCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNsQyxNQUFNLFlBQVksR0FDaEIsQ0FBQyxDQUFDLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pFLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxDQUNYLEVBQUUsQ0FBQyxHQUFHLENBQ0osV0FBVyxPQUFPLGdDQUFnQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN4SCxDQUNGLENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLDBCQUEwQixDQUFDLENBQUMsQ0FBQTtRQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FDbEUsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUosU0FBUyxhQUFhO0lBQ3BCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUMxQixLQUFLLE1BQU0sTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVE7UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUNELEtBQUssTUFBTSxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmNvbnN0IGRlZmF1bHRzUm9vdCA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwic291cmNlXCIpXG5cbi8qKlxuICogTGlzdCBvciBjb3B5IGVzY2FwYWJsZSBsaXZlbWFyayBmaWxlcyBpbnRvIGAubGl2ZW1hcmsvYC5cbiAqXG4gKiBXaXRob3V0IGFuIGFyZ3VtZW50LCBwcmludHMgZXZlcnkgZmlsZSB5b3UgY2FuIHNoYWRvdy4gV2l0aCBhIHBhdGgsIGNvcGllc1xuICogdGhlIGRlZmF1bHQgZnJvbSB0aGUgbGl2ZW1hcmsgcGFja2FnZSBpbnRvIGAubGl2ZW1hcmsvPHBhdGg+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
|