livemark 0.10.4 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/{target → build}/actions/changelog/build.d.ts +4 -1
  2. package/build/actions/changelog/build.js +192 -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 +15 -9
  31. package/source/actions/changelog/build.ts +11 -6
  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 -73
  55. package/target/actions/changelog/build.js +0 -187
  56. package/target/actions/config/load.d.ts +0 -5
  57. package/target/actions/config/load.js +0 -25
  58. package/target/actions/config/load.unit.js +0 -25
  59. package/target/commands/build.js +0 -14
  60. package/target/commands/escape.js +0 -56
  61. package/target/commands/preview.js +0 -18
  62. package/target/commands/start.js +0 -19
  63. package/target/components/Breadcrumbs.js +0 -13
  64. package/target/components/Layout.js +0 -65
  65. package/target/components/SidebarArticles.js +0 -45
  66. package/target/components/SidebarLinks.js +0 -26
  67. package/target/components/SidebarSections.js +0 -36
  68. package/target/components/SiteTitle.js +0 -12
  69. package/target/content/article.js +0 -54
  70. package/target/content/tag.js +0 -30
  71. package/target/content-collections.js +0 -218
  72. package/target/models/config.js +0 -34
  73. package/target/plugins/vite-livemark.d.ts +0 -18
  74. package/target/plugins/vite-livemark.js +0 -111
  75. package/target/routes/__root.js +0 -69
  76. package/target/settings.d.ts +0 -5
  77. package/target/settings.js +0 -15
  78. package/target/vite.config.js +0 -90
  79. /package/{target → build}/actions/changelog/build.unit.d.ts +0 -0
  80. /package/{target → build}/actions/changelog/build.unit.js +0 -0
  81. /package/{target → build}/actions/config/define.d.ts +0 -0
  82. /package/{target → build}/actions/config/define.js +0 -0
  83. /package/{target → build}/actions/config/define.unit.d.ts +0 -0
  84. /package/{target → build}/actions/config/define.unit.js +0 -0
  85. /package/{target → build}/actions/config/load.unit.d.ts +0 -0
  86. /package/{target → build}/client.d.ts +0 -0
  87. /package/{target → build}/client.js +0 -0
  88. /package/{target → build}/commands/build.d.ts +0 -0
  89. /package/{target → build}/commands/preview.d.ts +0 -0
  90. /package/{target → build}/commands/start.d.ts +0 -0
  91. /package/{target → build}/components/Abbr.d.ts +0 -0
  92. /package/{target → build}/components/Abbr.js +0 -0
  93. /package/{target → build}/components/AnsiCode.d.ts +0 -0
  94. /package/{target → build}/components/AnsiCode.js +0 -0
  95. /package/{target → build}/components/Article.d.ts +0 -0
  96. /package/{target → build}/components/Article.js +0 -0
  97. /package/{target → build}/components/BackToTop.d.ts +0 -0
  98. /package/{target → build}/components/BackToTop.js +0 -0
  99. /package/{target → build}/components/Banner.d.ts +0 -0
  100. /package/{target → build}/components/Banner.js +0 -0
  101. /package/{target → build}/components/BlogIndex.d.ts +0 -0
  102. /package/{target → build}/components/BlogIndex.js +0 -0
  103. /package/{target → build}/components/Breadcrumbs.d.ts +0 -0
  104. /package/{target → build}/components/Callout.d.ts +0 -0
  105. /package/{target → build}/components/Callout.js +0 -0
  106. /package/{target → build}/components/Card.d.ts +0 -0
  107. /package/{target → build}/components/Card.js +0 -0
  108. /package/{target → build}/components/Cards.d.ts +0 -0
  109. /package/{target → build}/components/Cards.js +0 -0
  110. /package/{target → build}/components/ChangelogIndex.d.ts +0 -0
  111. /package/{target → build}/components/ChangelogIndex.js +0 -0
  112. /package/{target → build}/components/CodeBlock.d.ts +0 -0
  113. /package/{target → build}/components/CodeBlock.js +0 -0
  114. /package/{target → build}/components/CodeTabs.d.ts +0 -0
  115. /package/{target → build}/components/CodeTabs.js +0 -0
  116. /package/{target → build}/components/Column.d.ts +0 -0
  117. /package/{target → build}/components/Column.js +0 -0
  118. /package/{target → build}/components/Columns.d.ts +0 -0
  119. /package/{target → build}/components/Columns.js +0 -0
  120. /package/{target → build}/components/Content.d.ts +0 -0
  121. /package/{target → build}/components/Content.js +0 -0
  122. /package/{target → build}/components/ContentTab.d.ts +0 -0
  123. /package/{target → build}/components/ContentTab.js +0 -0
  124. /package/{target → build}/components/ContentTabs.d.ts +0 -0
  125. /package/{target → build}/components/ContentTabs.js +0 -0
  126. /package/{target → build}/components/DefaultCatchBoundary.d.ts +0 -0
  127. /package/{target → build}/components/DefaultCatchBoundary.js +0 -0
  128. /package/{target → build}/components/DefinitionList.d.ts +0 -0
  129. /package/{target → build}/components/DefinitionList.js +0 -0
  130. /package/{target → build}/components/Details.d.ts +0 -0
  131. /package/{target → build}/components/Details.js +0 -0
  132. /package/{target → build}/components/FileTree.d.ts +0 -0
  133. /package/{target → build}/components/FileTree.js +0 -0
  134. /package/{target → build}/components/Footer.d.ts +0 -0
  135. /package/{target → build}/components/Footer.js +0 -0
  136. /package/{target → build}/components/FootnoteRef.d.ts +0 -0
  137. /package/{target → build}/components/FootnoteRef.js +0 -0
  138. /package/{target → build}/components/Heading.d.ts +0 -0
  139. /package/{target → build}/components/Heading.js +0 -0
  140. /package/{target → build}/components/InlineBadge.d.ts +0 -0
  141. /package/{target → build}/components/InlineBadge.js +0 -0
  142. /package/{target → build}/components/InlineIcon.d.ts +0 -0
  143. /package/{target → build}/components/InlineIcon.js +0 -0
  144. /package/{target → build}/components/InlineToc.d.ts +0 -0
  145. /package/{target → build}/components/InlineToc.js +0 -0
  146. /package/{target → build}/components/Layout.d.ts +0 -0
  147. /package/{target → build}/components/LinkButton.d.ts +0 -0
  148. /package/{target → build}/components/LinkButton.js +0 -0
  149. /package/{target → build}/components/Mermaid.d.ts +0 -0
  150. /package/{target → build}/components/Mermaid.js +0 -0
  151. /package/{target → build}/components/MermaidRenderer.d.ts +0 -0
  152. /package/{target → build}/components/MermaidRenderer.js +0 -0
  153. /package/{target → build}/components/NotFound.d.ts +0 -0
  154. /package/{target → build}/components/NotFound.js +0 -0
  155. /package/{target → build}/components/PackageTabs.d.ts +0 -0
  156. /package/{target → build}/components/PackageTabs.js +0 -0
  157. /package/{target → build}/components/PageToolbar.d.ts +0 -0
  158. /package/{target → build}/components/PageToolbar.js +0 -0
  159. /package/{target → build}/components/PrevNext.d.ts +0 -0
  160. /package/{target → build}/components/PrevNext.js +0 -0
  161. /package/{target → build}/components/Search.d.ts +0 -0
  162. /package/{target → build}/components/Search.js +0 -0
  163. /package/{target → build}/components/SearchDialog.d.ts +0 -0
  164. /package/{target → build}/components/SearchDialog.js +0 -0
  165. /package/{target → build}/components/Section.d.ts +0 -0
  166. /package/{target → build}/components/Section.js +0 -0
  167. /package/{target → build}/components/SectionHeader.d.ts +0 -0
  168. /package/{target → build}/components/SectionHeader.js +0 -0
  169. /package/{target → build}/components/Sidebar.d.ts +0 -0
  170. /package/{target → build}/components/Sidebar.js +0 -0
  171. /package/{target → build}/components/SidebarArticles.d.ts +0 -0
  172. /package/{target → build}/components/SidebarLinks.d.ts +0 -0
  173. /package/{target → build}/components/SidebarPosts.d.ts +0 -0
  174. /package/{target → build}/components/SidebarPosts.js +0 -0
  175. /package/{target → build}/components/SidebarReleases.d.ts +0 -0
  176. /package/{target → build}/components/SidebarReleases.js +0 -0
  177. /package/{target → build}/components/SidebarSections.d.ts +0 -0
  178. /package/{target → build}/components/SiteTitle.d.ts +0 -0
  179. /package/{target → build}/components/SortableTable.d.ts +0 -0
  180. /package/{target → build}/components/SortableTable.js +0 -0
  181. /package/{target → build}/components/SoundCloud.d.ts +0 -0
  182. /package/{target → build}/components/SoundCloud.js +0 -0
  183. /package/{target → build}/components/TagIndex.d.ts +0 -0
  184. /package/{target → build}/components/TagIndex.js +0 -0
  185. /package/{target → build}/components/Theme.d.ts +0 -0
  186. /package/{target → build}/components/Theme.js +0 -0
  187. /package/{target → build}/components/Toc.d.ts +0 -0
  188. /package/{target → build}/components/Toc.js +0 -0
  189. /package/{target → build}/components/YouTube.d.ts +0 -0
  190. /package/{target → build}/components/YouTube.js +0 -0
  191. /package/{target → build}/components/ZoomImage.d.ts +0 -0
  192. /package/{target → build}/components/ZoomImage.js +0 -0
  193. /package/{target → build}/content/article.d.ts +0 -0
  194. /package/{target → build}/content/tag.d.ts +0 -0
  195. /package/{target → build}/content-collections.d.ts +0 -0
  196. /package/{target → build}/elements/accordion.d.ts +0 -0
  197. /package/{target → build}/elements/accordion.js +0 -0
  198. /package/{target → build}/elements/alert-dialog.d.ts +0 -0
  199. /package/{target → build}/elements/alert-dialog.js +0 -0
  200. /package/{target → build}/elements/alert.d.ts +0 -0
  201. /package/{target → build}/elements/alert.js +0 -0
  202. /package/{target → build}/elements/aspect-ratio.d.ts +0 -0
  203. /package/{target → build}/elements/aspect-ratio.js +0 -0
  204. /package/{target → build}/elements/avatar.d.ts +0 -0
  205. /package/{target → build}/elements/avatar.js +0 -0
  206. /package/{target → build}/elements/badge.d.ts +0 -0
  207. /package/{target → build}/elements/badge.js +0 -0
  208. /package/{target → build}/elements/breadcrumb.d.ts +0 -0
  209. /package/{target → build}/elements/breadcrumb.js +0 -0
  210. /package/{target → build}/elements/button-group.d.ts +0 -0
  211. /package/{target → build}/elements/button-group.js +0 -0
  212. /package/{target → build}/elements/button.d.ts +0 -0
  213. /package/{target → build}/elements/button.js +0 -0
  214. /package/{target → build}/elements/calendar.d.ts +0 -0
  215. /package/{target → build}/elements/calendar.js +0 -0
  216. /package/{target → build}/elements/card.d.ts +0 -0
  217. /package/{target → build}/elements/card.js +0 -0
  218. /package/{target → build}/elements/carousel.d.ts +0 -0
  219. /package/{target → build}/elements/carousel.js +0 -0
  220. /package/{target → build}/elements/chart.d.ts +0 -0
  221. /package/{target → build}/elements/chart.js +0 -0
  222. /package/{target → build}/elements/checkbox.d.ts +0 -0
  223. /package/{target → build}/elements/checkbox.js +0 -0
  224. /package/{target → build}/elements/collapsible.d.ts +0 -0
  225. /package/{target → build}/elements/collapsible.js +0 -0
  226. /package/{target → build}/elements/command.d.ts +0 -0
  227. /package/{target → build}/elements/command.js +0 -0
  228. /package/{target → build}/elements/context-menu.d.ts +0 -0
  229. /package/{target → build}/elements/context-menu.js +0 -0
  230. /package/{target → build}/elements/dialog.d.ts +0 -0
  231. /package/{target → build}/elements/dialog.js +0 -0
  232. /package/{target → build}/elements/direction.d.ts +0 -0
  233. /package/{target → build}/elements/direction.js +0 -0
  234. /package/{target → build}/elements/drawer.d.ts +0 -0
  235. /package/{target → build}/elements/drawer.js +0 -0
  236. /package/{target → build}/elements/dropdown-menu.d.ts +0 -0
  237. /package/{target → build}/elements/dropdown-menu.js +0 -0
  238. /package/{target → build}/elements/empty.d.ts +0 -0
  239. /package/{target → build}/elements/empty.js +0 -0
  240. /package/{target → build}/elements/field.d.ts +0 -0
  241. /package/{target → build}/elements/field.js +0 -0
  242. /package/{target → build}/elements/hover-card.d.ts +0 -0
  243. /package/{target → build}/elements/hover-card.js +0 -0
  244. /package/{target → build}/elements/input-group.d.ts +0 -0
  245. /package/{target → build}/elements/input-group.js +0 -0
  246. /package/{target → build}/elements/input-otp.d.ts +0 -0
  247. /package/{target → build}/elements/input-otp.js +0 -0
  248. /package/{target → build}/elements/input.d.ts +0 -0
  249. /package/{target → build}/elements/input.js +0 -0
  250. /package/{target → build}/elements/item.d.ts +0 -0
  251. /package/{target → build}/elements/item.js +0 -0
  252. /package/{target → build}/elements/kbd.d.ts +0 -0
  253. /package/{target → build}/elements/kbd.js +0 -0
  254. /package/{target → build}/elements/label.d.ts +0 -0
  255. /package/{target → build}/elements/label.js +0 -0
  256. /package/{target → build}/elements/menubar.d.ts +0 -0
  257. /package/{target → build}/elements/menubar.js +0 -0
  258. /package/{target → build}/elements/native-select.d.ts +0 -0
  259. /package/{target → build}/elements/native-select.js +0 -0
  260. /package/{target → build}/elements/navigation-menu.d.ts +0 -0
  261. /package/{target → build}/elements/navigation-menu.js +0 -0
  262. /package/{target → build}/elements/pagination.d.ts +0 -0
  263. /package/{target → build}/elements/pagination.js +0 -0
  264. /package/{target → build}/elements/popover.d.ts +0 -0
  265. /package/{target → build}/elements/popover.js +0 -0
  266. /package/{target → build}/elements/progress.d.ts +0 -0
  267. /package/{target → build}/elements/progress.js +0 -0
  268. /package/{target → build}/elements/radio-group.d.ts +0 -0
  269. /package/{target → build}/elements/radio-group.js +0 -0
  270. /package/{target → build}/elements/resizable.d.ts +0 -0
  271. /package/{target → build}/elements/resizable.js +0 -0
  272. /package/{target → build}/elements/scroll-area.d.ts +0 -0
  273. /package/{target → build}/elements/scroll-area.js +0 -0
  274. /package/{target → build}/elements/select.d.ts +0 -0
  275. /package/{target → build}/elements/select.js +0 -0
  276. /package/{target → build}/elements/separator.d.ts +0 -0
  277. /package/{target → build}/elements/separator.js +0 -0
  278. /package/{target → build}/elements/sheet.d.ts +0 -0
  279. /package/{target → build}/elements/sheet.js +0 -0
  280. /package/{target → build}/elements/sidebar.d.ts +0 -0
  281. /package/{target → build}/elements/sidebar.js +0 -0
  282. /package/{target → build}/elements/skeleton.d.ts +0 -0
  283. /package/{target → build}/elements/skeleton.js +0 -0
  284. /package/{target → build}/elements/slider.d.ts +0 -0
  285. /package/{target → build}/elements/slider.js +0 -0
  286. /package/{target → build}/elements/sonner.d.ts +0 -0
  287. /package/{target → build}/elements/sonner.js +0 -0
  288. /package/{target → build}/elements/spinner.d.ts +0 -0
  289. /package/{target → build}/elements/spinner.js +0 -0
  290. /package/{target → build}/elements/switch.d.ts +0 -0
  291. /package/{target → build}/elements/switch.js +0 -0
  292. /package/{target → build}/elements/table.d.ts +0 -0
  293. /package/{target → build}/elements/table.js +0 -0
  294. /package/{target → build}/elements/tabs.d.ts +0 -0
  295. /package/{target → build}/elements/tabs.js +0 -0
  296. /package/{target → build}/elements/textarea.d.ts +0 -0
  297. /package/{target → build}/elements/textarea.js +0 -0
  298. /package/{target → build}/elements/toggle-group.d.ts +0 -0
  299. /package/{target → build}/elements/toggle-group.js +0 -0
  300. /package/{target → build}/elements/toggle.d.ts +0 -0
  301. /package/{target → build}/elements/toggle.js +0 -0
  302. /package/{target → build}/elements/tooltip.d.ts +0 -0
  303. /package/{target → build}/elements/tooltip.js +0 -0
  304. /package/{target → build}/entrypoints/main.d.ts +0 -0
  305. /package/{target → build}/entrypoints/main.js +0 -0
  306. /package/{target → build}/helpers/article-icon.d.ts +0 -0
  307. /package/{target → build}/helpers/article-icon.js +0 -0
  308. /package/{target → build}/helpers/article.d.ts +0 -0
  309. /package/{target → build}/helpers/article.js +0 -0
  310. /package/{target → build}/helpers/changelog-source.d.ts +0 -0
  311. /package/{target → build}/helpers/changelog-source.js +0 -0
  312. /package/{target → build}/helpers/changelog-source.unit.d.ts +0 -0
  313. /package/{target → build}/helpers/changelog-source.unit.js +0 -0
  314. /package/{target → build}/helpers/dynamic-icon-resolver.d.ts +0 -0
  315. /package/{target → build}/helpers/dynamic-icon-resolver.js +0 -0
  316. /package/{target → build}/helpers/dynamic-icon.d.ts +0 -0
  317. /package/{target → build}/helpers/dynamic-icon.js +0 -0
  318. /package/{target → build}/helpers/favicon.d.ts +0 -0
  319. /package/{target → build}/helpers/favicon.js +0 -0
  320. /package/{target → build}/helpers/model.d.ts +0 -0
  321. /package/{target → build}/helpers/model.js +0 -0
  322. /package/{target → build}/helpers/program.d.ts +0 -0
  323. /package/{target → build}/helpers/program.js +0 -0
  324. /package/{target → build}/helpers/resolve-asset-path.d.ts +0 -0
  325. /package/{target → build}/helpers/resolve-asset-path.js +0 -0
  326. /package/{target → build}/helpers/resolve-includes.d.ts +0 -0
  327. /package/{target → build}/helpers/resolve-includes.js +0 -0
  328. /package/{target → build}/helpers/resolve-includes.unit.d.ts +0 -0
  329. /package/{target → build}/helpers/resolve-includes.unit.js +0 -0
  330. /package/{target → build}/helpers/search-text.d.ts +0 -0
  331. /package/{target → build}/helpers/search-text.js +0 -0
  332. /package/{target → build}/helpers/section.d.ts +0 -0
  333. /package/{target → build}/helpers/section.js +0 -0
  334. /package/{target → build}/helpers/section.unit.d.ts +0 -0
  335. /package/{target → build}/helpers/section.unit.js +0 -0
  336. /package/{target → build}/helpers/theme.d.ts +0 -0
  337. /package/{target → build}/helpers/theme.js +0 -0
  338. /package/{target → build}/helpers/toc-context.d.ts +0 -0
  339. /package/{target → build}/helpers/toc-context.js +0 -0
  340. /package/{target → build}/helpers/toc.d.ts +0 -0
  341. /package/{target → build}/helpers/toc.js +0 -0
  342. /package/{target → build}/helpers/toc.unit.d.ts +0 -0
  343. /package/{target → build}/helpers/toc.unit.js +0 -0
  344. /package/{target → build}/hooks/in-view.d.ts +0 -0
  345. /package/{target → build}/hooks/in-view.js +0 -0
  346. /package/{target → build}/hooks/media.d.ts +0 -0
  347. /package/{target → build}/hooks/media.js +0 -0
  348. /package/{target → build}/index.d.ts +0 -0
  349. /package/{target → build}/index.js +0 -0
  350. /package/{target → build}/models/article.d.ts +0 -0
  351. /package/{target → build}/models/article.js +0 -0
  352. /package/{target → build}/models/link.d.ts +0 -0
  353. /package/{target → build}/models/link.js +0 -0
  354. /package/{target → build}/models/patch.d.ts +0 -0
  355. /package/{target → build}/models/patch.js +0 -0
  356. /package/{target → build}/models/section.d.ts +0 -0
  357. /package/{target → build}/models/section.js +0 -0
  358. /package/{target → build}/models/theme.d.ts +0 -0
  359. /package/{target → build}/models/theme.js +0 -0
  360. /package/{target → build}/models/toc.d.ts +0 -0
  361. /package/{target → build}/models/toc.js +0 -0
  362. /package/{target → build}/plugins/rehype-inline-code.d.ts +0 -0
  363. /package/{target → build}/plugins/rehype-inline-code.js +0 -0
  364. /package/{target → build}/plugins/rehype-task-list-a11y.d.ts +0 -0
  365. /package/{target → build}/plugins/rehype-task-list-a11y.js +0 -0
  366. /package/{target → build}/plugins/remark-abbr.d.ts +0 -0
  367. /package/{target → build}/plugins/remark-abbr.js +0 -0
  368. /package/{target → build}/plugins/remark-abbr.unit.d.ts +0 -0
  369. /package/{target → build}/plugins/remark-abbr.unit.js +0 -0
  370. /package/{target → build}/plugins/remark-ansi.d.ts +0 -0
  371. /package/{target → build}/plugins/remark-ansi.js +0 -0
  372. /package/{target → build}/plugins/remark-ansi.unit.d.ts +0 -0
  373. /package/{target → build}/plugins/remark-ansi.unit.js +0 -0
  374. /package/{target → build}/plugins/remark-badge.d.ts +0 -0
  375. /package/{target → build}/plugins/remark-badge.js +0 -0
  376. /package/{target → build}/plugins/remark-badge.unit.d.ts +0 -0
  377. /package/{target → build}/plugins/remark-badge.unit.js +0 -0
  378. /package/{target → build}/plugins/remark-button.d.ts +0 -0
  379. /package/{target → build}/plugins/remark-button.js +0 -0
  380. /package/{target → build}/plugins/remark-button.unit.d.ts +0 -0
  381. /package/{target → build}/plugins/remark-button.unit.js +0 -0
  382. /package/{target → build}/plugins/remark-callout.d.ts +0 -0
  383. /package/{target → build}/plugins/remark-callout.js +0 -0
  384. /package/{target → build}/plugins/remark-card.d.ts +0 -0
  385. /package/{target → build}/plugins/remark-card.js +0 -0
  386. /package/{target → build}/plugins/remark-code-tabs.d.ts +0 -0
  387. /package/{target → build}/plugins/remark-code-tabs.js +0 -0
  388. /package/{target → build}/plugins/remark-columns.d.ts +0 -0
  389. /package/{target → build}/plugins/remark-columns.js +0 -0
  390. /package/{target → build}/plugins/remark-custom-heading-id.d.ts +0 -0
  391. /package/{target → build}/plugins/remark-custom-heading-id.js +0 -0
  392. /package/{target → build}/plugins/remark-custom-heading-id.unit.d.ts +0 -0
  393. /package/{target → build}/plugins/remark-custom-heading-id.unit.js +0 -0
  394. /package/{target → build}/plugins/remark-deflist.d.ts +0 -0
  395. /package/{target → build}/plugins/remark-deflist.js +0 -0
  396. /package/{target → build}/plugins/remark-details.d.ts +0 -0
  397. /package/{target → build}/plugins/remark-details.js +0 -0
  398. /package/{target → build}/plugins/remark-filetree.d.ts +0 -0
  399. /package/{target → build}/plugins/remark-filetree.js +0 -0
  400. /package/{target → build}/plugins/remark-filetree.unit.d.ts +0 -0
  401. /package/{target → build}/plugins/remark-filetree.unit.js +0 -0
  402. /package/{target → build}/plugins/remark-github-callout.d.ts +0 -0
  403. /package/{target → build}/plugins/remark-github-callout.js +0 -0
  404. /package/{target → build}/plugins/remark-icon.d.ts +0 -0
  405. /package/{target → build}/plugins/remark-icon.js +0 -0
  406. /package/{target → build}/plugins/remark-image.d.ts +0 -0
  407. /package/{target → build}/plugins/remark-image.js +0 -0
  408. /package/{target → build}/plugins/remark-media.d.ts +0 -0
  409. /package/{target → build}/plugins/remark-media.js +0 -0
  410. /package/{target → build}/plugins/remark-media.unit.d.ts +0 -0
  411. /package/{target → build}/plugins/remark-media.unit.js +0 -0
  412. /package/{target → build}/plugins/remark-mermaid.d.ts +0 -0
  413. /package/{target → build}/plugins/remark-mermaid.js +0 -0
  414. /package/{target → build}/plugins/remark-npm.d.ts +0 -0
  415. /package/{target → build}/plugins/remark-npm.js +0 -0
  416. /package/{target → build}/plugins/remark-passthrough-directive.d.ts +0 -0
  417. /package/{target → build}/plugins/remark-passthrough-directive.js +0 -0
  418. /package/{target → build}/plugins/remark-steps.d.ts +0 -0
  419. /package/{target → build}/plugins/remark-steps.js +0 -0
  420. /package/{target → build}/plugins/remark-steps.unit.d.ts +0 -0
  421. /package/{target → build}/plugins/remark-steps.unit.js +0 -0
  422. /package/{target → build}/plugins/remark-tab.d.ts +0 -0
  423. /package/{target → build}/plugins/remark-tab.js +0 -0
  424. /package/{target → build}/plugins/remark-tab.unit.d.ts +0 -0
  425. /package/{target → build}/plugins/remark-tab.unit.js +0 -0
  426. /package/{target → build}/plugins/remark-toc.d.ts +0 -0
  427. /package/{target → build}/plugins/remark-toc.js +0 -0
  428. /package/{target → build}/plugins/remark-toc.unit.d.ts +0 -0
  429. /package/{target → build}/plugins/remark-toc.unit.js +0 -0
  430. /package/{target → build}/plugins/shiki-icon.d.ts +0 -0
  431. /package/{target → build}/plugins/shiki-icon.js +0 -0
  432. /package/{target → build}/plugins/shiki-line-highlight.d.ts +0 -0
  433. /package/{target → build}/plugins/shiki-line-highlight.js +0 -0
  434. /package/{target → build}/program.d.ts +0 -0
  435. /package/{target → build}/program.js +0 -0
  436. /package/{target → build}/routeTree.gen.d.ts +0 -0
  437. /package/{target → build}/routeTree.gen.js +0 -0
  438. /package/{target → build}/router.d.ts +0 -0
  439. /package/{target → build}/router.js +0 -0
  440. /package/{target → build}/routes/$.d.ts +0 -0
  441. /package/{target → build}/routes/$.js +0 -0
  442. /package/{target → build}/routes/__root.d.ts +0 -0
  443. /package/{target → build}/server.d.ts +0 -0
  444. /package/{target → build}/server.js +0 -0
  445. /package/{target → build}/utils/style.d.ts +0 -0
  446. /package/{target → build}/utils/style.js +0 -0
  447. /package/{target → build}/vite.config.d.ts +0 -0
@@ -0,0 +1,218 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { basename, relative, resolve } from "node:path";
4
+ import { DEFAULT_EXCLUDES } from "./settings.js";
5
+ import { defineCollection, defineConfig } from "@content-collections/core";
6
+ import { compileMDX } from "@content-collections/mdx";
7
+ import rehypeShiki from "@shikijs/rehype";
8
+ import { transformerTwoslash } from "@shikijs/twoslash";
9
+ import rehypeKatex from "rehype-katex";
10
+ import rehypeSlug from "rehype-slug";
11
+ import remarkDefinitionList from "remark-definition-list";
12
+ import remarkDirective from "remark-directive";
13
+ import remarkGemoji from "remark-gemoji";
14
+ import remarkGfm from "remark-gfm";
15
+ import remarkMath from "remark-math";
16
+ import { loadConfig } from "./actions/config/load.js";
17
+ import { buildChangelog, cacheIncludeGlob } from "./actions/changelog/build.js";
18
+ import { Article } from "./models/article.js";
19
+ import { pickDefaultIcon } from "./helpers/article-icon.js";
20
+ import slugify from "@sindresorhus/slugify";
21
+ import remarkCustomHeadingId from "./plugins/remark-custom-heading-id.js";
22
+ import { remarkCallout } from "./plugins/remark-callout.js";
23
+ import { remarkCard } from "./plugins/remark-card.js";
24
+ import { remarkColumns } from "./plugins/remark-columns.js";
25
+ import { remarkTab } from "./plugins/remark-tab.js";
26
+ import { remarkBadge } from "./plugins/remark-badge.js";
27
+ import { remarkButton } from "./plugins/remark-button.js";
28
+ import { remarkAbbr } from "./plugins/remark-abbr.js";
29
+ import { remarkDeflist } from "./plugins/remark-deflist.js";
30
+ import { remarkDetails } from "./plugins/remark-details.js";
31
+ import { remarkFiletree } from "./plugins/remark-filetree.js";
32
+ import { remarkIcon } from "./plugins/remark-icon.js";
33
+ import { remarkCodeTabs } from "./plugins/remark-code-tabs.js";
34
+ import { remarkGithubCallout } from "./plugins/remark-github-callout.js";
35
+ import { remarkImage } from "./plugins/remark-image.js";
36
+ import { remarkMedia } from "./plugins/remark-media.js";
37
+ import { remarkAnsi } from "./plugins/remark-ansi.js";
38
+ import { remarkMermaid } from "./plugins/remark-mermaid.js";
39
+ import { remarkToc } from "./plugins/remark-toc.js";
40
+ import { remarkNpm } from "./plugins/remark-npm.js";
41
+ import { remarkSteps } from "./plugins/remark-steps.js";
42
+ import { remarkPassthroughDirective } from "./plugins/remark-passthrough-directive.js";
43
+ import { transformerLineHighlight, transformerNotations, } from "./plugins/shiki-line-highlight.js";
44
+ import { rehypeInlineCode } from "./plugins/rehype-inline-code.js";
45
+ import { rehypeTaskListA11y } from "./plugins/rehype-task-list-a11y.js";
46
+ import { transformerIcon } from "./plugins/shiki-icon.js";
47
+ import { resolveAssetPath } from "./helpers/resolve-asset-path.js";
48
+ import { resolveIncludes } from "./helpers/resolve-includes.js";
49
+ import { extractSearchText } from "./helpers/search-text.js";
50
+ import { extractToc } from "./helpers/toc.js";
51
+ const config = await loadConfig();
52
+ const changelogSections = config.sections?.filter(s => s.type === "changelog") ?? [];
53
+ for (const section of changelogSections) {
54
+ await buildChangelog(section, config);
55
+ }
56
+ const configInclude = Array.isArray(config.include)
57
+ ? config.include
58
+ : [config.include];
59
+ const include = changelogSections.length
60
+ ? [...configInclude, cacheIncludeGlob(config)]
61
+ : configInclude;
62
+ const userExclude = config.exclude
63
+ ? Array.isArray(config.exclude)
64
+ ? config.exclude
65
+ : [config.exclude]
66
+ : [];
67
+ // When the consumer doesn't have a .gitignore, fall back to a sensible
68
+ // floor so `**/*.md` doesn't sweep up every README.md under node_modules,
69
+ // build outputs, etc. With a .gitignore present we trust the user.
70
+ const hasGitignore = existsSync(resolve(config.root, ".gitignore"));
71
+ const defaultExclude = hasGitignore ? [] : [...DEFAULT_EXCLUDES];
72
+ const exclude = [...defaultExclude, ...userExclude];
73
+ // content-collections compiles this file to .content-collections/cache/;
74
+ // going up 2 levels reconstructs the baseDirectory it uses for path resolution
75
+ const baseDir = resolve(import.meta.dirname, "../..");
76
+ const directory = relative(baseDir, config.root) || ".";
77
+ function toPath(filePath) {
78
+ const name = basename(filePath).replace(/\.\w+$/, "");
79
+ return slugify(name);
80
+ }
81
+ function getLastUpdated(filePath) {
82
+ try {
83
+ const timestamp = execSync(`git log -1 --format=%cI -- "${filePath}"`, {
84
+ cwd: config.root,
85
+ encoding: "utf-8",
86
+ }).trim();
87
+ return timestamp || undefined;
88
+ }
89
+ catch {
90
+ return undefined;
91
+ }
92
+ }
93
+ function stripLeadingH1(content) {
94
+ return content.replace(/^[ \t]*#\s+[^\n]*\n+/, "");
95
+ }
96
+ function extractTitle(content, path) {
97
+ const match = /^#\s+(.+)$/m.exec(content);
98
+ if (match)
99
+ return match[1];
100
+ return (path
101
+ .split("/")
102
+ .pop()
103
+ ?.replace(/\.\w+$/, "") ?? path);
104
+ }
105
+ const articles = defineCollection({
106
+ name: "articles",
107
+ directory,
108
+ include,
109
+ exclude,
110
+ schema: Article,
111
+ transform: async (document, context) => {
112
+ const patch = config.patches?.find(p => p.file === document._meta.filePath);
113
+ const doc = patch ? { ...document, ...patch.article } : document;
114
+ const filePath = resolve(config.root, doc._meta.filePath);
115
+ const content = resolveIncludes(doc.content, filePath);
116
+ const title = doc.title ?? extractTitle(content, doc._meta.path);
117
+ const icon = doc.icon ?? pickDefaultIcon(doc._meta.path);
118
+ const path = doc.path ?? toPath(doc._meta.filePath);
119
+ // The article's h1 is rendered from `title` by the layout, so strip any
120
+ // leading h1 in the body to avoid two h1s side-by-side (especially when
121
+ // a content patch overrides the title to something different from the
122
+ // body's own heading).
123
+ const bodyContent = stripLeadingH1(content);
124
+ const mdx = await compileMDX(context, { ...doc, content: bodyContent }, {
125
+ remarkPlugins: [
126
+ remarkGfm,
127
+ remarkGemoji,
128
+ remarkDefinitionList,
129
+ remarkDeflist,
130
+ remarkMath,
131
+ remarkDirective,
132
+ remarkCallout,
133
+ remarkCard,
134
+ remarkColumns,
135
+ remarkTab,
136
+ remarkDetails,
137
+ remarkFiletree,
138
+ remarkIcon,
139
+ remarkBadge,
140
+ remarkButton,
141
+ remarkAbbr,
142
+ remarkGithubCallout,
143
+ [
144
+ remarkImage,
145
+ {
146
+ filePath: resolve(config.root, doc._meta.filePath),
147
+ root: config.root,
148
+ },
149
+ ],
150
+ remarkAnsi,
151
+ remarkMermaid,
152
+ remarkMedia,
153
+ remarkToc,
154
+ remarkNpm,
155
+ remarkCodeTabs,
156
+ remarkSteps,
157
+ remarkCustomHeadingId,
158
+ // Run last: anything still typed as a directive after every handler
159
+ // above is unintended (e.g. `3.2:1`, `port:8080`) — passthrough as
160
+ // plain text so it doesn't render as an empty span/div.
161
+ remarkPassthroughDirective,
162
+ ],
163
+ rehypePlugins: [
164
+ [
165
+ rehypeShiki,
166
+ {
167
+ themes: {
168
+ light: config.codeThemeLight,
169
+ dark: config.codeThemeDark,
170
+ },
171
+ // Darken catppuccin-latte's green (the colour used for strings and
172
+ // some comments) — the theme default #40A02B lands at 3.2:1 on the
173
+ // code-block background, below the WCAG AA 4.5:1 threshold.
174
+ colorReplacements: {
175
+ "catppuccin-latte": {
176
+ "#40a02b": "#2a7e16",
177
+ },
178
+ },
179
+ transformers: [
180
+ transformerTwoslash({ explicitTrigger: true }),
181
+ transformerIcon(),
182
+ transformerNotations(),
183
+ transformerLineHighlight(),
184
+ ],
185
+ parseMetaString: (meta) => ({ "data-meta": meta }),
186
+ },
187
+ ],
188
+ rehypeInlineCode,
189
+ rehypeSlug,
190
+ rehypeKatex,
191
+ rehypeTaskListA11y,
192
+ ],
193
+ });
194
+ const tocItems = extractToc(content);
195
+ const searchText = extractSearchText(content);
196
+ const lastUpdated = getLastUpdated(doc._meta.filePath);
197
+ const image = doc.image
198
+ ? resolveAssetPath(doc.image, filePath, config.root)
199
+ : undefined;
200
+ return {
201
+ ...doc,
202
+ file: doc._meta.filePath,
203
+ lastUpdated,
204
+ image,
205
+ title,
206
+ icon,
207
+ path,
208
+ tocItems,
209
+ searchText,
210
+ mdx,
211
+ };
212
+ },
213
+ });
214
+ export default defineConfig({
215
+ // @ts-expect-error tsgo picks wrong overload when rehype-slug augments unified types
216
+ content: [articles],
217
+ });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1jb2xsZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9jb250ZW50LWNvbGxlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLFdBQVcsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN2RCxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUE7QUFDdEMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sb0JBQW9CLE1BQU0sd0JBQXdCLENBQUE7QUFDekQsT0FBTyxlQUFlLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFBO0FBQ3hDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUNsQyxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFB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QUMsT0FBTyxDQUFDLENBQUE7UUFDN0MsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUs7WUFDckIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUNiLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVc7WUFDWCxLQUFLO1lBQ0wsS0FBSztZQUNMLElBQUk7WUFDSixJQUFJO1lBQ0osUUFBUTtZQUNSLFVBQVU7WUFDVixHQUFHO1NBQ0osQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFDLENBQUE7QUFFRixlQUFlLFlBQVksQ0FBQztJQUMxQixxRkFBcUY7SUFDckYsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO0NBQ3BCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgYmFzZW5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBERUZBVUxUX0VYQ0xVREVTIH0gZnJvbSBcIi4vc2V0dGluZ3MudHNcIlxuaW1wb3J0IHsgZGVmaW5lQ29sbGVjdGlvbiwgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIkBjb250ZW50LWNvbGxlY3Rpb25zL2NvcmVcIlxuaW1wb3J0IHsgY29tcGlsZU1EWCB9IGZyb20gXCJAY29udGVudC1jb2xsZWN0aW9ucy9tZHhcIlxuaW1wb3J0IHJlaHlwZVNoaWtpIGZyb20gXCJAc2hpa2lqcy9yZWh5cGVcIlxuaW1wb3J0IHsgdHJhbnNmb3JtZXJUd29zbGFzaCB9IGZyb20gXCJAc2hpa2lqcy90d29zbGFzaFwiXG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSBcInJlaHlwZS1rYXRleFwiXG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tIFwicmVoeXBlLXNsdWdcIlxuaW1wb3J0IHJlbWFya0RlZmluaXRpb25MaXN0IGZyb20gXCJyZW1hcmstZGVmaW5pdGlvbi1saXN0XCJcbmltcG9ydCByZW1hcmtEaXJlY3RpdmUgZnJvbSBcInJlbWFyay1kaXJlY3RpdmVcIlxuaW1wb3J0IHJlbWFya0dlbW9qaSBmcm9tIFwicmVtYXJrLWdlbW9qaVwiXG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gXCJyZW1hcmstZ2ZtXCJcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gXCJyZW1hcmstbWF0aFwiXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4vYWN0aW9ucy9jb25maWcvbG9hZC50c1wiXG5pbXBvcnQgeyBidWlsZENoYW5nZWxvZywgY2FjaGVJbmNsdWRlR2xvYiB9IGZyb20gXCIuL2FjdGlvbnMvY2hhbmdlbG9nL2J1aWxkLnRzXCJcbmltcG9ydCB7IEFydGljbGUgfSBmcm9tIFwiLi9tb2RlbHMvYXJ0aWNsZS50c1wiXG5pbXBvcnQgeyBwaWNrRGVmYXVsdEljb24gfSBmcm9tIFwiLi9oZWxwZXJzL2FydGljbGUtaWNvbi50c1wiXG5pbXBvcnQgc2x1Z2lmeSBmcm9tIFwiQHNpbmRyZXNvcmh1cy9zbHVnaWZ5XCJcbmltcG9ydCByZW1hcmtDdXN0b21IZWFkaW5nSWQgZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstY3VzdG9tLWhlYWRpbmctaWQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ2FsbG91dCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNhbGxvdXQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ2FyZCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNhcmQudHNcIlxuaW1wb3J0IHsgcmVtYXJrQ29sdW1ucyB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWNvbHVtbnMudHNcIlxuaW1wb3J0IHsgcmVtYXJrVGFiIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstdGFiLnRzXCJcbmltcG9ydCB7IHJlbWFya0JhZGdlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYmFkZ2UudHNcIlxuaW1wb3J0IHsgcmVtYXJrQnV0dG9uIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYnV0dG9uLnRzXCJcbmltcG9ydCB7IHJlbWFya0FiYnIgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1hYmJyLnRzXCJcbmltcG9ydCB7IHJlbWFya0RlZmxpc3QgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1kZWZsaXN0LnRzXCJcbmltcG9ydCB7IHJlbWFya0RldGFpbHMgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1kZXRhaWxzLnRzXCJcbmltcG9ydCB7IHJlbWFya0ZpbGV0cmVlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstZmlsZXRyZWUudHNcIlxuaW1wb3J0IHsgcmVtYXJrSWNvbiB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWljb24udHNcIlxuaW1wb3J0IHsgcmVtYXJrQ29kZVRhYnMgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1jb2RlLXRhYnMudHNcIlxuaW1wb3J0IHsgcmVtYXJrR2l0aHViQ2FsbG91dCB9IGZyb20gXCIuL3BsdWdpbnMvcmVtYXJrLWdpdGh1Yi1jYWxsb3V0LnRzXCJcbmltcG9ydCB7IHJlbWFya0ltYWdlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstaW1hZ2UudHNcIlxuaW1wb3J0IHsgcmVtYXJrTWVkaWEgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1tZWRpYS50c1wiXG5pbXBvcnQgeyByZW1hcmtBbnNpIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstYW5zaS50c1wiXG5pbXBvcnQgeyByZW1hcmtNZXJtYWlkIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstbWVybWFpZC50c1wiXG5pbXBvcnQgeyByZW1hcmtUb2MgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay10b2MudHNcIlxuaW1wb3J0IHsgcmVtYXJrTnBtIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstbnBtLnRzXCJcbmltcG9ydCB7IHJlbWFya1N0ZXBzIH0gZnJvbSBcIi4vcGx1Z2lucy9yZW1hcmstc3RlcHMudHNcIlxuaW1wb3J0IHsgcmVtYXJrUGFzc3Rocm91Z2hEaXJlY3RpdmUgfSBmcm9tIFwiLi9wbHVnaW5zL3JlbWFyay1wYXNzdGhyb3VnaC1kaXJlY3RpdmUudHNcIlxuaW1wb3J0IHtcbiAgdHJhbnNmb3JtZXJMaW5lSGlnaGxpZ2h0LFxuICB0cmFuc2Zvcm1lck5vdGF0aW9ucyxcbn0gZnJvbSBcIi4vcGx1Z2lucy9zaGlraS1saW5lLWhpZ2hsaWdodC50c1wiXG5pbXBvcnQgeyByZWh5cGVJbmxpbmVDb2RlIH0gZnJvbSBcIi4vcGx1Z2lucy9yZWh5cGUtaW5saW5lLWNvZGUudHNcIlxuaW1wb3J0IHsgcmVoeXBlVGFza0xpc3RBMTF5IH0gZnJvbSBcIi4vcGx1Z2lucy9yZWh5cGUtdGFzay1saXN0LWExMXkudHNcIlxuaW1wb3J0IHsgdHJhbnNmb3JtZXJJY29uIH0gZnJvbSBcIi4vcGx1Z2lucy9zaGlraS1pY29uLnRzXCJcbmltcG9ydCB7IHJlc29sdmVBc3NldFBhdGggfSBmcm9tIFwiLi9oZWxwZXJzL3Jlc29sdmUtYXNzZXQtcGF0aC50c1wiXG5pbXBvcnQgeyByZXNvbHZlSW5jbHVkZXMgfSBmcm9tIFwiLi9oZWxwZXJzL3Jlc29sdmUtaW5jbHVkZXMudHNcIlxuaW1wb3J0IHsgZXh0cmFjdFNlYXJjaFRleHQgfSBmcm9tIFwiLi9oZWxwZXJzL3NlYXJjaC10ZXh0LnRzXCJcbmltcG9ydCB7IGV4dHJhY3RUb2MgfSBmcm9tIFwiLi9oZWxwZXJzL3RvYy50c1wiXG5cbmNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKVxuXG5jb25zdCBjaGFuZ2Vsb2dTZWN0aW9ucyA9XG4gIGNvbmZpZy5zZWN0aW9ucz8uZmlsdGVyKHMgPT4gcy50eXBlID09PSBcImNoYW5nZWxvZ1wiKSA/PyBbXVxuZm9yIChjb25zdCBzZWN0aW9uIG9mIGNoYW5nZWxvZ1NlY3Rpb25zKSB7XG4gIGF3YWl0IGJ1aWxkQ2hhbmdlbG9nKHNlY3Rpb24sIGNvbmZpZylcbn1cblxuY29uc3QgY29uZmlnSW5jbHVkZSA9IEFycmF5LmlzQXJyYXkoY29uZmlnLmluY2x1ZGUpXG4gID8gY29uZmlnLmluY2x1ZGVcbiAgOiBbY29uZmlnLmluY2x1ZGVdXG5jb25zdCBpbmNsdWRlID0gY2hhbmdlbG9nU2VjdGlvbnMubGVuZ3RoXG4gID8gWy4uLmNvbmZpZ0luY2x1ZGUsIGNhY2hlSW5jbHVkZUdsb2IoY29uZmlnKV1cbiAgOiBjb25maWdJbmNsdWRlXG5cbmNvbnN0IHVzZXJFeGNsdWRlID0gY29uZmlnLmV4Y2x1ZGVcbiAgPyBBcnJheS5pc0FycmF5KGNvbmZpZy5leGNsdWRlKVxuICAgID8gY29uZmlnLmV4Y2x1ZGVcbiAgICA6IFtjb25maWcuZXhjbHVkZV1cbiAgOiBbXVxuLy8gV2hlbiB0aGUgY29uc3VtZXIgZG9lc24ndCBoYXZlIGEgLmdpdGlnbm9yZSwgZmFsbCBiYWNrIHRvIGEgc2Vuc2libGVcbi8vIGZsb29yIHNvIGAqKi8qLm1kYCBkb2Vzbid0IHN3ZWVwIHVwIGV2ZXJ5IFJFQURNRS5tZCB1bmRlciBub2RlX21vZHVsZXMsXG4vLyBidWlsZCBvdXRwdXRzLCBldGMuIFdpdGggYSAuZ2l0aWdub3JlIHByZXNlbnQgd2UgdHJ1c3QgdGhlIHVzZXIuXG5jb25zdCBoYXNHaXRpZ25vcmUgPSBleGlzdHNTeW5jKHJlc29sdmUoY29uZmlnLnJvb3QsIFwiLmdpdGlnbm9yZVwiKSlcbmNvbnN0IGRlZmF1bHRFeGNsdWRlID0gaGFzR2l0aWdub3JlID8gW10gOiBbLi4uREVGQVVMVF9FWENMVURFU11cbmNvbnN0IGV4Y2x1ZGUgPSBbLi4uZGVmYXVsdEV4Y2x1ZGUsIC4uLnVzZXJFeGNsdWRlXVxuXG4vLyBjb250ZW50LWNvbGxlY3Rpb25zIGNvbXBpbGVzIHRoaXMgZmlsZSB0byAuY29udGVudC1jb2xsZWN0aW9ucy9jYWNoZS87XG4vLyBnb2luZyB1cCAyIGxldmVscyByZWNvbnN0cnVjdHMgdGhlIGJhc2VEaXJlY3RvcnkgaXQgdXNlcyBmb3IgcGF0aCByZXNvbHV0aW9uXG5jb25zdCBiYXNlRGlyID0gcmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uLy4uXCIpXG5jb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZShiYXNlRGlyLCBjb25maWcucm9vdCkgfHwgXCIuXCJcblxuZnVuY3Rpb24gdG9QYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGVQYXRoKS5yZXBsYWNlKC9cXC5cXHcrJC8sIFwiXCIpXG4gIHJldHVybiBzbHVnaWZ5KG5hbWUpXG59XG5cbmZ1bmN0aW9uIGdldExhc3RVcGRhdGVkKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBleGVjU3luYyhgZ2l0IGxvZyAtMSAtLWZvcm1hdD0lY0kgLS0gXCIke2ZpbGVQYXRofVwiYCwge1xuICAgICAgY3dkOiBjb25maWcucm9vdCxcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgfSkudHJpbSgpXG4gICAgcmV0dXJuIHRpbWVzdGFtcCB8fCB1bmRlZmluZWRcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ0gxKGNvbnRlbnQ6IHN0cmluZykge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9eWyBcXHRdKiNcXHMrW15cXG5dKlxcbisvLCBcIlwiKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VGl0bGUoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXiNcXHMrKC4rKSQvbS5leGVjKGNvbnRlbnQpXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdIVxuICByZXR1cm4gKFxuICAgIHBhdGhcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5wb3AoKVxuICAgICAgPy5yZXBsYWNlKC9cXC5cXHcrJC8sIFwiXCIpID8/IHBhdGhcbiAgKVxufVxuXG5jb25zdCBhcnRpY2xlcyA9IGRlZmluZUNvbGxlY3Rpb24oe1xuICBuYW1lOiBcImFydGljbGVzXCIsXG4gIGRpcmVjdG9yeSxcbiAgaW5jbHVkZSxcbiAgZXhjbHVkZSxcbiAgc2NoZW1hOiBBcnRpY2xlLFxuICB0cmFuc2Zvcm06IGFzeW5jIChkb2N1bWVudCwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHBhdGNoID0gY29uZmlnLnBhdGNoZXM/LmZpbmQocCA9PiBwLmZpbGUgPT09IGRvY3VtZW50Ll9tZXRhLmZpbGVQYXRoKVxuICAgIGNvbnN0IGRvYyA9IHBhdGNoID8geyAuLi5kb2N1bWVudCwgLi4ucGF0Y2guYXJ0aWNsZSB9IDogZG9jdW1lbnRcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnJvb3QsIGRvYy5fbWV0YS5maWxlUGF0aClcbiAgICBjb25zdCBjb250ZW50ID0gcmVzb2x2ZUluY2x1ZGVzKGRvYy5jb250ZW50LCBmaWxlUGF0aClcbiAgICBjb25zdCB0aXRsZSA9IGRvYy50aXRsZSA/PyBleHRyYWN0VGl0bGUoY29udGVudCwgZG9jLl9tZXRhLnBhdGgpXG4gICAgY29uc3QgaWNvbiA9IGRvYy5pY29uID8/IHBpY2tEZWZhdWx0SWNvbihkb2MuX21ldGEucGF0aClcbiAgICBjb25zdCBwYXRoID0gZG9jLnBhdGggPz8gdG9QYXRoKGRvYy5fbWV0YS5maWxlUGF0aClcbiAgICAvLyBUaGUgYXJ0aWNsZSdzIGgxIGlzIHJlbmRlcmVkIGZyb20gYHRpdGxlYCBieSB0aGUgbGF5b3V0LCBzbyBzdHJpcCBhbnlcbiAgICAvLyBsZWFkaW5nIGgxIGluIHRoZSBib2R5IHRvIGF2b2lkIHR3byBoMXMgc2lkZS1ieS1zaWRlIChlc3BlY2lhbGx5IHdoZW5cbiAgICAvLyBhIGNvbnRlbnQgcGF0Y2ggb3ZlcnJpZGVzIHRoZSB0aXRsZSB0byBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gdGhlXG4gICAgLy8gYm9keSdzIG93biBoZWFkaW5nKS5cbiAgICBjb25zdCBib2R5Q29udGVudCA9IHN0cmlwTGVhZGluZ0gxKGNvbnRlbnQpXG4gICAgY29uc3QgbWR4ID0gYXdhaXQgY29tcGlsZU1EWChcbiAgICAgIGNvbnRleHQsXG4gICAgICB7IC4uLmRvYywgY29udGVudDogYm9keUNvbnRlbnQgfSxcbiAgICAgIHtcbiAgICAgICAgcmVtYXJrUGx1Z2luczogW1xuICAgICAgICAgIHJlbWFya0dmbSxcbiAgICAgICAgICByZW1hcmtHZW1vamksXG4gICAgICAgICAgcmVtYXJrRGVmaW5pdGlvbkxpc3QsXG4gICAgICAgICAgcmVtYXJrRGVmbGlzdCxcbiAgICAgICAgICByZW1hcmtNYXRoLFxuICAgICAgICAgIHJlbWFya0RpcmVjdGl2ZSxcbiAgICAgICAgICByZW1hcmtDYWxsb3V0LFxuICAgICAgICAgIHJlbWFya0NhcmQsXG4gICAgICAgICAgcmVtYXJrQ29sdW1ucyxcbiAgICAgICAgICByZW1hcmtUYWIsXG4gICAgICAgICAgcmVtYXJrRGV0YWlscyxcbiAgICAgICAgICByZW1hcmtGaWxldHJlZSxcbiAgICAgICAgICByZW1hcmtJY29uLFxuICAgICAgICAgIHJlbWFya0JhZGdlLFxuICAgICAgICAgIHJlbWFya0J1dHRvbixcbiAgICAgICAgICByZW1hcmtBYmJyLFxuICAgICAgICAgIHJlbWFya0dpdGh1YkNhbGxvdXQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgcmVtYXJrSW1hZ2UsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbGVQYXRoOiByZXNvbHZlKGNvbmZpZy5yb290LCBkb2MuX21ldGEuZmlsZVBhdGgpLFxuICAgICAgICAgICAgICByb290OiBjb25maWcucm9vdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZW1hcmtBbnNpLFxuICAgICAgICAgIHJlbWFya01lcm1haWQsXG4gICAgICAgICAgcmVtYXJrTWVkaWEsXG4gICAgICAgICAgcmVtYXJrVG9jLFxuICAgICAgICAgIHJlbWFya05wbSxcbiAgICAgICAgICByZW1hcmtDb2RlVGFicyxcbiAgICAgICAgICByZW1hcmtTdGVwcyxcbiAgICAgICAgICByZW1hcmtDdXN0b21IZWFkaW5nSWQsXG4gICAgICAgICAgLy8gUnVuIGxhc3Q6IGFueXRoaW5nIHN0aWxsIHR5cGVkIGFzIGEgZGlyZWN0aXZlIGFmdGVyIGV2ZXJ5IGhhbmRsZXJcbiAgICAgICAgICAvLyBhYm92ZSBpcyB1bmludGVuZGVkIChlLmcuIGAzLjI6MWAsIGBwb3J0OjgwODBgKSDigJQgcGFzc3Rocm91Z2ggYXNcbiAgICAgICAgICAvLyBwbGFpbiB0ZXh0IHNvIGl0IGRvZXNuJ3QgcmVuZGVyIGFzIGFuIGVtcHR5IHNwYW4vZGl2LlxuICAgICAgICAgIHJlbWFya1Bhc3N0aHJvdWdoRGlyZWN0aXZlLFxuICAgICAgICBdLFxuICAgICAgICByZWh5cGVQbHVnaW5zOiBbXG4gICAgICAgICAgW1xuICAgICAgICAgICAgcmVoeXBlU2hpa2ksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoZW1lczoge1xuICAgICAgICAgICAgICAgIGxpZ2h0OiBjb25maWcuY29kZVRoZW1lTGlnaHQsXG4gICAgICAgICAgICAgICAgZGFyazogY29uZmlnLmNvZGVUaGVtZURhcmssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIERhcmtlbiBjYXRwcHVjY2luLWxhdHRlJ3MgZ3JlZW4gKHRoZSBjb2xvdXIgdXNlZCBmb3Igc3RyaW5ncyBhbmRcbiAgICAgICAgICAgICAgLy8gc29tZSBjb21tZW50cykg4oCUIHRoZSB0aGVtZSBkZWZhdWx0ICM0MEEwMkIgbGFuZHMgYXQgMy4yOjEgb24gdGhlXG4gICAgICAgICAgICAgIC8vIGNvZGUtYmxvY2sgYmFja2dyb3VuZCwgYmVsb3cgdGhlIFdDQUcgQUEgNC41OjEgdGhyZXNob2xkLlxuICAgICAgICAgICAgICBjb2xvclJlcGxhY2VtZW50czoge1xuICAgICAgICAgICAgICAgIFwiY2F0cHB1Y2Npbi1sYXR0ZVwiOiB7XG4gICAgICAgICAgICAgICAgICBcIiM0MGEwMmJcIjogXCIjMmE3ZTE2XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZXJzOiBbXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXJUd29zbGFzaCh7IGV4cGxpY2l0VHJpZ2dlcjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lckljb24oKSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lck5vdGF0aW9ucygpLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyTGluZUhpZ2hsaWdodCgpLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBwYXJzZU1ldGFTdHJpbmc6IChtZXRhOiBzdHJpbmcpID0+ICh7IFwiZGF0YS1tZXRhXCI6IG1ldGEgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVoeXBlSW5saW5lQ29kZSxcbiAgICAgICAgICByZWh5cGVTbHVnLFxuICAgICAgICAgIHJlaHlwZUthdGV4LFxuICAgICAgICAgIHJlaHlwZVRhc2tMaXN0QTExeSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKVxuICAgIGNvbnN0IHRvY0l0ZW1zID0gZXh0cmFjdFRvYyhjb250ZW50KVxuICAgIGNvbnN0IHNlYXJjaFRleHQgPSBleHRyYWN0U2VhcmNoVGV4dChjb250ZW50KVxuICAgIGNvbnN0IGxhc3RVcGRhdGVkID0gZ2V0TGFzdFVwZGF0ZWQoZG9jLl9tZXRhLmZpbGVQYXRoKVxuICAgIGNvbnN0IGltYWdlID0gZG9jLmltYWdlXG4gICAgICA/IHJlc29sdmVBc3NldFBhdGgoZG9jLmltYWdlLCBmaWxlUGF0aCwgY29uZmlnLnJvb3QpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHJldHVybiB7XG4gICAgICAuLi5kb2MsXG4gICAgICBmaWxlOiBkb2MuX21ldGEuZmlsZVBhdGgsXG4gICAgICBsYXN0VXBkYXRlZCxcbiAgICAgIGltYWdlLFxuICAgICAgdGl0bGUsXG4gICAgICBpY29uLFxuICAgICAgcGF0aCxcbiAgICAgIHRvY0l0ZW1zLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIG1keCxcbiAgICB9XG4gIH0sXG59KVxuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRzZ28gcGlja3Mgd3Jvbmcgb3ZlcmxvYWQgd2hlbiByZWh5cGUtc2x1ZyBhdWdtZW50cyB1bmlmaWVkIHR5cGVzXG4gIGNvbnRlbnQ6IFthcnRpY2xlc10sXG59KVxuIl19
@@ -1,8 +1,18 @@
1
1
  import { z } from "zod";
2
+ import type { ConfigEnv, UserConfig as ViteUserConfig } from "vite";
3
+ /** Escape hatch for arbitrary Vite config — accepts either a config
4
+ * object (simple overrides) or a function form (`(env) => config`,
5
+ * matching Vite's own `defineConfig`). Merged on top of livemark's
6
+ * defaults via `mergeConfig`, so plugin arrays concatenate, defines
7
+ * merge, etc. Use this for deployment-target tweaks (e.g. CF Workers
8
+ * via `environments.ssr.resolve.conditions: ["workerd", ...]`). */
9
+ export type ViteOverride = ViteUserConfig | ((env: ConfigEnv) => ViteUserConfig | Promise<ViteUserConfig>);
2
10
  /**
3
11
  * User-provided configuration for Livemark.
4
12
  */
5
- export type UserConfig = z.infer<typeof UserConfig>;
13
+ export type UserConfig = Omit<z.infer<typeof UserConfig>, "vite"> & {
14
+ vite?: ViteOverride;
15
+ };
6
16
  export declare const UserConfig: z.ZodObject<{
7
17
  site: z.ZodOptional<z.ZodString>;
8
18
  favicon: z.ZodOptional<z.ZodString>;
@@ -143,6 +153,7 @@ export declare const UserConfig: z.ZodObject<{
143
153
  }>>>;
144
154
  }, z.core.$strict>;
145
155
  }, z.core.$strip>>>;
156
+ vite: z.ZodOptional<z.ZodUnknown>;
146
157
  }, z.core.$strip>;
147
158
  /** Website configuration injected at build time via Vite define */
148
159
  export type WebsiteConfig = z.infer<typeof WebsiteConfig>;
@@ -203,6 +214,10 @@ export declare const SystemConfig: z.ZodObject<{
203
214
  }, z.core.$strip>;
204
215
  /**
205
216
  * Fully resolved Livemark configuration.
217
+ *
218
+ * `vite` stays `unknown` here because that's what the runtime schema
219
+ * produces — consumer-facing typing happens via {@link UserConfig} so
220
+ * `defineConfig` shows the right shape in editors.
206
221
  */
207
222
  export type Config = z.infer<typeof Config>;
208
223
  export declare const Config: z.ZodObject<{
@@ -345,6 +360,7 @@ export declare const Config: z.ZodObject<{
345
360
  }>>>;
346
361
  }, z.core.$strict>;
347
362
  }, z.core.$strip>>>;
363
+ vite: z.ZodOptional<z.ZodUnknown>;
348
364
  root: z.ZodString;
349
365
  configPath: z.ZodString;
350
366
  }, z.core.$strip>;
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { Link } from "./link.js";
3
+ import { Patch } from "./patch.js";
4
+ import { Section } from "./section.js";
5
+ import { CodeThemeDark, CodeThemeLight } from "./theme.js";
6
+ export const UserConfig = z.object({
7
+ site: z.string().optional(),
8
+ favicon: z.string().optional(),
9
+ logo: z.string().optional(),
10
+ title: z.string().default("Livemark"),
11
+ description: z.string().default("Markdown site generator"),
12
+ include: z.union([z.string(), z.array(z.string())]).default("**/*.md"),
13
+ exclude: z.union([z.string(), z.array(z.string())]).optional(),
14
+ codeThemeLight: CodeThemeLight.default("catppuccin-latte"),
15
+ codeThemeDark: CodeThemeDark.default("catppuccin-mocha"),
16
+ links: z.array(Link).optional(),
17
+ sections: z.array(Section).optional(),
18
+ patches: z.array(Patch).optional(),
19
+ // Stored as `unknown` in the schema (zod can't type a Vite UserConfig
20
+ // or a function returning one meaningfully); the public TypeScript
21
+ // surface above lifts it back to ViteOverride for editor support.
22
+ vite: z.unknown().optional(),
23
+ });
24
+ export const WebsiteConfig = UserConfig.pick({
25
+ title: true,
26
+ description: true,
27
+ site: true,
28
+ favicon: true,
29
+ logo: true,
30
+ links: true,
31
+ sections: true,
32
+ });
33
+ export const SystemConfig = z.object({
34
+ root: z.string(),
35
+ configPath: z.string(),
36
+ });
37
+ export const Config = UserConfig.merge(SystemConfig);
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL21vZGVscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQWtCMUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDOUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3JDLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0lBQzFELE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDdEUsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzlELGNBQWMsRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBQzFELGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBQ3hELEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMvQixRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ2xDLHNFQUFzRTtJQUN0RSxtRUFBbUU7SUFDbkUsa0VBQWtFO0lBQ2xFLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdCLENBQUMsQ0FBQTtBQUlGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzNDLEtBQUssRUFBRSxJQUFJO0lBQ1gsV0FBVyxFQUFFLElBQUk7SUFDakIsSUFBSSxFQUFFLElBQUk7SUFDVixPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUMsQ0FBQTtBQU1GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQTtBQVVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSBcIi4vbGluay50c1wiXG5pbXBvcnQgeyBQYXRjaCB9IGZyb20gXCIuL3BhdGNoLnRzXCJcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tIFwiLi9zZWN0aW9uLnRzXCJcbmltcG9ydCB7IENvZGVUaGVtZURhcmssIENvZGVUaGVtZUxpZ2h0IH0gZnJvbSBcIi4vdGhlbWUudHNcIlxuXG4vKiogRXNjYXBlIGhhdGNoIGZvciBhcmJpdHJhcnkgVml0ZSBjb25maWcg4oCUIGFjY2VwdHMgZWl0aGVyIGEgY29uZmlnXG4gKiAgb2JqZWN0IChzaW1wbGUgb3ZlcnJpZGVzKSBvciBhIGZ1bmN0aW9uIGZvcm0gKGAoZW52KSA9PiBjb25maWdgLFxuICogIG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLiBNZXJnZWQgb24gdG9wIG9mIGxpdmVtYXJrJ3NcbiAqICBkZWZhdWx0cyB2aWEgYG1lcmdlQ29uZmlnYCwgc28gcGx1Z2luIGFycmF5cyBjb25jYXRlbmF0ZSwgZGVmaW5lc1xuICogIG1lcmdlLCBldGMuIFVzZSB0aGlzIGZvciBkZXBsb3ltZW50LXRhcmdldCB0d2Vha3MgKGUuZy4gQ0YgV29ya2Vyc1xuICogIHZpYSBgZW52aXJvbm1lbnRzLnNzci5yZXNvbHZlLmNvbmRpdGlvbnM6IFtcIndvcmtlcmRcIiwgLi4uXWApLiAqL1xuZXhwb3J0IHR5cGUgVml0ZU92ZXJyaWRlID1cbiAgfCBWaXRlVXNlckNvbmZpZ1xuICB8ICgoZW52OiBDb25maWdFbnYpID0+IFZpdGVVc2VyQ29uZmlnIHwgUHJvbWlzZTxWaXRlVXNlckNvbmZpZz4pXG5cbi8qKlxuICogVXNlci1wcm92aWRlZCBjb25maWd1cmF0aW9uIGZvciBMaXZlbWFyay5cbiAqL1xuZXhwb3J0IHR5cGUgVXNlckNvbmZpZyA9IE9taXQ8ei5pbmZlcjx0eXBlb2YgVXNlckNvbmZpZz4sIFwidml0ZVwiPiAmIHtcbiAgdml0ZT86IFZpdGVPdmVycmlkZVxufVxuZXhwb3J0IGNvbnN0IFVzZXJDb25maWcgPSB6Lm9iamVjdCh7XG4gIHNpdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZmF2aWNvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBsb2dvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpdGxlOiB6LnN0cmluZygpLmRlZmF1bHQoXCJMaXZlbWFya1wiKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkuZGVmYXVsdChcIk1hcmtkb3duIHNpdGUgZ2VuZXJhdG9yXCIpLFxuICBpbmNsdWRlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSkuZGVmYXVsdChcIioqLyoubWRcIiksXG4gIGV4Y2x1ZGU6IHoudW5pb24oW3ouc3RyaW5nKCksIHouYXJyYXkoei5zdHJpbmcoKSldKS5vcHRpb25hbCgpLFxuICBjb2RlVGhlbWVMaWdodDogQ29kZVRoZW1lTGlnaHQuZGVmYXVsdChcImNhdHBwdWNjaW4tbGF0dGVcIiksXG4gIGNvZGVUaGVtZURhcms6IENvZGVUaGVtZURhcmsuZGVmYXVsdChcImNhdHBwdWNjaW4tbW9jaGFcIiksXG4gIGxpbmtzOiB6LmFycmF5KExpbmspLm9wdGlvbmFsKCksXG4gIHNlY3Rpb25zOiB6LmFycmF5KFNlY3Rpb24pLm9wdGlvbmFsKCksXG4gIHBhdGNoZXM6IHouYXJyYXkoUGF0Y2gpLm9wdGlvbmFsKCksXG4gIC8vIFN0b3JlZCBhcyBgdW5rbm93bmAgaW4gdGhlIHNjaGVtYSAoem9kIGNhbid0IHR5cGUgYSBWaXRlIFVzZXJDb25maWdcbiAgLy8gb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgb25lIG1lYW5pbmdmdWxseSk7IHRoZSBwdWJsaWMgVHlwZVNjcmlwdFxuICAvLyBzdXJmYWNlIGFib3ZlIGxpZnRzIGl0IGJhY2sgdG8gVml0ZU92ZXJyaWRlIGZvciBlZGl0b3Igc3VwcG9ydC5cbiAgdml0ZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pXG5cbi8qKiBXZWJzaXRlIGNvbmZpZ3VyYXRpb24gaW5qZWN0ZWQgYXQgYnVpbGQgdGltZSB2aWEgVml0ZSBkZWZpbmUgKi9cbmV4cG9ydCB0eXBlIFdlYnNpdGVDb25maWcgPSB6LmluZmVyPHR5cGVvZiBXZWJzaXRlQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFdlYnNpdGVDb25maWcgPSBVc2VyQ29uZmlnLnBpY2soe1xuICB0aXRsZTogdHJ1ZSxcbiAgZGVzY3JpcHRpb246IHRydWUsXG4gIHNpdGU6IHRydWUsXG4gIGZhdmljb246IHRydWUsXG4gIGxvZ286IHRydWUsXG4gIGxpbmtzOiB0cnVlLFxuICBzZWN0aW9uczogdHJ1ZSxcbn0pXG5cbi8qKlxuICogU3lzdGVtLWNvbXB1dGVkIGNvbmZpZ3VyYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBjb25maWcgZmlsZSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgU3lzdGVtQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgU3lzdGVtQ29uZmlnPlxuZXhwb3J0IGNvbnN0IFN5c3RlbUNvbmZpZyA9IHoub2JqZWN0KHtcbiAgcm9vdDogei5zdHJpbmcoKSxcbiAgY29uZmlnUGF0aDogei5zdHJpbmcoKSxcbn0pXG5cbi8qKlxuICogRnVsbHkgcmVzb2x2ZWQgTGl2ZW1hcmsgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBgdml0ZWAgc3RheXMgYHVua25vd25gIGhlcmUgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGUgcnVudGltZSBzY2hlbWFcbiAqIHByb2R1Y2VzIOKAlCBjb25zdW1lci1mYWNpbmcgdHlwaW5nIGhhcHBlbnMgdmlhIHtAbGluayBVc2VyQ29uZmlnfSBzb1xuICogYGRlZmluZUNvbmZpZ2Agc2hvd3MgdGhlIHJpZ2h0IHNoYXBlIGluIGVkaXRvcnMuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHouaW5mZXI8dHlwZW9mIENvbmZpZz5cbmV4cG9ydCBjb25zdCBDb25maWcgPSBVc2VyQ29uZmlnLm1lcmdlKFN5c3RlbUNvbmZpZylcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import type { Plugin } from "vite";
2
+ import type { Config } from "../models/config.ts";
3
+ export interface LivemarkOptions {
4
+ config: Config;
5
+ }
6
+ /** Owns the per-consumer `targets/<hash>/` mount: synthesizes it via
7
+ * `buildTarget()`, returns the Vite config that anchors there, and
8
+ * watches the consumer's `.livemark/` (plus livemark's `source/` in
9
+ * dev) for changes that need to be re-copied into the target. The
10
+ * override mechanism is pure file-system (full copies) — no resolveId
11
+ * redirection, no realpath surprises. */
12
+ export declare function livemark(opts: LivemarkOptions): Plugin;
@@ -0,0 +1,165 @@
1
+ import { cpSync, existsSync, rmSync } from "node:fs";
2
+ import { join, sep } from "node:path";
3
+ import { mergeConfig } from "vite";
4
+ import { buildTarget } from "../actions/target/build.js";
5
+ import { WebsiteConfig } from "../models/config.js";
6
+ import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
7
+ const SOURCE_DIR = join(import.meta.dirname, "..");
8
+ /** Single virtual module exposing livemark's runtime values to consumer
9
+ * override files via named exports:
10
+ *
11
+ * import { config } from "livemark:virtual"
12
+ *
13
+ * Currently exports `config` (validated `WebsiteConfig`); future
14
+ * additions (e.g. `articles`, `sections`) land here as new named
15
+ * exports without consumers changing their import statements.
16
+ *
17
+ * The `\0` prefix on the resolved id is Vite's convention to signal
18
+ * "this is a virtual module — no other plugin should try to resolve
19
+ * or load it from disk". */
20
+ const VIRTUAL_ID = "livemark:virtual";
21
+ const VIRTUAL_RESOLVED_ID = `\0${VIRTUAL_ID}`;
22
+ /** Owns the per-consumer `targets/<hash>/` mount: synthesizes it via
23
+ * `buildTarget()`, returns the Vite config that anchors there, and
24
+ * watches the consumer's `.livemark/` (plus livemark's `source/` in
25
+ * dev) for changes that need to be re-copied into the target. The
26
+ * override mechanism is pure file-system (full copies) — no resolveId
27
+ * redirection, no realpath surprises. */
28
+ export function livemark(opts) {
29
+ const overridesRoot = join(opts.config.root, ".livemark");
30
+ let targetDir = "";
31
+ return {
32
+ name: "livemark",
33
+ enforce: "pre",
34
+ async config(_, env) {
35
+ targetDir = buildTarget(opts.config.configPath);
36
+ const base = {
37
+ root: targetDir,
38
+ // outDir lives outside the target root (in the consumer's
39
+ // .livemark/) so the consumer can find their deployable output
40
+ // without digging into node_modules. Vite's default refusal to
41
+ // empty out-of-root directories doesn't apply here because the
42
+ // target/ root is livemark's, not the consumer's.
43
+ build: { outDir: join(overridesRoot, "build"), emptyOutDir: true },
44
+ resolve: { dedupe: ["react", "react-dom"] },
45
+ };
46
+ const override = await resolveViteOverride(opts.config.vite, env);
47
+ return override ? mergeConfig(base, override) : base;
48
+ },
49
+ resolveId(id) {
50
+ if (id === VIRTUAL_ID)
51
+ return VIRTUAL_RESOLVED_ID;
52
+ return null;
53
+ },
54
+ load(id) {
55
+ if (id !== VIRTUAL_RESOLVED_ID)
56
+ return null;
57
+ const config = WebsiteConfig.parse(opts.config);
58
+ return `export const config = ${JSON.stringify(config)}`;
59
+ },
60
+ configureServer(server) {
61
+ server.watcher.add(opts.config.configPath);
62
+ server.watcher.add(join(overridesRoot, "**", "*"));
63
+ server.watcher.add(join(SOURCE_DIR, "**", "*"));
64
+ server.watcher.on("change", file => onChange(file, "change"));
65
+ server.watcher.on("add", file => onChange(file, "add"));
66
+ server.watcher.on("unlink", file => onChange(file, "unlink"));
67
+ function onChange(file, kind) {
68
+ if (file === opts.config.configPath) {
69
+ server.restart();
70
+ return;
71
+ }
72
+ const overlayHit = matchOverlay(file, overridesRoot);
73
+ if (overlayHit) {
74
+ syncOverlay(overlayHit, kind, targetDir, overridesRoot);
75
+ if (kind !== "change")
76
+ fullReload(server);
77
+ return;
78
+ }
79
+ const sourceHit = matchSource(file);
80
+ if (sourceHit) {
81
+ syncSource(sourceHit, kind, targetDir, overridesRoot);
82
+ if (kind !== "change")
83
+ fullReload(server);
84
+ }
85
+ }
86
+ },
87
+ };
88
+ }
89
+ function matchOverlay(file, overridesRoot) {
90
+ const prefix = `${overridesRoot}${sep}`;
91
+ if (!file.startsWith(prefix))
92
+ return null;
93
+ const rel = file.slice(prefix.length);
94
+ return { rel, category: classify(rel) };
95
+ }
96
+ function matchSource(file) {
97
+ const prefix = `${SOURCE_DIR}${sep}`;
98
+ if (!file.startsWith(prefix))
99
+ return null;
100
+ // Skip the targets/ output dir itself (sibling of source/) and any
101
+ // `.gen.ts` files that downstream tools regenerate inside the target.
102
+ const rel = file.slice(prefix.length);
103
+ if (rel === "" || rel.includes("routeTree.gen.ts"))
104
+ return null;
105
+ return { rel, category: classify(rel) };
106
+ }
107
+ function classify(rel) {
108
+ const [head] = rel.split(sep);
109
+ if (head && ESCAPABLE_FOLDERS.includes(head))
110
+ return "folder";
111
+ if (ESCAPABLE_FILES.includes(rel))
112
+ return "file";
113
+ // Non-escapable source files still need to flow into target during
114
+ // livemark's own dev — the user is editing the canonical source.
115
+ return null;
116
+ }
117
+ function syncOverlay(hit, kind, targetDir, overridesRoot) {
118
+ if (!hit.category)
119
+ return;
120
+ const dest = join(targetDir, hit.rel);
121
+ const source = join(SOURCE_DIR, hit.rel);
122
+ if (kind === "unlink") {
123
+ rmSync(dest, { force: true, recursive: true });
124
+ if (existsSync(source))
125
+ cpSync(source, dest, { recursive: true, force: true });
126
+ return;
127
+ }
128
+ const overlay = join(overridesRoot, hit.rel);
129
+ if (existsSync(overlay))
130
+ cpSync(overlay, dest, { recursive: true, force: true });
131
+ }
132
+ function syncSource(hit, kind, targetDir, overridesRoot) {
133
+ // If the consumer has an overlay for this file (and it's escapable),
134
+ // the overlay wins — ignore source changes.
135
+ if (hit.category && existsSync(join(overridesRoot, hit.rel)))
136
+ return;
137
+ const dest = join(targetDir, hit.rel);
138
+ const source = join(SOURCE_DIR, hit.rel);
139
+ if (kind === "unlink") {
140
+ rmSync(dest, { force: true, recursive: true });
141
+ return;
142
+ }
143
+ if (existsSync(source))
144
+ cpSync(source, dest, { recursive: true, force: true });
145
+ }
146
+ function fullReload(server) {
147
+ server.ws.send({ type: "full-reload" });
148
+ }
149
+ /** Resolve livemark.config.ts's `vite` field — either a config object
150
+ * or a function `(env) => config` (matching Vite's own `defineConfig`).
151
+ * Schema stores it as `unknown`; typing for the consumer's editor
152
+ * lives on {@link ViteOverride}. */
153
+ async function resolveViteOverride(vite, env) {
154
+ if (!vite)
155
+ return null;
156
+ if (typeof vite === "function") {
157
+ const result = await Reflect.apply(vite, undefined, [env]);
158
+ return isObject(result) ? result : null;
159
+ }
160
+ return isObject(vite) ? vite : null;
161
+ }
162
+ function isObject(v) {
163
+ return v !== null && typeof v === "object";
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBT3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUVsRDs7Ozs7Ozs7Ozs7NkJBVzZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7Ozs7MENBSzBDO0FBQzFDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBcUI7SUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3pELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHO1lBQ2pCLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FB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LEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZyxcbiAgVml0ZURldlNlcnZlcixcbn0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgbWVyZ2VDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBidWlsZFRhcmdldCB9IGZyb20gXCIuLi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1wiXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBFU0NBUEFCTEVfRklMRVMsIEVTQ0FQQUJMRV9GT0xERVJTIH0gZnJvbSBcIi4uL3NldHRpbmdzLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlbWFya09wdGlvbnMge1xuICBjb25maWc6IENvbmZpZ1xufVxuXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIpXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwZXItY29uc3VtZXIgYHRhcmdldHMvPGhhc2g+L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICB3YXRjaGVzIHRoZSBjb25zdW1lcidzIGAubGl2ZW1hcmsvYCAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpblxuICogIGRldikgZm9yIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIHJlLWNvcGllZCBpbnRvIHRoZSB0YXJnZXQuIFRoZVxuICogIG92ZXJyaWRlIG1lY2hhbmlzbSBpcyBwdXJlIGZpbGUtc3lzdGVtIChmdWxsIGNvcGllcykg4oCUIG5vIHJlc29sdmVJZFxuICogIHJlZGlyZWN0aW9uLCBubyByZWFscGF0aCBzdXJwcmlzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgbGV0IHRhcmdldERpciA9IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImxpdmVtYXJrXCIsXG4gICAgZW5mb3JjZTogXCJwcmVcIixcbiAgICBhc3luYyBjb25maWcoXywgZW52KSB7XG4gICAgICB0YXJnZXREaXIgPSBidWlsZFRhcmdldChvcHRzLmNvbmZpZy5jb25maWdQYXRoKVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290IChpbiB0aGUgY29uc3VtZXInc1xuICAgICAgICAvLyAubGl2ZW1hcmsvKSBzbyB0aGUgY29uc3VtZXIgY2FuIGZpbmQgdGhlaXIgZGVwbG95YWJsZSBvdXRwdXRcbiAgICAgICAgLy8gd2l0aG91dCBkaWdnaW5nIGludG8gbm9kZV9tb2R1bGVzLiBWaXRlJ3MgZGVmYXVsdCByZWZ1c2FsIHRvXG4gICAgICAgIC8vIGVtcHR5IG91dC1vZi1yb290IGRpcmVjdG9yaWVzIGRvZXNuJ3QgYXBwbHkgaGVyZSBiZWNhdXNlIHRoZVxuICAgICAgICAvLyB0YXJnZXQvIHJvb3QgaXMgbGl2ZW1hcmsncywgbm90IHRoZSBjb25zdW1lcidzLlxuICAgICAgICBidWlsZDogeyBvdXREaXI6IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKSwgZW1wdHlPdXREaXI6IHRydWUgfSxcbiAgICAgICAgcmVzb2x2ZTogeyBkZWR1cGU6IFtcInJlYWN0XCIsIFwicmVhY3QtZG9tXCJdIH0sXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IFZJUlRVQUxfSUQpIHJldHVybiBWSVJUVUFMX1JFU09MVkVEX0lEXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG4gICAgbG9hZChpZCkge1xuICAgICAgaWYgKGlkICE9PSBWSVJUVUFMX1JFU09MVkVEX0lEKSByZXR1cm4gbnVsbFxuICAgICAgY29uc3QgY29uZmlnID0gV2Vic2l0ZUNvbmZpZy5wYXJzZShvcHRzLmNvbmZpZylcbiAgICAgIHJldHVybiBgZXhwb3J0IGNvbnN0IGNvbmZpZyA9ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnKX1gXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICBzZXJ2ZXIud2F0Y2hlci5hZGQob3B0cy5jb25maWcuY29uZmlnUGF0aClcbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChqb2luKG92ZXJyaWRlc1Jvb3QsIFwiKipcIiwgXCIqXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKGpvaW4oU09VUkNFX0RJUiwgXCIqKlwiLCBcIipcIikpXG5cbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJjaGFuZ2VcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcImFkZFwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiYWRkXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKGZpbGUgPT09IG9wdHMuY29uZmlnLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3ZlcmxheUhpdCA9IG1hdGNoT3ZlcmxheShmaWxlLCBvdmVycmlkZXNSb290KVxuICAgICAgICBpZiAob3ZlcmxheUhpdCkge1xuICAgICAgICAgIHN5bmNPdmVybGF5KG92ZXJsYXlIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgICBpZiAoa2luZCAhPT0gXCJjaGFuZ2VcIikgZnVsbFJlbG9hZChzZXJ2ZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hTb3VyY2UoZmlsZSlcbiAgICAgICAgaWYgKHNvdXJjZUhpdCkge1xuICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgaWYgKGtpbmQgIT09IFwiY2hhbmdlXCIpIGZ1bGxSZWxvYWQoc2VydmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5pbnRlcmZhY2UgSGl0IHtcbiAgcmVsOiBzdHJpbmdcbiAgY2F0ZWdvcnk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGxcbn1cblxuZnVuY3Rpb24gbWF0Y2hPdmVybGF5KGZpbGU6IHN0cmluZywgb3ZlcnJpZGVzUm9vdDogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGNvbnN0IHByZWZpeCA9IGAke292ZXJyaWRlc1Jvb3R9JHtzZXB9YFxuICBpZiAoIWZpbGUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gbnVsbFxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFNvdXJjZShmaWxlOiBzdHJpbmcpOiBIaXQgfCBudWxsIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7U09VUkNFX0RJUn0ke3NlcH1gXG4gIGlmICghZmlsZS5zdGFydHNXaXRoKHByZWZpeCkpIHJldHVybiBudWxsXG4gIC8vIFNraXAgdGhlIHRhcmdldHMvIG91dHB1dCBkaXIgaXRzZWxmIChzaWJsaW5nIG9mIHNvdXJjZS8pIGFuZCBhbnlcbiAgLy8gYC5nZW4udHNgIGZpbGVzIHRoYXQgZG93bnN0cmVhbSB0b29scyByZWdlbmVyYXRlIGluc2lkZSB0aGUgdGFyZ2V0LlxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gIGlmIChyZWwgPT09IFwiXCIgfHwgcmVsLmluY2x1ZGVzKFwicm91dGVUcmVlLmdlbi50c1wiKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHsgcmVsLCBjYXRlZ29yeTogY2xhc3NpZnkocmVsKSB9XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5KHJlbDogc3RyaW5nKTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbCB7XG4gIGNvbnN0IFtoZWFkXSA9IHJlbC5zcGxpdChzZXApXG4gIGlmIChoZWFkICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGhlYWQpKSByZXR1cm4gXCJmb2xkZXJcIlxuICBpZiAoRVNDQVBBQkxFX0ZJTEVTLmluY2x1ZGVzKHJlbCkpIHJldHVybiBcImZpbGVcIlxuICAvLyBOb24tZXNjYXBhYmxlIHNvdXJjZSBmaWxlcyBzdGlsbCBuZWVkIHRvIGZsb3cgaW50byB0YXJnZXQgZHVyaW5nXG4gIC8vIGxpdmVtYXJrJ3Mgb3duIGRldiDigJQgdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgY2Fub25pY2FsIHNvdXJjZS5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gc3luY092ZXJsYXkoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFoaXQuY2F0ZWdvcnkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSlcbiAgICAgIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpXG4gIGlmIChleGlzdHNTeW5jKG92ZXJsYXkpKVxuICAgIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIGZ1bGxSZWxvYWQoc2VydmVyOiBWaXRlRGV2U2VydmVyKSB7XG4gIHNlcnZlci53cy5zZW5kKHsgdHlwZTogXCJmdWxsLXJlbG9hZFwiIH0pXG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==