livemark 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/package.json +14 -14
  2. package/source/actions/changelog/build.ts +245 -0
  3. package/source/actions/changelog/build.unit.ts +69 -0
  4. package/source/actions/config/define.ts +11 -0
  5. package/source/actions/config/define.unit.ts +33 -0
  6. package/source/actions/config/load.ts +22 -0
  7. package/source/actions/config/load.unit.ts +30 -0
  8. package/source/commands/build.ts +21 -0
  9. package/source/commands/escape.ts +77 -0
  10. package/source/commands/preview.ts +25 -0
  11. package/source/commands/start.ts +26 -0
  12. package/{build/website → source}/components/Article.tsx +12 -2
  13. package/{build/website → source}/components/Callout.tsx +1 -1
  14. package/{build/website → source}/components/Layout.tsx +3 -14
  15. package/{build/website → source}/components/LinkButton.tsx +1 -1
  16. package/{build/website → source}/components/PageToolbar.tsx +21 -8
  17. package/{build/website → source}/components/Section.tsx +1 -1
  18. package/{build/website → source}/components/SectionHeader.tsx +1 -1
  19. package/{build/website/components/MiniSidebar.tsx → source/components/Sidebar.tsx} +21 -5
  20. package/{build/website/components/Sidebar.tsx → source/components/SidebarArticles.tsx} +22 -55
  21. package/source/components/SidebarPosts.tsx +129 -0
  22. package/source/components/SidebarReleases.tsx +85 -0
  23. package/{build/website → source}/content-collections.ts +2 -2
  24. package/{build/website → source}/elements/accordion.tsx +1 -1
  25. package/{build/website → source}/elements/alert-dialog.tsx +1 -1
  26. package/{build/website → source}/elements/alert.tsx +1 -1
  27. package/{build/website → source}/elements/aspect-ratio.tsx +1 -1
  28. package/{build/website → source}/elements/avatar.tsx +1 -1
  29. package/{build/website → source}/elements/badge.tsx +1 -1
  30. package/{build/website → source}/elements/breadcrumb.tsx +1 -1
  31. package/{build/website → source}/elements/button-group.tsx +1 -1
  32. package/{build/website → source}/elements/button.tsx +1 -1
  33. package/{build/website → source}/elements/calendar.tsx +1 -1
  34. package/{build/website → source}/elements/card.tsx +1 -1
  35. package/{build/website → source}/elements/carousel.tsx +1 -1
  36. package/{build/website → source}/elements/chart.tsx +1 -1
  37. package/{build/website → source}/elements/checkbox.tsx +1 -1
  38. package/{build/website → source}/elements/command.tsx +1 -1
  39. package/{build/website → source}/elements/context-menu.tsx +1 -1
  40. package/{build/website → source}/elements/dialog.tsx +1 -1
  41. package/{build/website → source}/elements/drawer.tsx +1 -1
  42. package/{build/website → source}/elements/dropdown-menu.tsx +1 -1
  43. package/{build/website → source}/elements/empty.tsx +1 -1
  44. package/{build/website → source}/elements/field.tsx +1 -1
  45. package/{build/website → source}/elements/hover-card.tsx +1 -1
  46. package/{build/website → source}/elements/input-group.tsx +1 -1
  47. package/{build/website → source}/elements/input-otp.tsx +1 -1
  48. package/{build/website → source}/elements/input.tsx +1 -1
  49. package/{build/website → source}/elements/item.tsx +1 -1
  50. package/{build/website → source}/elements/kbd.tsx +1 -1
  51. package/{build/website → source}/elements/label.tsx +1 -1
  52. package/{build/website → source}/elements/menubar.tsx +1 -1
  53. package/{build/website → source}/elements/native-select.tsx +1 -1
  54. package/{build/website → source}/elements/navigation-menu.tsx +1 -1
  55. package/{build/website → source}/elements/pagination.tsx +1 -1
  56. package/{build/website → source}/elements/popover.tsx +1 -1
  57. package/{build/website → source}/elements/progress.tsx +1 -1
  58. package/{build/website → source}/elements/radio-group.tsx +1 -1
  59. package/{build/website → source}/elements/resizable.tsx +1 -1
  60. package/{build/website → source}/elements/scroll-area.tsx +1 -1
  61. package/{build/website → source}/elements/select.tsx +1 -1
  62. package/{build/website → source}/elements/separator.tsx +1 -1
  63. package/{build/website → source}/elements/sheet.tsx +1 -1
  64. package/{build/website → source}/elements/sidebar.tsx +7 -4
  65. package/{build/website → source}/elements/skeleton.tsx +1 -1
  66. package/{build/website → source}/elements/slider.tsx +1 -1
  67. package/{build/website → source}/elements/spinner.tsx +1 -1
  68. package/{build/website → source}/elements/switch.tsx +1 -1
  69. package/{build/website → source}/elements/table.tsx +1 -1
  70. package/{build/website → source}/elements/tabs.tsx +1 -1
  71. package/{build/website → source}/elements/textarea.tsx +1 -1
  72. package/{build/website → source}/elements/toggle-group.tsx +1 -1
  73. package/{build/website → source}/elements/toggle.tsx +1 -1
  74. package/{build/website → source}/elements/tooltip.tsx +1 -1
  75. package/source/entrypoints/main.ts +12 -0
  76. package/{build/website → source}/env.d.ts +1 -1
  77. package/source/helpers/program.ts +6 -0
  78. package/{build/website → source}/helpers/section.ts +1 -1
  79. package/source/hooks/media.ts +29 -0
  80. package/source/index.ts +1 -0
  81. package/{build/website → source}/models/article.ts +4 -0
  82. package/source/models/config.ts +51 -0
  83. package/source/models/link.ts +11 -0
  84. package/source/models/patch.ts +9 -0
  85. package/source/models/section.ts +45 -0
  86. package/source/models/theme.ts +74 -0
  87. package/source/program.ts +18 -0
  88. package/source/settings.ts +6 -0
  89. package/{build/website → source}/vite.config.ts +3 -3
  90. package/{build → target}/actions/changelog/build.d.ts +1 -0
  91. package/target/actions/changelog/build.js +187 -0
  92. package/target/actions/changelog/build.unit.js +66 -0
  93. package/target/actions/config/define.js +8 -0
  94. package/target/actions/config/define.unit.js +29 -0
  95. package/target/actions/config/load.js +25 -0
  96. package/target/actions/config/load.unit.js +23 -0
  97. package/target/client.d.ts +1 -0
  98. package/target/client.js +6 -0
  99. package/target/commands/build.js +14 -0
  100. package/target/commands/escape.js +56 -0
  101. package/target/commands/preview.js +18 -0
  102. package/target/commands/start.js +19 -0
  103. package/target/components/Abbr.d.ts +5 -0
  104. package/target/components/Abbr.js +9 -0
  105. package/target/components/AnsiCode.d.ts +4 -0
  106. package/target/components/AnsiCode.js +6 -0
  107. package/target/components/Article.d.ts +5 -0
  108. package/target/components/Article.js +105 -0
  109. package/target/components/BackToTop.d.ts +3 -0
  110. package/target/components/BackToTop.js +19 -0
  111. package/target/components/Banner.d.ts +2 -0
  112. package/target/components/Banner.js +12 -0
  113. package/target/components/BlogIndex.d.ts +4 -0
  114. package/target/components/BlogIndex.js +62 -0
  115. package/target/components/Breadcrumbs.d.ts +1 -0
  116. package/target/components/Breadcrumbs.js +13 -0
  117. package/target/components/Callout.d.ts +8 -0
  118. package/target/components/Callout.js +43 -0
  119. package/target/components/Card.d.ts +7 -0
  120. package/target/components/Card.js +17 -0
  121. package/target/components/Cards.d.ts +4 -0
  122. package/target/components/Cards.js +6 -0
  123. package/target/components/ChangelogIndex.d.ts +4 -0
  124. package/target/components/ChangelogIndex.js +57 -0
  125. package/target/components/CodeBlock.d.ts +1 -0
  126. package/target/components/CodeBlock.js +47 -0
  127. package/target/components/CodeTabs.d.ts +6 -0
  128. package/target/components/CodeTabs.js +49 -0
  129. package/target/components/Column.d.ts +4 -0
  130. package/target/components/Column.js +6 -0
  131. package/target/components/Columns.d.ts +5 -0
  132. package/target/components/Columns.js +10 -0
  133. package/target/components/Content.d.ts +3 -0
  134. package/target/components/Content.js +5 -0
  135. package/target/components/ContentTab.d.ts +5 -0
  136. package/target/components/ContentTab.js +6 -0
  137. package/target/components/ContentTabs.d.ts +5 -0
  138. package/target/components/ContentTabs.js +47 -0
  139. package/target/components/DefaultCatchBoundary.d.ts +2 -0
  140. package/target/components/DefaultCatchBoundary.js +20 -0
  141. package/target/components/DefinitionList.d.ts +7 -0
  142. package/target/components/DefinitionList.js +14 -0
  143. package/target/components/Details.d.ts +5 -0
  144. package/target/components/Details.js +13 -0
  145. package/target/components/FileTree.d.ts +4 -0
  146. package/target/components/FileTree.js +17 -0
  147. package/target/components/Footer.d.ts +2 -0
  148. package/target/components/Footer.js +9 -0
  149. package/target/components/FootnoteRef.d.ts +3 -0
  150. package/target/components/FootnoteRef.js +31 -0
  151. package/target/components/Heading.d.ts +8 -0
  152. package/target/components/Heading.js +18 -0
  153. package/target/components/InlineBadge.d.ts +5 -0
  154. package/target/components/InlineBadge.js +7 -0
  155. package/target/components/InlineIcon.d.ts +5 -0
  156. package/target/components/InlineIcon.js +10 -0
  157. package/target/components/InlineToc.d.ts +4 -0
  158. package/target/components/InlineToc.js +14 -0
  159. package/target/components/Layout.d.ts +4 -0
  160. package/target/components/Layout.js +65 -0
  161. package/target/components/LinkButton.d.ts +7 -0
  162. package/target/components/LinkButton.js +11 -0
  163. package/target/components/Mermaid.d.ts +4 -0
  164. package/target/components/Mermaid.js +8 -0
  165. package/target/components/MermaidRenderer.d.ts +4 -0
  166. package/target/components/MermaidRenderer.js +32 -0
  167. package/target/components/NotFound.d.ts +3 -0
  168. package/target/components/NotFound.js +10 -0
  169. package/target/components/PackageTabs.d.ts +9 -0
  170. package/target/components/PackageTabs.js +28 -0
  171. package/target/components/PageToolbar.d.ts +7 -0
  172. package/target/components/PageToolbar.js +34 -0
  173. package/target/components/PrevNext.d.ts +4 -0
  174. package/target/components/PrevNext.js +34 -0
  175. package/target/components/Search.d.ts +2 -0
  176. package/target/components/Search.js +16 -0
  177. package/target/components/SearchDialog.d.ts +5 -0
  178. package/target/components/SearchDialog.js +139 -0
  179. package/target/components/Section.d.ts +5 -0
  180. package/target/components/Section.js +8 -0
  181. package/target/components/SectionHeader.d.ts +7 -0
  182. package/target/components/SectionHeader.js +7 -0
  183. package/target/components/Sidebar.d.ts +4 -0
  184. package/target/components/Sidebar.js +33 -0
  185. package/target/components/SidebarArticles.d.ts +2 -0
  186. package/target/components/SidebarArticles.js +45 -0
  187. package/target/components/SidebarLinks.d.ts +4 -0
  188. package/target/components/SidebarLinks.js +26 -0
  189. package/target/components/SidebarPosts.d.ts +2 -0
  190. package/target/components/SidebarPosts.js +53 -0
  191. package/target/components/SidebarReleases.d.ts +2 -0
  192. package/target/components/SidebarReleases.js +35 -0
  193. package/target/components/SidebarSections.d.ts +4 -0
  194. package/target/components/SidebarSections.js +36 -0
  195. package/target/components/SiteTitle.d.ts +2 -0
  196. package/target/components/SiteTitle.js +12 -0
  197. package/target/components/SortableTable.d.ts +5 -0
  198. package/target/components/SortableTable.js +63 -0
  199. package/target/components/SoundCloud.d.ts +4 -0
  200. package/target/components/SoundCloud.js +7 -0
  201. package/target/components/TagIndex.d.ts +5 -0
  202. package/target/components/TagIndex.js +64 -0
  203. package/target/components/Theme.d.ts +1 -0
  204. package/target/components/Theme.js +21 -0
  205. package/target/components/Toc.d.ts +12 -0
  206. package/target/components/Toc.js +128 -0
  207. package/target/components/YouTube.d.ts +4 -0
  208. package/target/components/YouTube.js +6 -0
  209. package/target/components/ZoomImage.d.ts +4 -0
  210. package/target/components/ZoomImage.js +26 -0
  211. package/target/content/article.d.ts +43 -0
  212. package/target/content/article.js +54 -0
  213. package/target/content/tag.d.ts +2 -0
  214. package/target/content/tag.js +30 -0
  215. package/target/content-collections.d.ts +2 -0
  216. package/target/content-collections.js +192 -0
  217. package/target/elements/accordion.d.ts +6 -0
  218. package/target/elements/accordion.js +19 -0
  219. package/target/elements/alert-dialog.d.ts +18 -0
  220. package/target/elements/alert-dialog.js +44 -0
  221. package/target/elements/alert.d.ts +9 -0
  222. package/target/elements/alert.js +28 -0
  223. package/target/elements/aspect-ratio.d.ts +4 -0
  224. package/target/elements/aspect-ratio.js +9 -0
  225. package/target/elements/avatar.d.ts +11 -0
  226. package/target/elements/avatar.js +23 -0
  227. package/target/elements/badge.d.ts +7 -0
  228. package/target/elements/badge.js +34 -0
  229. package/target/elements/breadcrumb.d.ts +9 -0
  230. package/target/elements/breadcrumb.js +39 -0
  231. package/target/elements/button-group.d.ts +10 -0
  232. package/target/elements/button-group.js +37 -0
  233. package/target/elements/button.d.ts +8 -0
  234. package/target/elements/button.js +35 -0
  235. package/target/elements/calendar.d.ts +10 -0
  236. package/target/elements/calendar.js +76 -0
  237. package/target/elements/card.d.ts +11 -0
  238. package/target/elements/card.js +25 -0
  239. package/target/elements/carousel.d.ts +28 -0
  240. package/target/elements/carousel.js +95 -0
  241. package/target/elements/chart.d.ts +44 -0
  242. package/target/elements/chart.js +140 -0
  243. package/target/elements/checkbox.d.ts +3 -0
  244. package/target/elements/checkbox.js +9 -0
  245. package/target/elements/collapsible.d.ts +5 -0
  246. package/target/elements/collapsible.js +13 -0
  247. package/target/elements/command.d.ts +23 -0
  248. package/target/elements/command.js +42 -0
  249. package/target/elements/context-menu.d.ts +29 -0
  250. package/target/elements/context-menu.js +54 -0
  251. package/target/elements/dialog.d.ts +16 -0
  252. package/target/elements/dialog.js +41 -0
  253. package/target/elements/direction.d.ts +1 -0
  254. package/target/elements/direction.js +2 -0
  255. package/target/elements/drawer.d.ts +12 -0
  256. package/target/elements/drawer.js +38 -0
  257. package/target/elements/dropdown-menu.d.ts +24 -0
  258. package/target/elements/dropdown-menu.js +54 -0
  259. package/target/elements/empty.d.ts +11 -0
  260. package/target/elements/empty.js +34 -0
  261. package/target/elements/field.d.ts +24 -0
  262. package/target/elements/field.js +69 -0
  263. package/target/elements/hover-card.d.ts +5 -0
  264. package/target/elements/hover-card.js +14 -0
  265. package/target/elements/input-group.d.ts +18 -0
  266. package/target/elements/input-group.js +60 -0
  267. package/target/elements/input-otp.d.ts +11 -0
  268. package/target/elements/input-otp.js +21 -0
  269. package/target/elements/input.d.ts +2 -0
  270. package/target/elements/input.js +8 -0
  271. package/target/elements/item.d.ts +21 -0
  272. package/target/elements/item.js +79 -0
  273. package/target/elements/kbd.d.ts +3 -0
  274. package/target/elements/kbd.js +10 -0
  275. package/target/elements/label.d.ts +2 -0
  276. package/target/elements/label.js +8 -0
  277. package/target/elements/menubar.d.ts +29 -0
  278. package/target/elements/menubar.js +58 -0
  279. package/target/elements/native-select.d.ts +8 -0
  280. package/target/elements/native-select.js +16 -0
  281. package/target/elements/navigation-menu.d.ts +11 -0
  282. package/target/elements/navigation-menu.js +34 -0
  283. package/target/elements/pagination.d.ts +17 -0
  284. package/target/elements/pagination.js +33 -0
  285. package/target/elements/popover.d.ts +9 -0
  286. package/target/elements/popover.js +23 -0
  287. package/target/elements/progress.d.ts +7 -0
  288. package/target/elements/progress.js +21 -0
  289. package/target/elements/radio-group.d.ts +5 -0
  290. package/target/elements/radio-group.js +12 -0
  291. package/target/elements/resizable.d.ts +7 -0
  292. package/target/elements/resizable.js +14 -0
  293. package/target/elements/scroll-area.d.ts +4 -0
  294. package/target/elements/scroll-area.js +13 -0
  295. package/target/elements/select.d.ts +15 -0
  296. package/target/elements/select.js +39 -0
  297. package/target/elements/separator.d.ts +3 -0
  298. package/target/elements/separator.js +8 -0
  299. package/target/elements/sheet.d.ts +13 -0
  300. package/target/elements/sheet.js +41 -0
  301. package/target/elements/sidebar.d.ts +63 -0
  302. package/target/elements/sidebar.js +272 -0
  303. package/target/elements/skeleton.d.ts +2 -0
  304. package/target/elements/skeleton.js +7 -0
  305. package/target/elements/slider.d.ts +3 -0
  306. package/target/elements/slider.js +15 -0
  307. package/target/elements/sonner.d.ts +3 -0
  308. package/target/elements/sonner.js +23 -0
  309. package/target/elements/spinner.d.ts +2 -0
  310. package/target/elements/spinner.js +8 -0
  311. package/target/elements/switch.d.ts +5 -0
  312. package/target/elements/switch.js +8 -0
  313. package/target/elements/table.d.ts +9 -0
  314. package/target/elements/table.js +28 -0
  315. package/target/elements/tabs.d.ts +10 -0
  316. package/target/elements/tabs.js +29 -0
  317. package/target/elements/textarea.d.ts +2 -0
  318. package/target/elements/textarea.js +7 -0
  319. package/target/elements/toggle-group.d.ts +10 -0
  320. package/target/elements/toggle-group.js +24 -0
  321. package/target/elements/toggle.d.ts +8 -0
  322. package/target/elements/toggle.js +26 -0
  323. package/target/elements/tooltip.d.ts +6 -0
  324. package/target/elements/tooltip.js +18 -0
  325. package/target/entrypoints/main.js +12 -0
  326. package/target/helpers/article-icon.d.ts +3 -0
  327. package/target/helpers/article-icon.js +34 -0
  328. package/target/helpers/article.d.ts +24 -0
  329. package/target/helpers/article.js +73 -0
  330. package/target/helpers/changelog-source.d.ts +7 -0
  331. package/target/helpers/changelog-source.js +16 -0
  332. package/target/helpers/changelog-source.unit.d.ts +1 -0
  333. package/target/helpers/changelog-source.unit.js +33 -0
  334. package/target/helpers/dynamic-icon-resolver.d.ts +5 -0
  335. package/target/helpers/dynamic-icon-resolver.js +17 -0
  336. package/target/helpers/dynamic-icon.d.ts +5 -0
  337. package/target/helpers/dynamic-icon.js +8 -0
  338. package/target/helpers/favicon.d.ts +2 -0
  339. package/target/helpers/favicon.js +11 -0
  340. package/target/helpers/model.d.ts +3 -0
  341. package/target/helpers/model.js +4 -0
  342. package/target/helpers/program.js +5 -0
  343. package/target/helpers/resolve-asset-path.d.ts +2 -0
  344. package/target/helpers/resolve-asset-path.js +9 -0
  345. package/target/helpers/resolve-includes.d.ts +2 -0
  346. package/target/helpers/resolve-includes.js +113 -0
  347. package/target/helpers/resolve-includes.unit.d.ts +1 -0
  348. package/target/helpers/resolve-includes.unit.js +76 -0
  349. package/target/helpers/search-text.d.ts +2 -0
  350. package/target/helpers/search-text.js +16 -0
  351. package/target/helpers/section.d.ts +13 -0
  352. package/target/helpers/section.js +39 -0
  353. package/target/helpers/section.unit.d.ts +1 -0
  354. package/target/helpers/section.unit.js +62 -0
  355. package/target/helpers/theme.d.ts +5 -0
  356. package/target/helpers/theme.js +23 -0
  357. package/target/helpers/toc-context.d.ts +5 -0
  358. package/target/helpers/toc-context.js +8 -0
  359. package/target/helpers/toc.d.ts +3 -0
  360. package/target/helpers/toc.js +41 -0
  361. package/target/helpers/toc.unit.d.ts +1 -0
  362. package/target/helpers/toc.unit.js +65 -0
  363. package/target/hooks/in-view.d.ts +4 -0
  364. package/target/hooks/in-view.js +23 -0
  365. package/target/hooks/media.d.ts +6 -0
  366. package/target/hooks/media.js +25 -0
  367. package/target/index.js +2 -0
  368. package/target/models/article.d.ts +57 -0
  369. package/target/models/article.js +21 -0
  370. package/{build → target}/models/config.d.ts +10 -0
  371. package/target/models/config.js +34 -0
  372. package/target/models/link.js +9 -0
  373. package/{build → target}/models/patch.d.ts +5 -0
  374. package/target/models/patch.js +7 -0
  375. package/target/models/section.js +26 -0
  376. package/target/models/theme.js +73 -0
  377. package/target/models/toc.d.ts +5 -0
  378. package/target/models/toc.js +2 -0
  379. package/target/plugins/rehype-inline-code.d.ts +19 -0
  380. package/target/plugins/rehype-inline-code.js +55 -0
  381. package/target/plugins/rehype-task-list-a11y.d.ts +10 -0
  382. package/target/plugins/rehype-task-list-a11y.js +29 -0
  383. package/target/plugins/remark-abbr.d.ts +6 -0
  384. package/target/plugins/remark-abbr.js +39 -0
  385. package/target/plugins/remark-abbr.unit.d.ts +1 -0
  386. package/target/plugins/remark-abbr.unit.js +79 -0
  387. package/target/plugins/remark-ansi.d.ts +8 -0
  388. package/target/plugins/remark-ansi.js +239 -0
  389. package/target/plugins/remark-ansi.unit.d.ts +1 -0
  390. package/target/plugins/remark-ansi.unit.js +134 -0
  391. package/target/plugins/remark-badge.d.ts +6 -0
  392. package/target/plugins/remark-badge.js +43 -0
  393. package/target/plugins/remark-badge.unit.d.ts +1 -0
  394. package/target/plugins/remark-badge.unit.js +76 -0
  395. package/target/plugins/remark-button.d.ts +6 -0
  396. package/target/plugins/remark-button.js +52 -0
  397. package/target/plugins/remark-button.unit.d.ts +1 -0
  398. package/target/plugins/remark-button.unit.js +105 -0
  399. package/target/plugins/remark-callout.d.ts +4 -0
  400. package/target/plugins/remark-callout.js +39 -0
  401. package/target/plugins/remark-card.d.ts +4 -0
  402. package/target/plugins/remark-card.js +66 -0
  403. package/target/plugins/remark-code-tabs.d.ts +4 -0
  404. package/target/plugins/remark-code-tabs.js +72 -0
  405. package/target/plugins/remark-columns.d.ts +4 -0
  406. package/target/plugins/remark-columns.js +54 -0
  407. package/target/plugins/remark-custom-heading-id.d.ts +14 -0
  408. package/target/plugins/remark-custom-heading-id.js +54 -0
  409. package/target/plugins/remark-custom-heading-id.unit.d.ts +1 -0
  410. package/target/plugins/remark-custom-heading-id.unit.js +91 -0
  411. package/target/plugins/remark-deflist.d.ts +4 -0
  412. package/target/plugins/remark-deflist.js +31 -0
  413. package/target/plugins/remark-details.d.ts +4 -0
  414. package/target/plugins/remark-details.js +33 -0
  415. package/target/plugins/remark-filetree.d.ts +12 -0
  416. package/target/plugins/remark-filetree.js +61 -0
  417. package/target/plugins/remark-filetree.unit.d.ts +1 -0
  418. package/target/plugins/remark-filetree.unit.js +87 -0
  419. package/target/plugins/remark-github-callout.d.ts +4 -0
  420. package/target/plugins/remark-github-callout.js +62 -0
  421. package/target/plugins/remark-icon.d.ts +4 -0
  422. package/target/plugins/remark-icon.js +36 -0
  423. package/target/plugins/remark-image.d.ts +9 -0
  424. package/target/plugins/remark-image.js +26 -0
  425. package/target/plugins/remark-media.d.ts +6 -0
  426. package/target/plugins/remark-media.js +52 -0
  427. package/target/plugins/remark-media.unit.d.ts +1 -0
  428. package/target/plugins/remark-media.unit.js +54 -0
  429. package/target/plugins/remark-mermaid.d.ts +4 -0
  430. package/target/plugins/remark-mermaid.js +20 -0
  431. package/target/plugins/remark-npm.d.ts +4 -0
  432. package/target/plugins/remark-npm.js +32 -0
  433. package/target/plugins/remark-steps.d.ts +6 -0
  434. package/target/plugins/remark-steps.js +30 -0
  435. package/target/plugins/remark-steps.unit.d.ts +1 -0
  436. package/target/plugins/remark-steps.unit.js +65 -0
  437. package/target/plugins/remark-tab.d.ts +6 -0
  438. package/target/plugins/remark-tab.js +76 -0
  439. package/target/plugins/remark-tab.unit.d.ts +1 -0
  440. package/target/plugins/remark-tab.unit.js +156 -0
  441. package/target/plugins/remark-toc.d.ts +6 -0
  442. package/target/plugins/remark-toc.js +33 -0
  443. package/target/plugins/remark-toc.unit.d.ts +1 -0
  444. package/target/plugins/remark-toc.unit.js +57 -0
  445. package/target/plugins/shiki-icon.d.ts +16 -0
  446. package/target/plugins/shiki-icon.js +66 -0
  447. package/target/plugins/shiki-line-highlight.d.ts +27 -0
  448. package/target/plugins/shiki-line-highlight.js +140 -0
  449. package/target/plugins/vite-livemark.d.ts +13 -0
  450. package/target/plugins/vite-livemark.js +76 -0
  451. package/target/program.js +18 -0
  452. package/target/routeTree.gen.d.ts +57 -0
  453. package/target/routeTree.gen.js +27 -0
  454. package/target/router.d.ts +6 -0
  455. package/target/router.js +26 -0
  456. package/target/routes/$.d.ts +1 -0
  457. package/target/routes/$.js +85 -0
  458. package/target/routes/__root.d.ts +1 -0
  459. package/target/routes/__root.js +69 -0
  460. package/target/server.d.ts +2 -0
  461. package/target/server.js +7 -0
  462. package/target/settings.js +7 -0
  463. package/target/utils/style.d.ts +2 -0
  464. package/target/utils/style.js +6 -0
  465. package/target/vite.config.d.ts +2 -0
  466. package/target/vite.config.js +64 -0
  467. package/build/actions/changelog/build.js +0 -158
  468. package/build/actions/changelog/build.unit.js +0 -66
  469. package/build/actions/config/define.js +0 -8
  470. package/build/actions/config/define.unit.js +0 -29
  471. package/build/actions/config/load.js +0 -25
  472. package/build/actions/config/load.unit.js +0 -23
  473. package/build/commands/build.js +0 -14
  474. package/build/commands/escape.js +0 -56
  475. package/build/commands/preview.js +0 -18
  476. package/build/commands/start.js +0 -19
  477. package/build/docs/markdown/includes/example.d.ts +0 -58
  478. package/build/docs/markdown/includes/example.js +0 -5
  479. package/build/entrypoints/main.js +0 -12
  480. package/build/helpers/program.js +0 -5
  481. package/build/index.js +0 -2
  482. package/build/livemark.config.d.ts +0 -58
  483. package/build/livemark.config.js +0 -25
  484. package/build/models/config.js +0 -34
  485. package/build/models/link.js +0 -9
  486. package/build/models/patch.js +0 -7
  487. package/build/models/section.js +0 -26
  488. package/build/models/theme.js +0 -73
  489. package/build/package.json +0 -138
  490. package/build/program.js +0 -18
  491. package/build/settings.js +0 -7
  492. package/build/vite.config.d.ts +0 -2
  493. package/build/vite.config.js +0 -48
  494. package/build/website/components/BlogSidebar.tsx +0 -162
  495. package/build/website/components/ChangelogSidebar.tsx +0 -120
  496. package/build/website/hooks/media.ts +0 -19
  497. /package/{build/website → source}/assets/logo.svg +0 -0
  498. /package/{build/website → source}/client.tsx +0 -0
  499. /package/{build/website → source}/components/Abbr.tsx +0 -0
  500. /package/{build/website → source}/components/AnsiCode.tsx +0 -0
  501. /package/{build/website → source}/components/BackToTop.tsx +0 -0
  502. /package/{build/website → source}/components/Banner.tsx +0 -0
  503. /package/{build/website → source}/components/BlogIndex.tsx +0 -0
  504. /package/{build/website → source}/components/Breadcrumbs.tsx +0 -0
  505. /package/{build/website → source}/components/Card.tsx +0 -0
  506. /package/{build/website → source}/components/Cards.tsx +0 -0
  507. /package/{build/website → source}/components/ChangelogIndex.tsx +0 -0
  508. /package/{build/website → source}/components/CodeBlock.tsx +0 -0
  509. /package/{build/website → source}/components/CodeTabs.tsx +0 -0
  510. /package/{build/website → source}/components/Column.tsx +0 -0
  511. /package/{build/website → source}/components/Columns.tsx +0 -0
  512. /package/{build/website → source}/components/Content.tsx +0 -0
  513. /package/{build/website → source}/components/ContentTab.tsx +0 -0
  514. /package/{build/website → source}/components/ContentTabs.tsx +0 -0
  515. /package/{build/website → source}/components/DefaultCatchBoundary.tsx +0 -0
  516. /package/{build/website → source}/components/DefinitionList.tsx +0 -0
  517. /package/{build/website → source}/components/Details.tsx +0 -0
  518. /package/{build/website → source}/components/FileTree.tsx +0 -0
  519. /package/{build/website → source}/components/Footer.tsx +0 -0
  520. /package/{build/website → source}/components/FootnoteRef.tsx +0 -0
  521. /package/{build/website → source}/components/Heading.tsx +0 -0
  522. /package/{build/website → source}/components/InlineBadge.tsx +0 -0
  523. /package/{build/website → source}/components/InlineIcon.tsx +0 -0
  524. /package/{build/website → source}/components/InlineToc.tsx +0 -0
  525. /package/{build/website → source}/components/Mermaid.tsx +0 -0
  526. /package/{build/website → source}/components/MermaidRenderer.tsx +0 -0
  527. /package/{build/website → source}/components/NotFound.tsx +0 -0
  528. /package/{build/website → source}/components/PackageTabs.tsx +0 -0
  529. /package/{build/website → source}/components/PrevNext.tsx +0 -0
  530. /package/{build/website → source}/components/Search.tsx +0 -0
  531. /package/{build/website → source}/components/SearchDialog.tsx +0 -0
  532. /package/{build/website → source}/components/SidebarLinks.tsx +0 -0
  533. /package/{build/website → source}/components/SidebarSections.tsx +0 -0
  534. /package/{build/website → source}/components/SiteTitle.tsx +0 -0
  535. /package/{build/website → source}/components/SortableTable.tsx +0 -0
  536. /package/{build/website → source}/components/SoundCloud.tsx +0 -0
  537. /package/{build/website → source}/components/TagIndex.tsx +0 -0
  538. /package/{build/website → source}/components/Theme.tsx +0 -0
  539. /package/{build/website → source}/components/Toc.tsx +0 -0
  540. /package/{build/website → source}/components/YouTube.tsx +0 -0
  541. /package/{build/website → source}/components/ZoomImage.tsx +0 -0
  542. /package/{build/website → source}/content/article.ts +0 -0
  543. /package/{build/website → source}/content/tag.ts +0 -0
  544. /package/{build/website → source}/elements/collapsible.tsx +0 -0
  545. /package/{build/website → source}/elements/direction.tsx +0 -0
  546. /package/{build/website → source}/elements/sonner.tsx +0 -0
  547. /package/{build/website → source}/helpers/article-icon.ts +0 -0
  548. /package/{build/website → source}/helpers/article.ts +0 -0
  549. /package/{build/website → source}/helpers/changelog-source.ts +0 -0
  550. /package/{build/website → source}/helpers/changelog-source.unit.ts +0 -0
  551. /package/{build/website → source}/helpers/dynamic-icon-resolver.tsx +0 -0
  552. /package/{build/website → source}/helpers/dynamic-icon.tsx +0 -0
  553. /package/{build/website → source}/helpers/favicon.ts +0 -0
  554. /package/{build/website → source}/helpers/model.ts +0 -0
  555. /package/{build/website → source}/helpers/resolve-asset-path.ts +0 -0
  556. /package/{build/website → source}/helpers/resolve-includes.ts +0 -0
  557. /package/{build/website → source}/helpers/resolve-includes.unit.ts +0 -0
  558. /package/{build/website → source}/helpers/search-text.ts +0 -0
  559. /package/{build/website → source}/helpers/section.unit.ts +0 -0
  560. /package/{build/website → source}/helpers/theme.ts +0 -0
  561. /package/{build/website → source}/helpers/toc-context.ts +0 -0
  562. /package/{build/website → source}/helpers/toc.ts +0 -0
  563. /package/{build/website → source}/helpers/toc.unit.ts +0 -0
  564. /package/{build/website → source}/hooks/in-view.ts +0 -0
  565. /package/{build/website → source}/models/toc.ts +0 -0
  566. /package/{build/website → source}/plugins/rehype-inline-code.ts +0 -0
  567. /package/{build/website → source}/plugins/rehype-task-list-a11y.ts +0 -0
  568. /package/{build/website → source}/plugins/remark-abbr.ts +0 -0
  569. /package/{build/website → source}/plugins/remark-abbr.unit.ts +0 -0
  570. /package/{build/website → source}/plugins/remark-ansi.ts +0 -0
  571. /package/{build/website → source}/plugins/remark-ansi.unit.ts +0 -0
  572. /package/{build/website → source}/plugins/remark-badge.ts +0 -0
  573. /package/{build/website → source}/plugins/remark-badge.unit.ts +0 -0
  574. /package/{build/website → source}/plugins/remark-button.ts +0 -0
  575. /package/{build/website → source}/plugins/remark-button.unit.ts +0 -0
  576. /package/{build/website → source}/plugins/remark-callout.ts +0 -0
  577. /package/{build/website → source}/plugins/remark-card.ts +0 -0
  578. /package/{build/website → source}/plugins/remark-code-tabs.ts +0 -0
  579. /package/{build/website → source}/plugins/remark-columns.ts +0 -0
  580. /package/{build/website → source}/plugins/remark-custom-heading-id.ts +0 -0
  581. /package/{build/website → source}/plugins/remark-custom-heading-id.unit.ts +0 -0
  582. /package/{build/website → source}/plugins/remark-deflist.ts +0 -0
  583. /package/{build/website → source}/plugins/remark-details.ts +0 -0
  584. /package/{build/website → source}/plugins/remark-filetree.ts +0 -0
  585. /package/{build/website → source}/plugins/remark-filetree.unit.ts +0 -0
  586. /package/{build/website → source}/plugins/remark-github-callout.ts +0 -0
  587. /package/{build/website → source}/plugins/remark-icon.ts +0 -0
  588. /package/{build/website → source}/plugins/remark-image.ts +0 -0
  589. /package/{build/website → source}/plugins/remark-media.ts +0 -0
  590. /package/{build/website → source}/plugins/remark-media.unit.ts +0 -0
  591. /package/{build/website → source}/plugins/remark-mermaid.ts +0 -0
  592. /package/{build/website → source}/plugins/remark-npm.ts +0 -0
  593. /package/{build/website → source}/plugins/remark-steps.ts +0 -0
  594. /package/{build/website → source}/plugins/remark-steps.unit.ts +0 -0
  595. /package/{build/website → source}/plugins/remark-tab.ts +0 -0
  596. /package/{build/website → source}/plugins/remark-tab.unit.ts +0 -0
  597. /package/{build/website → source}/plugins/remark-toc.ts +0 -0
  598. /package/{build/website → source}/plugins/remark-toc.unit.ts +0 -0
  599. /package/{build/website → source}/plugins/shiki-icon.ts +0 -0
  600. /package/{build/website → source}/plugins/shiki-line-highlight.ts +0 -0
  601. /package/{build/website → source}/plugins/vite-livemark.ts +0 -0
  602. /package/{build/website → source}/routeTree.gen.ts +0 -0
  603. /package/{build/website → source}/router.tsx +0 -0
  604. /package/{build/website → source}/routes/$.tsx +0 -0
  605. /package/{build/website → source}/routes/__root.tsx +0 -0
  606. /package/{build/website → source}/server.ts +0 -0
  607. /package/{build/website → source}/styles/general.css +0 -0
  608. /package/{build/website → source}/styles/markdown.css +0 -0
  609. /package/{build/website/helpers → source/utils}/style.ts +0 -0
  610. /package/{build → target}/actions/changelog/build.unit.d.ts +0 -0
  611. /package/{build → target}/actions/config/define.d.ts +0 -0
  612. /package/{build → target}/actions/config/define.unit.d.ts +0 -0
  613. /package/{build → target}/actions/config/load.d.ts +0 -0
  614. /package/{build → target}/actions/config/load.unit.d.ts +0 -0
  615. /package/{build → target}/commands/build.d.ts +0 -0
  616. /package/{build → target}/commands/escape.d.ts +0 -0
  617. /package/{build → target}/commands/preview.d.ts +0 -0
  618. /package/{build → target}/commands/start.d.ts +0 -0
  619. /package/{build → target}/entrypoints/main.d.ts +0 -0
  620. /package/{build → target}/helpers/program.d.ts +0 -0
  621. /package/{build → target}/index.d.ts +0 -0
  622. /package/{build → target}/models/link.d.ts +0 -0
  623. /package/{build → target}/models/section.d.ts +0 -0
  624. /package/{build → target}/models/theme.d.ts +0 -0
  625. /package/{build → target}/program.d.ts +0 -0
  626. /package/{build → target}/settings.d.ts +0 -0
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { icons } from "lucide-react";
3
+ function toPascalCase(name) {
4
+ return name
5
+ .split("-")
6
+ .map(s => s.charAt(0).toUpperCase() + s.slice(1))
7
+ .join("");
8
+ }
9
+ /** Resolves a Lucide icon by kebab-case name from the full registry */
10
+ export default function DynamicIconResolver(props) {
11
+ const key = toPascalCase(props.name);
12
+ if (!(key in icons))
13
+ return null;
14
+ const Icon = icons[key];
15
+ return _jsx(Icon, { className: props.className });
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1pY29uLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvZHluYW1pYy1pY29uLXJlc29sdmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUVwQyxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE9BQU8sSUFBSTtTQUNSLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ2IsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsT0FBTyxVQUFVLG1CQUFtQixDQUFDLEtBRzNDO0lBQ0MsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDaEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQXlCLENBQUMsQ0FBQTtJQUM3QyxPQUFPLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxHQUFJLENBQUE7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGljb25zIH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5cbmZ1bmN0aW9uIHRvUGFzY2FsQ2FzZShuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG5hbWVcbiAgICAuc3BsaXQoXCItXCIpXG4gICAgLm1hcChzID0+IHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpKVxuICAgIC5qb2luKFwiXCIpXG59XG5cbi8qKiBSZXNvbHZlcyBhIEx1Y2lkZSBpY29uIGJ5IGtlYmFiLWNhc2UgbmFtZSBmcm9tIHRoZSBmdWxsIHJlZ2lzdHJ5ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEeW5hbWljSWNvblJlc29sdmVyKHByb3BzOiB7XG4gIG5hbWU6IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbn0pIHtcbiAgY29uc3Qga2V5ID0gdG9QYXNjYWxDYXNlKHByb3BzLm5hbWUpXG4gIGlmICghKGtleSBpbiBpY29ucykpIHJldHVybiBudWxsXG4gIGNvbnN0IEljb24gPSBpY29uc1trZXkgYXMga2V5b2YgdHlwZW9mIGljb25zXVxuICByZXR1cm4gPEljb24gY2xhc3NOYW1lPXtwcm9wcy5jbGFzc05hbWV9IC8+XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /** Lazily loads and renders a Lucide icon by kebab-case name */
2
+ export declare function DynamicIcon(props: {
3
+ name: string;
4
+ className?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Suspense, lazy } from "react";
3
+ const Resolver = lazy(() => import("./dynamic-icon-resolver.js"));
4
+ /** Lazily loads and renders a Lucide icon by kebab-case name */
5
+ export function DynamicIcon(props) {
6
+ return (_jsx(Suspense, { children: _jsx(Resolver, { ...props }) }));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1pY29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvZHluYW1pYy1pY29uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyw0QkFBNkIsQ0FBQyxDQUFDLENBQUE7QUFFbEUsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBMkM7SUFDckUsT0FBTyxDQUNMLEtBQUMsUUFBUSxjQUNQLEtBQUMsUUFBUSxPQUFLLEtBQUssR0FBSSxHQUNkLENBQ1osQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdXNwZW5zZSwgbGF6eSB9IGZyb20gXCJyZWFjdFwiXG5cbmNvbnN0IFJlc29sdmVyID0gbGF6eSgoKSA9PiBpbXBvcnQoXCIuL2R5bmFtaWMtaWNvbi1yZXNvbHZlci50c3hcIikpXG5cbi8qKiBMYXppbHkgbG9hZHMgYW5kIHJlbmRlcnMgYSBMdWNpZGUgaWNvbiBieSBrZWJhYi1jYXNlIG5hbWUgKi9cbmV4cG9ydCBmdW5jdGlvbiBEeW5hbWljSWNvbihwcm9wczogeyBuYW1lOiBzdHJpbmc7IGNsYXNzTmFtZT86IHN0cmluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPFN1c3BlbnNlPlxuICAgICAgPFJlc29sdmVyIHsuLi5wcm9wc30gLz5cbiAgICA8L1N1c3BlbnNlPlxuICApXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ /** Derive the MIME type for a favicon from its file extension */
2
+ export declare function faviconType(href: string): "image/png" | "image/svg+xml" | "image/x-icon" | undefined;
@@ -0,0 +1,11 @@
1
+ /** Derive the MIME type for a favicon from its file extension */
2
+ export function faviconType(href) {
3
+ if (href.endsWith(".svg"))
4
+ return "image/svg+xml";
5
+ if (href.endsWith(".png"))
6
+ return "image/png";
7
+ if (href.endsWith(".ico"))
8
+ return "image/x-icon";
9
+ return undefined;
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmF2aWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL2Zhdmljb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxlQUFlLENBQUE7SUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFBO0lBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLGNBQWMsQ0FBQTtJQUNoRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIERlcml2ZSB0aGUgTUlNRSB0eXBlIGZvciBhIGZhdmljb24gZnJvbSBpdHMgZmlsZSBleHRlbnNpb24gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXZpY29uVHlwZShocmVmOiBzdHJpbmcpIHtcbiAgaWYgKGhyZWYuZW5kc1dpdGgoXCIuc3ZnXCIpKSByZXR1cm4gXCJpbWFnZS9zdmcreG1sXCJcbiAgaWYgKGhyZWYuZW5kc1dpdGgoXCIucG5nXCIpKSByZXR1cm4gXCJpbWFnZS9wbmdcIlxuICBpZiAoaHJlZi5lbmRzV2l0aChcIi5pY29cIikpIHJldHVybiBcImltYWdlL3gtaWNvblwiXG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ /** Zod schema for a non-empty string (rejects ""). */
3
+ export declare const nonEmptyString: z.ZodString;
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ /** Zod schema for a non-empty string (rejects ""). */
3
+ export const nonEmptyString = z.string().min(1);
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy9tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBRXZCLHNEQUFzRDtBQUN0RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcblxuLyoqIFpvZCBzY2hlbWEgZm9yIGEgbm9uLWVtcHR5IHN0cmluZyAocmVqZWN0cyBcIlwiKS4gKi9cbmV4cG9ydCBjb25zdCBub25FbXB0eVN0cmluZyA9IHouc3RyaW5nKCkubWluKDEpXG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3Byb2dyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFzQjtJQUNsRCxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQy9ELENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEhlbHBDb25maWd1cmF0aW9uIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuXG5leHBvcnQgY29uc3QgaGVscENvbmZpZ3VyYXRpb246IEhlbHBDb25maWd1cmF0aW9uID0ge1xuICBzdHlsZVRpdGxlOiBzdHIgPT4gcGMuYm9sZChzdHIudG9VcHBlckNhc2UoKS5yZXBsYWNlKFwiOlwiLCBcIlwiKSksXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ /** Resolve a relative asset path to an absolute URL serveable by Vite */
2
+ export declare function resolveAssetPath(url: string, filePath: string, root: string): string;
@@ -0,0 +1,9 @@
1
+ import { dirname, relative, resolve } from "node:path";
2
+ /** Resolve a relative asset path to an absolute URL serveable by Vite */
3
+ export function resolveAssetPath(url, filePath, root) {
4
+ if (url.startsWith("http") || url.startsWith("/") || url.startsWith("data:"))
5
+ return url;
6
+ const absolute = resolve(dirname(filePath), url);
7
+ return "/" + relative(root, absolute);
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1hc3NldC1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvcmVzb2x2ZS1hc3NldC1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV0RCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxRQUFnQixFQUFFLElBQVk7SUFDMUUsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDMUUsT0FBTyxHQUFHLENBQUE7SUFDWixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2hELE9BQU8sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpcm5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5cbi8qKiBSZXNvbHZlIGEgcmVsYXRpdmUgYXNzZXQgcGF0aCB0byBhbiBhYnNvbHV0ZSBVUkwgc2VydmVhYmxlIGJ5IFZpdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXNzZXRQYXRoKHVybDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCByb290OiBzdHJpbmcpIHtcbiAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSB8fCB1cmwuc3RhcnRzV2l0aChcIi9cIikgfHwgdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSlcbiAgICByZXR1cm4gdXJsXG4gIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZShkaXJuYW1lKGZpbGVQYXRoKSwgdXJsKVxuICByZXR1cm4gXCIvXCIgKyByZWxhdGl2ZShyb290LCBhYnNvbHV0ZSlcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ /** Resolves ::include{file="..."} directives by replacing them with referenced file contents */
2
+ export declare function resolveIncludes(content: string, filePath: string, depth?: number): string;
@@ -0,0 +1,113 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, extname, resolve } from "node:path";
3
+ const INCLUDE_RE = /^::include\{(.+)\}$/;
4
+ const FRONTMATTER_RE = /^---\n[\s\S]*?\n---\n?/;
5
+ const FENCE_RE = /^(`{3,}|~{3,})/;
6
+ const extToLang = {
7
+ ".ts": "typescript",
8
+ ".tsx": "tsx",
9
+ ".js": "javascript",
10
+ ".jsx": "jsx",
11
+ ".py": "python",
12
+ ".rs": "rust",
13
+ ".go": "go",
14
+ ".rb": "ruby",
15
+ ".java": "java",
16
+ ".kt": "kotlin",
17
+ ".swift": "swift",
18
+ ".c": "c",
19
+ ".cpp": "cpp",
20
+ ".h": "c",
21
+ ".cs": "csharp",
22
+ ".css": "css",
23
+ ".scss": "scss",
24
+ ".html": "html",
25
+ ".json": "json",
26
+ ".yaml": "yaml",
27
+ ".yml": "yaml",
28
+ ".toml": "toml",
29
+ ".xml": "xml",
30
+ ".sql": "sql",
31
+ ".sh": "bash",
32
+ ".bash": "bash",
33
+ ".zsh": "zsh",
34
+ ".fish": "fish",
35
+ ".ps1": "powershell",
36
+ ".dockerfile": "dockerfile",
37
+ ".graphql": "graphql",
38
+ ".proto": "protobuf",
39
+ ".lua": "lua",
40
+ ".php": "php",
41
+ ".r": "r",
42
+ ".zig": "zig",
43
+ ".ex": "elixir",
44
+ ".exs": "elixir",
45
+ };
46
+ function parseAttributes(raw) {
47
+ const attrs = {};
48
+ const re = /(\w+)="([^"]+)"/g;
49
+ let m = null;
50
+ while ((m = re.exec(raw)) !== null) {
51
+ attrs[m[1]] = m[2];
52
+ }
53
+ return attrs;
54
+ }
55
+ function resolveDirective(rawAttrs, fileDir, depth) {
56
+ const attrs = parseAttributes(rawAttrs);
57
+ const file = attrs.file;
58
+ if (!file)
59
+ return undefined;
60
+ const absolutePath = resolve(fileDir, file);
61
+ try {
62
+ let included = readFileSync(absolutePath, "utf-8");
63
+ const ext = extname(file).toLowerCase();
64
+ const lang = extToLang[ext];
65
+ if (lang && !file.endsWith(".md")) {
66
+ const filename = file.split("/").pop();
67
+ const title = `title="${filename}"`;
68
+ const meta = attrs.meta ? ` ${attrs.meta}` : "";
69
+ return ("```" + lang + " " + title + meta + "\n" + included.trimEnd() + "\n```");
70
+ }
71
+ included = included.replace(FRONTMATTER_RE, "");
72
+ return resolveIncludes(included.trim(), absolutePath, depth + 1);
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ }
78
+ /** Resolves ::include{file="..."} directives by replacing them with referenced file contents */
79
+ export function resolveIncludes(content, filePath, depth = 0) {
80
+ if (depth > 5)
81
+ return content;
82
+ const fileDir = dirname(filePath);
83
+ const lines = content.split("\n");
84
+ const result = [];
85
+ let fenceMarker;
86
+ for (const line of lines) {
87
+ const fenceMatch = FENCE_RE.exec(line);
88
+ if (fenceMatch) {
89
+ if (!fenceMarker) {
90
+ fenceMarker = fenceMatch[1];
91
+ }
92
+ else if (line.startsWith(fenceMarker)) {
93
+ fenceMarker = undefined;
94
+ }
95
+ result.push(line);
96
+ continue;
97
+ }
98
+ if (fenceMarker) {
99
+ result.push(line);
100
+ continue;
101
+ }
102
+ const includeMatch = INCLUDE_RE.exec(line);
103
+ if (includeMatch) {
104
+ const resolved = resolveDirective(includeMatch[1], fileDir, depth);
105
+ result.push(resolved ?? line);
106
+ }
107
+ else {
108
+ result.push(line);
109
+ }
110
+ }
111
+ return result.join("\n");
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1pbmNsdWRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3Jlc29sdmUtaW5jbHVkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFckQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUE7QUFDeEMsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUE7QUFDL0MsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUE7QUFFakMsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEtBQUssRUFBRSxZQUFZO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0lBQ2IsS0FBSyxFQUFFLFlBQVk7SUFDbkIsTUFBTSxFQUFFLEtBQUs7SUFDYixLQUFLLEVBQUUsUUFBUTtJQUNmLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxLQUFLLEVBQUUsTUFBTTtJQUNiLE9BQU8sRUFBRSxNQUFNO0lBQ2YsS0FBSyxFQUFFLFFBQVE7SUFDZixRQUFRLEVBQUUsT0FBTztJQUNqQixJQUFJLEVBQUUsR0FBRztJQUNULE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLEdBQUc7SUFDVCxLQUFLLEVBQUUsUUFBUTtJQUNmLE1BQU0sRUFBRSxLQUFLO0lBQ2IsT0FBTyxFQUFFLE1BQU07SUFDZixPQUFPLEVBQUUsTUFBTTtJQUNmLE9BQU8sRUFBRSxNQUFNO0lBQ2YsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsTUFBTTtJQUNkLE9BQU8sRUFBRSxNQUFNO0lBQ2YsTUFBTSxFQUFFLEtBQUs7SUFDYixNQUFNLEVBQUUsS0FBSztJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsT0FBTyxFQUFFLE1BQU07SUFDZixNQUFNLEVBQUUsS0FB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bm9kZTpmc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmNvbnN0IElOQ0xVREVfUkUgPSAvXjo6aW5jbHVkZVxceyguKylcXH0kL1xuY29uc3QgRlJPTlRNQVRURVJfUkUgPSAvXi0tLVxcbltcXHNcXFNdKj9cXG4tLS1cXG4/L1xuY29uc3QgRkVOQ0VfUkUgPSAvXihgezMsfXx+ezMsfSkvXG5cbmNvbnN0IGV4dFRvTGFuZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgXCIudHNcIjogXCJ0eXBlc2NyaXB0XCIsXG4gIFwiLnRzeFwiOiBcInRzeFwiLFxuICBcIi5qc1wiOiBcImphdmFzY3JpcHRcIixcbiAgXCIuanN4XCI6IFwianN4XCIsXG4gIFwiLnB5XCI6IFwicHl0aG9uXCIsXG4gIFwiLnJzXCI6IFwicnVzdFwiLFxuICBcIi5nb1wiOiBcImdvXCIsXG4gIFwiLnJiXCI6IFwicnVieVwiLFxuICBcIi5qYXZhXCI6IFwiamF2YVwiLFxuICBcIi5rdFwiOiBcImtvdGxpblwiLFxuICBcIi5zd2lmdFwiOiBcInN3aWZ0XCIsXG4gIFwiLmNcIjogXCJjXCIsXG4gIFwiLmNwcFwiOiBcImNwcFwiLFxuICBcIi5oXCI6IFwiY1wiLFxuICBcIi5jc1wiOiBcImNzaGFycFwiLFxuICBcIi5jc3NcIjogXCJjc3NcIixcbiAgXCIuc2Nzc1wiOiBcInNjc3NcIixcbiAgXCIuaHRtbFwiOiBcImh0bWxcIixcbiAgXCIuanNvblwiOiBcImpzb25cIixcbiAgXCIueWFtbFwiOiBcInlhbWxcIixcbiAgXCIueW1sXCI6IFwieWFtbFwiLFxuICBcIi50b21sXCI6IFwidG9tbFwiLFxuICBcIi54bWxcIjogXCJ4bWxcIixcbiAgXCIuc3FsXCI6IFwic3FsXCIsXG4gIFwiLnNoXCI6IFwiYmFzaFwiLFxuICBcIi5iYXNoXCI6IFwiYmFzaFwiLFxuICBcIi56c2hcIjogXCJ6c2hcIixcbiAgXCIuZmlzaFwiOiBcImZpc2hcIixcbiAgXCIucHMxXCI6IFwicG93ZXJzaGVsbFwiLFxuICBcIi5kb2NrZXJmaWxlXCI6IFwiZG9ja2VyZmlsZVwiLFxuICBcIi5ncmFwaHFsXCI6IFwiZ3JhcGhxbFwiLFxuICBcIi5wcm90b1wiOiBcInByb3RvYnVmXCIsXG4gIFwiLmx1YVwiOiBcImx1YVwiLFxuICBcIi5waHBcIjogXCJwaHBcIixcbiAgXCIuclwiOiBcInJcIixcbiAgXCIuemlnXCI6IFwiemlnXCIsXG4gIFwiLmV4XCI6IFwiZWxpeGlyXCIsXG4gIFwiLmV4c1wiOiBcImVsaXhpclwiLFxufVxuXG5mdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMocmF3OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBjb25zdCByZSA9IC8oXFx3Kyk9XCIoW15cIl0rKVwiL2dcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBudWxsXG4gIHdoaWxlICgobSA9IHJlLmV4ZWMocmF3KSkgIT09IG51bGwpIHtcbiAgICBhdHRyc1ttWzFdIV0gPSBtWzJdIVxuICB9XG4gIHJldHVybiBhdHRyc1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKFxuICByYXdBdHRyczogc3RyaW5nLFxuICBmaWxlRGlyOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdHRycyA9IHBhcnNlQXR0cmlidXRlcyhyYXdBdHRycylcbiAgY29uc3QgZmlsZSA9IGF0dHJzLmZpbGVcbiAgaWYgKCFmaWxlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcmVzb2x2ZShmaWxlRGlyLCBmaWxlKVxuICB0cnkge1xuICAgIGxldCBpbmNsdWRlZCA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmLThcIilcblxuICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoZmlsZSkudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGxhbmcgPSBleHRUb0xhbmdbZXh0XVxuXG4gICAgaWYgKGxhbmcgJiYgIWZpbGUuZW5kc1dpdGgoXCIubWRcIikpIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZS5zcGxpdChcIi9cIikucG9wKCkhXG4gICAgICBjb25zdCB0aXRsZSA9IGB0aXRsZT1cIiR7ZmlsZW5hbWV9XCJgXG4gICAgICBjb25zdCBtZXRhID0gYXR0cnMubWV0YSA/IGAgJHthdHRycy5tZXRhfWAgOiBcIlwiXG4gICAgICByZXR1cm4gKFxuICAgICAgICBcImBgYFwiICsgbGFuZyArIFwiIFwiICsgdGl0bGUgKyBtZXRhICsgXCJcXG5cIiArIGluY2x1ZGVkLnRyaW1FbmQoKSArIFwiXFxuYGBgXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBpbmNsdWRlZCA9IGluY2x1ZGVkLnJlcGxhY2UoRlJPTlRNQVRURVJfUkUsIFwiXCIpXG4gICAgcmV0dXJuIHJlc29sdmVJbmNsdWRlcyhpbmNsdWRlZC50cmltKCksIGFic29sdXRlUGF0aCwgZGVwdGggKyAxKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqIFJlc29sdmVzIDo6aW5jbHVkZXtmaWxlPVwiLi4uXCJ9IGRpcmVjdGl2ZXMgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCByZWZlcmVuY2VkIGZpbGUgY29udGVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW5jbHVkZXMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVwdGggPSAwLFxuKTogc3RyaW5nIHtcbiAgaWYgKGRlcHRoID4gNSkgcmV0dXJuIGNvbnRlbnRcblxuICBjb25zdCBmaWxlRGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICBsZXQgZmVuY2VNYXJrZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGZlbmNlTWF0Y2ggPSBGRU5DRV9SRS5leGVjKGxpbmUpXG4gICAgaWYgKGZlbmNlTWF0Y2gpIHtcbiAgICAgIGlmICghZmVuY2VNYXJrZXIpIHtcbiAgICAgICAgZmVuY2VNYXJrZXIgPSBmZW5jZU1hdGNoWzFdIVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoZmVuY2VNYXJrZXIpKSB7XG4gICAgICAgIGZlbmNlTWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChsaW5lKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZmVuY2VNYXJrZXIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVNYXRjaCA9IElOQ0xVREVfUkUuZXhlYyhsaW5lKVxuICAgIGlmIChpbmNsdWRlTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZURpcmVjdGl2ZShpbmNsdWRlTWF0Y2hbMV0hLCBmaWxlRGlyLCBkZXB0aClcbiAgICAgIHJlc3VsdC5wdXNoKHJlc29sdmVkID8/IGxpbmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,76 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { describe, expect, it } from "vite-plus/test";
4
+ import { temporaryDirectory } from "tempy";
5
+ import { resolveIncludes } from "./resolve-includes.js";
6
+ describe("resolveIncludes", () => {
7
+ it("should replace include directive with file content", () => {
8
+ const dir = temporaryDirectory();
9
+ writeFileSync(join(dir, "snippet.md"), "Hello from snippet");
10
+ const result = resolveIncludes('::include{file="snippet.md"}', join(dir, "main.md"));
11
+ expect(result).toBe("Hello from snippet");
12
+ });
13
+ it("should strip frontmatter from included files", () => {
14
+ const dir = temporaryDirectory();
15
+ writeFileSync(join(dir, "snippet.md"), "---\ntitle: Test\n---\nContent here");
16
+ const result = resolveIncludes('::include{file="snippet.md"}', join(dir, "main.md"));
17
+ expect(result).toBe("Content here");
18
+ });
19
+ it("should preserve surrounding content", () => {
20
+ const dir = temporaryDirectory();
21
+ writeFileSync(join(dir, "snippet.md"), "Included text");
22
+ const result = resolveIncludes('Before\n\n::include{file="snippet.md"}\n\nAfter', join(dir, "main.md"));
23
+ expect(result).toBe("Before\n\nIncluded text\n\nAfter");
24
+ });
25
+ it("should keep directive when file is missing", () => {
26
+ const result = resolveIncludes('::include{file="nonexistent.md"}', "/tmp/main.md");
27
+ expect(result).toBe('::include{file="nonexistent.md"}');
28
+ });
29
+ it("should resolve nested includes", () => {
30
+ const dir = temporaryDirectory();
31
+ writeFileSync(join(dir, "inner.md"), "Inner content");
32
+ writeFileSync(join(dir, "outer.md"), '::include{file="inner.md"}');
33
+ const result = resolveIncludes('::include{file="outer.md"}', join(dir, "main.md"));
34
+ expect(result).toBe("Inner content");
35
+ });
36
+ it("should limit recursion depth", () => {
37
+ const dir = temporaryDirectory();
38
+ writeFileSync(join(dir, "recursive.md"), '::include{file="recursive.md"}');
39
+ const result = resolveIncludes('::include{file="recursive.md"}', join(dir, "main.md"));
40
+ expect(result).toBe('::include{file="recursive.md"}');
41
+ });
42
+ it("should resolve relative paths from included file location", () => {
43
+ const dir = temporaryDirectory();
44
+ mkdirSync(join(dir, "sub"));
45
+ writeFileSync(join(dir, "sub", "child.md"), "Child content");
46
+ writeFileSync(join(dir, "parent.md"), '::include{file="sub/child.md"}');
47
+ const result = resolveIncludes('::include{file="parent.md"}', join(dir, "main.md"));
48
+ expect(result).toBe("Child content");
49
+ });
50
+ it("should handle multiple includes in one file", () => {
51
+ const dir = temporaryDirectory();
52
+ writeFileSync(join(dir, "a.md"), "Alpha");
53
+ writeFileSync(join(dir, "b.md"), "Beta");
54
+ const result = resolveIncludes('::include{file="a.md"}\n\n::include{file="b.md"}', join(dir, "main.md"));
55
+ expect(result).toBe("Alpha\n\nBeta");
56
+ });
57
+ it("should wrap code files in fenced blocks", () => {
58
+ const dir = temporaryDirectory();
59
+ writeFileSync(join(dir, "example.ts"), 'const x = 1\nconst y = "hello"');
60
+ const result = resolveIncludes('::include{file="example.ts"}', join(dir, "main.md"));
61
+ expect(result).toBe('```typescript title="example.ts"\nconst x = 1\nconst y = "hello"\n```');
62
+ });
63
+ it("should pass meta to code fence", () => {
64
+ const dir = temporaryDirectory();
65
+ writeFileSync(join(dir, "app.tsx"), "export default function App() {}");
66
+ const result = resolveIncludes('::include{file="app.tsx" meta="{1} lineNumbers"}', join(dir, "main.md"));
67
+ expect(result).toBe('```tsx title="app.tsx" {1} lineNumbers\nexport default function App() {}\n```');
68
+ });
69
+ it("should treat unknown extensions as markdown", () => {
70
+ const dir = temporaryDirectory();
71
+ writeFileSync(join(dir, "notes.txt"), "Plain text");
72
+ const result = resolveIncludes('::include{file="notes.txt"}', join(dir, "main.md"));
73
+ expect(result).toBe("Plain text");
74
+ });
75
+ });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1pbmNsdWRlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvcmVzb2x2ZS1pbmNsdWRlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUV2RCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDNUQsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtRQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQzVELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FDNUIsOEJBQThCLEVBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQ3JCLENBQUE7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDM0MsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sR0FBRyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDaEMsYUFBYSxDQUNYLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQ3ZCLHFDQUFxQyxDQUN0QyxDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsZUFB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Q0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELE1BQU0sR0FBRyxHQUFHLGtCQUFrQixFQUFFLENBQUE7UUFDaEMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUM1Qiw2QkFBNkIsRUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FDckIsQ0FBQTtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeSB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyByZXNvbHZlSW5jbHVkZXMgfSBmcm9tIFwiLi9yZXNvbHZlLWluY2x1ZGVzLnRzXCJcblxuZGVzY3JpYmUoXCJyZXNvbHZlSW5jbHVkZXNcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCByZXBsYWNlIGluY2x1ZGUgZGlyZWN0aXZlIHdpdGggZmlsZSBjb250ZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwic25pcHBldC5tZFwiKSwgXCJIZWxsbyBmcm9tIHNuaXBwZXRcIilcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJzbmlwcGV0Lm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJIZWxsbyBmcm9tIHNuaXBwZXRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBzdHJpcCBmcm9udG1hdHRlciBmcm9tIGluY2x1ZGVkIGZpbGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICBqb2luKGRpciwgXCJzbmlwcGV0Lm1kXCIpLFxuICAgICAgXCItLS1cXG50aXRsZTogVGVzdFxcbi0tLVxcbkNvbnRlbnQgaGVyZVwiLFxuICAgIClcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJzbmlwcGV0Lm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJDb250ZW50IGhlcmVcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBwcmVzZXJ2ZSBzdXJyb3VuZGluZyBjb250ZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwic25pcHBldC5tZFwiKSwgXCJJbmNsdWRlZCB0ZXh0XCIpXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJ0JlZm9yZVxcblxcbjo6aW5jbHVkZXtmaWxlPVwic25pcHBldC5tZFwifVxcblxcbkFmdGVyJyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJCZWZvcmVcXG5cXG5JbmNsdWRlZCB0ZXh0XFxuXFxuQWZ0ZXJcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBrZWVwIGRpcmVjdGl2ZSB3aGVuIGZpbGUgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJzo6aW5jbHVkZXtmaWxlPVwibm9uZXhpc3RlbnQubWRcIn0nLFxuICAgICAgXCIvdG1wL21haW4ubWRcIixcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnOjppbmNsdWRle2ZpbGU9XCJub25leGlzdGVudC5tZFwifScpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVzb2x2ZSBuZXN0ZWQgaW5jbHVkZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJpbm5lci5tZFwiKSwgXCJJbm5lciBjb250ZW50XCIpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJvdXRlci5tZFwiKSwgJzo6aW5jbHVkZXtmaWxlPVwiaW5uZXIubWRcIn0nKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cIm91dGVyLm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJJbm5lciBjb250ZW50XCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbGltaXQgcmVjdXJzaW9uIGRlcHRoXCIsICgpID0+IHtcbiAgICBjb25zdCBkaXIgPSB0ZW1wb3JhcnlEaXJlY3RvcnkoKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbihkaXIsIFwicmVjdXJzaXZlLm1kXCIpLCAnOjppbmNsdWRle2ZpbGU9XCJyZWN1cnNpdmUubWRcIn0nKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cInJlY3Vyc2l2ZS5tZFwifScsXG4gICAgICBqb2luKGRpciwgXCJtYWluLm1kXCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKCc6OmluY2x1ZGV7ZmlsZT1cInJlY3Vyc2l2ZS5tZFwifScpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcmVzb2x2ZSByZWxhdGl2ZSBwYXRocyBmcm9tIGluY2x1ZGVkIGZpbGUgbG9jYXRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgbWtkaXJTeW5jKGpvaW4oZGlyLCBcInN1YlwiKSlcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcInN1YlwiLCBcImNoaWxkLm1kXCIpLCBcIkNoaWxkIGNvbnRlbnRcIilcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcInBhcmVudC5tZFwiKSwgJzo6aW5jbHVkZXtmaWxlPVwic3ViL2NoaWxkLm1kXCJ9JylcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJwYXJlbnQubWRcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIkNoaWxkIGNvbnRlbnRcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgaW5jbHVkZXMgaW4gb25lIGZpbGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJhLm1kXCIpLCBcIkFscGhhXCIpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJiLm1kXCIpLCBcIkJldGFcIilcbiAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlSW5jbHVkZXMoXG4gICAgICAnOjppbmNsdWRle2ZpbGU9XCJhLm1kXCJ9XFxuXFxuOjppbmNsdWRle2ZpbGU9XCJiLm1kXCJ9JyxcbiAgICAgIGpvaW4oZGlyLCBcIm1haW4ubWRcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJBbHBoYVxcblxcbkJldGFcIilcbiAgfSlcblxuICBpdChcInNob3VsZCB3cmFwIGNvZGUgZmlsZXMgaW4gZmVuY2VkIGJsb2Nrc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgZGlyID0gdGVtcG9yYXJ5RGlyZWN0b3J5KClcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oZGlyLCBcImV4YW1wbGUudHNcIiksICdjb25zdCB4ID0gMVxcbmNvbnN0IHkgPSBcImhlbGxvXCInKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cImV4YW1wbGUudHNcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcbiAgICAgICdgYGB0eXBlc2NyaXB0IHRpdGxlPVwiZXhhbXBsZS50c1wiXFxuY29uc3QgeCA9IDFcXG5jb25zdCB5ID0gXCJoZWxsb1wiXFxuYGBgJyxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgcGFzcyBtZXRhIHRvIGNvZGUgZmVuY2VcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJhcHAudHN4XCIpLCBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHt9XCIpXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUluY2x1ZGVzKFxuICAgICAgJzo6aW5jbHVkZXtmaWxlPVwiYXBwLnRzeFwiIG1ldGE9XCJ7MX0gbGluZU51bWJlcnNcIn0nLFxuICAgICAgam9pbihkaXIsIFwibWFpbi5tZFwiKSxcbiAgICApXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcbiAgICAgICdgYGB0c3ggdGl0bGU9XCJhcHAudHN4XCIgezF9IGxpbmVOdW1iZXJzXFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkge31cXG5gYGAnLFxuICAgIClcbiAgfSlcblxuICBpdChcInNob3VsZCB0cmVhdCB1bmtub3duIGV4dGVuc2lvbnMgYXMgbWFya2Rvd25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRpciwgXCJub3Rlcy50eHRcIiksIFwiUGxhaW4gdGV4dFwiKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVJbmNsdWRlcyhcbiAgICAgICc6OmluY2x1ZGV7ZmlsZT1cIm5vdGVzLnR4dFwifScsXG4gICAgICBqb2luKGRpciwgXCJtYWluLm1kXCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKFwiUGxhaW4gdGV4dFwiKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ /** Strip markdown syntax to extract plain searchable text */
2
+ export declare function extractSearchText(markdown: string): string;
@@ -0,0 +1,16 @@
1
+ /** Strip markdown syntax to extract plain searchable text */
2
+ export function extractSearchText(markdown) {
3
+ return markdown
4
+ .replace(/^---[\s\S]*?---\n*/m, "")
5
+ .replace(/```[\s\S]*?```/g, "")
6
+ .replace(/:::\w+[\s\S]*?:::/g, "")
7
+ .replace(/::\w+(?:\[.*?\])?(?:\{.*?\})?/g, "")
8
+ .replace(/!\[.*?\]\(.*?\)/g, "")
9
+ .replace(/\[([^\]]*)\]\(.*?\)/g, "$1")
10
+ .replace(/<[^>]+>/g, "")
11
+ .replace(/#{1,6}\s*/g, "")
12
+ .replace(/[*_~`>|]/g, "")
13
+ .replace(/\n{2,}/g, "\n")
14
+ .trim();
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy9zZWFyY2gtdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQWdCO0lBQ2hELE9BQU8sUUFBUTtTQUNaLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7U0FDbEMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztTQUM5QixPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1NBQ2pDLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLENBQUM7U0FDN0MsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztTQUMvQixPQUFPLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDO1NBQ3JDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1NBQ3hCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1NBQ3hCLElBQUksRUFBRSxDQUFBO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTdHJpcCBtYXJrZG93biBzeW50YXggdG8gZXh0cmFjdCBwbGFpbiBzZWFyY2hhYmxlIHRleHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VhcmNoVGV4dChtYXJrZG93bjogc3RyaW5nKSB7XG4gIHJldHVybiBtYXJrZG93blxuICAgIC5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxcbiovbSwgXCJcIilcbiAgICAucmVwbGFjZSgvYGBgW1xcc1xcU10qP2BgYC9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC86OjpcXHcrW1xcc1xcU10qPzo6Oi9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC86OlxcdysoPzpcXFsuKj9cXF0pPyg/Olxcey4qP1xcfSk/L2csIFwiXCIpXG4gICAgLnJlcGxhY2UoLyFcXFsuKj9cXF1cXCguKj9cXCkvZywgXCJcIilcbiAgICAucmVwbGFjZSgvXFxbKFteXFxdXSopXFxdXFwoLio/XFwpL2csIFwiJDFcIilcbiAgICAucmVwbGFjZSgvPFtePl0rPi9nLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8jezEsNn1cXHMqL2csIFwiXCIpXG4gICAgLnJlcGxhY2UoL1sqX35gPnxdL2csIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcbnsyLH0vZywgXCJcXG5cIilcbiAgICAudHJpbSgpXG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import type { Section } from "../models/section.ts";
2
+ /** Return the section's icon, falling back to a type-based default */
3
+ export declare function sectionIcon(section: Pick<Section, "icon" | "type">): string;
4
+ /** Find the section whose prefix is the longest prefix of the article path */
5
+ export declare function matchSection<S extends {
6
+ prefix: string;
7
+ }>(articlePath: string, sections: S[]): S | undefined;
8
+ /** Split articles into per-section buckets. Unmatched articles go to "__default__" */
9
+ export declare function partitionBySection<T extends {
10
+ path: string;
11
+ }>(articles: T[], sections: {
12
+ prefix: string;
13
+ }[]): Map<string, T[]>;
@@ -0,0 +1,39 @@
1
+ const DEFAULT_ICONS = {
2
+ article: "book-open",
3
+ blog: "rss",
4
+ changelog: "history",
5
+ };
6
+ /** Return the section's icon, falling back to a type-based default */
7
+ export function sectionIcon(section) {
8
+ return section.icon ?? DEFAULT_ICONS[section.type];
9
+ }
10
+ /** Find the section whose prefix is the longest prefix of the article path */
11
+ export function matchSection(articlePath, sections) {
12
+ let best;
13
+ let bestLen = 0;
14
+ for (const section of sections) {
15
+ if (articlePath.startsWith(section.prefix) &&
16
+ section.prefix.length > bestLen) {
17
+ best = section;
18
+ bestLen = section.prefix.length;
19
+ }
20
+ }
21
+ return best;
22
+ }
23
+ /** Split articles into per-section buckets. Unmatched articles go to "__default__" */
24
+ export function partitionBySection(articles, sections) {
25
+ const buckets = new Map();
26
+ for (const article of articles) {
27
+ const section = matchSection(article.path, sections);
28
+ const key = section?.prefix ?? "__default__";
29
+ const bucket = buckets.get(key);
30
+ if (bucket) {
31
+ bucket.push(article);
32
+ }
33
+ else {
34
+ buckets.set(key, [article]);
35
+ }
36
+ }
37
+ return buckets;
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3NlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxhQUFhLEdBQW9DO0lBQ3JELE9BQU8sRUFBRSxXQUFXO0lBQ3BCLElBQUksRUFBRSxLQUFLO0lBQ1gsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQTtBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQXVDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsV0FBbUIsRUFDbkIsUUFBYTtJQUViLElBQUksSUFBbUIsQ0FBQTtJQUN2QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7SUFDZixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQ0UsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFDL0IsQ0FBQztZQUNELElBQUksR0FBRyxPQUFPLENBQUE7WUFDZCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUE7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxRQUFhLEVBQ2IsUUFBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQTtJQUN0QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksYUFBYSxDQUFBO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTZWN0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZWN0aW9uLnRzXCJcblxuY29uc3QgREVGQVVMVF9JQ09OUzogUmVjb3JkPFNlY3Rpb25bXCJ0eXBlXCJdLCBzdHJpbmc+ID0ge1xuICBhcnRpY2xlOiBcImJvb2stb3BlblwiLFxuICBibG9nOiBcInJzc1wiLFxuICBjaGFuZ2Vsb2c6IFwiaGlzdG9yeVwiLFxufVxuXG4vKiogUmV0dXJuIHRoZSBzZWN0aW9uJ3MgaWNvbiwgZmFsbGluZyBiYWNrIHRvIGEgdHlwZS1iYXNlZCBkZWZhdWx0ICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkljb24oc2VjdGlvbjogUGljazxTZWN0aW9uLCBcImljb25cIiB8IFwidHlwZVwiPikge1xuICByZXR1cm4gc2VjdGlvbi5pY29uID8/IERFRkFVTFRfSUNPTlNbc2VjdGlvbi50eXBlXVxufVxuXG4vKiogRmluZCB0aGUgc2VjdGlvbiB3aG9zZSBwcmVmaXggaXMgdGhlIGxvbmdlc3QgcHJlZml4IG9mIHRoZSBhcnRpY2xlIHBhdGggKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFNlY3Rpb248UyBleHRlbmRzIHsgcHJlZml4OiBzdHJpbmcgfT4oXG4gIGFydGljbGVQYXRoOiBzdHJpbmcsXG4gIHNlY3Rpb25zOiBTW10sXG4pOiBTIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGJlc3Q6IFMgfCB1bmRlZmluZWRcbiAgbGV0IGJlc3RMZW4gPSAwXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgIGlmIChcbiAgICAgIGFydGljbGVQYXRoLnN0YXJ0c1dpdGgoc2VjdGlvbi5wcmVmaXgpICYmXG4gICAgICBzZWN0aW9uLnByZWZpeC5sZW5ndGggPiBiZXN0TGVuXG4gICAgKSB7XG4gICAgICBiZXN0ID0gc2VjdGlvblxuICAgICAgYmVzdExlbiA9IHNlY3Rpb24ucHJlZml4Lmxlbmd0aFxuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdFxufVxuXG4vKiogU3BsaXQgYXJ0aWNsZXMgaW50byBwZXItc2VjdGlvbiBidWNrZXRzLiBVbm1hdGNoZWQgYXJ0aWNsZXMgZ28gdG8gXCJfX2RlZmF1bHRfX1wiICovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uQnlTZWN0aW9uPFQgZXh0ZW5kcyB7IHBhdGg6IHN0cmluZyB9PihcbiAgYXJ0aWNsZXM6IFRbXSxcbiAgc2VjdGlvbnM6IHsgcHJlZml4OiBzdHJpbmcgfVtdLFxuKTogTWFwPHN0cmluZywgVFtdPiB7XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgVFtdPigpXG4gIGZvciAoY29uc3QgYXJ0aWNsZSBvZiBhcnRpY2xlcykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBtYXRjaFNlY3Rpb24oYXJ0aWNsZS5wYXRoLCBzZWN0aW9ucylcbiAgICBjb25zdCBrZXkgPSBzZWN0aW9uPy5wcmVmaXggPz8gXCJfX2RlZmF1bHRfX1wiXG4gICAgY29uc3QgYnVja2V0ID0gYnVja2V0cy5nZXQoa2V5KVxuICAgIGlmIChidWNrZXQpIHtcbiAgICAgIGJ1Y2tldC5wdXNoKGFydGljbGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Y2tldHMuc2V0KGtleSwgW2FydGljbGVdKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYnVja2V0c1xufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from "vite-plus/test";
2
+ import { matchSection, partitionBySection } from "./section.js";
3
+ describe("matchSection", () => {
4
+ const sections = [
5
+ { title: "Docs", prefix: "/" },
6
+ { title: "API", prefix: "/api/" },
7
+ { title: "API Auth", prefix: "/api/auth/" },
8
+ ];
9
+ it("should match the most specific prefix", () => {
10
+ expect(matchSection("/api/auth/login/", sections)?.title).toBe("API Auth");
11
+ });
12
+ it("should match a less specific prefix when no deeper match", () => {
13
+ expect(matchSection("/api/users/", sections)?.title).toBe("API");
14
+ });
15
+ it("should match root section as fallback", () => {
16
+ expect(matchSection("/getting-started/", sections)?.title).toBe("Docs");
17
+ });
18
+ it("should return undefined when no section matches", () => {
19
+ const narrow = [{ title: "API", prefix: "/api/" }];
20
+ expect(matchSection("/getting-started/", narrow)).toBeUndefined();
21
+ });
22
+ it("should match a single root section for all articles", () => {
23
+ const root = [{ title: "Docs", prefix: "/" }];
24
+ expect(matchSection("/anything/deep/path/", root)?.title).toBe("Docs");
25
+ });
26
+ });
27
+ describe("partitionBySection", () => {
28
+ const sections = [
29
+ { title: "Docs", prefix: "/" },
30
+ { title: "API", prefix: "/api/" },
31
+ ];
32
+ const articles = [
33
+ { path: "/getting-started/" },
34
+ { path: "/guide/" },
35
+ { path: "/api/users/" },
36
+ { path: "/api/auth/" },
37
+ ];
38
+ it("should split articles into section buckets", () => {
39
+ const result = partitionBySection(articles, sections);
40
+ expect(result.get("/")?.map(a => a.path)).toEqual([
41
+ "/getting-started/",
42
+ "/guide/",
43
+ ]);
44
+ expect(result.get("/api/")?.map(a => a.path)).toEqual([
45
+ "/api/users/",
46
+ "/api/auth/",
47
+ ]);
48
+ });
49
+ it("should put unmatched articles in __default__ bucket", () => {
50
+ const narrow = [{ title: "API", prefix: "/api/" }];
51
+ const result = partitionBySection(articles, narrow);
52
+ expect(result.get("__default__")?.map(a => a.path)).toEqual([
53
+ "/getting-started/",
54
+ "/guide/",
55
+ ]);
56
+ expect(result.get("/api/")?.map(a => a.path)).toEqual([
57
+ "/api/users/",
58
+ "/api/auth/",
59
+ ]);
60
+ });
61
+ });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvc2VjdGlvbi51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFL0QsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsTUFBTSxRQUFRLEdBQUc7UUFDZixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUM5QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtRQUNqQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRTtLQUM1QyxDQUFBO0lBRUQsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6RSxD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cmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgeyBtYXRjaFNlY3Rpb24sIHBhcnRpdGlvbkJ5U2VjdGlvbiB9IGZyb20gXCIuL3NlY3Rpb24udHNcIlxuXG5kZXNjcmliZShcIm1hdGNoU2VjdGlvblwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgIHsgdGl0bGU6IFwiRG9jc1wiLCBwcmVmaXg6IFwiL1wiIH0sXG4gICAgeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfSxcbiAgICB7IHRpdGxlOiBcIkFQSSBBdXRoXCIsIHByZWZpeDogXCIvYXBpL2F1dGgvXCIgfSxcbiAgXVxuXG4gIGl0KFwic2hvdWxkIG1hdGNoIHRoZSBtb3N0IHNwZWNpZmljIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG1hdGNoU2VjdGlvbihcIi9hcGkvYXV0aC9sb2dpbi9cIiwgc2VjdGlvbnMpPy50aXRsZSkudG9CZShcIkFQSSBBdXRoXCIpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgbWF0Y2ggYSBsZXNzIHNwZWNpZmljIHByZWZpeCB3aGVuIG5vIGRlZXBlciBtYXRjaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG1hdGNoU2VjdGlvbihcIi9hcGkvdXNlcnMvXCIsIHNlY3Rpb25zKT8udGl0bGUpLnRvQmUoXCJBUElcIilcbiAgfSlcblxuICBpdChcInNob3VsZCBtYXRjaCByb290IHNlY3Rpb24gYXMgZmFsbGJhY2tcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvZ2V0dGluZy1zdGFydGVkL1wiLCBzZWN0aW9ucyk/LnRpdGxlKS50b0JlKFwiRG9jc1wiKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiB1bmRlZmluZWQgd2hlbiBubyBzZWN0aW9uIG1hdGNoZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG5hcnJvdyA9IFt7IHRpdGxlOiBcIkFQSVwiLCBwcmVmaXg6IFwiL2FwaS9cIiB9XVxuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvZ2V0dGluZy1zdGFydGVkL1wiLCBuYXJyb3cpKS50b0JlVW5kZWZpbmVkKClcbiAgfSlcblxuICBpdChcInNob3VsZCBtYXRjaCBhIHNpbmdsZSByb290IHNlY3Rpb24gZm9yIGFsbCBhcnRpY2xlc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IFt7IHRpdGxlOiBcIkRvY3NcIiwgcHJlZml4OiBcIi9cIiB9XVxuICAgIGV4cGVjdChtYXRjaFNlY3Rpb24oXCIvYW55dGhpbmcvZGVlcC9wYXRoL1wiLCByb290KT8udGl0bGUpLnRvQmUoXCJEb2NzXCIpXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInBhcnRpdGlvbkJ5U2VjdGlvblwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgIHsgdGl0bGU6IFwiRG9jc1wiLCBwcmVmaXg6IFwiL1wiIH0sXG4gICAgeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfSxcbiAgXVxuXG4gIGNvbnN0IGFydGljbGVzID0gW1xuICAgIHsgcGF0aDogXCIvZ2V0dGluZy1zdGFydGVkL1wiIH0sXG4gICAgeyBwYXRoOiBcIi9ndWlkZS9cIiB9LFxuICAgIHsgcGF0aDogXCIvYXBpL3VzZXJzL1wiIH0sXG4gICAgeyBwYXRoOiBcIi9hcGkvYXV0aC9cIiB9LFxuICBdXG5cbiAgaXQoXCJzaG91bGQgc3BsaXQgYXJ0aWNsZXMgaW50byBzZWN0aW9uIGJ1Y2tldHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnRpdGlvbkJ5U2VjdGlvbihhcnRpY2xlcywgc2VjdGlvbnMpXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvXCIpPy5tYXAoYSA9PiBhLnBhdGgpKS50b0VxdWFsKFtcbiAgICAgIFwiL2dldHRpbmctc3RhcnRlZC9cIixcbiAgICAgIFwiL2d1aWRlL1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvYXBpL1wiKT8ubWFwKGEgPT4gYS5wYXRoKSkudG9FcXVhbChbXG4gICAgICBcIi9hcGkvdXNlcnMvXCIsXG4gICAgICBcIi9hcGkvYXV0aC9cIixcbiAgICBdKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHB1dCB1bm1hdGNoZWQgYXJ0aWNsZXMgaW4gX19kZWZhdWx0X18gYnVja2V0XCIsICgpID0+IHtcbiAgICBjb25zdCBuYXJyb3cgPSBbeyB0aXRsZTogXCJBUElcIiwgcHJlZml4OiBcIi9hcGkvXCIgfV1cbiAgICBjb25zdCByZXN1bHQgPSBwYXJ0aXRpb25CeVNlY3Rpb24oYXJ0aWNsZXMsIG5hcnJvdylcbiAgICBleHBlY3QocmVzdWx0LmdldChcIl9fZGVmYXVsdF9fXCIpPy5tYXAoYSA9PiBhLnBhdGgpKS50b0VxdWFsKFtcbiAgICAgIFwiL2dldHRpbmctc3RhcnRlZC9cIixcbiAgICAgIFwiL2d1aWRlL1wiLFxuICAgIF0pXG4gICAgZXhwZWN0KHJlc3VsdC5nZXQoXCIvYXBpL1wiKT8ubWFwKGEgPT4gYS5wYXRoKSkudG9FcXVhbChbXG4gICAgICBcIi9hcGkvdXNlcnMvXCIsXG4gICAgICBcIi9hcGkvYXV0aC9cIixcbiAgICBdKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export type Theme = "light" | "dark";
2
+ export declare function detectClientTheme(): Theme;
3
+ export declare function activateTheme(theme: Theme): void;
4
+ export declare function getCurrentTheme(): Theme;
5
+ export declare function setTheme(theme: Theme): void;
@@ -0,0 +1,23 @@
1
+ const STORAGE_KEY = "livemark-theme";
2
+ export function detectClientTheme() {
3
+ const stored = localStorage.getItem(STORAGE_KEY);
4
+ return stored || "light";
5
+ }
6
+ export function activateTheme(theme) {
7
+ if (theme === "dark") {
8
+ globalThis.document.documentElement.classList.add("dark");
9
+ }
10
+ else {
11
+ globalThis.document.documentElement.classList.remove("dark");
12
+ }
13
+ }
14
+ export function getCurrentTheme() {
15
+ return globalThis.document?.documentElement.classList.contains("dark")
16
+ ? "dark"
17
+ : "light";
18
+ }
19
+ export function setTheme(theme) {
20
+ activateTheme(theme);
21
+ localStorage.setItem(STORAGE_KEY, theme);
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy90aGVtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFpQixDQUFBO0lBQ2hFLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBQTtBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFZO0lBQ3hDLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0QsQ0FBQztTQUFNLENBQUM7UUFDTixVQUFVLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzlELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNwRSxDQUFDLENBQUMsTUFBTTtRQUNSLENBQUMsQ0FBQyxPQUFPLENBQUE7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFZO0lBQ25DLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQixZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU1RPUkFHRV9LRVkgPSBcImxpdmVtYXJrLXRoZW1lXCJcblxuZXhwb3J0IHR5cGUgVGhlbWUgPSBcImxpZ2h0XCIgfCBcImRhcmtcIlxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Q2xpZW50VGhlbWUoKTogVGhlbWUge1xuICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSkgYXMgVGhlbWUgfCBudWxsXG4gIHJldHVybiBzdG9yZWQgfHwgXCJsaWdodFwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZVRoZW1lKHRoZW1lOiBUaGVtZSkge1xuICBpZiAodGhlbWUgPT09IFwiZGFya1wiKSB7XG4gICAgZ2xvYmFsVGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRhcmtcIilcbiAgfSBlbHNlIHtcbiAgICBnbG9iYWxUaGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiZGFya1wiKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VGhlbWUoKTogVGhlbWUge1xuICByZXR1cm4gZ2xvYmFsVGhpcy5kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImRhcmtcIilcbiAgICA/IFwiZGFya1wiXG4gICAgOiBcImxpZ2h0XCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRoZW1lKHRoZW1lOiBUaGVtZSkge1xuICBhY3RpdmF0ZVRoZW1lKHRoZW1lKVxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgdGhlbWUpXG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import type { TocItem } from "../models/toc.ts";
2
+ /** React context that provides TOC items to inline components */
3
+ export declare const TocContext: import("react").Context<TocItem[]>;
4
+ /** Consume the TOC items from the nearest TocContext provider */
5
+ export declare function useTocItems(): TocItem[];
@@ -0,0 +1,8 @@
1
+ import { createContext, useContext } from "react";
2
+ /** React context that provides TOC items to inline components */
3
+ export const TocContext = createContext([]);
4
+ /** Consume the TOC items from the nearest TocContext provider */
5
+ export function useTocItems() {
6
+ return useContext(TocContext);
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvaGVscGVycy90b2MtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUdqRCxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBWSxFQUFFLENBQUMsQ0FBQTtBQUV0RCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLFdBQVc7SUFDekIsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHR5cGUgeyBUb2NJdGVtIH0gZnJvbSBcIi4uL21vZGVscy90b2MudHNcIlxuXG4vKiogUmVhY3QgY29udGV4dCB0aGF0IHByb3ZpZGVzIFRPQyBpdGVtcyB0byBpbmxpbmUgY29tcG9uZW50cyAqL1xuZXhwb3J0IGNvbnN0IFRvY0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFRvY0l0ZW1bXT4oW10pXG5cbi8qKiBDb25zdW1lIHRoZSBUT0MgaXRlbXMgZnJvbSB0aGUgbmVhcmVzdCBUb2NDb250ZXh0IHByb3ZpZGVyICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9jSXRlbXMoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KFRvY0NvbnRleHQpXG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import type { TocItem } from "../models/toc.ts";
2
+ /** Extract TOC headings from raw markdown content */
3
+ export declare function extractToc(content: string): TocItem[];
@@ -0,0 +1,41 @@
1
+ import GithubSlugger from "github-slugger";
2
+ const CUSTOM_ID_PATTERN = /\s*\[#([^\]]+)\]\s*$/;
3
+ const TOC_HIDDEN_PATTERN = /\s*\[!toc\]\s*$/;
4
+ const TOC_ONLY_PATTERN = /\s*\[toc\]\s*$/;
5
+ const STEP_PATTERN = /\s*\[step\]\s*$/;
6
+ /** Extract TOC headings from raw markdown content */
7
+ export function extractToc(content) {
8
+ const slugger = new GithubSlugger();
9
+ const items = [];
10
+ const headingRegex = /^(#{2,4})\s+(.+)$/;
11
+ const lines = content.split("\n");
12
+ let inCodeBlock = false;
13
+ for (const line of lines) {
14
+ if (line.startsWith("```") || line.startsWith("````")) {
15
+ inCodeBlock = !inCodeBlock;
16
+ continue;
17
+ }
18
+ if (inCodeBlock)
19
+ continue;
20
+ const match = headingRegex.exec(line);
21
+ if (!match)
22
+ continue;
23
+ const depth = match[1].length;
24
+ const rawTitle = match[2];
25
+ if (TOC_HIDDEN_PATTERN.test(rawTitle))
26
+ continue;
27
+ if (STEP_PATTERN.test(rawTitle))
28
+ continue;
29
+ const idMatch = CUSTOM_ID_PATTERN.exec(rawTitle);
30
+ const title = rawTitle
31
+ .replace(CUSTOM_ID_PATTERN, "")
32
+ .replace(TOC_ONLY_PATTERN, "")
33
+ .replace(STEP_PATTERN, "")
34
+ .replace(/\*\*(.+?)\*\*/g, "$1")
35
+ .replace(/`(.+?)`/g, "$1");
36
+ const slug = idMatch?.[1] ?? slugger.slug(title);
37
+ items.push({ url: `#${slug}`, title, depth });
38
+ }
39
+ return items;
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLGdCQUFnQixDQUFBO0FBRzFDLE1BQU0saUJBQWlCLEdBQUcsc0JBQXNCLENBQUE7QUFDaEQsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQTtBQUM1QyxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFBO0FBRXRDLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQTtJQUNuQyxNQUFNLEtBQUssR0FBYyxFQUFFLENBQUE7SUFDM0IsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUE7SUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUE7SUFFdkIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RELFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQTtZQUMxQixTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksV0FBVztZQUFFLFNBQVE7UUFFekIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsS0FBSztZQUFFLFNBQVE7UUFFcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLE1BQU0sQ0FBQTtRQUM5QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUE7UUFFMUIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUTtRQUMvQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUTtRQUV6QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEQsTUFBTSxLQUFLLEdBQUcsUUFBUTthQUNuQixPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2FBQzlCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7YUFDN0IsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7YUFDekIsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQzthQUMvQixPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR2l0aHViU2x1Z2dlciBmcm9tIFwiZ2l0aHViLXNsdWdnZXJcIlxuaW1wb3J0IHR5cGUgeyBUb2NJdGVtIH0gZnJvbSBcIi4uL21vZGVscy90b2MudHNcIlxuXG5jb25zdCBDVVNUT01fSURfUEFUVEVSTiA9IC9cXHMqXFxbIyhbXlxcXV0rKVxcXVxccyokL1xuY29uc3QgVE9DX0hJRERFTl9QQVRURVJOID0gL1xccypcXFshdG9jXFxdXFxzKiQvXG5jb25zdCBUT0NfT05MWV9QQVRURVJOID0gL1xccypcXFt0b2NcXF1cXHMqJC9cbmNvbnN0IFNURVBfUEFUVEVSTiA9IC9cXHMqXFxbc3RlcFxcXVxccyokL1xuXG4vKiogRXh0cmFjdCBUT0MgaGVhZGluZ3MgZnJvbSByYXcgbWFya2Rvd24gY29udGVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUb2MoY29udGVudDogc3RyaW5nKTogVG9jSXRlbVtdIHtcbiAgY29uc3Qgc2x1Z2dlciA9IG5ldyBHaXRodWJTbHVnZ2VyKClcbiAgY29uc3QgaXRlbXM6IFRvY0l0ZW1bXSA9IFtdXG4gIGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCN7Miw0fSlcXHMrKC4rKSQvXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKVxuICBsZXQgaW5Db2RlQmxvY2sgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJgYGBcIikgfHwgbGluZS5zdGFydHNXaXRoKFwiYGBgYFwiKSkge1xuICAgICAgaW5Db2RlQmxvY2sgPSAhaW5Db2RlQmxvY2tcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChpbkNvZGVCbG9jaykgY29udGludWVcblxuICAgIGNvbnN0IG1hdGNoID0gaGVhZGluZ1JlZ2V4LmV4ZWMobGluZSlcbiAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgY29uc3QgZGVwdGggPSBtYXRjaFsxXSEubGVuZ3RoXG4gICAgY29uc3QgcmF3VGl0bGUgPSBtYXRjaFsyXSFcblxuICAgIGlmIChUT0NfSElEREVOX1BBVFRFUk4udGVzdChyYXdUaXRsZSkpIGNvbnRpbnVlXG4gICAgaWYgKFNURVBfUEFUVEVSTi50ZXN0KHJhd1RpdGxlKSkgY29udGludWVcblxuICAgIGNvbnN0IGlkTWF0Y2ggPSBDVVNUT01fSURfUEFUVEVSTi5leGVjKHJhd1RpdGxlKVxuICAgIGNvbnN0IHRpdGxlID0gcmF3VGl0bGVcbiAgICAgIC5yZXBsYWNlKENVU1RPTV9JRF9QQVRURVJOLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoVE9DX09OTFlfUEFUVEVSTiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKFNURVBfUEFUVEVSTiwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXCpcXCooLis/KVxcKlxcKi9nLCBcIiQxXCIpXG4gICAgICAucmVwbGFjZSgvYCguKz8pYC9nLCBcIiQxXCIpXG4gICAgY29uc3Qgc2x1ZyA9IGlkTWF0Y2g/LlsxXSA/PyBzbHVnZ2VyLnNsdWcodGl0bGUpXG5cbiAgICBpdGVtcy5wdXNoKHsgdXJsOiBgIyR7c2x1Z31gLCB0aXRsZSwgZGVwdGggfSlcbiAgfVxuXG4gIHJldHVybiBpdGVtc1xufVxuIl19
@@ -0,0 +1 @@
1
+ export {};