livemark 0.10.5 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/build/actions/changelog/build.d.ts +22 -0
  2. package/build/actions/changelog/build.js +198 -0
  3. package/build/actions/config/load.d.ts +12 -0
  4. package/build/actions/config/load.js +41 -0
  5. package/build/actions/config/load.unit.js +39 -0
  6. package/build/actions/target/build.d.ts +29 -0
  7. package/build/actions/target/build.js +87 -0
  8. package/build/commands/build.js +15 -0
  9. package/{target → build}/commands/escape.d.ts +1 -1
  10. package/build/commands/escape.js +62 -0
  11. package/build/commands/preview.js +19 -0
  12. package/build/commands/start.js +20 -0
  13. package/build/components/Breadcrumbs.js +14 -0
  14. package/build/components/Layout.js +66 -0
  15. package/build/components/SidebarArticles.js +46 -0
  16. package/build/components/SidebarLinks.js +27 -0
  17. package/build/components/SidebarSections.js +37 -0
  18. package/build/components/SiteTitle.js +13 -0
  19. package/build/content/article.js +55 -0
  20. package/build/content/tag.js +31 -0
  21. package/build/content-collections.js +218 -0
  22. package/{target → build}/models/config.d.ts +17 -1
  23. package/build/models/config.js +38 -0
  24. package/build/plugins/vite-livemark.d.ts +12 -0
  25. package/build/plugins/vite-livemark.js +165 -0
  26. package/build/routes/__root.js +68 -0
  27. package/build/settings.d.ts +9 -0
  28. package/build/settings.js +25 -0
  29. package/build/vite.config.js +30 -0
  30. package/package.json +9 -7
  31. package/source/actions/changelog/build.ts +26 -9
  32. package/source/actions/config/load.ts +21 -6
  33. package/source/actions/config/load.unit.ts +19 -2
  34. package/source/actions/target/build.ts +89 -0
  35. package/source/commands/build.ts +1 -0
  36. package/source/commands/escape.ts +18 -11
  37. package/source/commands/preview.ts +1 -0
  38. package/source/commands/start.ts +1 -0
  39. package/source/components/Breadcrumbs.tsx +2 -1
  40. package/source/components/Layout.tsx +3 -2
  41. package/source/components/SidebarArticles.tsx +2 -1
  42. package/source/components/SidebarLinks.tsx +2 -1
  43. package/source/components/SidebarSections.tsx +2 -1
  44. package/source/components/SiteTitle.tsx +5 -10
  45. package/source/content/article.ts +2 -1
  46. package/source/content/tag.ts +2 -1
  47. package/source/content-collections.ts +1 -1
  48. package/source/env.d.ts +2 -2
  49. package/source/models/config.ts +22 -1
  50. package/source/plugins/vite-livemark.ts +168 -94
  51. package/source/routeTree.gen.ts +86 -0
  52. package/source/routes/__root.tsx +7 -9
  53. package/source/settings.ts +13 -2
  54. package/source/vite.config.ts +4 -78
  55. package/target/actions/changelog/build.d.ts +0 -15
  56. package/target/actions/changelog/build.js +0 -187
  57. package/target/actions/config/load.d.ts +0 -5
  58. package/target/actions/config/load.js +0 -25
  59. package/target/actions/config/load.unit.js +0 -25
  60. package/target/commands/build.js +0 -14
  61. package/target/commands/escape.js +0 -56
  62. package/target/commands/preview.js +0 -18
  63. package/target/commands/start.js +0 -19
  64. package/target/components/Breadcrumbs.js +0 -13
  65. package/target/components/Layout.js +0 -65
  66. package/target/components/SidebarArticles.js +0 -45
  67. package/target/components/SidebarLinks.js +0 -26
  68. package/target/components/SidebarSections.js +0 -36
  69. package/target/components/SiteTitle.js +0 -12
  70. package/target/content/article.js +0 -54
  71. package/target/content/tag.js +0 -30
  72. package/target/content-collections.js +0 -218
  73. package/target/models/config.js +0 -34
  74. package/target/plugins/vite-livemark.d.ts +0 -18
  75. package/target/plugins/vite-livemark.js +0 -111
  76. package/target/routes/__root.js +0 -69
  77. package/target/settings.d.ts +0 -5
  78. package/target/settings.js +0 -15
  79. package/target/vite.config.js +0 -89
  80. package/{target → build}/actions/changelog/build.unit.d.ts +0 -0
  81. package/{target → build}/actions/changelog/build.unit.js +0 -0
  82. package/{target → build}/actions/config/define.d.ts +0 -0
  83. package/{target → build}/actions/config/define.js +0 -0
  84. package/{target → build}/actions/config/define.unit.d.ts +0 -0
  85. package/{target → build}/actions/config/define.unit.js +0 -0
  86. package/{target → build}/actions/config/load.unit.d.ts +0 -0
  87. package/{target → build}/client.d.ts +0 -0
  88. package/{target → build}/client.js +0 -0
  89. package/{target → build}/commands/build.d.ts +0 -0
  90. package/{target → build}/commands/preview.d.ts +0 -0
  91. package/{target → build}/commands/start.d.ts +0 -0
  92. package/{target → build}/components/Abbr.d.ts +0 -0
  93. package/{target → build}/components/Abbr.js +0 -0
  94. package/{target → build}/components/AnsiCode.d.ts +0 -0
  95. package/{target → build}/components/AnsiCode.js +0 -0
  96. package/{target → build}/components/Article.d.ts +0 -0
  97. package/{target → build}/components/Article.js +0 -0
  98. package/{target → build}/components/BackToTop.d.ts +0 -0
  99. package/{target → build}/components/BackToTop.js +0 -0
  100. package/{target → build}/components/Banner.d.ts +0 -0
  101. package/{target → build}/components/Banner.js +0 -0
  102. package/{target → build}/components/BlogIndex.d.ts +0 -0
  103. package/{target → build}/components/BlogIndex.js +0 -0
  104. package/{target → build}/components/Breadcrumbs.d.ts +0 -0
  105. package/{target → build}/components/Callout.d.ts +0 -0
  106. package/{target → build}/components/Callout.js +0 -0
  107. package/{target → build}/components/Card.d.ts +0 -0
  108. package/{target → build}/components/Card.js +0 -0
  109. package/{target → build}/components/Cards.d.ts +0 -0
  110. package/{target → build}/components/Cards.js +0 -0
  111. package/{target → build}/components/ChangelogIndex.d.ts +0 -0
  112. package/{target → build}/components/ChangelogIndex.js +0 -0
  113. package/{target → build}/components/CodeBlock.d.ts +0 -0
  114. package/{target → build}/components/CodeBlock.js +0 -0
  115. package/{target → build}/components/CodeTabs.d.ts +0 -0
  116. package/{target → build}/components/CodeTabs.js +0 -0
  117. package/{target → build}/components/Column.d.ts +0 -0
  118. package/{target → build}/components/Column.js +0 -0
  119. package/{target → build}/components/Columns.d.ts +0 -0
  120. package/{target → build}/components/Columns.js +0 -0
  121. package/{target → build}/components/Content.d.ts +0 -0
  122. package/{target → build}/components/Content.js +0 -0
  123. package/{target → build}/components/ContentTab.d.ts +0 -0
  124. package/{target → build}/components/ContentTab.js +0 -0
  125. package/{target → build}/components/ContentTabs.d.ts +0 -0
  126. package/{target → build}/components/ContentTabs.js +0 -0
  127. package/{target → build}/components/DefaultCatchBoundary.d.ts +0 -0
  128. package/{target → build}/components/DefaultCatchBoundary.js +0 -0
  129. package/{target → build}/components/DefinitionList.d.ts +0 -0
  130. package/{target → build}/components/DefinitionList.js +0 -0
  131. package/{target → build}/components/Details.d.ts +0 -0
  132. package/{target → build}/components/Details.js +0 -0
  133. package/{target → build}/components/FileTree.d.ts +0 -0
  134. package/{target → build}/components/FileTree.js +0 -0
  135. package/{target → build}/components/Footer.d.ts +0 -0
  136. package/{target → build}/components/Footer.js +0 -0
  137. package/{target → build}/components/FootnoteRef.d.ts +0 -0
  138. package/{target → build}/components/FootnoteRef.js +0 -0
  139. package/{target → build}/components/Heading.d.ts +0 -0
  140. package/{target → build}/components/Heading.js +0 -0
  141. package/{target → build}/components/InlineBadge.d.ts +0 -0
  142. package/{target → build}/components/InlineBadge.js +0 -0
  143. package/{target → build}/components/InlineIcon.d.ts +0 -0
  144. package/{target → build}/components/InlineIcon.js +0 -0
  145. package/{target → build}/components/InlineToc.d.ts +0 -0
  146. package/{target → build}/components/InlineToc.js +0 -0
  147. package/{target → build}/components/Layout.d.ts +0 -0
  148. package/{target → build}/components/LinkButton.d.ts +0 -0
  149. package/{target → build}/components/LinkButton.js +0 -0
  150. package/{target → build}/components/Mermaid.d.ts +0 -0
  151. package/{target → build}/components/Mermaid.js +0 -0
  152. package/{target → build}/components/MermaidRenderer.d.ts +0 -0
  153. package/{target → build}/components/MermaidRenderer.js +0 -0
  154. package/{target → build}/components/NotFound.d.ts +0 -0
  155. package/{target → build}/components/NotFound.js +0 -0
  156. package/{target → build}/components/PackageTabs.d.ts +0 -0
  157. package/{target → build}/components/PackageTabs.js +0 -0
  158. package/{target → build}/components/PageToolbar.d.ts +0 -0
  159. package/{target → build}/components/PageToolbar.js +0 -0
  160. package/{target → build}/components/PrevNext.d.ts +0 -0
  161. package/{target → build}/components/PrevNext.js +0 -0
  162. package/{target → build}/components/Search.d.ts +0 -0
  163. package/{target → build}/components/Search.js +0 -0
  164. package/{target → build}/components/SearchDialog.d.ts +0 -0
  165. package/{target → build}/components/SearchDialog.js +0 -0
  166. package/{target → build}/components/Section.d.ts +0 -0
  167. package/{target → build}/components/Section.js +0 -0
  168. package/{target → build}/components/SectionHeader.d.ts +0 -0
  169. package/{target → build}/components/SectionHeader.js +0 -0
  170. package/{target → build}/components/Sidebar.d.ts +0 -0
  171. package/{target → build}/components/Sidebar.js +0 -0
  172. package/{target → build}/components/SidebarArticles.d.ts +0 -0
  173. package/{target → build}/components/SidebarLinks.d.ts +0 -0
  174. package/{target → build}/components/SidebarPosts.d.ts +0 -0
  175. package/{target → build}/components/SidebarPosts.js +0 -0
  176. package/{target → build}/components/SidebarReleases.d.ts +0 -0
  177. package/{target → build}/components/SidebarReleases.js +0 -0
  178. package/{target → build}/components/SidebarSections.d.ts +0 -0
  179. package/{target → build}/components/SiteTitle.d.ts +0 -0
  180. package/{target → build}/components/SortableTable.d.ts +0 -0
  181. package/{target → build}/components/SortableTable.js +0 -0
  182. package/{target → build}/components/SoundCloud.d.ts +0 -0
  183. package/{target → build}/components/SoundCloud.js +0 -0
  184. package/{target → build}/components/TagIndex.d.ts +0 -0
  185. package/{target → build}/components/TagIndex.js +0 -0
  186. package/{target → build}/components/Theme.d.ts +0 -0
  187. package/{target → build}/components/Theme.js +0 -0
  188. package/{target → build}/components/Toc.d.ts +0 -0
  189. package/{target → build}/components/Toc.js +0 -0
  190. package/{target → build}/components/YouTube.d.ts +0 -0
  191. package/{target → build}/components/YouTube.js +0 -0
  192. package/{target → build}/components/ZoomImage.d.ts +0 -0
  193. package/{target → build}/components/ZoomImage.js +0 -0
  194. package/{target → build}/content/article.d.ts +5 -5
  195. /package/{target → build}/content/tag.d.ts +0 -0
  196. /package/{target → build}/content-collections.d.ts +0 -0
  197. /package/{target → build}/elements/accordion.d.ts +0 -0
  198. /package/{target → build}/elements/accordion.js +0 -0
  199. /package/{target → build}/elements/alert-dialog.d.ts +0 -0
  200. /package/{target → build}/elements/alert-dialog.js +0 -0
  201. /package/{target → build}/elements/alert.d.ts +0 -0
  202. /package/{target → build}/elements/alert.js +0 -0
  203. /package/{target → build}/elements/aspect-ratio.d.ts +0 -0
  204. /package/{target → build}/elements/aspect-ratio.js +0 -0
  205. /package/{target → build}/elements/avatar.d.ts +0 -0
  206. /package/{target → build}/elements/avatar.js +0 -0
  207. /package/{target → build}/elements/badge.d.ts +0 -0
  208. /package/{target → build}/elements/badge.js +0 -0
  209. /package/{target → build}/elements/breadcrumb.d.ts +0 -0
  210. /package/{target → build}/elements/breadcrumb.js +0 -0
  211. /package/{target → build}/elements/button-group.d.ts +0 -0
  212. /package/{target → build}/elements/button-group.js +0 -0
  213. /package/{target → build}/elements/button.d.ts +0 -0
  214. /package/{target → build}/elements/button.js +0 -0
  215. /package/{target → build}/elements/calendar.d.ts +0 -0
  216. /package/{target → build}/elements/calendar.js +0 -0
  217. /package/{target → build}/elements/card.d.ts +0 -0
  218. /package/{target → build}/elements/card.js +0 -0
  219. /package/{target → build}/elements/carousel.d.ts +0 -0
  220. /package/{target → build}/elements/carousel.js +0 -0
  221. /package/{target → build}/elements/chart.d.ts +0 -0
  222. /package/{target → build}/elements/chart.js +0 -0
  223. /package/{target → build}/elements/checkbox.d.ts +0 -0
  224. /package/{target → build}/elements/checkbox.js +0 -0
  225. /package/{target → build}/elements/collapsible.d.ts +0 -0
  226. /package/{target → build}/elements/collapsible.js +0 -0
  227. /package/{target → build}/elements/command.d.ts +0 -0
  228. /package/{target → build}/elements/command.js +0 -0
  229. /package/{target → build}/elements/context-menu.d.ts +0 -0
  230. /package/{target → build}/elements/context-menu.js +0 -0
  231. /package/{target → build}/elements/dialog.d.ts +0 -0
  232. /package/{target → build}/elements/dialog.js +0 -0
  233. /package/{target → build}/elements/direction.d.ts +0 -0
  234. /package/{target → build}/elements/direction.js +0 -0
  235. /package/{target → build}/elements/drawer.d.ts +0 -0
  236. /package/{target → build}/elements/drawer.js +0 -0
  237. /package/{target → build}/elements/dropdown-menu.d.ts +0 -0
  238. /package/{target → build}/elements/dropdown-menu.js +0 -0
  239. /package/{target → build}/elements/empty.d.ts +0 -0
  240. /package/{target → build}/elements/empty.js +0 -0
  241. /package/{target → build}/elements/field.d.ts +0 -0
  242. /package/{target → build}/elements/field.js +0 -0
  243. /package/{target → build}/elements/hover-card.d.ts +0 -0
  244. /package/{target → build}/elements/hover-card.js +0 -0
  245. /package/{target → build}/elements/input-group.d.ts +0 -0
  246. /package/{target → build}/elements/input-group.js +0 -0
  247. /package/{target → build}/elements/input-otp.d.ts +0 -0
  248. /package/{target → build}/elements/input-otp.js +0 -0
  249. /package/{target → build}/elements/input.d.ts +0 -0
  250. /package/{target → build}/elements/input.js +0 -0
  251. /package/{target → build}/elements/item.d.ts +0 -0
  252. /package/{target → build}/elements/item.js +0 -0
  253. /package/{target → build}/elements/kbd.d.ts +0 -0
  254. /package/{target → build}/elements/kbd.js +0 -0
  255. /package/{target → build}/elements/label.d.ts +0 -0
  256. /package/{target → build}/elements/label.js +0 -0
  257. /package/{target → build}/elements/menubar.d.ts +0 -0
  258. /package/{target → build}/elements/menubar.js +0 -0
  259. /package/{target → build}/elements/native-select.d.ts +0 -0
  260. /package/{target → build}/elements/native-select.js +0 -0
  261. /package/{target → build}/elements/navigation-menu.d.ts +0 -0
  262. /package/{target → build}/elements/navigation-menu.js +0 -0
  263. /package/{target → build}/elements/pagination.d.ts +0 -0
  264. /package/{target → build}/elements/pagination.js +0 -0
  265. /package/{target → build}/elements/popover.d.ts +0 -0
  266. /package/{target → build}/elements/popover.js +0 -0
  267. /package/{target → build}/elements/progress.d.ts +0 -0
  268. /package/{target → build}/elements/progress.js +0 -0
  269. /package/{target → build}/elements/radio-group.d.ts +0 -0
  270. /package/{target → build}/elements/radio-group.js +0 -0
  271. /package/{target → build}/elements/resizable.d.ts +0 -0
  272. /package/{target → build}/elements/resizable.js +0 -0
  273. /package/{target → build}/elements/scroll-area.d.ts +0 -0
  274. /package/{target → build}/elements/scroll-area.js +0 -0
  275. /package/{target → build}/elements/select.d.ts +0 -0
  276. /package/{target → build}/elements/select.js +0 -0
  277. /package/{target → build}/elements/separator.d.ts +0 -0
  278. /package/{target → build}/elements/separator.js +0 -0
  279. /package/{target → build}/elements/sheet.d.ts +0 -0
  280. /package/{target → build}/elements/sheet.js +0 -0
  281. /package/{target → build}/elements/sidebar.d.ts +0 -0
  282. /package/{target → build}/elements/sidebar.js +0 -0
  283. /package/{target → build}/elements/skeleton.d.ts +0 -0
  284. /package/{target → build}/elements/skeleton.js +0 -0
  285. /package/{target → build}/elements/slider.d.ts +0 -0
  286. /package/{target → build}/elements/slider.js +0 -0
  287. /package/{target → build}/elements/sonner.d.ts +0 -0
  288. /package/{target → build}/elements/sonner.js +0 -0
  289. /package/{target → build}/elements/spinner.d.ts +0 -0
  290. /package/{target → build}/elements/spinner.js +0 -0
  291. /package/{target → build}/elements/switch.d.ts +0 -0
  292. /package/{target → build}/elements/switch.js +0 -0
  293. /package/{target → build}/elements/table.d.ts +0 -0
  294. /package/{target → build}/elements/table.js +0 -0
  295. /package/{target → build}/elements/tabs.d.ts +0 -0
  296. /package/{target → build}/elements/tabs.js +0 -0
  297. /package/{target → build}/elements/textarea.d.ts +0 -0
  298. /package/{target → build}/elements/textarea.js +0 -0
  299. /package/{target → build}/elements/toggle-group.d.ts +0 -0
  300. /package/{target → build}/elements/toggle-group.js +0 -0
  301. /package/{target → build}/elements/toggle.d.ts +0 -0
  302. /package/{target → build}/elements/toggle.js +0 -0
  303. /package/{target → build}/elements/tooltip.d.ts +0 -0
  304. /package/{target → build}/elements/tooltip.js +0 -0
  305. /package/{target → build}/entrypoints/main.d.ts +0 -0
  306. /package/{target → build}/entrypoints/main.js +0 -0
  307. /package/{target → build}/helpers/article-icon.d.ts +0 -0
  308. /package/{target → build}/helpers/article-icon.js +0 -0
  309. /package/{target → build}/helpers/article.d.ts +0 -0
  310. /package/{target → build}/helpers/article.js +0 -0
  311. /package/{target → build}/helpers/changelog-source.d.ts +0 -0
  312. /package/{target → build}/helpers/changelog-source.js +0 -0
  313. /package/{target → build}/helpers/changelog-source.unit.d.ts +0 -0
  314. /package/{target → build}/helpers/changelog-source.unit.js +0 -0
  315. /package/{target → build}/helpers/dynamic-icon-resolver.d.ts +0 -0
  316. /package/{target → build}/helpers/dynamic-icon-resolver.js +0 -0
  317. /package/{target → build}/helpers/dynamic-icon.d.ts +0 -0
  318. /package/{target → build}/helpers/dynamic-icon.js +0 -0
  319. /package/{target → build}/helpers/favicon.d.ts +0 -0
  320. /package/{target → build}/helpers/favicon.js +0 -0
  321. /package/{target → build}/helpers/model.d.ts +0 -0
  322. /package/{target → build}/helpers/model.js +0 -0
  323. /package/{target → build}/helpers/program.d.ts +0 -0
  324. /package/{target → build}/helpers/program.js +0 -0
  325. /package/{target → build}/helpers/resolve-asset-path.d.ts +0 -0
  326. /package/{target → build}/helpers/resolve-asset-path.js +0 -0
  327. /package/{target → build}/helpers/resolve-includes.d.ts +0 -0
  328. /package/{target → build}/helpers/resolve-includes.js +0 -0
  329. /package/{target → build}/helpers/resolve-includes.unit.d.ts +0 -0
  330. /package/{target → build}/helpers/resolve-includes.unit.js +0 -0
  331. /package/{target → build}/helpers/search-text.d.ts +0 -0
  332. /package/{target → build}/helpers/search-text.js +0 -0
  333. /package/{target → build}/helpers/section.d.ts +0 -0
  334. /package/{target → build}/helpers/section.js +0 -0
  335. /package/{target → build}/helpers/section.unit.d.ts +0 -0
  336. /package/{target → build}/helpers/section.unit.js +0 -0
  337. /package/{target → build}/helpers/theme.d.ts +0 -0
  338. /package/{target → build}/helpers/theme.js +0 -0
  339. /package/{target → build}/helpers/toc-context.d.ts +0 -0
  340. /package/{target → build}/helpers/toc-context.js +0 -0
  341. /package/{target → build}/helpers/toc.d.ts +0 -0
  342. /package/{target → build}/helpers/toc.js +0 -0
  343. /package/{target → build}/helpers/toc.unit.d.ts +0 -0
  344. /package/{target → build}/helpers/toc.unit.js +0 -0
  345. /package/{target → build}/hooks/in-view.d.ts +0 -0
  346. /package/{target → build}/hooks/in-view.js +0 -0
  347. /package/{target → build}/hooks/media.d.ts +0 -0
  348. /package/{target → build}/hooks/media.js +0 -0
  349. /package/{target → build}/index.d.ts +0 -0
  350. /package/{target → build}/index.js +0 -0
  351. /package/{target → build}/models/article.d.ts +0 -0
  352. /package/{target → build}/models/article.js +0 -0
  353. /package/{target → build}/models/link.d.ts +0 -0
  354. /package/{target → build}/models/link.js +0 -0
  355. /package/{target → build}/models/patch.d.ts +0 -0
  356. /package/{target → build}/models/patch.js +0 -0
  357. /package/{target → build}/models/section.d.ts +0 -0
  358. /package/{target → build}/models/section.js +0 -0
  359. /package/{target → build}/models/theme.d.ts +0 -0
  360. /package/{target → build}/models/theme.js +0 -0
  361. /package/{target → build}/models/toc.d.ts +0 -0
  362. /package/{target → build}/models/toc.js +0 -0
  363. /package/{target → build}/plugins/rehype-inline-code.d.ts +0 -0
  364. /package/{target → build}/plugins/rehype-inline-code.js +0 -0
  365. /package/{target → build}/plugins/rehype-task-list-a11y.d.ts +0 -0
  366. /package/{target → build}/plugins/rehype-task-list-a11y.js +0 -0
  367. /package/{target → build}/plugins/remark-abbr.d.ts +0 -0
  368. /package/{target → build}/plugins/remark-abbr.js +0 -0
  369. /package/{target → build}/plugins/remark-abbr.unit.d.ts +0 -0
  370. /package/{target → build}/plugins/remark-abbr.unit.js +0 -0
  371. /package/{target → build}/plugins/remark-ansi.d.ts +0 -0
  372. /package/{target → build}/plugins/remark-ansi.js +0 -0
  373. /package/{target → build}/plugins/remark-ansi.unit.d.ts +0 -0
  374. /package/{target → build}/plugins/remark-ansi.unit.js +0 -0
  375. /package/{target → build}/plugins/remark-badge.d.ts +0 -0
  376. /package/{target → build}/plugins/remark-badge.js +0 -0
  377. /package/{target → build}/plugins/remark-badge.unit.d.ts +0 -0
  378. /package/{target → build}/plugins/remark-badge.unit.js +0 -0
  379. /package/{target → build}/plugins/remark-button.d.ts +0 -0
  380. /package/{target → build}/plugins/remark-button.js +0 -0
  381. /package/{target → build}/plugins/remark-button.unit.d.ts +0 -0
  382. /package/{target → build}/plugins/remark-button.unit.js +0 -0
  383. /package/{target → build}/plugins/remark-callout.d.ts +0 -0
  384. /package/{target → build}/plugins/remark-callout.js +0 -0
  385. /package/{target → build}/plugins/remark-card.d.ts +0 -0
  386. /package/{target → build}/plugins/remark-card.js +0 -0
  387. /package/{target → build}/plugins/remark-code-tabs.d.ts +0 -0
  388. /package/{target → build}/plugins/remark-code-tabs.js +0 -0
  389. /package/{target → build}/plugins/remark-columns.d.ts +0 -0
  390. /package/{target → build}/plugins/remark-columns.js +0 -0
  391. /package/{target → build}/plugins/remark-custom-heading-id.d.ts +0 -0
  392. /package/{target → build}/plugins/remark-custom-heading-id.js +0 -0
  393. /package/{target → build}/plugins/remark-custom-heading-id.unit.d.ts +0 -0
  394. /package/{target → build}/plugins/remark-custom-heading-id.unit.js +0 -0
  395. /package/{target → build}/plugins/remark-deflist.d.ts +0 -0
  396. /package/{target → build}/plugins/remark-deflist.js +0 -0
  397. /package/{target → build}/plugins/remark-details.d.ts +0 -0
  398. /package/{target → build}/plugins/remark-details.js +0 -0
  399. /package/{target → build}/plugins/remark-filetree.d.ts +0 -0
  400. /package/{target → build}/plugins/remark-filetree.js +0 -0
  401. /package/{target → build}/plugins/remark-filetree.unit.d.ts +0 -0
  402. /package/{target → build}/plugins/remark-filetree.unit.js +0 -0
  403. /package/{target → build}/plugins/remark-github-callout.d.ts +0 -0
  404. /package/{target → build}/plugins/remark-github-callout.js +0 -0
  405. /package/{target → build}/plugins/remark-icon.d.ts +0 -0
  406. /package/{target → build}/plugins/remark-icon.js +0 -0
  407. /package/{target → build}/plugins/remark-image.d.ts +0 -0
  408. /package/{target → build}/plugins/remark-image.js +0 -0
  409. /package/{target → build}/plugins/remark-media.d.ts +0 -0
  410. /package/{target → build}/plugins/remark-media.js +0 -0
  411. /package/{target → build}/plugins/remark-media.unit.d.ts +0 -0
  412. /package/{target → build}/plugins/remark-media.unit.js +0 -0
  413. /package/{target → build}/plugins/remark-mermaid.d.ts +0 -0
  414. /package/{target → build}/plugins/remark-mermaid.js +0 -0
  415. /package/{target → build}/plugins/remark-npm.d.ts +0 -0
  416. /package/{target → build}/plugins/remark-npm.js +0 -0
  417. /package/{target → build}/plugins/remark-passthrough-directive.d.ts +0 -0
  418. /package/{target → build}/plugins/remark-passthrough-directive.js +0 -0
  419. /package/{target → build}/plugins/remark-steps.d.ts +0 -0
  420. /package/{target → build}/plugins/remark-steps.js +0 -0
  421. /package/{target → build}/plugins/remark-steps.unit.d.ts +0 -0
  422. /package/{target → build}/plugins/remark-steps.unit.js +0 -0
  423. /package/{target → build}/plugins/remark-tab.d.ts +0 -0
  424. /package/{target → build}/plugins/remark-tab.js +0 -0
  425. /package/{target → build}/plugins/remark-tab.unit.d.ts +0 -0
  426. /package/{target → build}/plugins/remark-tab.unit.js +0 -0
  427. /package/{target → build}/plugins/remark-toc.d.ts +0 -0
  428. /package/{target → build}/plugins/remark-toc.js +0 -0
  429. /package/{target → build}/plugins/remark-toc.unit.d.ts +0 -0
  430. /package/{target → build}/plugins/remark-toc.unit.js +0 -0
  431. /package/{target → build}/plugins/shiki-icon.d.ts +0 -0
  432. /package/{target → build}/plugins/shiki-icon.js +0 -0
  433. /package/{target → build}/plugins/shiki-line-highlight.d.ts +0 -0
  434. /package/{target → build}/plugins/shiki-line-highlight.js +0 -0
  435. /package/{target → build}/program.d.ts +0 -0
  436. /package/{target → build}/program.js +0 -0
  437. /package/{target → build}/routeTree.gen.d.ts +0 -0
  438. /package/{target → build}/routeTree.gen.js +0 -0
  439. /package/{target → build}/router.d.ts +0 -0
  440. /package/{target → build}/router.js +0 -0
  441. /package/{target → build}/routes/$.d.ts +0 -0
  442. /package/{target → build}/routes/$.js +0 -0
  443. /package/{target → build}/routes/__root.d.ts +0 -0
  444. /package/{target → build}/server.d.ts +0 -0
  445. /package/{target → build}/server.js +0 -0
  446. /package/{target → build}/utils/style.d.ts +0 -0
  447. /package/{target → build}/utils/style.js +0 -0
  448. /package/{target → build}/vite.config.d.ts +0 -0
@@ -0,0 +1,22 @@
1
+ import type { Config } from "../../models/config.ts";
2
+ import type { ChangelogSection } from "../../models/section.ts";
3
+ interface ChangelogEntry {
4
+ slug: string;
5
+ title: string;
6
+ date?: string;
7
+ body: string;
8
+ sourceUrl?: string;
9
+ }
10
+ /** Glob (absolute path) covering all cached changelog markdown files for
11
+ * a given consumer. Used by content-collections to include them in the
12
+ * article scan. */
13
+ export declare function cacheIncludeGlob(config: Config): string;
14
+ /** Build the per-version changelog cache files. Livemark allows one
15
+ * changelog per project, so all cache state lives in a single
16
+ * `cache/changelog/`: the rendered `.md` entries plus a `meta.json`
17
+ * holding the etag for conditional GETs. On refresh we wipe only the
18
+ * `.md` files, leaving meta intact. */
19
+ export declare function buildChangelog(section: ChangelogSection, config: Config): Promise<void>;
20
+ /** Parse CHANGELOG.md into per-version entries using mdast */
21
+ export declare function splitLocalChangelog(body: string): ChangelogEntry[];
22
+ export {};
@@ -0,0 +1,198 @@
1
+ import { access, mkdir, readFile, readdir, rm, writeFile, } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import slugify from "@sindresorhus/slugify";
4
+ import { toString as mdastToString } from "mdast-util-to-string";
5
+ import remarkParse from "remark-parse";
6
+ import remarkStringify from "remark-stringify";
7
+ import { unified } from "unified";
8
+ import { visit } from "unist-util-visit";
9
+ import { isGitHubUrl, parseGitHubRepo } from "../../helpers/changelog-source.js";
10
+ import { targetDirFor } from "../target/build.js";
11
+ const CACHE_SUBDIR = "cache/changelog";
12
+ const parser = unified().use(remarkParse);
13
+ const stringifier = unified().use(remarkStringify, {
14
+ bullet: "-",
15
+ fences: true,
16
+ emphasis: "_",
17
+ });
18
+ /** Glob (absolute path) covering all cached changelog markdown files for
19
+ * a given consumer. Used by content-collections to include them in the
20
+ * article scan. */
21
+ export function cacheIncludeGlob(config) {
22
+ return join(targetDirFor(config.configPath), CACHE_SUBDIR, "**", "*.md");
23
+ }
24
+ /** Build the per-version changelog cache files. Livemark allows one
25
+ * changelog per project, so all cache state lives in a single
26
+ * `cache/changelog/`: the rendered `.md` entries plus a `meta.json`
27
+ * holding the etag for conditional GETs. On refresh we wipe only the
28
+ * `.md` files, leaving meta intact. */
29
+ export async function buildChangelog(section, config) {
30
+ const targetDir = targetDirFor(config.configPath);
31
+ const cacheDir = join(targetDir, CACHE_SUBDIR);
32
+ const metaPath = join(cacheDir, "meta.json");
33
+ const entries = isGitHubUrl(section.source)
34
+ ? await buildFromGitHub(section.source, metaPath, cacheDir)
35
+ : await buildFromLocal(section.source, config.root);
36
+ if (entries === undefined)
37
+ return;
38
+ await mkdir(cacheDir, { recursive: true });
39
+ for (const f of await readdir(cacheDir).catch(() => [])) {
40
+ if (f.endsWith(".md"))
41
+ await rm(join(cacheDir, f), { force: true });
42
+ }
43
+ for (const entry of entries) {
44
+ const markdown = wrapFrontmatter(entry, section);
45
+ await writeFile(join(cacheDir, `${entry.slug}.md`), markdown, "utf-8");
46
+ }
47
+ }
48
+ async function buildFromLocal(source, root) {
49
+ const filePath = resolve(root, source);
50
+ const body = await readFile(filePath, "utf-8");
51
+ return splitLocalChangelog(body);
52
+ }
53
+ /** Parse CHANGELOG.md into per-version entries using mdast */
54
+ export function splitLocalChangelog(body) {
55
+ const tree = parser.parse(body);
56
+ const entries = [];
57
+ let current;
58
+ for (const child of tree.children) {
59
+ if (child.type === "heading" && child.depth === 2) {
60
+ if (current)
61
+ entries.push(finalizeEntry(current));
62
+ current = { heading: mdastToString(child), children: [] };
63
+ }
64
+ else if (current) {
65
+ current.children.push(child);
66
+ }
67
+ }
68
+ if (current)
69
+ entries.push(finalizeEntry(current));
70
+ return entries;
71
+ }
72
+ function finalizeEntry(input) {
73
+ const versionMatch = input.heading.match(/^\[?([^\]\s]+)\]?/);
74
+ const version = versionMatch?.[1] ?? input.heading;
75
+ const dateMatch = input.heading.match(/\d{4}-\d{2}-\d{2}/);
76
+ const body = renderEntryBody(input.children);
77
+ return {
78
+ slug: slugify(version),
79
+ title: version,
80
+ date: dateMatch?.[0],
81
+ body,
82
+ };
83
+ }
84
+ /** Serialize an entry's mdast children back to markdown */
85
+ function renderEntryBody(children) {
86
+ const root = { type: "root", children };
87
+ return stringifier.stringify(root).trimEnd();
88
+ }
89
+ /** Drop the body's leading h1 (typically the conventional-changelog
90
+ * `# 0.7.2 (2026-04-25)` boilerplate that duplicates the article's title),
91
+ * shift h2–h6 up by one so subsection headings become h1 / h2 / …, and
92
+ * escape stray `<` outside code so MDX doesn't mistake them for JSX. */
93
+ function processBody(body) {
94
+ const tree = parser.parse(body);
95
+ visit(tree, "heading", node => {
96
+ if (node.depth > 1)
97
+ node.depth = (node.depth - 1);
98
+ });
99
+ if (tree.children[0]?.type === "heading" && tree.children[0].depth === 1) {
100
+ tree.children.shift();
101
+ }
102
+ return escapeMdxAngles(stringifier.stringify(tree).trimEnd());
103
+ }
104
+ /** Escape `<` to `\<` outside fenced code blocks and inline backtick spans
105
+ * so commit messages with placeholders like `<subdir>` don't get parsed as
106
+ * JSX by MDX. */
107
+ function escapeMdxAngles(markdown) {
108
+ let inFence = false;
109
+ return markdown
110
+ .split("\n")
111
+ .map(line => {
112
+ if (line.startsWith("```")) {
113
+ inFence = !inFence;
114
+ return line;
115
+ }
116
+ if (inFence)
117
+ return line;
118
+ return line.replace(/`[^`]*`|</g, match => match === "<" ? "\\<" : match);
119
+ })
120
+ .join("\n");
121
+ }
122
+ async function buildFromGitHub(source, metaPath, cacheDir) {
123
+ const parsed = parseGitHubRepo(source);
124
+ if (!parsed) {
125
+ throw new Error(`Could not parse GitHub repo from source: ${source}`);
126
+ }
127
+ const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/releases?per_page=100`;
128
+ const headers = {
129
+ Accept: "application/vnd.github+json",
130
+ "X-GitHub-Api-Version": "2022-11-28",
131
+ };
132
+ const token = process.env.GITHUB_TOKEN;
133
+ if (token)
134
+ headers.Authorization = `Bearer ${token}`;
135
+ const meta = await readMeta(metaPath);
136
+ const hasCache = await exists(cacheDir);
137
+ if (meta && hasCache)
138
+ headers["If-None-Match"] = meta.etag;
139
+ const res = await fetch(url, { headers });
140
+ if (res.status === 304)
141
+ return undefined;
142
+ if (!res.ok) {
143
+ const remaining = res.headers.get("x-ratelimit-remaining");
144
+ const reset = res.headers.get("x-ratelimit-reset");
145
+ const msg = `GitHub API ${res.status} ${res.statusText} (rate-limit remaining: ${remaining ?? "?"}, reset: ${reset ?? "?"})`;
146
+ if (hasCache) {
147
+ console.warn(`${msg} — falling back to cached changelog`);
148
+ return undefined;
149
+ }
150
+ throw new Error(msg);
151
+ }
152
+ const releases = (await res.json());
153
+ const etag = res.headers.get("etag");
154
+ if (etag) {
155
+ await mkdir(dirname(metaPath), { recursive: true });
156
+ await writeFile(metaPath, JSON.stringify({ etag, fetchedAt: new Date().toISOString() }, null, 2), "utf-8");
157
+ }
158
+ return releases.map(release => ({
159
+ slug: slugify(release.tag_name),
160
+ title: release.tag_name,
161
+ date: release.published_at ?? undefined,
162
+ body: (release.body ?? "").trim(),
163
+ sourceUrl: release.html_url ?? undefined,
164
+ }));
165
+ }
166
+ function wrapFrontmatter(entry, section) {
167
+ const lines = [
168
+ "---",
169
+ `title: ${entry.title}`,
170
+ `path: ${section.prefix}${entry.slug}/`,
171
+ ];
172
+ if (entry.date)
173
+ lines.push(`date: ${entry.date}`);
174
+ if (entry.sourceUrl) {
175
+ lines.push(`sourceUrl: ${entry.sourceUrl}`, "sourceAction: view");
176
+ }
177
+ lines.push("---", "", `# ${entry.title}`, "", processBody(entry.body));
178
+ return lines.join("\n");
179
+ }
180
+ async function readMeta(metaPath) {
181
+ try {
182
+ const raw = await readFile(metaPath, "utf-8");
183
+ return JSON.parse(raw);
184
+ }
185
+ catch {
186
+ return undefined;
187
+ }
188
+ }
189
+ async function exists(path) {
190
+ try {
191
+ await access(path);
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ }
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYWN0aW9ucy9jaGFuZ2Vsb2cvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE9BQU8sRUFDUCxFQUFFLEVBQ0YsU0FBUyxHQUNWLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2xELE9BQU8sT0FBTyxNQUFNLHVCQUF1QixDQUFBO0FBRTNDLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDaEUsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFBO0FBQ3RDLE9BQU8sZUFBZSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBR3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBdUJqRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQTtBQUV0QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRTtJQUNqRCxNQUFNLEVBQUUsR0FBRztJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLEdBQUc7Q0FDZCxDQUFDLENBQUE7QUFFRjs7b0JBRW9CO0FBQ3BCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFjO0lBQzdDLE9BQU8sSUFBSSxD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QUMsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHJlYWRkaXIsXG4gIHJtLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzbHVnaWZ5IGZyb20gXCJAc2luZHJlc29yaHVzL3NsdWdpZnlcIlxuaW1wb3J0IHR5cGUgeyBSb290LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiXG5pbXBvcnQgeyB0b1N0cmluZyBhcyBtZGFzdFRvU3RyaW5nIH0gZnJvbSBcIm1kYXN0LXV0aWwtdG8tc3RyaW5nXCJcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCJcbmltcG9ydCByZW1hcmtTdHJpbmdpZnkgZnJvbSBcInJlbWFyay1zdHJpbmdpZnlcIlxuaW1wb3J0IHsgdW5pZmllZCB9IGZyb20gXCJ1bmlmaWVkXCJcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSBcInVuaXN0LXV0aWwtdmlzaXRcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgdHlwZSB7IENoYW5nZWxvZ1NlY3Rpb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NlY3Rpb24udHNcIlxuaW1wb3J0IHsgaXNHaXRIdWJVcmwsIHBhcnNlR2l0SHViUmVwbyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL2NoYW5nZWxvZy1zb3VyY2UudHNcIlxuaW1wb3J0IHsgdGFyZ2V0RGlyRm9yIH0gZnJvbSBcIi4uL3RhcmdldC9idWlsZC50c1wiXG5cbmludGVyZmFjZSBSZWxlYXNlIHtcbiAgdGFnX25hbWU6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICBwdWJsaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIGJvZHk/OiBzdHJpbmcgfCBudWxsXG4gIGh0bWxfdXJsPzogc3RyaW5nIHwgbnVsbFxufVxuXG5pbnRlcmZhY2UgQ2FjaGVNZXRhIHtcbiAgZXRhZzogc3RyaW5nXG4gIGZldGNoZWRBdDogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDaGFuZ2Vsb2dFbnRyeSB7XG4gIHNsdWc6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIGRhdGU/OiBzdHJpbmdcbiAgYm9keTogc3RyaW5nXG4gIHNvdXJjZVVybD86IHN0cmluZ1xufVxuXG5jb25zdCBDQUNIRV9TVUJESVIgPSBcImNhY2hlL2NoYW5nZWxvZ1wiXG5cbmNvbnN0IHBhcnNlciA9IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpXG5jb25zdCBzdHJpbmdpZmllciA9IHVuaWZpZWQoKS51c2UocmVtYXJrU3RyaW5naWZ5LCB7XG4gIGJ1bGxldDogXCItXCIsXG4gIGZlbmNlczogdHJ1ZSxcbiAgZW1waGFzaXM6IFwiX1wiLFxufSlcblxuLyoqIEdsb2IgKGFic29sdXRlIHBhdGgpIGNvdmVyaW5nIGFsbCBjYWNoZWQgY2hhbmdlbG9nIG1hcmtkb3duIGZpbGVzIGZvclxuICogIGEgZ2l2ZW4gY29uc3VtZXIuIFVzZWQgYnkgY29udGVudC1jb2xsZWN0aW9ucyB0byBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gKiAgYXJ0aWNsZSBzY2FuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlSW5jbHVkZUdsb2IoY29uZmlnOiBDb25maWcpIHtcbiAgcmV0dXJuIGpvaW4odGFyZ2V0RGlyRm9yKGNvbmZpZy5jb25maWdQYXRoKSwgQ0FDSEVfU1VCRElSLCBcIioqXCIsIFwiKi5tZFwiKVxufVxuXG4vKiogQnVpbGQgdGhlIHBlci12ZXJzaW9uIGNoYW5nZWxvZyBjYWNoZSBmaWxlcy4gTGl2ZW1hcmsgYWxsb3dzIG9uZVxuICogIGNoYW5nZWxvZyBwZXIgcHJvamVjdCwgc28gYWxsIGNhY2hlIHN0YXRlIGxpdmVzIGluIGEgc2luZ2xlXG4gKiAgYGNhY2hlL2NoYW5nZWxvZy9gOiB0aGUgcmVuZGVyZWQgYC5tZGAgZW50cmllcyBwbHVzIGEgYG1ldGEuanNvbmBcbiAqICBob2xkaW5nIHRoZSBldGFnIGZvciBjb25kaXRpb25hbCBHRVRzLiBPbiByZWZyZXNoIHdlIHdpcGUgb25seSB0aGVcbiAqICBgLm1kYCBmaWxlcywgbGVhdmluZyBtZXRhIGludGFjdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENoYW5nZWxvZyhcbiAgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbixcbiAgY29uZmlnOiBDb25maWcsXG4pIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZy5jb25maWdQYXRoKVxuICBjb25zdCBjYWNoZURpciA9IGpvaW4odGFyZ2V0RGlyLCBDQUNIRV9TVUJESVIpXG4gIGNvbnN0IG1ldGFQYXRoID0gam9pbihjYWNoZURpciwgXCJtZXRhLmpzb25cIilcblxuICBjb25zdCBlbnRyaWVzID0gaXNHaXRIdWJVcmwoc2VjdGlvbi5zb3VyY2UpXG4gICAgPyBhd2FpdCBidWlsZEZyb21HaXRIdWIoc2VjdGlvbi5zb3VyY2UsIG1ldGFQYXRoLCBjYWNoZURpcilcbiAgICA6IGF3YWl0IGJ1aWxkRnJvbUxvY2FsKHNlY3Rpb24uc291cmNlLCBjb25maWcucm9vdClcblxuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICBhd2FpdCBta2RpcihjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgZm9yIChjb25zdCBmIG9mIGF3YWl0IHJlYWRkaXIoY2FjaGVEaXIpLmNhdGNoKCgpID0+IFtdKSkge1xuICAgIGlmIChmLmVuZHNXaXRoKFwiLm1kXCIpKSBhd2FpdCBybShqb2luKGNhY2hlRGlyLCBmKSwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWFya2Rvd24gPSB3cmFwRnJvbnRtYXR0ZXIoZW50cnksIHNlY3Rpb24pXG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oY2FjaGVEaXIsIGAke2VudHJ5LnNsdWd9Lm1kYCksIG1hcmtkb3duLCBcInV0Zi04XCIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRGcm9tTG9jYWwoc291cmNlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUocm9vdCwgc291cmNlKVxuICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsIFwidXRmLThcIilcbiAgcmV0dXJuIHNwbGl0TG9jYWxDaGFuZ2Vsb2coYm9keSlcbn1cblxuLyoqIFBhcnNlIENIQU5HRUxPRy5tZCBpbnRvIHBlci12ZXJzaW9uIGVudHJpZXMgdXNpbmcgbWRhc3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdExvY2FsQ2hhbmdlbG9nKGJvZHk6IHN0cmluZyk6IENoYW5nZWxvZ0VudHJ5W10ge1xuICBjb25zdCB0cmVlID0gcGFyc2VyLnBhcnNlKGJvZHkpIGFzIFJvb3RcbiAgY29uc3QgZW50cmllczogQ2hhbmdlbG9nRW50cnlbXSA9IFtdXG4gIGxldCBjdXJyZW50OiB7IGhlYWRpbmc6IHN0cmluZzsgY2hpbGRyZW46IFJvb3RDb250ZW50W10gfSB8IHVuZGVmaW5lZFxuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgdHJlZS5jaGlsZHJlbikge1xuICAgIGlmIChjaGlsZC50eXBlID09PSBcImhlYWRpbmdcIiAmJiBjaGlsZC5kZXB0aCA9PT0gMikge1xuICAgICAgaWYgKGN1cnJlbnQpIGVudHJpZXMucHVzaChmaW5hbGl6ZUVudHJ5KGN1cnJlbnQpKVxuICAgICAgY3VycmVudCA9IHsgaGVhZGluZzogbWRhc3RUb1N0cmluZyhjaGlsZCksIGNoaWxkcmVuOiBbXSB9XG4gICAgfSBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICBjdXJyZW50LmNoaWxkcmVuLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50KSBlbnRyaWVzLnB1c2goZmluYWxpemVFbnRyeShjdXJyZW50KSlcbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuZnVuY3Rpb24gZmluYWxpemVFbnRyeShpbnB1dDoge1xuICBoZWFkaW5nOiBzdHJpbmdcbiAgY2hpbGRyZW46IFJvb3RDb250ZW50W11cbn0pOiBDaGFuZ2Vsb2dFbnRyeSB7XG4gIGNvbnN0IHZlcnNpb25NYXRjaCA9IGlucHV0LmhlYWRpbmcubWF0Y2goL15cXFs/KFteXFxdXFxzXSspXFxdPy8pXG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uTWF0Y2g/LlsxXSA/PyBpbnB1dC5oZWFkaW5nXG4gIGNvbnN0IGRhdGVNYXRjaCA9IGlucHV0LmhlYWRpbmcubWF0Y2goL1xcZHs0fS1cXGR7Mn0tXFxkezJ9LylcbiAgY29uc3QgYm9keSA9IHJlbmRlckVudHJ5Qm9keShpbnB1dC5jaGlsZHJlbilcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBzbHVnaWZ5KHZlcnNpb24pLFxuICAgIHRpdGxlOiB2ZXJzaW9uLFxuICAgIGRhdGU6IGRhdGVNYXRjaD8uWzBdLFxuICAgIGJvZHksXG4gIH1cbn1cblxuLyoqIFNlcmlhbGl6ZSBhbiBlbnRyeSdzIG1kYXN0IGNoaWxkcmVuIGJhY2sgdG8gbWFya2Rvd24gKi9cbmZ1bmN0aW9uIHJlbmRlckVudHJ5Qm9keShjaGlsZHJlbjogUm9vdENvbnRlbnRbXSkge1xuICBjb25zdCByb290OiBSb290ID0geyB0eXBlOiBcInJvb3RcIiwgY2hpbGRyZW4gfVxuICByZXR1cm4gc3RyaW5naWZpZXIuc3RyaW5naWZ5KHJvb3QpLnRyaW1FbmQoKVxufVxuXG4vKiogRHJvcCB0aGUgYm9keSdzIGxlYWRpbmcgaDEgKHR5cGljYWxseSB0aGUgY29udmVudGlvbmFsLWNoYW5nZWxvZ1xuICogYCMgMC43LjIgKDIwMjYtMDQtMjUpYCBib2lsZXJwbGF0ZSB0aGF0IGR1cGxpY2F0ZXMgdGhlIGFydGljbGUncyB0aXRsZSksXG4gKiBzaGlmdCBoMuKAk2g2IHVwIGJ5IG9uZSBzbyBzdWJzZWN0aW9uIGhlYWRpbmdzIGJlY29tZSBoMSAvIGgyIC8g4oCmLCBhbmRcbiAqIGVzY2FwZSBzdHJheSBgPGAgb3V0c2lkZSBjb2RlIHNvIE1EWCBkb2Vzbid0IG1pc3Rha2UgdGhlbSBmb3IgSlNYLiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0JvZHkoYm9keTogc3RyaW5nKSB7XG4gIGNvbnN0IHRyZWUgPSBwYXJzZXIucGFyc2UoYm9keSkgYXMgUm9vdFxuICB2aXNpdCh0cmVlLCBcImhlYWRpbmdcIiwgbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUuZGVwdGggPiAxKSBub2RlLmRlcHRoID0gKG5vZGUuZGVwdGggLSAxKSBhcyAxIHwgMiB8IDMgfCA0IHwgNVxuICB9KVxuICBpZiAodHJlZS5jaGlsZHJlblswXT8udHlwZSA9PT0gXCJoZWFkaW5nXCIgJiYgdHJlZS5jaGlsZHJlblswXS5kZXB0aCA9PT0gMSkge1xuICAgIHRyZWUuY2hpbGRyZW4uc2hpZnQoKVxuICB9XG4gIHJldHVybiBlc2NhcGVNZHhBbmdsZXMoc3RyaW5naWZpZXIuc3RyaW5naWZ5KHRyZWUpLnRyaW1FbmQoKSlcbn1cblxuLyoqIEVzY2FwZSBgPGAgdG8gYFxcPGAgb3V0c2lkZSBmZW5jZWQgY29kZSBibG9ja3MgYW5kIGlubGluZSBiYWNrdGljayBzcGFuc1xuICogc28gY29tbWl0IG1lc3NhZ2VzIHdpdGggcGxhY2Vob2xkZXJzIGxpa2UgYDxzdWJkaXI+YCBkb24ndCBnZXQgcGFyc2VkIGFzXG4gKiBKU1ggYnkgTURYLiAqL1xuZnVuY3Rpb24gZXNjYXBlTWR4QW5nbGVzKG1hcmtkb3duOiBzdHJpbmcpIHtcbiAgbGV0IGluRmVuY2UgPSBmYWxzZVxuICByZXR1cm4gbWFya2Rvd25cbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcImBgYFwiKSkge1xuICAgICAgICBpbkZlbmNlID0gIWluRmVuY2VcbiAgICAgICAgcmV0dXJuIGxpbmVcbiAgICAgIH1cbiAgICAgIGlmIChpbkZlbmNlKSByZXR1cm4gbGluZVxuICAgICAgcmV0dXJuIGxpbmUucmVwbGFjZSgvYFteYF0qYHw8L2csIG1hdGNoID0+XG4gICAgICAgIG1hdGNoID09PSBcIjxcIiA/IFwiXFxcXDxcIiA6IG1hdGNoLFxuICAgICAgKVxuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIilcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRGcm9tR2l0SHViKFxuICBzb3VyY2U6IHN0cmluZyxcbiAgbWV0YVBhdGg6IHN0cmluZyxcbiAgY2FjaGVEaXI6IHN0cmluZyxcbik6IFByb21pc2U8Q2hhbmdlbG9nRW50cnlbXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUdpdEh1YlJlcG8oc291cmNlKVxuICBpZiAoIXBhcnNlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEdpdEh1YiByZXBvIGZyb20gc291cmNlOiAke3NvdXJjZX1gKVxuICB9XG5cbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtwYXJzZWQub3duZXJ9LyR7cGFyc2VkLnJlcG99L3JlbGVhc2VzP3Blcl9wYWdlPTEwMGBcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uXCIsXG4gICAgXCJYLUdpdEh1Yi1BcGktVmVyc2lvblwiOiBcIjIwMjItMTEtMjhcIixcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gIGlmICh0b2tlbikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEJlYXJlciAke3Rva2VufWBcblxuICBjb25zdCBtZXRhID0gYXdhaXQgcmVhZE1ldGEobWV0YVBhdGgpXG4gIGNvbnN0IGhhc0NhY2hlID0gYXdhaXQgZXhpc3RzKGNhY2hlRGlyKVxuICBpZiAobWV0YSAmJiBoYXNDYWNoZSkgaGVhZGVyc1tcIklmLU5vbmUtTWF0Y2hcIl0gPSBtZXRhLmV0YWdcblxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KVxuXG4gIGlmIChyZXMuc3RhdHVzID09PSAzMDQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHJlcy5oZWFkZXJzLmdldChcIngtcmF0ZWxpbWl0LXJlbWFpbmluZ1wiKVxuICAgIGNvbnN0IHJlc2V0ID0gcmVzLmhlYWRlcnMuZ2V0KFwieC1yYXRlbGltaXQtcmVzZXRcIilcbiAgICBjb25zdCBtc2cgPSBgR2l0SHViIEFQSSAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9IChyYXRlLWxpbWl0IHJlbWFpbmluZzogJHtyZW1haW5pbmcgPz8gXCI/XCJ9LCByZXNldDogJHtyZXNldCA/PyBcIj9cIn0pYFxuICAgIGlmIChoYXNDYWNoZSkge1xuICAgICAgY29uc29sZS53YXJuKGAke21zZ30g4oCUIGZhbGxpbmcgYmFjayB0byBjYWNoZWQgY2hhbmdlbG9nYClcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZylcbiAgfVxuXG4gIGNvbnN0IHJlbGVhc2VzID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJlbGVhc2VbXVxuICBjb25zdCBldGFnID0gcmVzLmhlYWRlcnMuZ2V0KFwiZXRhZ1wiKVxuICBpZiAoZXRhZykge1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobWV0YVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgIG1ldGFQYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHsgZXRhZywgZmV0Y2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSBzYXRpc2ZpZXMgQ2FjaGVNZXRhLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKSxcbiAgICAgIFwidXRmLThcIixcbiAgICApXG4gIH1cblxuICByZXR1cm4gcmVsZWFzZXMubWFwKHJlbGVhc2UgPT4gKHtcbiAgICBzbHVnOiBzbHVnaWZ5KHJlbGVhc2UudGFnX25hbWUpLFxuICAgIHRpdGxlOiByZWxlYXNlLnRhZ19uYW1lLFxuICAgIGRhdGU6IHJlbGVhc2UucHVibGlzaGVkX2F0ID8/IHVuZGVmaW5lZCxcbiAgICBib2R5OiAocmVsZWFzZS5ib2R5ID8/IFwiXCIpLnRyaW0oKSxcbiAgICBzb3VyY2VVcmw6IHJlbGVhc2UuaHRtbF91cmwgPz8gdW5kZWZpbmVkLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gd3JhcEZyb250bWF0dGVyKGVudHJ5OiBDaGFuZ2Vsb2dFbnRyeSwgc2VjdGlvbjogQ2hhbmdlbG9nU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBcIi0tLVwiLFxuICAgIGB0aXRsZTogJHtlbnRyeS50aXRsZX1gLFxuICAgIGBwYXRoOiAke3NlY3Rpb24ucHJlZml4fSR7ZW50cnkuc2x1Z30vYCxcbiAgXVxuICBpZiAoZW50cnkuZGF0ZSkgbGluZXMucHVzaChgZGF0ZTogJHtlbnRyeS5kYXRlfWApXG4gIGlmIChlbnRyeS5zb3VyY2VVcmwpIHtcbiAgICBsaW5lcy5wdXNoKGBzb3VyY2VVcmw6ICR7ZW50cnkuc291cmNlVXJsfWAsIFwic291cmNlQWN0aW9uOiB2aWV3XCIpXG4gIH1cbiAgbGluZXMucHVzaChcIi0tLVwiLCBcIlwiLCBgIyAke2VudHJ5LnRpdGxlfWAsIFwiXCIsIHByb2Nlc3NCb2R5KGVudHJ5LmJvZHkpKVxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWV0YShtZXRhUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDYWNoZU1ldGEgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShtZXRhUGF0aCwgXCJ1dGYtOFwiKVxuICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2FjaGVNZXRhXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGlzdHMocGF0aDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKHBhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import type { Config } from "../../models/config.ts";
2
+ /**
3
+ * Load and validate a config file, checking --config/-c CLI arg, then cwd.
4
+ *
5
+ * If a path is provided explicitly (arg or `--config`/`-c`) and the
6
+ * file is missing, throws — the user asked for a specific config and
7
+ * it isn't there. If no path is provided and no `livemark.config.ts`
8
+ * exists in cwd, falls back to the default config with a synthesized
9
+ * `configPath = <cwd>/livemark.config.ts` so downstream code (target
10
+ * hash, watcher) still has a stable per-project key.
11
+ */
12
+ export declare function loadConfig(path?: string): Promise<Config>;
@@ -0,0 +1,41 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { existsSync } from "node:fs";
10
+ import { dirname, resolve } from "node:path";
11
+ import { pathToFileURL } from "node:url";
12
+ import { defineConfig } from "./define.js";
13
+ /**
14
+ * Load and validate a config file, checking --config/-c CLI arg, then cwd.
15
+ *
16
+ * If a path is provided explicitly (arg or `--config`/`-c`) and the
17
+ * file is missing, throws — the user asked for a specific config and
18
+ * it isn't there. If no path is provided and no `livemark.config.ts`
19
+ * exists in cwd, falls back to the default config with a synthesized
20
+ * `configPath = <cwd>/livemark.config.ts` so downstream code (target
21
+ * hash, watcher) still has a stable per-project key.
22
+ */
23
+ export async function loadConfig(path) {
24
+ const configIndex = process.argv.findIndex(a => a === "-c" || a === "--config");
25
+ const cliPath = configIndex !== -1 ? process.argv[configIndex + 1] : undefined;
26
+ const explicit = path ?? cliPath;
27
+ const resolved = resolve(explicit ?? "livemark.config.ts");
28
+ let input = {};
29
+ if (existsSync(resolved)) {
30
+ // Cache-bust the ESM import so dev-server restart reloads edits on disk.
31
+ const url = `${pathToFileURL(resolved).href}?t=${Date.now()}`;
32
+ const module = await import(__rewriteRelativeImportExtension(url));
33
+ input = module.default ?? {};
34
+ }
35
+ else if (explicit) {
36
+ throw new Error(`Config file not found: ${resolved}`);
37
+ }
38
+ const validated = defineConfig(input);
39
+ return { ...validated, root: dirname(resolved), configPath: resolved };
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL2NvbmZpZy9sb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFMUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsSUFBYTtJQUM1QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxVQUFVLENBQ3BDLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDOUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQTtJQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLG9CQUFvQixDQUFDLENBQUE7SUFDMUQsSUFBSSxLQUFLLEdBQStCLEVBQUUsQ0FBQTtJQUMxQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pCLHlFQUF5RTtRQUN6RSxNQUFNLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUE7UUFDN0QsTUFBTSxNQUFNLEdBQTRCLE1BQU0sTUFBTSxrQ0FBQyxHQUFHLEVBQUMsQ0FBQTtRQUN6RCxLQUFLLEdBQUksTUFBTSxDQUFDLE9BQXNDLElBQUksRUFBRSxDQUFBO0lBQzlELENBQUM7U0FBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNyQyxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUE7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBVc2VyQ29uZmlnIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vZGVmaW5lLnRzXCJcblxuLyoqXG4gKiBMb2FkIGFuZCB2YWxpZGF0ZSBhIGNvbmZpZyBmaWxlLCBjaGVja2luZyAtLWNvbmZpZy8tYyBDTEkgYXJnLCB0aGVuIGN3ZC5cbiAqXG4gKiBJZiBhIHBhdGggaXMgcHJvdmlkZWQgZXhwbGljaXRseSAoYXJnIG9yIGAtLWNvbmZpZ2AvYC1jYCkgYW5kIHRoZVxuICogZmlsZSBpcyBtaXNzaW5nLCB0aHJvd3Mg4oCUIHRoZSB1c2VyIGFza2VkIGZvciBhIHNwZWNpZmljIGNvbmZpZyBhbmRcbiAqIGl0IGlzbid0IHRoZXJlLiBJZiBubyBwYXRoIGlzIHByb3ZpZGVkIGFuZCBubyBgbGl2ZW1hcmsuY29uZmlnLnRzYFxuICogZXhpc3RzIGluIGN3ZCwgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBjb25maWcgd2l0aCBhIHN5bnRoZXNpemVkXG4gKiBgY29uZmlnUGF0aCA9IDxjd2Q+L2xpdmVtYXJrLmNvbmZpZy50c2Agc28gZG93bnN0cmVhbSBjb2RlICh0YXJnZXRcbiAqIGhhc2gsIHdhdGNoZXIpIHN0aWxsIGhhcyBhIHN0YWJsZSBwZXItcHJvamVjdCBrZXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKHBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPENvbmZpZz4ge1xuICBjb25zdCBjb25maWdJbmRleCA9IHByb2Nlc3MuYXJndi5maW5kSW5kZXgoXG4gICAgYSA9PiBhID09PSBcIi1jXCIgfHwgYSA9PT0gXCItLWNvbmZpZ1wiLFxuICApXG4gIGNvbnN0IGNsaVBhdGggPSBjb25maWdJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3ZbY29uZmlnSW5kZXggKyAxXSA6IHVuZGVmaW5lZFxuICBjb25zdCBleHBsaWNpdCA9IHBhdGggPz8gY2xpUGF0aFxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoZXhwbGljaXQgPz8gXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgbGV0IGlucHV0OiB6LmlucHV0PHR5cGVvZiBVc2VyQ29uZmlnPiA9IHt9XG4gIGlmIChleGlzdHNTeW5jKHJlc29sdmVkKSkge1xuICAgIC8vIENhY2hlLWJ1c3QgdGhlIEVTTSBpbXBvcnQgc28gZGV2LXNlcnZlciByZXN0YXJ0IHJlbG9hZHMgZWRpdHMgb24gZGlzay5cbiAgICBjb25zdCB1cmwgPSBgJHtwYXRoVG9GaWxlVVJMKHJlc29sdmVkKS5ocmVmfT90PSR7RGF0ZS5ub3coKX1gXG4gICAgY29uc3QgbW9kdWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgaW5wdXQgPSAobW9kdWxlLmRlZmF1bHQgYXMgei5pbnB1dDx0eXBlb2YgVXNlckNvbmZpZz4pID8/IHt9XG4gIH0gZWxzZSBpZiAoZXhwbGljaXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBmaWxlIG5vdCBmb3VuZDogJHtyZXNvbHZlZH1gKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRlZCA9IGRlZmluZUNvbmZpZyhpbnB1dClcbiAgcmV0dXJuIHsgLi4udmFsaWRhdGVkLCByb290OiBkaXJuYW1lKHJlc29sdmVkKSwgY29uZmlnUGF0aDogcmVzb2x2ZWQgfVxufVxuIl19
@@ -0,0 +1,39 @@
1
+ import fs from "node:fs";
2
+ import { join } from "node:path";
3
+ import { temporaryDirectoryTask } from "tempy";
4
+ import { describe, expect, it } from "vite-plus/test";
5
+ import { loadConfig } from "./load.js";
6
+ describe("loadConfig", () => {
7
+ it("should throw when an explicit path points at a missing file", async () => {
8
+ await expect(loadConfig("/nonexistent/config.ts")).rejects.toThrow(/not found/);
9
+ });
10
+ it("should return defaults when no path is given and cwd has no config", () => temporaryDirectoryTask(async (tmpDir) => {
11
+ const cwd = process.cwd();
12
+ try {
13
+ process.chdir(tmpDir);
14
+ const config = await loadConfig();
15
+ expect(config.title).toBe("Livemark");
16
+ expect(config.include).toBe("**/*.md");
17
+ expect(config.root).toBe(tmpDir);
18
+ expect(config.configPath).toBe(join(tmpDir, "livemark.config.ts"));
19
+ }
20
+ finally {
21
+ process.chdir(cwd);
22
+ }
23
+ }));
24
+ it("should load config from explicit path", () => temporaryDirectoryTask(async (tmpDir) => {
25
+ const configPath = join(tmpDir, "livemark.config.ts");
26
+ fs.writeFileSync(configPath, 'export default { include: "articles/**/*.mdx" }\n');
27
+ const config = await loadConfig(configPath);
28
+ expect(config.include).toBe("articles/**/*.mdx");
29
+ expect(config.root).toBe(tmpDir);
30
+ }));
31
+ it("should apply defaults when fields are omitted", () => temporaryDirectoryTask(async (tmpDir) => {
32
+ const configPath = join(tmpDir, "livemark.config.ts");
33
+ fs.writeFileSync(configPath, "export default {}\n");
34
+ const config = await loadConfig(configPath);
35
+ expect(config.include).toBe("**/*.md");
36
+ expect(config.title).toBe("Livemark");
37
+ }));
38
+ });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc291cmNlL2FjdGlvbnMvY29uZmlnL2xvYWQudW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV0QyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixFQUFFLENBQUMsNkRBQTZELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDM0UsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNoRSxXQUFXLENBQ1osQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRSxDQUM1RSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQTtZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtRQUNwRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRUwsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRSxDQUMvQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3JELEVBQUUsQ0FBQyxhQUFhLENBQ2QsVUFBVSxFQUNWLG1EQUFtRCxDQUNwRCxDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRUwsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRSxDQUN2RCxzQkFBc0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQ3JELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDdkMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeVRhc2sgfSBmcm9tIFwidGVtcHlcIlxuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gXCIuL2xvYWQudHNcIlxuXG5kZXNjcmliZShcImxvYWRDb25maWdcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCB0aHJvdyB3aGVuIGFuIGV4cGxpY2l0IHBhdGggcG9pbnRzIGF0IGEgbWlzc2luZyBmaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBleHBlY3QobG9hZENvbmZpZyhcIi9ub25leGlzdGVudC9jb25maWcudHNcIikpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIC9ub3QgZm91bmQvLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCByZXR1cm4gZGVmYXVsdHMgd2hlbiBubyBwYXRoIGlzIGdpdmVuIGFuZCBjd2QgaGFzIG5vIGNvbmZpZ1wiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIodG1wRGlyKVxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKClcbiAgICAgICAgZXhwZWN0KGNvbmZpZy50aXRsZSkudG9CZShcIkxpdmVtYXJrXCIpXG4gICAgICAgIGV4cGVjdChjb25maWcuaW5jbHVkZSkudG9CZShcIioqLyoubWRcIilcbiAgICAgICAgZXhwZWN0KGNvbmZpZy5yb290KS50b0JlKHRtcERpcilcbiAgICAgICAgZXhwZWN0KGNvbmZpZy5jb25maWdQYXRoKS50b0JlKGpvaW4odG1wRGlyLCBcImxpdmVtYXJrLmNvbmZpZy50c1wiKSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHByb2Nlc3MuY2hkaXIoY3dkKVxuICAgICAgfVxuICAgIH0pKVxuXG4gIGl0KFwic2hvdWxkIGxvYWQgY29uZmlnIGZyb20gZXhwbGljaXQgcGF0aFwiLCAoKSA9PlxuICAgIHRlbXBvcmFyeURpcmVjdG9yeVRhc2soYXN5bmMgdG1wRGlyID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHRtcERpciwgXCJsaXZlbWFyay5jb25maWcudHNcIilcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIGNvbmZpZ1BhdGgsXG4gICAgICAgICdleHBvcnQgZGVmYXVsdCB7IGluY2x1ZGU6IFwiYXJ0aWNsZXMvKiovKi5tZHhcIiB9XFxuJyxcbiAgICAgIClcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoY29uZmlnUGF0aClcbiAgICAgIGV4cGVjdChjb25maWcuaW5jbHVkZSkudG9CZShcImFydGljbGVzLyoqLyoubWR4XCIpXG4gICAgICBleHBlY3QoY29uZmlnLnJvb3QpLnRvQmUodG1wRGlyKVxuICAgIH0pKVxuXG4gIGl0KFwic2hvdWxkIGFwcGx5IGRlZmF1bHRzIHdoZW4gZmllbGRzIGFyZSBvbWl0dGVkXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyB0bXBEaXIgPT4ge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4odG1wRGlyLCBcImxpdmVtYXJrLmNvbmZpZy50c1wiKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBcImV4cG9ydCBkZWZhdWx0IHt9XFxuXCIpXG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKGNvbmZpZ1BhdGgpXG4gICAgICBleHBlY3QoY29uZmlnLmluY2x1ZGUpLnRvQmUoXCIqKi8qLm1kXCIpXG4gICAgICBleHBlY3QoY29uZmlnLnRpdGxlKS50b0JlKFwiTGl2ZW1hcmtcIilcbiAgICB9KSlcbn0pXG4iXX0=
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Synthesize a fully self-contained per-consumer Vite mount at
3
+ * `<livemark-pkg>/targets/<hash>/`.
4
+ *
5
+ * The mount is built by copying livemark's `source/` wholesale, then
6
+ * overlaying any matching files from the consumer's `.livemark/`. Every
7
+ * file lives at its target path as a real file — no symlinks — so
8
+ * Vite's relative-import and bare-specifier resolution all anchor
9
+ * inside the target dir, where node_modules walks reach livemark's pnpm
10
+ * subtree natively.
11
+ *
12
+ * Behavior:
13
+ * - First run (target dir missing): full source copy + overlay.
14
+ * - Subsequent runs: skip the source copy. Source is immutable in
15
+ * installed mode; in livemark's own dev the watcher keeps the target
16
+ * in sync. Only the `.livemark/` overlay is re-applied each time —
17
+ * cheap, and may have changed between runs.
18
+ * - With `--clear` in argv: wipe the entire target dir (including
19
+ * downstream caches like `.vite/`, `.content-collections/`,
20
+ * `cache/`, `routeTree.gen.ts`) and rebuild from scratch. Use this
21
+ * to recover from a stale or corrupted cache.
22
+ *
23
+ * Returns the absolute path to the target dir.
24
+ */
25
+ export declare function buildTarget(configPath: string): string;
26
+ /** Compute the target dir for a given consumer config path without
27
+ * rebuilding it. Used by code that needs to write into the target
28
+ * (e.g. cache writers) outside of `buildTarget`'s setup phase. */
29
+ export declare function targetDirFor(configPath: string): string;
@@ -0,0 +1,87 @@
1
+ import { createHash } from "node:crypto";
2
+ import { cpSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../../settings.js";
5
+ // This file ships at <livemark-pkg>/source/actions/target/build.ts AND
6
+ // gets copied into <livemark-pkg>/targets/<hash>/actions/target/build.ts
7
+ // as part of every per-consumer mount. content-collections loads the
8
+ // COPIED version, so `import.meta.dirname` can land inside `targets/`.
9
+ // Walk up to the first directory holding livemark's `package.json` so
10
+ // SOURCE_DIR / TARGETS_ROOT always anchor at the package, never at a
11
+ // per-consumer dir.
12
+ const LIVEMARK_PKG = findLivemarkPkg(import.meta.dirname);
13
+ const SOURCE_DIR = join(LIVEMARK_PKG, "source");
14
+ const TARGETS_ROOT = join(LIVEMARK_PKG, "targets");
15
+ function findLivemarkPkg(start) {
16
+ let cur = start;
17
+ while (cur !== dirname(cur)) {
18
+ if (existsSync(join(cur, "package.json")))
19
+ return cur;
20
+ cur = dirname(cur);
21
+ }
22
+ throw new Error(`Could not locate livemark package root from ${start}`);
23
+ }
24
+ /**
25
+ * Synthesize a fully self-contained per-consumer Vite mount at
26
+ * `<livemark-pkg>/targets/<hash>/`.
27
+ *
28
+ * The mount is built by copying livemark's `source/` wholesale, then
29
+ * overlaying any matching files from the consumer's `.livemark/`. Every
30
+ * file lives at its target path as a real file — no symlinks — so
31
+ * Vite's relative-import and bare-specifier resolution all anchor
32
+ * inside the target dir, where node_modules walks reach livemark's pnpm
33
+ * subtree natively.
34
+ *
35
+ * Behavior:
36
+ * - First run (target dir missing): full source copy + overlay.
37
+ * - Subsequent runs: skip the source copy. Source is immutable in
38
+ * installed mode; in livemark's own dev the watcher keeps the target
39
+ * in sync. Only the `.livemark/` overlay is re-applied each time —
40
+ * cheap, and may have changed between runs.
41
+ * - With `--clear` in argv: wipe the entire target dir (including
42
+ * downstream caches like `.vite/`, `.content-collections/`,
43
+ * `cache/`, `routeTree.gen.ts`) and rebuild from scratch. Use this
44
+ * to recover from a stale or corrupted cache.
45
+ *
46
+ * Returns the absolute path to the target dir.
47
+ */
48
+ export function buildTarget(configPath) {
49
+ const targetDir = targetDirFor(configPath);
50
+ const overridesRoot = join(dirname(configPath), ".livemark");
51
+ const clear = process.argv.includes("--clear");
52
+ if (clear)
53
+ rmSync(targetDir, { recursive: true, force: true });
54
+ if (!existsSync(targetDir)) {
55
+ mkdirSync(targetDir, { recursive: true });
56
+ cpSync(SOURCE_DIR, targetDir, { recursive: true });
57
+ }
58
+ for (const folder of ESCAPABLE_FOLDERS) {
59
+ const overlay = join(overridesRoot, folder);
60
+ if (!existsSync(overlay))
61
+ continue;
62
+ const dest = join(targetDir, folder);
63
+ if (!existsSync(dest))
64
+ mkdirSync(dest, { recursive: true });
65
+ for (const f of readdirSync(overlay)) {
66
+ cpSync(join(overlay, f), join(dest, f), { recursive: true, force: true });
67
+ }
68
+ }
69
+ for (const file of ESCAPABLE_FILES) {
70
+ const overlay = join(overridesRoot, file);
71
+ if (!existsSync(overlay))
72
+ continue;
73
+ cpSync(overlay, join(targetDir, file), { force: true });
74
+ }
75
+ return targetDir;
76
+ }
77
+ /** Compute the target dir for a given consumer config path without
78
+ * rebuilding it. Used by code that needs to write into the target
79
+ * (e.g. cache writers) outside of `buildTarget`'s setup phase. */
80
+ export function targetDirFor(configPath) {
81
+ const hash = createHash("sha256")
82
+ .update(configPath)
83
+ .digest("hex")
84
+ .slice(0, 16);
85
+ return join(TARGETS_ROOT, hash);
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvYWN0aW9ucy90YXJnZXQvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFdEUsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSxxRUFBcUU7QUFDckUsdUVBQXVFO0FBQ3ZFLHNFQUFzRTtBQUN0RSxxRUFBcUU7QUFDckUsb0JBQW9CO0FBQ3BCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN6RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFFbEQsU0FBUyxlQUFlLENBQUMsS0FBYTtJQUNwQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUE7SUFDZixPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUE7UUFDckQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUN6RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFrQjtJQUM1QyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM1RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUU5QyxJQUFJLEtBQUs7UUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQUUsU0FBUTtRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzNELEtBQUssTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFBRSxTQUFRO1FBQ2xDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O21FQUVtRTtBQUNuRSxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQWtCO0lBQzdDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDOUIsTUFBTSxDQUFDLFVBQVUsQ0FBQztTQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MudHNcIlxuXG4vLyBUaGlzIGZpbGUgc2hpcHMgYXQgPGxpdmVtYXJrLXBrZz4vc291cmNlL2FjdGlvbnMvdGFyZ2V0L2J1aWxkLnRzIEFORFxuLy8gZ2V0cyBjb3BpZWQgaW50byA8bGl2ZW1hcmstcGtnPi90YXJnZXRzLzxoYXNoPi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1xuLy8gYXMgcGFydCBvZiBldmVyeSBwZXItY29uc3VtZXIgbW91bnQuIGNvbnRlbnQtY29sbGVjdGlvbnMgbG9hZHMgdGhlXG4vLyBDT1BJRUQgdmVyc2lvbiwgc28gYGltcG9ydC5tZXRhLmRpcm5hbWVgIGNhbiBsYW5kIGluc2lkZSBgdGFyZ2V0cy9gLlxuLy8gV2FsayB1cCB0byB0aGUgZmlyc3QgZGlyZWN0b3J5IGhvbGRpbmcgbGl2ZW1hcmsncyBgcGFja2FnZS5qc29uYCBzb1xuLy8gU09VUkNFX0RJUiAvIFRBUkdFVFNfUk9PVCBhbHdheXMgYW5jaG9yIGF0IHRoZSBwYWNrYWdlLCBuZXZlciBhdCBhXG4vLyBwZXItY29uc3VtZXIgZGlyLlxuY29uc3QgTElWRU1BUktfUEtHID0gZmluZExpdmVtYXJrUGtnKGltcG9ydC5tZXRhLmRpcm5hbWUpXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihMSVZFTUFSS19QS0csIFwic291cmNlXCIpXG5jb25zdCBUQVJHRVRTX1JPT1QgPSBqb2luKExJVkVNQVJLX1BLRywgXCJ0YXJnZXRzXCIpXG5cbmZ1bmN0aW9uIGZpbmRMaXZlbWFya1BrZyhzdGFydDogc3RyaW5nKSB7XG4gIGxldCBjdXIgPSBzdGFydFxuICB3aGlsZSAoY3VyICE9PSBkaXJuYW1lKGN1cikpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGN1ciwgXCJwYWNrYWdlLmpzb25cIikpKSByZXR1cm4gY3VyXG4gICAgY3VyID0gZGlybmFtZShjdXIpXG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIGxpdmVtYXJrIHBhY2thZ2Ugcm9vdCBmcm9tICR7c3RhcnR9YClcbn1cblxuLyoqXG4gKiBTeW50aGVzaXplIGEgZnVsbHkgc2VsZi1jb250YWluZWQgcGVyLWNvbnN1bWVyIFZpdGUgbW91bnQgYXRcbiAqIGA8bGl2ZW1hcmstcGtnPi90YXJnZXRzLzxoYXNoPi9gLlxuICpcbiAqIFRoZSBtb3VudCBpcyBidWlsdCBieSBjb3B5aW5nIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIHdob2xlc2FsZSwgdGhlblxuICogb3ZlcmxheWluZyBhbnkgbWF0Y2hpbmcgZmlsZXMgZnJvbSB0aGUgY29uc3VtZXIncyBgLmxpdmVtYXJrL2AuIEV2ZXJ5XG4gKiBmaWxlIGxpdmVzIGF0IGl0cyB0YXJnZXQgcGF0aCBhcyBhIHJlYWwgZmlsZSDigJQgbm8gc3ltbGlua3Mg4oCUIHNvXG4gKiBWaXRlJ3MgcmVsYXRpdmUtaW1wb3J0IGFuZCBiYXJlLXNwZWNpZmllciByZXNvbHV0aW9uIGFsbCBhbmNob3JcbiAqIGluc2lkZSB0aGUgdGFyZ2V0IGRpciwgd2hlcmUgbm9kZV9tb2R1bGVzIHdhbGtzIHJlYWNoIGxpdmVtYXJrJ3MgcG5wbVxuICogc3VidHJlZSBuYXRpdmVseS5cbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gRmlyc3QgcnVuICh0YXJnZXQgZGlyIG1pc3NpbmcpOiBmdWxsIHNvdXJjZSBjb3B5ICsgb3ZlcmxheS5cbiAqIC0gU3Vic2VxdWVudCBydW5zOiBza2lwIHRoZSBzb3VyY2UgY29weS4gU291cmNlIGlzIGltbXV0YWJsZSBpblxuICogICBpbnN0YWxsZWQgbW9kZTsgaW4gbGl2ZW1hcmsncyBvd24gZGV2IHRoZSB3YXRjaGVyIGtlZXBzIHRoZSB0YXJnZXRcbiAqICAgaW4gc3luYy4gT25seSB0aGUgYC5saXZlbWFyay9gIG92ZXJsYXkgaXMgcmUtYXBwbGllZCBlYWNoIHRpbWUg4oCUXG4gKiAgIGNoZWFwLCBhbmQgbWF5IGhhdmUgY2hhbmdlZCBiZXR3ZWVuIHJ1bnMuXG4gKiAtIFdpdGggYC0tY2xlYXJgIGluIGFyZ3Y6IHdpcGUgdGhlIGVudGlyZSB0YXJnZXQgZGlyIChpbmNsdWRpbmdcbiAqICAgZG93bnN0cmVhbSBjYWNoZXMgbGlrZSBgLnZpdGUvYCwgYC5jb250ZW50LWNvbGxlY3Rpb25zL2AsXG4gKiAgIGBjYWNoZS9gLCBgcm91dGVUcmVlLmdlbi50c2ApIGFuZCByZWJ1aWxkIGZyb20gc2NyYXRjaC4gVXNlIHRoaXNcbiAqICAgdG8gcmVjb3ZlciBmcm9tIGEgc3RhbGUgb3IgY29ycnVwdGVkIGNhY2hlLlxuICpcbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCBkaXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRhcmdldChjb25maWdQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZ1BhdGgpXG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKGRpcm5hbWUoY29uZmlnUGF0aCksIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IGNsZWFyID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiLS1jbGVhclwiKVxuXG4gIGlmIChjbGVhcikgcm1TeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG5cbiAgaWYgKCFleGlzdHNTeW5jKHRhcmdldERpcikpIHtcbiAgICBta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIGNwU3luYyhTT1VSQ0VfRElSLCB0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IGZvbGRlciBvZiBFU0NBUEFCTEVfRk9MREVSUykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGZvbGRlcilcbiAgICBpZiAoIWV4aXN0c1N5bmMob3ZlcmxheSkpIGNvbnRpbnVlXG4gICAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBmb2xkZXIpXG4gICAgaWYgKCFleGlzdHNTeW5jKGRlc3QpKSBta2RpclN5bmMoZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICBmb3IgKGNvbnN0IGYgb2YgcmVhZGRpclN5bmMob3ZlcmxheSkpIHtcbiAgICAgIGNwU3luYyhqb2luKG92ZXJsYXksIGYpLCBqb2luKGRlc3QsIGYpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBmaWxlIG9mIEVTQ0FQQUJMRV9GSUxFUykge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGZpbGUpXG4gICAgaWYgKCFleGlzdHNTeW5jKG92ZXJsYXkpKSBjb250aW51ZVxuICAgIGNwU3luYyhvdmVybGF5LCBqb2luKHRhcmdldERpciwgZmlsZSksIHsgZm9yY2U6IHRydWUgfSlcbiAgfVxuXG4gIHJldHVybiB0YXJnZXREaXJcbn1cblxuLyoqIENvbXB1dGUgdGhlIHRhcmdldCBkaXIgZm9yIGEgZ2l2ZW4gY29uc3VtZXIgY29uZmlnIHBhdGggd2l0aG91dFxuICogIHJlYnVpbGRpbmcgaXQuIFVzZWQgYnkgY29kZSB0aGF0IG5lZWRzIHRvIHdyaXRlIGludG8gdGhlIHRhcmdldFxuICogIChlLmcuIGNhY2hlIHdyaXRlcnMpIG91dHNpZGUgb2YgYGJ1aWxkVGFyZ2V0YCdzIHNldHVwIHBoYXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhcmdldERpckZvcihjb25maWdQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKGNvbmZpZ1BhdGgpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNilcbiAgcmV0dXJuIGpvaW4oVEFSR0VUU19ST09ULCBoYXNoKVxufVxuIl19
@@ -0,0 +1,15 @@
1
+ import { join } from "node:path";
2
+ import { Command } from "commander";
3
+ import { createBuilder } from "vite";
4
+ const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts");
5
+ /**
6
+ * Build the site for production.
7
+ */
8
+ export const build = new Command("build")
9
+ .description("Build the site for production")
10
+ .option("--clear", "Wipe and fully rebuild the runtime target dir")
11
+ .action(async () => {
12
+ const builder = await createBuilder({ configFile });
13
+ await builder.buildApp();
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQ25CLElBQUksRUFDSixJQUFJLEVBQ0osUUFBUSxFQUNSLGdCQUFnQixDQUNqQixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ3RDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQztLQUM1QyxNQUFNLENBQUMsU0FBUyxFQUFFLCtDQUErQyxDQUFDO0tBQ2xFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDMUIsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVCdWlsZGVyIH0gZnJvbSBcInZpdGVcIlxuXG5jb25zdCBjb25maWdGaWxlID0gam9pbihcbiAgaW1wb3J0Lm1ldGEuZGlybmFtZSxcbiAgXCIuLlwiLFxuICBcIi4uXCIsXG4gIFwic291cmNlXCIsXG4gIFwidml0ZS5jb25maWcudHNcIixcbilcblxuLyoqXG4gKiBCdWlsZCB0aGUgc2l0ZSBmb3IgcHJvZHVjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkID0gbmV3IENvbW1hbmQoXCJidWlsZFwiKVxuICAuZGVzY3JpcHRpb24oXCJCdWlsZCB0aGUgc2l0ZSBmb3IgcHJvZHVjdGlvblwiKVxuICAub3B0aW9uKFwiLS1jbGVhclwiLCBcIldpcGUgYW5kIGZ1bGx5IHJlYnVpbGQgdGhlIHJ1bnRpbWUgdGFyZ2V0IGRpclwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gYXdhaXQgY3JlYXRlQnVpbGRlcih7IGNvbmZpZ0ZpbGUgfSlcbiAgICBhd2FpdCBidWlsZGVyLmJ1aWxkQXBwKClcbiAgfSlcbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  /**
3
- * List or copy overridable livemark files into `.livemark/`.
3
+ * List or copy escapable livemark files into `.livemark/`.
4
4
  *
5
5
  * Without an argument, prints every file you can shadow. With a path, copies
6
6
  * the default from the livemark package into `.livemark/<path>`; fails if the
@@ -0,0 +1,62 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { Command } from "commander";
4
+ import pc from "picocolors";
5
+ import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
6
+ const defaultsRoot = join(import.meta.dirname, "..", "..", "source");
7
+ /**
8
+ * List or copy escapable livemark files into `.livemark/`.
9
+ *
10
+ * Without an argument, prints every file you can shadow. With a path, copies
11
+ * the default from the livemark package into `.livemark/<path>`; fails if the
12
+ * destination already exists.
13
+ */
14
+ export const escape = new Command("escape")
15
+ .description("List or copy escapable livemark files into .livemark/")
16
+ .argument("[path]", "path relative to .livemark/ (e.g. components/Footer.tsx, client.tsx)")
17
+ .action((relPath) => {
18
+ if (!relPath) {
19
+ for (const file of listEscapable())
20
+ console.log(file);
21
+ console.log(pc.dim("\nRun 'livemark escape <path>' to copy a file into .livemark/"));
22
+ return;
23
+ }
24
+ const isTopLevelFile = !relPath.includes("/") && ESCAPABLE_FILES.includes(relPath);
25
+ const [first] = relPath.split("/");
26
+ const isFolderPath = !!first && ESCAPABLE_FOLDERS.includes(first) && !relPath.includes("..");
27
+ if (!isTopLevelFile && !isFolderPath) {
28
+ console.error(pc.red(`Error: '${relPath}' is not escapable (folders: ${ESCAPABLE_FOLDERS.join(", ")}; files: ${ESCAPABLE_FILES.join(", ")})`));
29
+ process.exit(1);
30
+ }
31
+ const src = join(defaultsRoot, relPath);
32
+ if (!existsSync(src) || !statSync(src).isFile()) {
33
+ console.error(pc.red(`Error: '${relPath}' is not a livemark file`));
34
+ process.exit(1);
35
+ }
36
+ const dest = join(process.cwd(), ".livemark", relPath);
37
+ if (existsSync(dest)) {
38
+ console.error(pc.red(`Error: .livemark/${relPath} already exists`));
39
+ process.exit(1);
40
+ }
41
+ mkdirSync(dirname(dest), { recursive: true });
42
+ writeFileSync(dest, readFileSync(src));
43
+ console.log(`Copied ${pc.dim(relPath)} → ${pc.green(`.livemark/${relPath}`)}`);
44
+ });
45
+ function listEscapable() {
46
+ const files = [];
47
+ for (const folder of ESCAPABLE_FOLDERS) {
48
+ const dir = join(defaultsRoot, folder);
49
+ if (!existsSync(dir))
50
+ continue;
51
+ for (const entry of readdirSync(dir)) {
52
+ if (statSync(join(dir, entry)).isFile())
53
+ files.push(`${folder}/${entry}`);
54
+ }
55
+ }
56
+ for (const file of ESCAPABLE_FILES) {
57
+ if (existsSync(join(defaultsRoot, file)))
58
+ files.push(file);
59
+ }
60
+ return files.sort();
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbW1hbmRzL2VzY2FwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFFBQVEsRUFDUixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRW5FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUVwRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3hDLFdBQVcsQ0FBQyx1REFBdUQsQ0FBQztLQUNwRSxRQUFRLENBQ1AsUUFBUSxFQUNSLHNFQUFzRSxDQUN2RTtLQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxFQUFFLENBQUMsR0FBRyxDQUFDLCtEQUErRCxDQUFDLENBQ3hFLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUNsQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFD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SSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmNvbnN0IGRlZmF1bHRzUm9vdCA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwic291cmNlXCIpXG5cbi8qKlxuICogTGlzdCBvciBjb3B5IGVzY2FwYWJsZSBsaXZlbWFyayBmaWxlcyBpbnRvIGAubGl2ZW1hcmsvYC5cbiAqXG4gKiBXaXRob3V0IGFuIGFyZ3VtZW50LCBwcmludHMgZXZlcnkgZmlsZSB5b3UgY2FuIHNoYWRvdy4gV2l0aCBhIHBhdGgsIGNvcGllc1xuICogdGhlIGRlZmF1bHQgZnJvbSB0aGUgbGl2ZW1hcmsgcGFja2FnZSBpbnRvIGAubGl2ZW1hcmsvPHBhdGg+YDsgZmFpbHMgaWYgdGhlXG4gKiBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZSA9IG5ldyBDb21tYW5kKFwiZXNjYXBlXCIpXG4gIC5kZXNjcmlwdGlvbihcIkxpc3Qgb3IgY29weSBlc2NhcGFibGUgbGl2ZW1hcmsgZmlsZXMgaW50byAubGl2ZW1hcmsvXCIpXG4gIC5hcmd1bWVudChcbiAgICBcIltwYXRoXVwiLFxuICAgIFwicGF0aCByZWxhdGl2ZSB0byAubGl2ZW1hcmsvIChlLmcuIGNvbXBvbmVudHMvRm9vdGVyLnRzeCwgY2xpZW50LnRzeClcIixcbiAgKVxuICAuYWN0aW9uKChyZWxQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFyZWxQYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgbGlzdEVzY2FwYWJsZSgpKSBjb25zb2xlLmxvZyhmaWxlKVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIHBjLmRpbShcIlxcblJ1biAnbGl2ZW1hcmsgZXNjYXBlIDxwYXRoPicgdG8gY29weSBhIGZpbGUgaW50byAubGl2ZW1hcmsvXCIpLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNUb3BMZXZlbEZpbGUgPVxuICAgICAgIXJlbFBhdGguaW5jbHVkZXMoXCIvXCIpICYmIEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWxQYXRoKVxuICAgIGNvbnN0IFtmaXJzdF0gPSByZWxQYXRoLnNwbGl0KFwiL1wiKVxuICAgIGNvbnN0IGlzRm9sZGVyUGF0aCA9XG4gICAgICAhIWZpcnN0ICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGZpcnN0KSAmJiAhcmVsUGF0aC5pbmNsdWRlcyhcIi4uXCIpXG4gICAgaWYgKCFpc1RvcExldmVsRmlsZSAmJiAhaXNGb2xkZXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBwYy5yZWQoXG4gICAgICAgICAgYEVycm9yOiAnJHtyZWxQYXRofScgaXMgbm90IGVzY2FwYWJsZSAoZm9sZGVyczogJHtFU0NBUEFCTEVfRk9MREVSUy5qb2luKFwiLCBcIil9OyBmaWxlczogJHtFU0NBUEFCTEVfRklMRVMuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3JjID0gam9pbihkZWZhdWx0c1Jvb3QsIHJlbFBhdGgpXG4gICAgaWYgKCFleGlzdHNTeW5jKHNyYykgfHwgIXN0YXRTeW5jKHNyYykuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogJyR7cmVsUGF0aH0nIGlzIG5vdCBhIGxpdmVtYXJrIGZpbGVgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiLmxpdmVtYXJrXCIsIHJlbFBhdGgpXG4gICAgaWYgKGV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGMucmVkKGBFcnJvcjogLmxpdmVtYXJrLyR7cmVsUGF0aH0gYWxyZWFkeSBleGlzdHNgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIG1rZGlyU3luYyhkaXJuYW1lKGRlc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHdyaXRlRmlsZVN5bmMoZGVzdCwgcmVhZEZpbGVTeW5jKHNyYykpXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQ29waWVkICR7cGMuZGltKHJlbFBhdGgpfSDihpIgJHtwYy5ncmVlbihgLmxpdmVtYXJrLyR7cmVsUGF0aH1gKX1gLFxuICAgIClcbiAgfSlcblxuZnVuY3Rpb24gbGlzdEVzY2FwYWJsZSgpIHtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgRVNDQVBBQkxFX0ZPTERFUlMpIHtcbiAgICBjb25zdCBkaXIgPSBqb2luKGRlZmF1bHRzUm9vdCwgZm9sZGVyKVxuICAgIGlmICghZXhpc3RzU3luYyhkaXIpKSBjb250aW51ZVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyKSkge1xuICAgICAgaWYgKHN0YXRTeW5jKGpvaW4oZGlyLCBlbnRyeSkpLmlzRmlsZSgpKSBmaWxlcy5wdXNoKGAke2ZvbGRlcn0vJHtlbnRyeX1gKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgRVNDQVBBQkxFX0ZJTEVTKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkZWZhdWx0c1Jvb3QsIGZpbGUpKSkgZmlsZXMucHVzaChmaWxlKVxuICB9XG4gIHJldHVybiBmaWxlcy5zb3J0KClcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import { join } from "node:path";
2
+ import { Command } from "commander";
3
+ import { preview as vitePreview } from "vite";
4
+ const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts");
5
+ /**
6
+ * Preview the production build locally.
7
+ */
8
+ export const preview = new Command("preview")
9
+ .description("Preview the production build locally")
10
+ .option("--clear", "Wipe and fully rebuild the runtime target dir")
11
+ .action(async () => {
12
+ const server = await vitePreview({
13
+ configFile,
14
+ preview: { port: 8000, host: true },
15
+ });
16
+ server.printUrls();
17
+ server.bindCLIShortcuts({ print: true });
18
+ });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21tYW5kcy9wcmV2aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUU3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFDbkIsSUFBSSxFQUNKLElBQUksRUFDSixRQUFRLEVBQ1IsZ0JBQWdCLENBQ2pCLENBQUE7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDMUMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELE1BQU0sQ0FBQyxTQUFTLEVBQUUsK0NBQStDLENBQUM7S0FDbEUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDO1FBQy9CLFVBQVU7UUFDVixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7S0FDcEMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFDLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgcHJldmlldyBhcyB2aXRlUHJldmlldyB9IGZyb20gXCJ2aXRlXCJcblxuY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oXG4gIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gIFwiLi5cIixcbiAgXCIuLlwiLFxuICBcInNvdXJjZVwiLFxuICBcInZpdGUuY29uZmlnLnRzXCIsXG4pXG5cbi8qKlxuICogUHJldmlldyB0aGUgcHJvZHVjdGlvbiBidWlsZCBsb2NhbGx5LlxuICovXG5leHBvcnQgY29uc3QgcHJldmlldyA9IG5ldyBDb21tYW5kKFwicHJldmlld1wiKVxuICAuZGVzY3JpcHRpb24oXCJQcmV2aWV3IHRoZSBwcm9kdWN0aW9uIGJ1aWxkIGxvY2FsbHlcIilcbiAgLm9wdGlvbihcIi0tY2xlYXJcIiwgXCJXaXBlIGFuZCBmdWxseSByZWJ1aWxkIHRoZSBydW50aW1lIHRhcmdldCBkaXJcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdml0ZVByZXZpZXcoe1xuICAgICAgY29uZmlnRmlsZSxcbiAgICAgIHByZXZpZXc6IHsgcG9ydDogODAwMCwgaG9zdDogdHJ1ZSB9LFxuICAgIH0pXG4gICAgc2VydmVyLnByaW50VXJscygpXG4gICAgc2VydmVyLmJpbmRDTElTaG9ydGN1dHMoeyBwcmludDogdHJ1ZSB9KVxuICB9KVxuIl19