livemark 0.0.0-dev

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.
Files changed (187) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/actions/config/define.d.ts +6 -0
  4. package/build/actions/config/define.js +8 -0
  5. package/build/actions/config/define.unit.d.ts +1 -0
  6. package/build/actions/config/define.unit.js +34 -0
  7. package/build/actions/config/load.d.ts +5 -0
  8. package/build/actions/config/load.js +22 -0
  9. package/build/actions/config/load.unit.d.ts +1 -0
  10. package/build/actions/config/load.unit.js +23 -0
  11. package/build/commands/build.d.ts +5 -0
  12. package/build/commands/build.js +13 -0
  13. package/build/commands/preview.d.ts +5 -0
  14. package/build/commands/preview.js +18 -0
  15. package/build/commands/start.d.ts +5 -0
  16. package/build/commands/start.js +19 -0
  17. package/build/docs/markdown/includes/example.d.ts +9 -0
  18. package/build/docs/markdown/includes/example.js +5 -0
  19. package/build/entrypoints/main.d.ts +2 -0
  20. package/build/entrypoints/main.js +12 -0
  21. package/build/helpers/program.d.ts +2 -0
  22. package/build/helpers/program.js +5 -0
  23. package/build/index.d.ts +1 -0
  24. package/build/index.js +2 -0
  25. package/build/livemark.config.d.ts +9 -0
  26. package/build/livemark.config.js +5 -0
  27. package/build/models/config.d.ts +33 -0
  28. package/build/models/config.js +14 -0
  29. package/build/program.d.ts +2 -0
  30. package/build/program.js +14 -0
  31. package/build/vite.config.d.ts +2 -0
  32. package/build/vite.config.js +48 -0
  33. package/build/website/client.tsx +10 -0
  34. package/build/website/components/Abbr.tsx +17 -0
  35. package/build/website/components/AnsiCode.tsx +15 -0
  36. package/build/website/components/Banner.tsx +32 -0
  37. package/build/website/components/Breadcrumbs.tsx +19 -0
  38. package/build/website/components/Callout.tsx +72 -0
  39. package/build/website/components/Cards.tsx +66 -0
  40. package/build/website/components/CodeBlock.tsx +118 -0
  41. package/build/website/components/CodeTabs.tsx +83 -0
  42. package/build/website/components/Columns.tsx +17 -0
  43. package/build/website/components/Content.tsx +7 -0
  44. package/build/website/components/ContentTab.tsx +7 -0
  45. package/build/website/components/ContentTabs.tsx +82 -0
  46. package/build/website/components/DefaultCatchBoundary.tsx +54 -0
  47. package/build/website/components/DefinitionList.tsx +21 -0
  48. package/build/website/components/Details.tsx +30 -0
  49. package/build/website/components/FileTree.tsx +52 -0
  50. package/build/website/components/Footer.tsx +9 -0
  51. package/build/website/components/FootnoteRef.tsx +52 -0
  52. package/build/website/components/Heading.tsx +20 -0
  53. package/build/website/components/InlineBadge.tsx +9 -0
  54. package/build/website/components/InlineIcon.tsx +21 -0
  55. package/build/website/components/InlineToc.tsx +31 -0
  56. package/build/website/components/Layout.tsx +220 -0
  57. package/build/website/components/LinkButton.tsx +31 -0
  58. package/build/website/components/Mermaid.tsx +37 -0
  59. package/build/website/components/NotFound.tsx +27 -0
  60. package/build/website/components/PackageTabs.tsx +74 -0
  61. package/build/website/components/PageToolbar.tsx +65 -0
  62. package/build/website/components/PrevNext.tsx +52 -0
  63. package/build/website/components/SearchDialog.tsx +245 -0
  64. package/build/website/components/Section.tsx +24 -0
  65. package/build/website/components/SectionHeader.tsx +35 -0
  66. package/build/website/components/SiteTitle.tsx +16 -0
  67. package/build/website/components/SortableTable.tsx +81 -0
  68. package/build/website/components/SoundCloud.tsx +16 -0
  69. package/build/website/components/Theme.tsx +40 -0
  70. package/build/website/components/Toc.tsx +99 -0
  71. package/build/website/components/YouTube.tsx +16 -0
  72. package/build/website/components/ZoomImage.tsx +30 -0
  73. package/build/website/content-collections.ts +181 -0
  74. package/build/website/elements/accordion.tsx +78 -0
  75. package/build/website/elements/alert-dialog.tsx +185 -0
  76. package/build/website/elements/alert.tsx +74 -0
  77. package/build/website/elements/aspect-ratio.tsx +22 -0
  78. package/build/website/elements/avatar.tsx +107 -0
  79. package/build/website/elements/badge.tsx +51 -0
  80. package/build/website/elements/breadcrumb.tsx +120 -0
  81. package/build/website/elements/button-group.tsx +87 -0
  82. package/build/website/elements/button.tsx +57 -0
  83. package/build/website/elements/calendar.tsx +229 -0
  84. package/build/website/elements/card.tsx +102 -0
  85. package/build/website/elements/carousel.tsx +240 -0
  86. package/build/website/elements/chart.tsx +372 -0
  87. package/build/website/elements/checkbox.tsx +26 -0
  88. package/build/website/elements/collapsible.tsx +19 -0
  89. package/build/website/elements/command.tsx +210 -0
  90. package/build/website/elements/context-menu.tsx +270 -0
  91. package/build/website/elements/dialog.tsx +152 -0
  92. package/build/website/elements/direction.tsx +4 -0
  93. package/build/website/elements/drawer.tsx +127 -0
  94. package/build/website/elements/dropdown-menu.tsx +260 -0
  95. package/build/website/elements/empty.tsx +104 -0
  96. package/build/website/elements/field.tsx +235 -0
  97. package/build/website/elements/hover-card.tsx +49 -0
  98. package/build/website/elements/input-group.tsx +171 -0
  99. package/build/website/elements/input-otp.tsx +84 -0
  100. package/build/website/elements/input.tsx +18 -0
  101. package/build/website/elements/item.tsx +199 -0
  102. package/build/website/elements/kbd.tsx +26 -0
  103. package/build/website/elements/label.tsx +17 -0
  104. package/build/website/elements/menubar.tsx +282 -0
  105. package/build/website/elements/native-select.tsx +56 -0
  106. package/build/website/elements/navigation-menu.tsx +171 -0
  107. package/build/website/elements/pagination.tsx +133 -0
  108. package/build/website/elements/popover.tsx +88 -0
  109. package/build/website/elements/progress.tsx +81 -0
  110. package/build/website/elements/radio-group.tsx +36 -0
  111. package/build/website/elements/resizable.tsx +48 -0
  112. package/build/website/elements/scroll-area.tsx +51 -0
  113. package/build/website/elements/select.tsx +200 -0
  114. package/build/website/elements/separator.tsx +22 -0
  115. package/build/website/elements/sheet.tsx +130 -0
  116. package/build/website/elements/sidebar.tsx +717 -0
  117. package/build/website/elements/skeleton.tsx +13 -0
  118. package/build/website/elements/slider.tsx +57 -0
  119. package/build/website/elements/sonner.tsx +40 -0
  120. package/build/website/elements/spinner.tsx +16 -0
  121. package/build/website/elements/switch.tsx +30 -0
  122. package/build/website/elements/table.tsx +112 -0
  123. package/build/website/elements/tabs.tsx +79 -0
  124. package/build/website/elements/textarea.tsx +16 -0
  125. package/build/website/elements/toggle-group.tsx +87 -0
  126. package/build/website/elements/toggle.tsx +43 -0
  127. package/build/website/elements/tooltip.tsx +67 -0
  128. package/build/website/env.d.ts +10 -0
  129. package/build/website/globals.d.ts +8 -0
  130. package/build/website/helpers/article-icon.ts +59 -0
  131. package/build/website/helpers/articles.ts +24 -0
  132. package/build/website/helpers/resolve-includes.ts +131 -0
  133. package/build/website/helpers/resolve-includes.unit.ts +126 -0
  134. package/build/website/helpers/search-text.ts +15 -0
  135. package/build/website/helpers/style.ts +6 -0
  136. package/build/website/helpers/theme.ts +27 -0
  137. package/build/website/helpers/toc-context.ts +10 -0
  138. package/build/website/helpers/toc.ts +51 -0
  139. package/build/website/helpers/toc.unit.ts +74 -0
  140. package/build/website/hooks/in-view.ts +30 -0
  141. package/build/website/hooks/media.ts +19 -0
  142. package/build/website/models/article.ts +40 -0
  143. package/build/website/plugins/rehype-inline-code.ts +107 -0
  144. package/build/website/plugins/remark-abbr.ts +46 -0
  145. package/build/website/plugins/remark-abbr.unit.ts +99 -0
  146. package/build/website/plugins/remark-ansi.ts +247 -0
  147. package/build/website/plugins/remark-ansi.unit.ts +197 -0
  148. package/build/website/plugins/remark-badge.ts +50 -0
  149. package/build/website/plugins/remark-badge.unit.ts +96 -0
  150. package/build/website/plugins/remark-button.ts +60 -0
  151. package/build/website/plugins/remark-button.unit.ts +147 -0
  152. package/build/website/plugins/remark-callout.ts +57 -0
  153. package/build/website/plugins/remark-card.ts +80 -0
  154. package/build/website/plugins/remark-code-tabs.ts +87 -0
  155. package/build/website/plugins/remark-columns.ts +66 -0
  156. package/build/website/plugins/remark-custom-heading-id.ts +70 -0
  157. package/build/website/plugins/remark-custom-heading-id.unit.ts +131 -0
  158. package/build/website/plugins/remark-deflist.ts +36 -0
  159. package/build/website/plugins/remark-details.ts +49 -0
  160. package/build/website/plugins/remark-filetree.ts +89 -0
  161. package/build/website/plugins/remark-filetree.unit.ts +137 -0
  162. package/build/website/plugins/remark-github-callout.ts +71 -0
  163. package/build/website/plugins/remark-icon.ts +42 -0
  164. package/build/website/plugins/remark-image.ts +25 -0
  165. package/build/website/plugins/remark-media.ts +62 -0
  166. package/build/website/plugins/remark-media.unit.ts +74 -0
  167. package/build/website/plugins/remark-mermaid.ts +23 -0
  168. package/build/website/plugins/remark-npm.ts +52 -0
  169. package/build/website/plugins/remark-steps.ts +36 -0
  170. package/build/website/plugins/remark-steps.unit.ts +97 -0
  171. package/build/website/plugins/remark-tab.ts +100 -0
  172. package/build/website/plugins/remark-tab.unit.ts +181 -0
  173. package/build/website/plugins/remark-toc.ts +39 -0
  174. package/build/website/plugins/remark-toc.unit.ts +82 -0
  175. package/build/website/plugins/shiki-icon.ts +82 -0
  176. package/build/website/plugins/shiki-line-highlight.ts +174 -0
  177. package/build/website/public/logo.svg +72 -0
  178. package/build/website/routeTree.gen.ts +86 -0
  179. package/build/website/router.tsx +34 -0
  180. package/build/website/routes/$.tsx +149 -0
  181. package/build/website/routes/__root.tsx +84 -0
  182. package/build/website/routes/index.tsx +13 -0
  183. package/build/website/server.ts +7 -0
  184. package/build/website/styles/general.css +347 -0
  185. package/build/website/vite.config.ts +36 -0
  186. package/entrypoints/main.ts +12 -0
  187. package/package.json +120 -0
package/LICENSE.md ADDED
@@ -0,0 +1,9 @@
1
+ # The MIT License (MIT)
2
+
3
+ Copyright © 2025 Evgeny Karev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Livemark
2
+
3
+ Livemark description
@@ -0,0 +1,6 @@
1
+ import type { z } from "zod";
2
+ import { UserConfig } from "../../models/config.ts";
3
+ /**
4
+ * Validate and fill defaults for a partial config object.
5
+ */
6
+ export declare function defineConfig(input: z.input<typeof UserConfig>): z.output<typeof UserConfig>;
@@ -0,0 +1,8 @@
1
+ import { UserConfig } from "../../models/config.js";
2
+ /**
3
+ * Validate and fill defaults for a partial config object.
4
+ */
5
+ export function defineConfig(input) {
6
+ return UserConfig.parse(input);
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy9jb25maWcvZGVmaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVuRDs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWlDO0lBRWpDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBVc2VyQ29uZmlnIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcudHNcIlxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBmaWxsIGRlZmF1bHRzIGZvciBhIHBhcnRpYWwgY29uZmlnIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZyhcbiAgaW5wdXQ6IHouaW5wdXQ8dHlwZW9mIFVzZXJDb25maWc+LFxuKTogei5vdXRwdXQ8dHlwZW9mIFVzZXJDb25maWc+IHtcbiAgcmV0dXJuIFVzZXJDb25maWcucGFyc2UoaW5wdXQpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ import { describe, expect, it } from "vite-plus/test";
2
+ import { defineConfig } from "./define.js";
3
+ describe("defineConfig", () => {
4
+ it("should accept include as a string", () => {
5
+ const config = defineConfig({ articles: { include: "articles/**/*.mdx" } });
6
+ expect(config.articles.include).toBe("articles/**/*.mdx");
7
+ });
8
+ it("should accept include as an array", () => {
9
+ const config = defineConfig({
10
+ articles: { include: ["articles/**/*.mdx", "guides/**/*.mdx"] },
11
+ });
12
+ expect(config.articles.include).toEqual([
13
+ "articles/**/*.mdx",
14
+ "guides/**/*.mdx",
15
+ ]);
16
+ });
17
+ it("should accept optional exclude", () => {
18
+ const config = defineConfig({
19
+ articles: { include: "**/*.mdx", exclude: "drafts/**" },
20
+ });
21
+ expect(config.articles.exclude).toBe("drafts/**");
22
+ });
23
+ it("should allow omitting exclude", () => {
24
+ const config = defineConfig({ articles: { include: "**/*.mdx" } });
25
+ expect(config.articles.exclude).toBeUndefined();
26
+ });
27
+ it("should reject missing articles", () => {
28
+ expect(() => defineConfig({})).toThrow();
29
+ });
30
+ it("should reject missing include", () => {
31
+ expect(() => defineConfig({ articles: {} })).toThrow();
32
+ });
33
+ });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLnVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb25zL2NvbmZpZy9kZWZpbmUudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRTFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQzNELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUM7WUFDMUIsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtTQUNoRSxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDdEMsbUJBQW1CO1lBQ25CLGlCQUFpQjtTQUNsQixDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7UUFDeEMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBQzFCLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtTQUN4RCxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDbkQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDakQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNqRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDL0QsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCIuL2RlZmluZS50c1wiXG5cbmRlc2NyaWJlKFwiZGVmaW5lQ29uZmlnXCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgYWNjZXB0IGluY2x1ZGUgYXMgYSBzdHJpbmdcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRlZmluZUNvbmZpZyh7IGFydGljbGVzOiB7IGluY2x1ZGU6IFwiYXJ0aWNsZXMvKiovKi5tZHhcIiB9IH0pXG4gICAgZXhwZWN0KGNvbmZpZy5hcnRpY2xlcy5pbmNsdWRlKS50b0JlKFwiYXJ0aWNsZXMvKiovKi5tZHhcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBhY2NlcHQgaW5jbHVkZSBhcyBhbiBhcnJheVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVmaW5lQ29uZmlnKHtcbiAgICAgIGFydGljbGVzOiB7IGluY2x1ZGU6IFtcImFydGljbGVzLyoqLyoubWR4XCIsIFwiZ3VpZGVzLyoqLyoubWR4XCJdIH0sXG4gICAgfSlcbiAgICBleHBlY3QoY29uZmlnLmFydGljbGVzLmluY2x1ZGUpLnRvRXF1YWwoW1xuICAgICAgXCJhcnRpY2xlcy8qKi8qLm1keFwiLFxuICAgICAgXCJndWlkZXMvKiovKi5tZHhcIixcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGFjY2VwdCBvcHRpb25hbCBleGNsdWRlXCIsICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWZpbmVDb25maWcoe1xuICAgICAgYXJ0aWNsZXM6IHsgaW5jbHVkZTogXCIqKi8qLm1keFwiLCBleGNsdWRlOiBcImRyYWZ0cy8qKlwiIH0sXG4gICAgfSlcbiAgICBleHBlY3QoY29uZmlnLmFydGljbGVzLmV4Y2x1ZGUpLnRvQmUoXCJkcmFmdHMvKipcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBhbGxvdyBvbWl0dGluZyBleGNsdWRlXCIsICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWZpbmVDb25maWcoeyBhcnRpY2xlczogeyBpbmNsdWRlOiBcIioqLyoubWR4XCIgfSB9KVxuICAgIGV4cGVjdChjb25maWcuYXJ0aWNsZXMuZXhjbHVkZSkudG9CZVVuZGVmaW5lZCgpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVqZWN0IG1pc3NpbmcgYXJ0aWNsZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBkZWZpbmVDb25maWcoe30gYXMgYW55KSkudG9UaHJvdygpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVqZWN0IG1pc3NpbmcgaW5jbHVkZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IGRlZmluZUNvbmZpZyh7IGFydGljbGVzOiB7fSB9IGFzIGFueSkpLnRvVGhyb3coKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,5 @@
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
+ export declare function loadConfig(path?: string): Promise<Config>;
@@ -0,0 +1,22 @@
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 { dirname, resolve } from "node:path";
10
+ import { defineConfig } from "./define.js";
11
+ /**
12
+ * Load and validate a config file, checking --config/-c CLI arg, then cwd.
13
+ */
14
+ export async function loadConfig(path) {
15
+ const configIndex = process.argv.findIndex(a => a === "-c" || a === "--config");
16
+ const cliPath = configIndex !== -1 ? process.argv[configIndex + 1] : undefined;
17
+ const resolved = resolve(path ?? cliPath ?? "livemark.config.ts");
18
+ const module = await import(__rewriteRelativeImportExtension(resolved));
19
+ const input = defineConfig(module.default);
20
+ return { ...input, root: dirname(resolved) };
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FjdGlvbnMvY29uZmlnL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUk1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRTFDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBYTtJQUM1QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxVQUFVLENBQ3BDLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDOUUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksb0JBQW9CLENBQUMsQ0FBQTtJQUNqRSxNQUFNLE1BQU0sR0FBNEIsTUFBTSxNQUFNLGtDQUFDLFFBQVEsRUFBQyxDQUFBO0lBQzlELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBcUMsQ0FBQyxDQUFBO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUE7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBVc2VyQ29uZmlnIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vZGVmaW5lLnRzXCJcblxuLyoqXG4gKiBMb2FkIGFuZCB2YWxpZGF0ZSBhIGNvbmZpZyBmaWxlLCBjaGVja2luZyAtLWNvbmZpZy8tYyBDTEkgYXJnLCB0aGVuIGN3ZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWcocGF0aD86IHN0cmluZyk6IFByb21pc2U8Q29uZmlnPiB7XG4gIGNvbnN0IGNvbmZpZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmZpbmRJbmRleChcbiAgICBhID0+IGEgPT09IFwiLWNcIiB8fCBhID09PSBcIi0tY29uZmlnXCIsXG4gIClcbiAgY29uc3QgY2xpUGF0aCA9IGNvbmZpZ0luZGV4ICE9PSAtMSA/IHByb2Nlc3MuYXJndltjb25maWdJbmRleCArIDFdIDogdW5kZWZpbmVkXG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShwYXRoID8/IGNsaVBhdGggPz8gXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgY29uc3QgbW9kdWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGF3YWl0IGltcG9ydChyZXNvbHZlZClcbiAgY29uc3QgaW5wdXQgPSBkZWZpbmVDb25maWcobW9kdWxlLmRlZmF1bHQgYXMgei5pbnB1dDx0eXBlb2YgVXNlckNvbmZpZz4pXG4gIHJldHVybiB7IC4uLmlucHV0LCByb290OiBkaXJuYW1lKHJlc29sdmVkKSB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
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 no config file exists", async () => {
8
+ await expect(loadConfig("/nonexistent/config.ts")).rejects.toThrow();
9
+ });
10
+ it("should load config from explicit path", () => temporaryDirectoryTask(async (tmpDir) => {
11
+ const configPath = join(tmpDir, "livemark.config.ts");
12
+ fs.writeFileSync(configPath, 'export default { articles: { include: "articles/**/*.mdx" } }\n');
13
+ const config = await loadConfig(configPath);
14
+ expect(config.articles.include).toBe("articles/**/*.mdx");
15
+ expect(config.root).toBe(tmpDir);
16
+ }));
17
+ it("should validate loaded config", () => temporaryDirectoryTask(async (tmpDir) => {
18
+ const configPath = join(tmpDir, "livemark.config.ts");
19
+ fs.writeFileSync(configPath, "export default {}\n");
20
+ await expect(loadConfig(configPath)).rejects.toThrow();
21
+ }));
22
+ });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWN0aW9ucy9jb25maWcvbG9hZC51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXRDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzFCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN0RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUUsQ0FDL0Msc0JBQXNCLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNyRCxFQUFFLENBQUMsYUFBYSxDQUNkLFVBQVUsRUFDVixpRUFBaUUsQ0FDbEUsQ0FBQTtRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFTCxFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFLENBQ3ZDLHNCQUFzQixDQUFDLEtBQUssRUFBQyxNQUFNLEVBQUMsRUFBRTtRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUE7UUFDckQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtRQUNuRCxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDeEQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeVRhc2sgfSBmcm9tIFwidGVtcHlcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5kZXNjcmliZShcImxvYWRDb25maWdcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCB0aHJvdyB3aGVuIG5vIGNvbmZpZyBmaWxlIGV4aXN0c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZXhwZWN0KGxvYWRDb25maWcoXCIvbm9uZXhpc3RlbnQvY29uZmlnLnRzXCIpKS5yZWplY3RzLnRvVGhyb3coKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgY29uZmlnIGZyb20gZXhwbGljaXQgcGF0aFwiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRtcERpciwgXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIGNvbmZpZ1BhdGgsXG4gICAgICAgICdleHBvcnQgZGVmYXVsdCB7IGFydGljbGVzOiB7IGluY2x1ZGU6IFwiYXJ0aWNsZXMvKiovKi5tZHhcIiB9IH1cXG4nLFxuICAgICAgKVxuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhjb25maWdQYXRoKVxuICAgICAgZXhwZWN0KGNvbmZpZy5hcnRpY2xlcy5pbmNsdWRlKS50b0JlKFwiYXJ0aWNsZXMvKiovKi5tZHhcIilcbiAgICAgIGV4cGVjdChjb25maWcucm9vdCkudG9CZSh0bXBEaXIpXG4gICAgfSkpXG5cbiAgaXQoXCJzaG91bGQgdmFsaWRhdGUgbG9hZGVkIGNvbmZpZ1wiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRtcERpciwgXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJleHBvcnQgZGVmYXVsdCB7fVxcblwiKVxuICAgICAgYXdhaXQgZXhwZWN0KGxvYWRDb25maWcoY29uZmlnUGF0aCkpLnJlamVjdHMudG9UaHJvdygpXG4gICAgfSkpXG59KVxuIl19
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Build the site for production.
4
+ */
5
+ export declare const build: Command;
@@ -0,0 +1,13 @@
1
+ import { join } from "node:path";
2
+ import { Command } from "commander";
3
+ import { build as viteBuild } from "vite";
4
+ const configFile = join(import.meta.dirname, "..", "website", "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
+ .action(async () => {
11
+ await viteBuild({ configFile });
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb21tYW5kcy9idWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUE7QUFFL0U7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ3RDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQztLQUM1QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDakIsTUFBTSxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0FBQ2pDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgYnVpbGQgYXMgdml0ZUJ1aWxkIH0gZnJvbSBcInZpdGVcIlxuXG5jb25zdCBjb25maWdGaWxlID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwid2Vic2l0ZVwiLCBcInZpdGUuY29uZmlnLnRzXCIpXG5cbi8qKlxuICogQnVpbGQgdGhlIHNpdGUgZm9yIHByb2R1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZCA9IG5ldyBDb21tYW5kKFwiYnVpbGRcIilcbiAgLmRlc2NyaXB0aW9uKFwiQnVpbGQgdGhlIHNpdGUgZm9yIHByb2R1Y3Rpb25cIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdml0ZUJ1aWxkKHsgY29uZmlnRmlsZSB9KVxuICB9KVxuIl19
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Preview the production build locally.
4
+ */
5
+ export declare const preview: Command;
@@ -0,0 +1,18 @@
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, "..", "website", "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
+ .action(async () => {
11
+ const server = await vitePreview({
12
+ configFile,
13
+ preview: { port: 8000, host: true },
14
+ });
15
+ server.printUrls();
16
+ server.bindCLIShortcuts({ print: true });
17
+ });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbW1hbmRzL3ByZXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRTdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRS9FOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztLQUMxQyxXQUFXLENBQUMsc0NBQXNDLENBQUM7S0FDbkQsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDO1FBQy9CLFVBQVU7UUFDVixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7S0FDcEMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcHJldmlldyBhcyB2aXRlUHJldmlldyB9IGZyb20gXCJ2aXRlXCJcblxuY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIndlYnNpdGVcIiwgXCJ2aXRlLmNvbmZpZy50c1wiKVxuXG4vKipcbiAqIFByZXZpZXcgdGhlIHByb2R1Y3Rpb24gYnVpbGQgbG9jYWxseS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXZpZXcgPSBuZXcgQ29tbWFuZChcInByZXZpZXdcIilcbiAgLmRlc2NyaXB0aW9uKFwiUHJldmlldyB0aGUgcHJvZHVjdGlvbiBidWlsZCBsb2NhbGx5XCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGF3YWl0IHZpdGVQcmV2aWV3KHtcbiAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICBwcmV2aWV3OiB7IHBvcnQ6IDgwMDAsIGhvc3Q6IHRydWUgfSxcbiAgICB9KVxuICAgIHNlcnZlci5wcmludFVybHMoKVxuICAgIHNlcnZlci5iaW5kQ0xJU2hvcnRjdXRzKHsgcHJpbnQ6IHRydWUgfSlcbiAgfSlcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Start a development server.
4
+ */
5
+ export declare const start: Command;
@@ -0,0 +1,19 @@
1
+ import { join } from "node:path";
2
+ import { Command } from "commander";
3
+ import { createServer } from "vite";
4
+ const configFile = join(import.meta.dirname, "..", "website", "vite.config.ts");
5
+ /**
6
+ * Start a development server.
7
+ */
8
+ export const start = new Command("start")
9
+ .description("Start a live server")
10
+ .action(async () => {
11
+ const server = await createServer({
12
+ configFile,
13
+ server: { port: 8000, host: true },
14
+ });
15
+ await server.listen();
16
+ server.printUrls();
17
+ server.bindCLIShortcuts({ print: true });
18
+ });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb21tYW5kcy9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtBQUUvRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdEMsV0FBVyxDQUFDLHFCQUFxQixDQUFDO0tBQ2xDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQztRQUNoQyxVQUFVO1FBQ1YsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQ25DLENBQUMsQ0FBQTtJQUNGLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3JCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNsQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUMxQyxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gXCJ2aXRlXCJcblxuY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIndlYnNpdGVcIiwgXCJ2aXRlLmNvbmZpZy50c1wiKVxuXG4vKipcbiAqIFN0YXJ0IGEgZGV2ZWxvcG1lbnQgc2VydmVyLlxuICovXG5leHBvcnQgY29uc3Qgc3RhcnQgPSBuZXcgQ29tbWFuZChcInN0YXJ0XCIpXG4gIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGEgbGl2ZSBzZXJ2ZXJcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlU2VydmVyKHtcbiAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICBzZXJ2ZXI6IHsgcG9ydDogODAwMCwgaG9zdDogdHJ1ZSB9LFxuICAgIH0pXG4gICAgYXdhaXQgc2VydmVyLmxpc3RlbigpXG4gICAgc2VydmVyLnByaW50VXJscygpXG4gICAgc2VydmVyLmJpbmRDTElTaG9ydGN1dHMoeyBwcmludDogdHJ1ZSB9KVxuICB9KVxuIl19
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ title: string;
3
+ description: string;
4
+ articles: {
5
+ include: string | string[];
6
+ exclude?: string | string[] | undefined;
7
+ };
8
+ };
9
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { defineConfig } from "livemark";
2
+ export default defineConfig({
3
+ articles: { include: "docs/*.md" },
4
+ });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RvY3MvbWFya2Rvd24vaW5jbHVkZXMvZXhhbXBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXZDLGVBQWUsWUFBWSxDQUFDO0lBQzFCLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUU7Q0FDbkMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcImxpdmVtYXJrXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgYXJ0aWNsZXM6IHsgaW5jbHVkZTogXCJkb2NzLyoubWRcIiB9LFxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ process.removeAllListeners("warning");
3
+ process.on("warning", warning => {
4
+ if (warning.name === "ExperimentalWarning") {
5
+ return;
6
+ }
7
+ console.warn(warning);
8
+ });
9
+ const { program } = await import("../program.js");
10
+ program.parse();
11
+ export {};
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2VudHJ5cG9pbnRzL21haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNyQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRTtJQUM5QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztRQUMzQyxPQUFNO0lBQ1IsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkIsQ0FBQyxDQUFDLENBQUE7QUFFRixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7QUFDakQsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyhcIndhcm5pbmdcIilcbnByb2Nlc3Mub24oXCJ3YXJuaW5nXCIsIHdhcm5pbmcgPT4ge1xuICBpZiAod2FybmluZy5uYW1lID09PSBcIkV4cGVyaW1lbnRhbFdhcm5pbmdcIikge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUud2Fybih3YXJuaW5nKVxufSlcblxuY29uc3QgeyBwcm9ncmFtIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9wcm9ncmFtLnRzXCIpXG5wcm9ncmFtLnBhcnNlKClcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type { HelpConfiguration } from "commander";
2
+ export declare const helpConfiguration: HelpConfiguration;
@@ -0,0 +1,5 @@
1
+ import pc from "picocolors";
2
+ export const helpConfiguration = {
3
+ styleTitle: str => pc.bold(str.toUpperCase().replace(":", "")),
4
+ };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2hlbHBlcnMvcHJvZ3JhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFM0IsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQXNCO0lBQ2xELFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDL0QsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSGVscENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCBwYyBmcm9tIFwicGljb2NvbG9yc1wiXG5cbmV4cG9ydCBjb25zdCBoZWxwQ29uZmlndXJhdGlvbjogSGVscENvbmZpZ3VyYXRpb24gPSB7XG4gIHN0eWxlVGl0bGU6IHN0ciA9PiBwYy5ib2xkKHN0ci50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoXCI6XCIsIFwiXCIpKSxcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export { defineConfig } from "./actions/config/define.ts";
package/build/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { defineConfig } from "./actions/config/define.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwiLi9hY3Rpb25zL2NvbmZpZy9kZWZpbmUudHNcIlxuIl19
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ title: string;
3
+ description: string;
4
+ articles: {
5
+ include: string | string[];
6
+ exclude?: string | string[] | undefined;
7
+ };
8
+ };
9
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { defineConfig } from "./index.js";
2
+ export default defineConfig({
3
+ articles: { include: "docs/**/*.md", exclude: "docs/**/includes/**" },
4
+ });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZW1hcmsuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGl2ZW1hcmsuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFekMsZUFBZSxZQUFZLENBQUM7SUFDMUIsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUU7Q0FDdEUsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vaW5kZXgudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBhcnRpY2xlczogeyBpbmNsdWRlOiBcImRvY3MvKiovKi5tZFwiLCBleGNsdWRlOiBcImRvY3MvKiovaW5jbHVkZXMvKipcIiB9LFxufSlcbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * User-provided configuration for Livemark.
4
+ */
5
+ export type UserConfig = z.infer<typeof UserConfig>;
6
+ export declare const UserConfig: z.ZodObject<{
7
+ title: z.ZodDefault<z.ZodString>;
8
+ description: z.ZodDefault<z.ZodString>;
9
+ articles: z.ZodObject<{
10
+ include: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
11
+ exclude: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
12
+ }, z.core.$strip>;
13
+ }, z.core.$strip>;
14
+ /**
15
+ * System-computed configuration derived from the config file location.
16
+ */
17
+ export type SystemConfig = z.infer<typeof SystemConfig>;
18
+ export declare const SystemConfig: z.ZodObject<{
19
+ root: z.ZodString;
20
+ }, z.core.$strip>;
21
+ /**
22
+ * Fully resolved Livemark configuration.
23
+ */
24
+ export type Config = z.infer<typeof Config>;
25
+ export declare const Config: z.ZodObject<{
26
+ title: z.ZodDefault<z.ZodString>;
27
+ description: z.ZodDefault<z.ZodString>;
28
+ articles: z.ZodObject<{
29
+ include: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
30
+ exclude: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
31
+ }, z.core.$strip>;
32
+ root: z.ZodString;
33
+ }, z.core.$strip>;
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export const UserConfig = z.object({
3
+ title: z.string().default("Livemark"),
4
+ description: z.string().default("Markdown site generator"),
5
+ articles: z.object({
6
+ include: z.union([z.string(), z.array(z.string())]),
7
+ exclude: z.union([z.string(), z.array(z.string())]).optional(),
8
+ }),
9
+ });
10
+ export const SystemConfig = z.object({
11
+ root: z.string(),
12
+ });
13
+ export const Config = UserConfig.merge(SystemConfig);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbW9kZWxzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBTXZCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2pDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztJQUMxRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0tBQy9ELENBQUM7Q0FDSCxDQUFDLENBQUE7QUFNRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNqQixDQUFDLENBQUE7QUFNRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcblxuLyoqXG4gKiBVc2VyLXByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gZm9yIExpdmVtYXJrLlxuICovXG5leHBvcnQgdHlwZSBVc2VyQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgVXNlckNvbmZpZz5cbmV4cG9ydCBjb25zdCBVc2VyQ29uZmlnID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZWZhdWx0KFwiTGl2ZW1hcmtcIiksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLmRlZmF1bHQoXCJNYXJrZG93biBzaXRlIGdlbmVyYXRvclwiKSxcbiAgYXJ0aWNsZXM6IHoub2JqZWN0KHtcbiAgICBpbmNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSksXG4gICAgZXhjbHVkZTogei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pLm9wdGlvbmFsKCksXG4gIH0pLFxufSlcblxuLyoqXG4gKiBTeXN0ZW0tY29tcHV0ZWQgY29uZmlndXJhdGlvbiBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZyBmaWxlIGxvY2F0aW9uLlxuICovXG5leHBvcnQgdHlwZSBTeXN0ZW1Db25maWcgPSB6LmluZmVyPHR5cGVvZiBTeXN0ZW1Db25maWc+XG5leHBvcnQgY29uc3QgU3lzdGVtQ29uZmlnID0gei5vYmplY3Qoe1xuICByb290OiB6LnN0cmluZygpLFxufSlcblxuLyoqXG4gKiBGdWxseSByZXNvbHZlZCBMaXZlbWFyayBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDb25maWcgPSB6LmluZmVyPHR5cGVvZiBDb25maWc+XG5leHBvcnQgY29uc3QgQ29uZmlnID0gVXNlckNvbmZpZy5tZXJnZShTeXN0ZW1Db25maWcpXG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const program: Command;
@@ -0,0 +1,14 @@
1
+ import { Command } from "commander";
2
+ import { build } from "./commands/build.js";
3
+ import { preview } from "./commands/preview.js";
4
+ import { start } from "./commands/start.js";
5
+ import { helpConfiguration } from "./helpers/program.js";
6
+ export const program = new Command()
7
+ .name("livemark")
8
+ .description("Livemark static site generator")
9
+ .option("-c, --config <path>", "path to config file")
10
+ .configureHelp(helpConfiguration)
11
+ .addCommand(start)
12
+ .addCommand(build)
13
+ .addCommand(preview);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3Byb2dyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUV4RCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUU7S0FDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQztLQUNoQixXQUFXLENBQUMsZ0NBQWdDLENBQUM7S0FDN0MsTUFBTSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0tBQ3BELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztLQUNoQyxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ2pCLFVBQVUsQ0FBQyxLQUFLLENBQUM7S0FDakIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgYnVpbGQgfSBmcm9tIFwiLi9jb21tYW5kcy9idWlsZC50c1wiXG5pbXBvcnQgeyBwcmV2aWV3IH0gZnJvbSBcIi4vY29tbWFuZHMvcHJldmlldy50c1wiXG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCIuL2NvbW1hbmRzL3N0YXJ0LnRzXCJcbmltcG9ydCB7IGhlbHBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vaGVscGVycy9wcm9ncmFtLnRzXCJcblxuZXhwb3J0IGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwibGl2ZW1hcmtcIilcbiAgLmRlc2NyaXB0aW9uKFwiTGl2ZW1hcmsgc3RhdGljIHNpdGUgZ2VuZXJhdG9yXCIpXG4gIC5vcHRpb24oXCItYywgLS1jb25maWcgPHBhdGg+XCIsIFwicGF0aCB0byBjb25maWcgZmlsZVwiKVxuICAuY29uZmlndXJlSGVscChoZWxwQ29uZmlndXJhdGlvbilcbiAgLmFkZENvbW1hbmQoc3RhcnQpXG4gIC5hZGRDb21tYW5kKGJ1aWxkKVxuICAuYWRkQ29tbWFuZChwcmV2aWV3KVxuIl19
@@ -0,0 +1,2 @@
1
+ declare const _default: UserConfig;
2
+ export default _default;
@@ -0,0 +1,48 @@
1
+ import { basename, dirname, join } from "node:path";
2
+ import { coverageConfigDefaults, defineConfig } from "vite-plus";
3
+ const ignorePatterns = ["**/generated/**", "**.gen.**"];
4
+ export default defineConfig({
5
+ fmt: {
6
+ semi: false,
7
+ printWidth: 80,
8
+ arrowParens: "avoid",
9
+ ignorePatterns,
10
+ },
11
+ lint: {
12
+ ignorePatterns,
13
+ options: {
14
+ typeAware: false,
15
+ typeCheck: false,
16
+ },
17
+ },
18
+ test: {
19
+ include: ["**/*.unit.(ts|tsx)"],
20
+ exclude: ["**/node_modules/**", "**/build/**"],
21
+ env: { NODE_OPTIONS: "--no-warnings" },
22
+ testTimeout: 60 * 1000,
23
+ passWithNoTests: true,
24
+ silent: "passed-only",
25
+ coverage: {
26
+ enabled: true,
27
+ reporter: ["html", "json"],
28
+ exclude: [
29
+ ...coverageConfigDefaults.exclude,
30
+ "**/@*",
31
+ "**/build/**",
32
+ "**/compile/**",
33
+ "**/coverage/**",
34
+ "**/entrypoints/**",
35
+ "**/examples/**",
36
+ "**/messages.js",
37
+ "**/program.ts",
38
+ "**/index.ts",
39
+ "**/main.ts",
40
+ ],
41
+ },
42
+ resolveSnapshotPath: (testPath, snapExtension) => {
43
+ return (join(dirname(testPath), "fixtures", "generated", basename(testPath)) +
44
+ snapExtension);
45
+ },
46
+ },
47
+ });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi92aXRlLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVoRSxNQUFNLGNBQWMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFBO0FBRXZELGVBQWUsWUFBWSxDQUFDO0lBQzFCLEdBQUcsRUFBRTtRQUNILElBQUksRUFBRSxLQUFLO1FBQ1gsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsT0FBTztRQUNwQixjQUFjO0tBQ2Y7SUFDRCxJQUFJLEVBQUU7UUFDSixjQUFjO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsU0FBUyxFQUFFLEtBQUs7WUFDaEIsU0FBUyxFQUFFLEtBQUs7U0FDakI7S0FDRjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO1FBQy9CLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQztRQUM5QyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFO1FBQ3RDLFdBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSTtRQUN0QixlQUFlLEVBQUUsSUFBSTtRQUNyQixNQUFNLEVBQUUsYUFBYTtRQUNyQixRQUFRLEVBQUU7WUFDUixPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDMUIsT0FBTyxFQUFFO2dCQUNQLEdBQUcsc0JBQXNCLENBQUMsT0FBTztnQkFDakMsT0FBTztnQkFDUCxhQUFhO2dCQUNiLGVBQWU7Z0JBQ2YsZ0JBQWdCO2dCQUNoQixtQkFBbUI7Z0JBQ25CLGdCQUFnQjtnQkFDaEIsZ0JBQWdCO2dCQUNoQixlQUFlO2dCQUNmLGFBQWE7Z0JBQ2IsWUFBWTthQUNiO1NBQ0Y7UUFDRCxtQkFBbUIsRUFBRSxDQUFDLFFBQWdCLEVBQUUsYUFBcUIsRUFBRSxFQUFFO1lBQy9ELE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRSxhQUFhLENBQ2QsQ0FBQTtRQUNILENBQUM7S0FDRjtDQUNGLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBjb3ZlcmFnZUNvbmZpZ0RlZmF1bHRzLCBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZS1wbHVzXCJcblxuY29uc3QgaWdub3JlUGF0dGVybnMgPSBbXCIqKi9nZW5lcmF0ZWQvKipcIiwgXCIqKi5nZW4uKipcIl1cblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgZm10OiB7XG4gICAgc2VtaTogZmFsc2UsXG4gICAgcHJpbnRXaWR0aDogODAsXG4gICAgYXJyb3dQYXJlbnM6IFwiYXZvaWRcIixcbiAgICBpZ25vcmVQYXR0ZXJucyxcbiAgfSxcbiAgbGludDoge1xuICAgIGlnbm9yZVBhdHRlcm5zLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGVBd2FyZTogZmFsc2UsXG4gICAgICB0eXBlQ2hlY2s6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBpbmNsdWRlOiBbXCIqKi8qLnVuaXQuKHRzfHRzeClcIl0sXG4gICAgZXhjbHVkZTogW1wiKiovbm9kZV9tb2R1bGVzLyoqXCIsIFwiKiovYnVpbGQvKipcIl0sXG4gICAgZW52OiB7IE5PREVfT1BUSU9OUzogXCItLW5vLXdhcm5pbmdzXCIgfSxcbiAgICB0ZXN0VGltZW91dDogNjAgKiAxMDAwLFxuICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICBzaWxlbnQ6IFwicGFzc2VkLW9ubHlcIixcbiAgICBjb3ZlcmFnZToge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHJlcG9ydGVyOiBbXCJodG1sXCIsIFwianNvblwiXSxcbiAgICAgIGV4Y2x1ZGU6IFtcbiAgICAgICAgLi4uY292ZXJhZ2VDb25maWdEZWZhdWx0cy5leGNsdWRlLFxuICAgICAgICBcIioqL0AqXCIsXG4gICAgICAgIFwiKiovYnVpbGQvKipcIixcbiAgICAgICAgXCIqKi9jb21waWxlLyoqXCIsXG4gICAgICAgIFwiKiovY292ZXJhZ2UvKipcIixcbiAgICAgICAgXCIqKi9lbnRyeXBvaW50cy8qKlwiLFxuICAgICAgICBcIioqL2V4YW1wbGVzLyoqXCIsXG4gICAgICAgIFwiKiovbWVzc2FnZXMuanNcIixcbiAgICAgICAgXCIqKi9wcm9ncmFtLnRzXCIsXG4gICAgICAgIFwiKiovaW5kZXgudHNcIixcbiAgICAgICAgXCIqKi9tYWluLnRzXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgcmVzb2x2ZVNuYXBzaG90UGF0aDogKHRlc3RQYXRoOiBzdHJpbmcsIHNuYXBFeHRlbnNpb246IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgam9pbihkaXJuYW1lKHRlc3RQYXRoKSwgXCJmaXh0dXJlc1wiLCBcImdlbmVyYXRlZFwiLCBiYXNlbmFtZSh0ZXN0UGF0aCkpICtcbiAgICAgICAgc25hcEV4dGVuc2lvblxuICAgICAgKVxuICAgIH0sXG4gIH0sXG59KVxuIl19
@@ -0,0 +1,10 @@
1
+ import { StartClient } from "@tanstack/react-start/client"
2
+ import { StrictMode } from "react"
3
+ import { hydrateRoot } from "react-dom/client"
4
+
5
+ hydrateRoot(
6
+ document,
7
+ <StrictMode>
8
+ <StartClient />
9
+ </StrictMode>,
10
+ )
@@ -0,0 +1,17 @@
1
+ import {
2
+ Tooltip,
3
+ TooltipContent,
4
+ TooltipTrigger,
5
+ } from "../elements/tooltip.tsx"
6
+
7
+ /** Renders an abbreviation with a shadcn tooltip showing its full form */
8
+ export function Abbr(props: { text: string; title: string }) {
9
+ return (
10
+ <Tooltip>
11
+ <TooltipTrigger className="border-b border-dotted border-muted-foreground cursor-help">
12
+ {props.text}
13
+ </TooltipTrigger>
14
+ <TooltipContent>{props.title}</TooltipContent>
15
+ </Tooltip>
16
+ )
17
+ }
@@ -0,0 +1,15 @@
1
+ /** Renders pre-formatted HTML produced from ANSI escape sequences */
2
+ export function AnsiCode(props: { html: string }) {
3
+ return (
4
+ <figure className="shiki not-prose my-4 relative rounded-xl border shadow-sm overflow-hidden text-sm bg-sidebar dark:bg-sidebar">
5
+ <div className="text-[0.8125rem] py-3.5 overflow-auto">
6
+ <pre className="min-w-full w-max">
7
+ <code
8
+ className="flex flex-col"
9
+ dangerouslySetInnerHTML={{ __html: props.html }}
10
+ />
11
+ </pre>
12
+ </div>
13
+ </figure>
14
+ )
15
+ }
@@ -0,0 +1,32 @@
1
+ import { Star, MessageCircle } from "lucide-react"
2
+
3
+ /** Technical preview banner displayed in the header */
4
+ export function Banner() {
5
+ return (
6
+ <div className="flex flex-1 items-center justify-end">
7
+ <div className="rounded-xl border border-primary/20 bg-primary/5 shadow-xs px-3 py-1.5 text-sm text-primary">
8
+ <span>
9
+ This project is in technical preview.{" "}
10
+ <a
11
+ href="https://github.com/datisthq/livemark"
12
+ target="_blank"
13
+ rel="noopener noreferrer"
14
+ className="font-semibold hover:underline underline-offset-2"
15
+ >
16
+ <Star className="inline size-3.5 align-[-0.125em]" /> Star on GitHub
17
+ </a>{" "}
18
+ and{" "}
19
+ <a
20
+ href="https://github.com/datisthq/livemark/discussions"
21
+ target="_blank"
22
+ rel="noopener noreferrer"
23
+ className="font-semibold hover:underline underline-offset-2"
24
+ >
25
+ <MessageCircle className="inline size-3.5 align-[-0.125em]" /> share
26
+ feedback!
27
+ </a>
28
+ </span>
29
+ </div>
30
+ </div>
31
+ )
32
+ }
@@ -0,0 +1,19 @@
1
+ import { Link, useMatches } from "@tanstack/react-router"
2
+
3
+ export function Breadcrumbs() {
4
+ const matches = useMatches()
5
+ const last = matches[matches.length - 1]
6
+ const loaderData = last?.loaderData as { title?: string } | undefined
7
+
8
+ return (
9
+ <nav className="flex items-center gap-1.5 text-sm text-muted-foreground">
10
+ <Link to="/" className="hover:text-foreground transition-colors">
11
+ Docs
12
+ </Link>
13
+ <span>/</span>
14
+ {loaderData?.title && (
15
+ <span className="text-foreground font-medium">{loaderData.title}</span>
16
+ )}
17
+ </nav>
18
+ )
19
+ }
@@ -0,0 +1,72 @@
1
+ import { AlertTriangle, Flame, Info, Lightbulb } from "lucide-react"
2
+ import { cn } from "../helpers/style.ts"
3
+
4
+ type CalloutType = "note" | "tip" | "info" | "warning" | "danger"
5
+
6
+ interface CalloutConfig {
7
+ icon: React.ElementType
8
+ label: string
9
+ classes: string
10
+ }
11
+
12
+ const configs: Record<CalloutType, CalloutConfig> = {
13
+ note: {
14
+ icon: Info,
15
+ label: "Note",
16
+ classes:
17
+ "border-blue-500/30 bg-blue-50/50 text-blue-900 dark:bg-blue-950/30 dark:text-blue-200",
18
+ },
19
+ info: {
20
+ icon: Info,
21
+ label: "Info",
22
+ classes:
23
+ "border-blue-500/30 bg-blue-50/50 text-blue-900 dark:bg-blue-950/30 dark:text-blue-200",
24
+ },
25
+ tip: {
26
+ icon: Lightbulb,
27
+ label: "Tip",
28
+ classes:
29
+ "border-green-500/30 bg-green-50/50 text-green-900 dark:bg-green-950/30 dark:text-green-200",
30
+ },
31
+ warning: {
32
+ icon: AlertTriangle,
33
+ label: "Warning",
34
+ classes:
35
+ "border-yellow-500/30 bg-yellow-50/50 text-yellow-900 dark:bg-yellow-950/30 dark:text-yellow-200",
36
+ },
37
+ danger: {
38
+ icon: Flame,
39
+ label: "Danger",
40
+ classes:
41
+ "border-red-500/30 bg-red-50/50 text-red-900 dark:bg-red-950/30 dark:text-red-200",
42
+ },
43
+ }
44
+
45
+ /** Styled callout block for notes, tips, warnings, and other admonitions */
46
+ export function Callout(props: {
47
+ type?: CalloutType
48
+ title?: string
49
+ children: React.ReactNode
50
+ }) {
51
+ const type = props.type ?? "note"
52
+ const config = configs[type]
53
+ const Icon = config.icon
54
+ const title = props.title ?? config.label
55
+
56
+ return (
57
+ <aside
58
+ className={cn(
59
+ "not-prose my-4 rounded-xl border px-4 py-3",
60
+ config.classes,
61
+ )}
62
+ >
63
+ <div className="flex items-center gap-2 font-semibold text-sm mb-2">
64
+ <Icon className="size-4 shrink-0" />
65
+ <span>{title}</span>
66
+ </div>
67
+ <div className="text-sm [&>p]:my-1 [&>p:first-child]:mt-0 [&>p:last-child]:mb-0">
68
+ {props.children}
69
+ </div>
70
+ </aside>
71
+ )
72
+ }