polen 0.9.1-next.2 → 0.10.0-next.10

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 (460) hide show
  1. package/README.md +49 -364
  2. package/build/api/api.d.ts +1 -0
  3. package/build/api/api.d.ts.map +1 -1
  4. package/build/api/api.js +1 -0
  5. package/build/api/api.js.map +1 -1
  6. package/build/api/config/configurator.d.ts +9 -1
  7. package/build/api/config/configurator.d.ts.map +1 -1
  8. package/build/api/config/configurator.js +18 -6
  9. package/build/api/config/configurator.js.map +1 -1
  10. package/build/api/config/load.js +5 -5
  11. package/build/api/config/load.js.map +1 -1
  12. package/build/api/config-resolver/resolve.js +2 -2
  13. package/build/api/config-resolver/resolve.js.map +1 -1
  14. package/build/api/content/$$.d.ts +7 -0
  15. package/build/api/content/$$.d.ts.map +1 -0
  16. package/build/api/content/$$.js +7 -0
  17. package/build/api/content/$$.js.map +1 -0
  18. package/build/api/content/$.d.ts +2 -0
  19. package/build/api/content/$.d.ts.map +1 -0
  20. package/build/api/content/$.js +2 -0
  21. package/build/api/content/$.js.map +1 -0
  22. package/build/api/content/metadata.d.ts +10 -0
  23. package/build/api/content/metadata.d.ts.map +1 -0
  24. package/build/api/content/metadata.js +9 -0
  25. package/build/api/content/metadata.js.map +1 -0
  26. package/build/api/content/navbar.d.ts +10 -0
  27. package/build/api/content/navbar.d.ts.map +1 -0
  28. package/build/api/content/navbar.js +45 -0
  29. package/build/api/content/navbar.js.map +1 -0
  30. package/build/api/content/page.d.ts +11 -0
  31. package/build/api/content/page.d.ts.map +1 -0
  32. package/build/api/content/page.js +2 -0
  33. package/build/api/content/page.js.map +1 -0
  34. package/build/api/content/scan.d.ts +19 -0
  35. package/build/api/content/scan.d.ts.map +1 -0
  36. package/build/api/content/scan.js +90 -0
  37. package/build/api/content/scan.js.map +1 -0
  38. package/build/api/content/sidebar.d.ts +104 -0
  39. package/build/api/content/sidebar.d.ts.map +1 -0
  40. package/build/api/content/sidebar.js +166 -0
  41. package/build/api/content/sidebar.js.map +1 -0
  42. package/build/api/content/utils.d.ts +5 -0
  43. package/build/api/content/utils.d.ts.map +1 -0
  44. package/build/api/content/utils.js +8 -0
  45. package/build/api/content/utils.js.map +1 -0
  46. package/build/api/schema/data-sources/schema-directory/schema-directory.js +1 -1
  47. package/build/api/schema/data-sources/schema-directory/schema-directory.js.map +1 -1
  48. package/build/api/static/index.d.ts +2 -0
  49. package/build/api/static/index.d.ts.map +1 -0
  50. package/build/api/static/index.js +2 -0
  51. package/build/api/static/index.js.map +1 -0
  52. package/build/api/static/manifest.d.ts +18 -0
  53. package/build/api/static/manifest.d.ts.map +1 -0
  54. package/build/api/static/manifest.js +13 -0
  55. package/build/api/static/manifest.js.map +1 -0
  56. package/build/api/static/rebase.d.ts +14 -0
  57. package/build/api/static/rebase.d.ts.map +1 -0
  58. package/build/api/static/rebase.js +110 -0
  59. package/build/api/static/rebase.js.map +1 -0
  60. package/build/api/static/static.d.ts +3 -0
  61. package/build/api/static/static.d.ts.map +1 -0
  62. package/build/api/static/static.js +3 -0
  63. package/build/api/static/static.js.map +1 -0
  64. package/build/api/vite/plugins/branding/index.d.ts +4 -0
  65. package/build/api/vite/plugins/branding/index.d.ts.map +1 -0
  66. package/build/api/vite/plugins/branding/index.js +80 -0
  67. package/build/api/vite/plugins/branding/index.js.map +1 -0
  68. package/build/api/vite/plugins/build.d.ts.map +1 -1
  69. package/build/api/vite/plugins/build.js +22 -1
  70. package/build/api/vite/plugins/build.js.map +1 -1
  71. package/build/api/vite/plugins/core.d.ts +2 -2
  72. package/build/api/vite/plugins/core.d.ts.map +1 -1
  73. package/build/api/vite/plugins/core.js +4 -5
  74. package/build/api/vite/plugins/core.js.map +1 -1
  75. package/build/api/vite/plugins/main.d.ts.map +1 -1
  76. package/build/api/vite/plugins/main.js +2 -1
  77. package/build/api/vite/plugins/main.js.map +1 -1
  78. package/build/api/vite/plugins/pages.d.ts +8 -14
  79. package/build/api/vite/plugins/pages.d.ts.map +1 -1
  80. package/build/api/vite/plugins/pages.js +110 -183
  81. package/build/api/vite/plugins/pages.js.map +1 -1
  82. package/build/api/vite/plugins/serve.js +5 -5
  83. package/build/api/vite/plugins/serve.js.map +1 -1
  84. package/build/cli/_/self-contained-mode.js +5 -5
  85. package/build/cli/_/self-contained-mode.js.map +1 -1
  86. package/build/cli/commands/static/$default.d.ts +3 -0
  87. package/build/cli/commands/static/$default.d.ts.map +1 -0
  88. package/build/cli/commands/static/$default.js +38 -0
  89. package/build/cli/commands/static/$default.js.map +1 -0
  90. package/build/cli/commands/static/rebase.d.ts +2 -0
  91. package/build/cli/commands/static/rebase.d.ts.map +1 -0
  92. package/build/cli/commands/static/rebase.js +26 -0
  93. package/build/cli/commands/static/rebase.js.map +1 -0
  94. package/build/cli/commands/static.d.ts +3 -0
  95. package/build/cli/commands/static.d.ts.map +1 -0
  96. package/build/cli/commands/static.js +5 -0
  97. package/build/cli/commands/static.js.map +1 -0
  98. package/build/exports/components.d.ts +2 -0
  99. package/build/exports/components.d.ts.map +1 -0
  100. package/build/exports/components.js +2 -0
  101. package/build/exports/components.js.map +1 -0
  102. package/build/lib/demos/builder.d.ts +83 -0
  103. package/build/lib/demos/builder.d.ts.map +1 -0
  104. package/build/lib/demos/builder.js +237 -0
  105. package/build/lib/demos/builder.js.map +1 -0
  106. package/build/lib/demos/config-schema.d.ts +243 -0
  107. package/build/lib/demos/config-schema.d.ts.map +1 -0
  108. package/build/lib/demos/config-schema.js +52 -0
  109. package/build/lib/demos/config-schema.js.map +1 -0
  110. package/build/lib/demos/config.d.ts +40 -0
  111. package/build/lib/demos/config.d.ts.map +1 -0
  112. package/build/lib/demos/config.js +180 -0
  113. package/build/lib/demos/config.js.map +1 -0
  114. package/build/lib/demos/index.d.ts +9 -0
  115. package/build/lib/demos/index.d.ts.map +1 -0
  116. package/build/lib/demos/index.js +8 -0
  117. package/build/lib/demos/index.js.map +1 -0
  118. package/build/lib/demos/ui/components.d.ts +33 -0
  119. package/build/lib/demos/ui/components.d.ts.map +1 -0
  120. package/build/lib/demos/ui/components.js +699 -0
  121. package/build/lib/demos/ui/components.js.map +1 -0
  122. package/build/lib/demos/ui/data-collector.d.ts +88 -0
  123. package/build/lib/demos/ui/data-collector.d.ts.map +1 -0
  124. package/build/lib/demos/ui/data-collector.js +174 -0
  125. package/build/lib/demos/ui/data-collector.js.map +1 -0
  126. package/build/lib/demos/ui/landing-page-cli.d.ts +3 -0
  127. package/build/lib/demos/ui/landing-page-cli.d.ts.map +1 -0
  128. package/build/lib/demos/ui/landing-page-cli.js +21 -0
  129. package/build/lib/demos/ui/landing-page-cli.js.map +1 -0
  130. package/build/lib/demos/ui/landing-page.d.ts +32 -0
  131. package/build/lib/demos/ui/landing-page.d.ts.map +1 -0
  132. package/build/lib/demos/ui/landing-page.js +83 -0
  133. package/build/lib/demos/ui/landing-page.js.map +1 -0
  134. package/build/lib/demos/ui/page-renderer.d.ts +26 -0
  135. package/build/lib/demos/ui/page-renderer.d.ts.map +1 -0
  136. package/build/lib/demos/ui/page-renderer.js +104 -0
  137. package/build/lib/demos/ui/page-renderer.js.map +1 -0
  138. package/build/lib/demos/utils.d.ts +14 -0
  139. package/build/lib/demos/utils.d.ts.map +1 -0
  140. package/build/lib/demos/utils.js +37 -0
  141. package/build/lib/demos/utils.js.map +1 -0
  142. package/build/lib/deployment/$$.d.ts +3 -0
  143. package/build/lib/deployment/$$.d.ts.map +1 -0
  144. package/build/lib/deployment/$$.js +3 -0
  145. package/build/lib/deployment/$$.js.map +1 -0
  146. package/build/lib/deployment/$.d.ts +2 -0
  147. package/build/lib/deployment/$.d.ts.map +1 -0
  148. package/build/lib/deployment/$.js +2 -0
  149. package/build/lib/deployment/$.js.map +1 -0
  150. package/build/lib/deployment/metadata.d.ts +32 -0
  151. package/build/lib/deployment/metadata.d.ts.map +1 -0
  152. package/build/lib/deployment/metadata.js +37 -0
  153. package/build/lib/deployment/metadata.js.map +1 -0
  154. package/build/lib/deployment/path-manager.d.ts +41 -0
  155. package/build/lib/deployment/path-manager.d.ts.map +1 -0
  156. package/build/lib/deployment/path-manager.js +157 -0
  157. package/build/lib/deployment/path-manager.js.map +1 -0
  158. package/build/lib/file-router/file-router.d.ts +0 -2
  159. package/build/lib/file-router/file-router.d.ts.map +1 -1
  160. package/build/lib/file-router/file-router.js +0 -2
  161. package/build/lib/file-router/file-router.js.map +1 -1
  162. package/build/lib/file-router/route.d.ts +2 -0
  163. package/build/lib/file-router/route.d.ts.map +1 -1
  164. package/build/lib/file-router/route.js.map +1 -1
  165. package/build/lib/file-router/scan.d.ts.map +1 -1
  166. package/build/lib/file-router/scan.js +22 -13
  167. package/build/lib/file-router/scan.js.map +1 -1
  168. package/build/lib/github-actions/git-controller.d.ts +50 -0
  169. package/build/lib/github-actions/git-controller.d.ts.map +1 -0
  170. package/build/lib/github-actions/git-controller.js +90 -0
  171. package/build/lib/github-actions/git-controller.js.map +1 -0
  172. package/build/lib/github-actions/github-actions.d.ts +7 -0
  173. package/build/lib/github-actions/github-actions.d.ts.map +1 -0
  174. package/build/lib/github-actions/github-actions.js +7 -0
  175. package/build/lib/github-actions/github-actions.js.map +1 -0
  176. package/build/lib/github-actions/index.d.ts +2 -0
  177. package/build/lib/github-actions/index.d.ts.map +1 -0
  178. package/build/lib/github-actions/index.js +2 -0
  179. package/build/lib/github-actions/index.js.map +1 -0
  180. package/build/lib/github-actions/lib/get-pr-deployments.d.ts +12 -0
  181. package/build/lib/github-actions/lib/get-pr-deployments.d.ts.map +1 -0
  182. package/build/lib/github-actions/lib/get-pr-deployments.js +51 -0
  183. package/build/lib/github-actions/lib/get-pr-deployments.js.map +1 -0
  184. package/build/lib/github-actions/pr-controller.d.ts +39 -0
  185. package/build/lib/github-actions/pr-controller.d.ts.map +1 -0
  186. package/build/lib/github-actions/pr-controller.js +122 -0
  187. package/build/lib/github-actions/pr-controller.js.map +1 -0
  188. package/build/lib/github-actions/run-step-cli.d.ts +9 -0
  189. package/build/lib/github-actions/run-step-cli.d.ts.map +1 -0
  190. package/build/lib/github-actions/run-step-cli.js +71 -0
  191. package/build/lib/github-actions/run-step-cli.js.map +1 -0
  192. package/build/lib/github-actions/runner.d.ts +17 -0
  193. package/build/lib/github-actions/runner.d.ts.map +1 -0
  194. package/build/lib/github-actions/runner.js +195 -0
  195. package/build/lib/github-actions/runner.js.map +1 -0
  196. package/build/lib/github-actions/schemas/context.d.ts +933 -0
  197. package/build/lib/github-actions/schemas/context.d.ts.map +1 -0
  198. package/build/lib/github-actions/schemas/context.js +407 -0
  199. package/build/lib/github-actions/schemas/context.js.map +1 -0
  200. package/build/lib/github-actions/schemas/index.d.ts +5 -0
  201. package/build/lib/github-actions/schemas/index.d.ts.map +1 -0
  202. package/build/lib/github-actions/schemas/index.js +5 -0
  203. package/build/lib/github-actions/schemas/index.js.map +1 -0
  204. package/build/lib/github-actions/search-module.d.ts +38 -0
  205. package/build/lib/github-actions/search-module.d.ts.map +1 -0
  206. package/build/lib/github-actions/search-module.js +40 -0
  207. package/build/lib/github-actions/search-module.js.map +1 -0
  208. package/build/lib/github-actions/step.d.ts +163 -0
  209. package/build/lib/github-actions/step.d.ts.map +1 -0
  210. package/build/lib/github-actions/step.js +121 -0
  211. package/build/lib/github-actions/step.js.map +1 -0
  212. package/build/lib/helpers.d.ts.map +1 -1
  213. package/build/lib/helpers.js +5 -3
  214. package/build/lib/helpers.js.map +1 -1
  215. package/build/lib/kit-temp.d.ts +54 -0
  216. package/build/lib/kit-temp.d.ts.map +1 -1
  217. package/build/lib/kit-temp.js +82 -14
  218. package/build/lib/kit-temp.js.map +1 -1
  219. package/build/lib/kit-temp.test-d.d.ts +2 -0
  220. package/build/lib/kit-temp.test-d.d.ts.map +1 -0
  221. package/build/lib/kit-temp.test-d.js +75 -0
  222. package/build/lib/kit-temp.test-d.js.map +1 -0
  223. package/build/lib/mask/$$.d.ts +3 -0
  224. package/build/lib/mask/$$.d.ts.map +1 -0
  225. package/build/lib/mask/$$.js +3 -0
  226. package/build/lib/mask/$$.js.map +1 -0
  227. package/build/lib/mask/$.d.ts +2 -0
  228. package/build/lib/mask/$.d.ts.map +1 -0
  229. package/build/lib/mask/$.js +2 -0
  230. package/build/lib/mask/$.js.map +1 -0
  231. package/build/lib/mask/apply.d.ts +86 -0
  232. package/build/lib/mask/apply.d.ts.map +1 -0
  233. package/build/lib/mask/apply.js +86 -0
  234. package/build/lib/mask/apply.js.map +1 -0
  235. package/build/lib/mask/mask.d.ts +124 -0
  236. package/build/lib/mask/mask.d.ts.map +1 -0
  237. package/build/lib/mask/mask.js +137 -0
  238. package/build/lib/mask/mask.js.map +1 -0
  239. package/build/lib/mask/mask.test-d.d.ts +2 -0
  240. package/build/lib/mask/mask.test-d.d.ts.map +1 -0
  241. package/build/lib/mask/mask.test-d.js +102 -0
  242. package/build/lib/mask/mask.test-d.js.map +1 -0
  243. package/build/lib/mutation-type.d.ts +18 -0
  244. package/build/lib/mutation-type.d.ts.map +1 -0
  245. package/build/lib/mutation-type.js +16 -0
  246. package/build/lib/mutation-type.js.map +1 -0
  247. package/build/lib/task/$$.d.ts +3 -0
  248. package/build/lib/task/$$.d.ts.map +1 -0
  249. package/build/lib/task/$$.js +3 -0
  250. package/build/lib/task/$$.js.map +1 -0
  251. package/build/lib/task/$.d.ts +2 -0
  252. package/build/lib/task/$.d.ts.map +1 -0
  253. package/build/lib/task/$.js +2 -0
  254. package/build/lib/task/$.js.map +1 -0
  255. package/build/lib/task/report.d.ts +28 -0
  256. package/build/lib/task/report.d.ts.map +1 -0
  257. package/build/lib/task/report.js +33 -0
  258. package/build/lib/task/report.js.map +1 -0
  259. package/build/lib/task/task.d.ts +44 -0
  260. package/build/lib/task/task.d.ts.map +1 -0
  261. package/build/lib/task/task.js +63 -0
  262. package/build/lib/task/task.js.map +1 -0
  263. package/build/lib/version-history/index.d.ts +3 -0
  264. package/build/lib/version-history/index.d.ts.map +1 -0
  265. package/build/lib/version-history/index.js +2 -0
  266. package/build/lib/version-history/index.js.map +1 -0
  267. package/build/lib/version-history/types.d.ts +64 -0
  268. package/build/lib/version-history/types.d.ts.map +1 -0
  269. package/build/lib/version-history/types.js +5 -0
  270. package/build/lib/version-history/types.js.map +1 -0
  271. package/build/lib/version-history/version-history.d.ts +85 -0
  272. package/build/lib/version-history/version-history.d.ts.map +1 -0
  273. package/build/lib/version-history/version-history.js +248 -0
  274. package/build/lib/version-history/version-history.js.map +1 -0
  275. package/build/project-data.d.ts +0 -1
  276. package/build/project-data.d.ts.map +1 -1
  277. package/build/sandbox.d.ts +2 -0
  278. package/build/sandbox.d.ts.map +1 -0
  279. package/build/sandbox.js +18 -0
  280. package/build/sandbox.js.map +1 -0
  281. package/build/singletons/debug.d.ts +1 -1
  282. package/build/singletons/debug.d.ts.map +1 -1
  283. package/build/singletons/debug.js +1 -1
  284. package/build/singletons/debug.js.map +1 -1
  285. package/build/template/components/HamburgerMenu.d.ts +9 -0
  286. package/build/template/components/HamburgerMenu.d.ts.map +1 -0
  287. package/build/template/components/HamburgerMenu.jsx +53 -0
  288. package/build/template/components/HamburgerMenu.jsx.map +1 -0
  289. package/build/template/components/Link.jsx +1 -1
  290. package/build/template/components/Logo.d.ts +9 -0
  291. package/build/template/components/Logo.d.ts.map +1 -0
  292. package/build/template/components/Logo.jsx +29 -0
  293. package/build/template/components/Logo.jsx.map +1 -0
  294. package/build/template/components/NotFound.d.ts +2 -0
  295. package/build/template/components/NotFound.d.ts.map +1 -0
  296. package/build/template/components/NotFound.jsx +26 -0
  297. package/build/template/components/NotFound.jsx.map +1 -0
  298. package/build/template/components/ThemeToggle.d.ts +3 -0
  299. package/build/template/components/ThemeToggle.d.ts.map +1 -0
  300. package/build/template/components/ThemeToggle.jsx +10 -0
  301. package/build/template/components/ThemeToggle.jsx.map +1 -0
  302. package/build/template/components/content/$$.d.ts +2 -0
  303. package/build/template/components/content/$$.d.ts.map +1 -0
  304. package/build/template/components/content/$$.js +2 -0
  305. package/build/template/components/content/$$.js.map +1 -0
  306. package/build/template/components/sidebar/Sidebar.d.ts +2 -2
  307. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  308. package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
  309. package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
  310. package/build/template/components/sidebar/SidebarItem.jsx +1 -1
  311. package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
  312. package/build/template/contexts/ThemeContext.d.ts +12 -0
  313. package/build/template/contexts/ThemeContext.d.ts.map +1 -0
  314. package/build/template/contexts/ThemeContext.jsx +41 -0
  315. package/build/template/contexts/ThemeContext.jsx.map +1 -0
  316. package/build/template/routes/root.d.ts.map +1 -1
  317. package/build/template/routes/root.jsx +66 -53
  318. package/build/template/routes/root.jsx.map +1 -1
  319. package/build/template/server/app.d.ts.map +1 -1
  320. package/build/template/server/app.js +2 -21
  321. package/build/template/server/app.js.map +1 -1
  322. package/package.json +27 -13
  323. package/src/api/api.ts +1 -0
  324. package/src/api/config/configurator.ts +28 -6
  325. package/src/api/config/load.ts +5 -5
  326. package/src/api/config-resolver/resolve.ts +2 -2
  327. package/src/api/content/$$.ts +6 -0
  328. package/src/api/content/$.test.ts +72 -0
  329. package/src/api/content/$.ts +1 -0
  330. package/src/api/content/metadata.ts +11 -0
  331. package/src/api/content/navbar.test.ts +55 -0
  332. package/src/api/content/navbar.ts +61 -0
  333. package/src/api/content/page.ts +12 -0
  334. package/src/api/content/scan.ts +117 -0
  335. package/src/api/content/sidebar.test.ts +297 -0
  336. package/src/api/content/sidebar.ts +283 -0
  337. package/src/api/content/utils.ts +7 -0
  338. package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
  339. package/src/api/singletons/markdown/markdown.test.ts +1 -1
  340. package/src/api/static/index.ts +1 -0
  341. package/src/api/static/manifest.test.ts +106 -0
  342. package/src/api/static/manifest.ts +16 -0
  343. package/src/api/static/rebase.test.ts +229 -0
  344. package/src/api/static/rebase.ts +140 -0
  345. package/src/api/static/static.ts +2 -0
  346. package/src/api/utils/asset-url/asset-url.test.ts +4 -4
  347. package/src/api/vite/plugins/branding/index.ts +108 -0
  348. package/src/api/vite/plugins/build.ts +25 -1
  349. package/src/api/vite/plugins/core.ts +6 -7
  350. package/src/api/vite/plugins/main.ts +2 -0
  351. package/src/api/vite/plugins/pages.ts +131 -207
  352. package/src/api/vite/plugins/serve.ts +5 -5
  353. package/src/cli/_/self-contained-mode.ts +5 -5
  354. package/src/cli/commands/static/$default.ts +43 -0
  355. package/src/cli/commands/static/rebase.ts +37 -0
  356. package/src/cli/commands/static.ts +6 -0
  357. package/src/exports/components.ts +1 -0
  358. package/src/lib/demos/builder.ts +298 -0
  359. package/src/lib/demos/config-schema.ts +56 -0
  360. package/src/lib/demos/config.test.ts +193 -0
  361. package/src/lib/demos/config.ts +205 -0
  362. package/src/lib/demos/index.ts +9 -0
  363. package/src/lib/demos/ui/components.ts +739 -0
  364. package/src/lib/demos/ui/data-collector.ts +246 -0
  365. package/src/lib/demos/ui/landing-page-cli.ts +23 -0
  366. package/src/lib/demos/ui/landing-page.ts +126 -0
  367. package/src/lib/demos/ui/page-renderer.ts +124 -0
  368. package/src/lib/demos/utils.ts +43 -0
  369. package/src/lib/deployment/$$.ts +2 -0
  370. package/src/lib/deployment/$.test.ts +53 -0
  371. package/src/lib/deployment/$.ts +1 -0
  372. package/src/lib/deployment/metadata.ts +40 -0
  373. package/src/lib/deployment/path-manager.ts +186 -0
  374. package/src/lib/file-router/file-router.ts +0 -2
  375. package/src/lib/file-router/linter.test.ts +2 -0
  376. package/src/lib/file-router/route.ts +2 -0
  377. package/src/lib/file-router/scan.ts +26 -14
  378. package/src/lib/github-actions/git-controller.ts +151 -0
  379. package/src/lib/github-actions/github-actions.ts +6 -0
  380. package/src/lib/github-actions/index.ts +1 -0
  381. package/src/lib/github-actions/lib/get-pr-deployments.ts +76 -0
  382. package/src/lib/github-actions/pr-controller.test.ts +172 -0
  383. package/src/lib/github-actions/pr-controller.ts +183 -0
  384. package/src/lib/github-actions/run-step-cli.ts +84 -0
  385. package/src/lib/github-actions/runner.test.ts +192 -0
  386. package/src/lib/github-actions/runner.ts +226 -0
  387. package/src/lib/github-actions/schemas/context.ts +424 -0
  388. package/src/lib/github-actions/schemas/index.ts +5 -0
  389. package/src/lib/github-actions/search-module.test.ts +110 -0
  390. package/src/lib/github-actions/search-module.ts +76 -0
  391. package/src/lib/github-actions/step.test.ts +149 -0
  392. package/src/lib/github-actions/step.ts +232 -0
  393. package/src/lib/helpers.ts +4 -3
  394. package/src/lib/kit-temp.test-d.ts +115 -0
  395. package/src/lib/kit-temp.test.ts +127 -0
  396. package/src/lib/kit-temp.ts +128 -14
  397. package/src/lib/mask/$$.ts +2 -0
  398. package/src/lib/mask/$.test.ts +248 -0
  399. package/src/lib/mask/$.ts +1 -0
  400. package/src/lib/mask/apply.ts +134 -0
  401. package/src/lib/mask/mask.test-d.ts +144 -0
  402. package/src/lib/mask/mask.ts +244 -0
  403. package/src/lib/mutation-type.ts +20 -0
  404. package/src/lib/shiki/shiki.test.ts +1 -1
  405. package/src/lib/task/$$.ts +2 -0
  406. package/src/lib/task/$.test.ts +209 -0
  407. package/src/lib/task/$.ts +1 -0
  408. package/src/lib/task/report.ts +72 -0
  409. package/src/lib/task/task.ts +112 -0
  410. package/src/lib/version-history/index.test.ts +196 -0
  411. package/src/lib/version-history/index.ts +4 -0
  412. package/src/lib/version-history/types.ts +68 -0
  413. package/src/lib/version-history/version-history.ts +293 -0
  414. package/src/project-data.ts +0 -1
  415. package/src/sandbox.ts +20 -0
  416. package/src/singletons/debug.ts +1 -1
  417. package/src/template/components/HamburgerMenu.tsx +96 -0
  418. package/src/template/components/Link.tsx +1 -1
  419. package/src/template/components/Logo.tsx +46 -0
  420. package/src/template/components/NotFound.tsx +28 -0
  421. package/src/template/components/ThemeToggle.tsx +21 -0
  422. package/src/template/components/content/$$.ts +1 -0
  423. package/src/template/components/sidebar/Sidebar.tsx +2 -2
  424. package/src/template/components/sidebar/SidebarItem.tsx +8 -8
  425. package/src/template/contexts/ThemeContext.tsx +60 -0
  426. package/src/template/routes/root.tsx +85 -74
  427. package/src/template/server/app.ts +2 -27
  428. package/build/lib/file-router/scan-tree.d.ts +0 -20
  429. package/build/lib/file-router/scan-tree.d.ts.map +0 -1
  430. package/build/lib/file-router/scan-tree.js +0 -158
  431. package/build/lib/file-router/scan-tree.js.map +0 -1
  432. package/build/lib/file-router/sidebar/index.d.ts +0 -3
  433. package/build/lib/file-router/sidebar/index.d.ts.map +0 -1
  434. package/build/lib/file-router/sidebar/index.js +0 -4
  435. package/build/lib/file-router/sidebar/index.js.map +0 -1
  436. package/build/lib/file-router/sidebar/sidebar-tree.d.ts +0 -9
  437. package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +0 -1
  438. package/build/lib/file-router/sidebar/sidebar-tree.js +0 -85
  439. package/build/lib/file-router/sidebar/sidebar-tree.js.map +0 -1
  440. package/build/lib/file-router/sidebar/types.d.ts +0 -17
  441. package/build/lib/file-router/sidebar/types.d.ts.map +0 -1
  442. package/build/lib/file-router/sidebar/types.js +0 -2
  443. package/build/lib/file-router/sidebar/types.js.map +0 -1
  444. package/build/lib/tree/index.d.ts +0 -3
  445. package/build/lib/tree/index.d.ts.map +0 -1
  446. package/build/lib/tree/index.js +0 -2
  447. package/build/lib/tree/index.js.map +0 -1
  448. package/build/lib/tree/tree.d.ts +0 -62
  449. package/build/lib/tree/tree.d.ts.map +0 -1
  450. package/build/lib/tree/tree.js +0 -134
  451. package/build/lib/tree/tree.js.map +0 -1
  452. package/src/lib/file-router/scan-tree.test.ts +0 -189
  453. package/src/lib/file-router/scan-tree.ts +0 -205
  454. package/src/lib/file-router/sidebar/index.ts +0 -3
  455. package/src/lib/file-router/sidebar/sidebar-tree.test.ts +0 -123
  456. package/src/lib/file-router/sidebar/sidebar-tree.ts +0 -110
  457. package/src/lib/file-router/sidebar/types.ts +0 -19
  458. package/src/lib/tree/index.ts +0 -2
  459. package/src/lib/tree/tree.test.ts +0 -117
  460. package/src/lib/tree/tree.ts +0 -183
@@ -0,0 +1 @@
1
+ export * as Content from './$$.ts'
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod/v4'
2
+
3
+ /**
4
+ * Schema for validating front matter content
5
+ */
6
+ export const MetadataSchema = z.object({
7
+ description: z.string().optional(),
8
+ hidden: z.boolean().default(false),
9
+ })
10
+
11
+ export type Metadata = z.infer<typeof MetadataSchema>
@@ -0,0 +1,55 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { createNavbar } from './navbar.ts'
3
+ import type { Page } from './page.ts'
4
+
5
+ const createPage = (path: string[], fileName = 'index', hidden = false): Page => ({
6
+ route: {
7
+ id: path.join('/'),
8
+ parentId: path.length > 1 ? path.slice(0, -1).join('/') : null,
9
+ logical: { path },
10
+ file: {
11
+ path: {
12
+ absolute: { root: '/', dir: `/pages/${path.join('/')}`, base: `${fileName}.md`, ext: '.md', name: fileName },
13
+ relative: { root: '', dir: path.join('/'), base: `${fileName}.md`, ext: '.md', name: fileName },
14
+ },
15
+ },
16
+ },
17
+ metadata: { description: undefined, hidden },
18
+ })
19
+
20
+ describe('createNavbar', () => {
21
+ it('returns empty for empty input', () => {
22
+ expect(createNavbar([])).toEqual([])
23
+ })
24
+
25
+ it('excludes hidden pages', () => {
26
+ const pages = [createPage(['visible'], 'index', false), createPage(['hidden'], 'index', true)]
27
+ const result = createNavbar(pages)
28
+ expect(result).toEqual([{ pathExp: '/visible', title: 'Visible' }])
29
+ })
30
+
31
+ it('includes directories with index pages', () => {
32
+ const pages = [createPage(['guide'], 'index'), createPage(['guide', 'intro'], 'intro')]
33
+ const result = createNavbar(pages)
34
+ expect(result).toEqual([{ pathExp: '/guide', title: 'Guide' }])
35
+ })
36
+
37
+ it('excludes directories without index pages', () => {
38
+ const pages = [createPage(['guide', 'intro'], 'intro')]
39
+ const result = createNavbar(pages)
40
+ expect(result).toEqual([])
41
+ })
42
+
43
+ it('includes single top-level pages', () => {
44
+ const pages = [createPage(['about'], 'about')]
45
+ const result = createNavbar(pages)
46
+ expect(result).toEqual([{ pathExp: '/about', title: 'About' }])
47
+ })
48
+
49
+ it('sorts results alphabetically', () => {
50
+ const pages = [createPage(['zebra'], 'zebra'), createPage(['alpha'], 'alpha')]
51
+ const result = createNavbar(pages)
52
+ expect(result[0]!.title).toBe('Alpha')
53
+ expect(result[1]!.title).toBe('Zebra')
54
+ })
55
+ })
@@ -0,0 +1,61 @@
1
+ import { Str } from '@wollybeard/kit'
2
+ import type { Page } from './page.ts'
3
+
4
+ export interface NavbarItem {
5
+ pathExp: string
6
+ title: string
7
+ }
8
+
9
+ /**
10
+ * Generate navbar items from a list of pages
11
+ */
12
+ export const createNavbar = (pages: Page[]): NavbarItem[] => {
13
+ const navbarItems: NavbarItem[] = []
14
+
15
+ // Group pages by their top-level directory/segment
16
+ const topLevelGroups = new Map<string, Page[]>()
17
+
18
+ pages.forEach(page => {
19
+ // Skip hidden pages
20
+ if (page.metadata.hidden) return
21
+
22
+ const firstSegment = page.route.logical.path[0]
23
+ if (firstSegment) {
24
+ if (!topLevelGroups.has(firstSegment)) {
25
+ topLevelGroups.set(firstSegment, [])
26
+ }
27
+ topLevelGroups.get(firstSegment)!.push(page)
28
+ }
29
+ })
30
+
31
+ // Add each top-level group to navbar
32
+ topLevelGroups.forEach((pages, segment) => {
33
+ // For directories, check if there's an index page
34
+ const indexPage = pages.find(p =>
35
+ p.route.logical.path.length === 1
36
+ && p.route.file.path.relative.name === 'index'
37
+ )
38
+
39
+ // For single non-index files at top level
40
+ const singlePage = pages.length === 1 && pages[0]!.route.logical.path.length === 1
41
+ && pages[0]!.route.file.path.relative.name !== 'index'
42
+
43
+ // Include in navbar if:
44
+ // 1. It's a directory with an index page, OR
45
+ // 2. It's a single top-level page (not index)
46
+ if (indexPage || singlePage) {
47
+ const title = Str.titlizeSlug(segment)
48
+ const pathExp = `/${segment}`
49
+
50
+ navbarItems.push({
51
+ pathExp,
52
+ title,
53
+ })
54
+ }
55
+ })
56
+
57
+ // Sort navbar items alphabetically for consistency
58
+ navbarItems.sort((a, b) => a.title.localeCompare(b.title))
59
+
60
+ return navbarItems
61
+ }
@@ -0,0 +1,12 @@
1
+ import type { FileRouter } from '#lib/file-router/index'
2
+ import type { Metadata } from './metadata.ts'
3
+
4
+ export type { Metadata }
5
+
6
+ /**
7
+ * A route with its associated metadata
8
+ */
9
+ export interface Page {
10
+ route: FileRouter.Route
11
+ metadata: Metadata
12
+ }
@@ -0,0 +1,117 @@
1
+ import { FileRouter } from '#lib/file-router/index'
2
+ import { Fs, Path, Tree } from '@wollybeard/kit'
3
+ import matter from 'gray-matter'
4
+ import { MetadataSchema } from './metadata.ts'
5
+ import type { Page } from './page.ts'
6
+
7
+ export interface ScanResult {
8
+ list: Page[]
9
+ tree: Tree.Tree<Page>
10
+ diagnostics: FileRouter.Diagnostic[]
11
+ }
12
+
13
+ /**
14
+ * Scan a directory for pages and extract metadata from their front matter
15
+ * By default, hidden pages are filtered out from both the pages list and route tree.
16
+ */
17
+ export const scan = async (options: {
18
+ dir: string
19
+ glob?: string
20
+ /** Include hidden pages in the result (useful for debugging or admin interfaces) */
21
+ includeHidden?: boolean
22
+ }): Promise<ScanResult> => {
23
+ // Scan for routes
24
+ const routeScanResult = await FileRouter.scan({
25
+ dir: options.dir,
26
+ glob: options.glob ?? '**/*.{md,mdx}',
27
+ })
28
+
29
+ // Create pages with metadata (id/parentId now come from route)
30
+ const allPages = await Promise.all(
31
+ routeScanResult.routes.map(route => readRoute(route)),
32
+ )
33
+
34
+ // Apply filtering if needed
35
+ const pages = options.includeHidden
36
+ ? allPages
37
+ : allPages.filter(page => !page.metadata.hidden)
38
+
39
+ // Build tree from pages using Tree.fromList
40
+ // Transform pages to include id/parentId at the top level for Tree.fromList
41
+ const pagesWithIds = pages.map(page => ({
42
+ ...page,
43
+ id: page.route.id,
44
+ parentId: page.route.parentId,
45
+ }))
46
+
47
+ // Handle cases where there might be multiple root nodes
48
+ // If all pages are at root level (no parentId), create a virtual root
49
+ const hasMultipleRoots = pagesWithIds.filter(p => !p.parentId).length > 1
50
+
51
+ let tree: Tree.Tree<Page>
52
+ if (hasMultipleRoots) {
53
+ // Create a virtual root node to hold all root-level pages
54
+ const virtualRoot: Page & { id: string; parentId: null } = {
55
+ route: {
56
+ id: '__virtual_root__',
57
+ parentId: null,
58
+ file: {
59
+ path: {
60
+ absolute: Path.parse(''),
61
+ relative: Path.parse(''),
62
+ },
63
+ },
64
+ logical: {
65
+ path: [],
66
+ },
67
+ },
68
+ metadata: { hidden: true },
69
+ id: '__virtual_root__',
70
+ parentId: null,
71
+ }
72
+
73
+ // Update pages to have virtual root as parent if they don't have one
74
+ const pagesWithVirtualRoot = pagesWithIds.map(page => ({
75
+ ...page,
76
+ parentId: page.parentId || '__virtual_root__',
77
+ }))
78
+
79
+ tree = Tree.fromList([virtualRoot, ...pagesWithVirtualRoot])
80
+ } else {
81
+ tree = Tree.fromList(pagesWithIds)
82
+ }
83
+
84
+ return {
85
+ list: pages,
86
+ tree,
87
+ diagnostics: routeScanResult.diagnostics,
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Read a single route file and extract metadata from its front matter
93
+ */
94
+ const readRoute = async (route: FileRouter.Route): Promise<Page> => {
95
+ const filePath = Path.format(route.file.path.absolute)
96
+ const fileContent = await Fs.read(filePath)
97
+
98
+ // Empty files still get default metadata (not hidden by default)
99
+ // This allows placeholder pages to exist in the navigation
100
+ if (!fileContent) {
101
+ return { route, metadata: { hidden: false } }
102
+ }
103
+
104
+ // Parse front matter
105
+ const { data } = matter(fileContent)
106
+
107
+ // Validate and parse the data
108
+ const parsed = MetadataSchema.safeParse(data)
109
+
110
+ if (!parsed.success) {
111
+ // Log warning but continue with defaults
112
+ console.warn(`Invalid front matter in ${filePath}:`, parsed.error.issues)
113
+ }
114
+
115
+ const metadata = parsed.success ? parsed.data : { hidden: false }
116
+ return { route, metadata }
117
+ }
@@ -0,0 +1,297 @@
1
+ import * as fc from 'fast-check'
2
+ import { describe, expect, it } from 'vitest'
3
+ import type { Page } from './page.ts'
4
+ import type { ScanResult } from './scan.ts'
5
+ import { buildSidebarIndex, type Item, type SidebarIndex } from './sidebar.ts'
6
+
7
+ // Generators
8
+ const pathSegmentArb = fc.stringMatching(/^[a-z][a-z0-9-]{0,19}$/)
9
+ const fileNameArb = fc.oneof(fc.constant('index'), pathSegmentArb)
10
+ const pathArb = fc.array(pathSegmentArb, { minLength: 1, maxLength: 4 })
11
+
12
+ const pageArb: fc.Arbitrary<Page> = fc.record({
13
+ route: fc.record({
14
+ id: fc.string(),
15
+ parentId: fc.oneof(fc.constant(null), fc.string()),
16
+ logical: fc.record({
17
+ path: pathArb,
18
+ order: fc.option(fc.integer({ min: 0, max: 100 }), { nil: undefined }),
19
+ }),
20
+ file: fc.record({
21
+ path: fc.record({
22
+ absolute: fc.record({
23
+ root: fc.constant('/'),
24
+ dir: fc.string(),
25
+ base: fc.string(),
26
+ ext: fc.constant('.md'),
27
+ name: fileNameArb,
28
+ }),
29
+ relative: fc.record({
30
+ root: fc.constant(''),
31
+ dir: fc.string(),
32
+ base: fc.string(),
33
+ ext: fc.constant('.md'),
34
+ name: fileNameArb,
35
+ }),
36
+ }),
37
+ }),
38
+ }),
39
+ metadata: fc.record({
40
+ description: fc.option(fc.string(), { nil: undefined }),
41
+ hidden: fc.boolean(),
42
+ }),
43
+ })
44
+
45
+ const scanResultArb: fc.Arbitrary<ScanResult> = fc.record({
46
+ list: fc.array(pageArb, { maxLength: 50 }),
47
+ tree: fc.constant({ root: null }), // Tree isn't used in the new implementation
48
+ diagnostics: fc.constant([]),
49
+ })
50
+
51
+ describe('buildSidebarIndex properties', () => {
52
+ it('never includes hidden pages in any sidebar', () => {
53
+ fc.assert(
54
+ fc.property(scanResultArb, (scanResult) => {
55
+ const result = buildSidebarIndex(scanResult)
56
+
57
+ // Collect all page paths that appear in sidebars
58
+ const allSidebarPaths = new Set<string>()
59
+
60
+ for (const sidebar of Object.values(result)) {
61
+ for (const item of sidebar.items) {
62
+ if (item.type === 'ItemLink') {
63
+ allSidebarPaths.add(item.pathExp)
64
+ } else {
65
+ allSidebarPaths.add(item.pathExp)
66
+ for (const link of item.links) {
67
+ allSidebarPaths.add(link.pathExp)
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ // Check that no hidden page appears in sidebars
74
+ const hiddenPagePaths = scanResult.list
75
+ .filter(page => page.metadata.hidden)
76
+ .map(page => page.route.logical.path.join('/'))
77
+
78
+ for (const hiddenPath of hiddenPagePaths) {
79
+ expect(allSidebarPaths.has(hiddenPath)).toBe(false)
80
+ }
81
+
82
+ return true
83
+ }),
84
+ )
85
+ })
86
+
87
+ it('only creates sidebars for directories with index pages', () => {
88
+ fc.assert(
89
+ fc.property(scanResultArb, (scanResult) => {
90
+ const result = buildSidebarIndex(scanResult)
91
+
92
+ // Every sidebar key should correspond to a directory with an index page
93
+ for (const sidebarPath of Object.keys(result)) {
94
+ const topLevelDir = sidebarPath.slice(1) // Remove leading '/'
95
+
96
+ const hasIndexPage = scanResult.list.some(page =>
97
+ page.route.logical.path.length === 1
98
+ && page.route.logical.path[0] === topLevelDir
99
+ && page.route.file.path.relative.name === 'index'
100
+ && !page.metadata.hidden
101
+ )
102
+
103
+ expect(hasIndexPage).toBe(true)
104
+ }
105
+
106
+ return true
107
+ }),
108
+ )
109
+ })
110
+
111
+ it('all items have valid non-empty titles and paths', () => {
112
+ fc.assert(
113
+ fc.property(scanResultArb, (scanResult) => {
114
+ const result = buildSidebarIndex(scanResult)
115
+
116
+ for (const sidebar of Object.values(result)) {
117
+ for (const item of sidebar.items) {
118
+ // Check item has required fields
119
+ expect(item.title).toBeTruthy()
120
+ expect(item.title.length).toBeGreaterThan(0)
121
+ expect(item.pathExp).toBeTruthy()
122
+ expect(item.pathExp.length).toBeGreaterThan(0)
123
+
124
+ if (item.type === 'ItemSection') {
125
+ expect(typeof item.isLinkToo).toBe('boolean')
126
+ expect(Array.isArray(item.links)).toBe(true)
127
+
128
+ // Check all links in section
129
+ for (const link of item.links) {
130
+ expect(link.type).toBe('ItemLink')
131
+ expect(link.title).toBeTruthy()
132
+ expect(link.title.length).toBeGreaterThan(0)
133
+ expect(link.pathExp).toBeTruthy()
134
+ expect(link.pathExp.length).toBeGreaterThan(0)
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+ return true
141
+ }),
142
+ )
143
+ })
144
+
145
+ it('sections marked as linkable have corresponding index pages', () => {
146
+ fc.assert(
147
+ fc.property(scanResultArb, (scanResult) => {
148
+ const result = buildSidebarIndex(scanResult)
149
+
150
+ for (const sidebar of Object.values(result)) {
151
+ for (const item of sidebar.items) {
152
+ if (item.type === 'ItemSection' && item.isLinkToo) {
153
+ // This section should have an index page
154
+ const hasIndexPage = scanResult.list.some(page =>
155
+ page.route.logical.path.join('/') === item.pathExp
156
+ && page.route.file.path.relative.name === 'index'
157
+ && !page.metadata.hidden
158
+ )
159
+
160
+ expect(hasIndexPage).toBe(true)
161
+ }
162
+ }
163
+ }
164
+
165
+ return true
166
+ }),
167
+ )
168
+ })
169
+
170
+ it('no duplicate paths within a sidebar', () => {
171
+ fc.assert(
172
+ fc.property(scanResultArb, (scanResult) => {
173
+ const result = buildSidebarIndex(scanResult)
174
+
175
+ for (const sidebar of Object.values(result)) {
176
+ const paths = new Set<string>()
177
+
178
+ for (const item of sidebar.items) {
179
+ if (item.type === 'ItemLink') {
180
+ expect(paths.has(item.pathExp)).toBe(false)
181
+ paths.add(item.pathExp)
182
+ } else {
183
+ expect(paths.has(item.pathExp)).toBe(false)
184
+ paths.add(item.pathExp)
185
+
186
+ for (const link of item.links) {
187
+ expect(paths.has(link.pathExp)).toBe(false)
188
+ paths.add(link.pathExp)
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ return true
195
+ }),
196
+ )
197
+ })
198
+
199
+ it('deterministic - same input produces same output', () => {
200
+ fc.assert(
201
+ fc.property(scanResultArb, (scanResult) => {
202
+ const result1 = buildSidebarIndex(scanResult)
203
+ const result2 = buildSidebarIndex(scanResult)
204
+
205
+ expect(JSON.stringify(result1)).toBe(JSON.stringify(result2))
206
+ return true
207
+ }),
208
+ )
209
+ })
210
+
211
+ it('preserves hierarchical relationships', () => {
212
+ fc.assert(
213
+ fc.property(scanResultArb, (scanResult) => {
214
+ const result = buildSidebarIndex(scanResult)
215
+
216
+ // For each sidebar, verify that all items belong to that top-level directory
217
+ for (const [sidebarPath, sidebar] of Object.entries(result)) {
218
+ const expectedPrefix = sidebarPath.slice(1) // Remove leading '/'
219
+
220
+ const checkPath = (pathExp: string) => {
221
+ const segments = pathExp.split('/')
222
+ expect(segments[0]).toBe(expectedPrefix)
223
+ }
224
+
225
+ for (const item of sidebar.items) {
226
+ checkPath(item.pathExp)
227
+
228
+ if (item.type === 'ItemSection') {
229
+ for (const link of item.links) {
230
+ checkPath(link.pathExp)
231
+ }
232
+ }
233
+ }
234
+ }
235
+
236
+ return true
237
+ }),
238
+ )
239
+ })
240
+ })
241
+
242
+ // Keep a few specific scenario tests for regression
243
+ describe('buildSidebarIndex specific scenarios', () => {
244
+ const createPage = (path: string[], fileName = 'index', hidden = false): Page => ({
245
+ route: {
246
+ id: path.join('/'),
247
+ parentId: path.length > 1 ? path.slice(0, -1).join('/') : null,
248
+ logical: { path },
249
+ file: {
250
+ path: {
251
+ absolute: { root: '/', dir: `/pages/${path.join('/')}`, base: `${fileName}.md`, ext: '.md', name: fileName },
252
+ relative: { root: '', dir: path.join('/'), base: `${fileName}.md`, ext: '.md', name: fileName },
253
+ },
254
+ },
255
+ },
256
+ metadata: { description: undefined, hidden },
257
+ })
258
+
259
+ it('handles empty input', () => {
260
+ const scanResult: ScanResult = {
261
+ list: [],
262
+ tree: { root: null },
263
+ diagnostics: [],
264
+ }
265
+ const result = buildSidebarIndex(scanResult)
266
+ expect(result).toEqual({})
267
+ })
268
+
269
+ it('creates sections for nested directories with index pages', () => {
270
+ const pages = [
271
+ createPage(['guide'], 'index'),
272
+ createPage(['guide', 'advanced'], 'index'),
273
+ createPage(['guide', 'advanced', 'tips'], 'tips'),
274
+ createPage(['guide', 'advanced', 'patterns'], 'patterns'),
275
+ ]
276
+
277
+ const scanResult: ScanResult = {
278
+ list: pages,
279
+ tree: { root: null },
280
+ diagnostics: [],
281
+ }
282
+
283
+ const result = buildSidebarIndex(scanResult)
284
+
285
+ expect(result['/guide']).toBeDefined()
286
+ expect(result['/guide']!.items).toHaveLength(1)
287
+
288
+ const section = result['/guide']!.items[0]
289
+ expect(section?.type).toBe('ItemSection')
290
+
291
+ if (section?.type === 'ItemSection') {
292
+ expect(section.title).toBe('Advanced')
293
+ expect(section.isLinkToo).toBe(true)
294
+ expect(section.links).toHaveLength(2)
295
+ }
296
+ })
297
+ })