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

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 (469) 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/CodeBlockEnhancer.d.ts +2 -0
  286. package/build/template/components/CodeBlockEnhancer.d.ts.map +1 -0
  287. package/build/template/components/CodeBlockEnhancer.jsx +175 -0
  288. package/build/template/components/CodeBlockEnhancer.jsx.map +1 -0
  289. package/build/template/components/HamburgerMenu.d.ts +9 -0
  290. package/build/template/components/HamburgerMenu.d.ts.map +1 -0
  291. package/build/template/components/HamburgerMenu.jsx +53 -0
  292. package/build/template/components/HamburgerMenu.jsx.map +1 -0
  293. package/build/template/components/Link.jsx +1 -1
  294. package/build/template/components/Logo.d.ts +9 -0
  295. package/build/template/components/Logo.d.ts.map +1 -0
  296. package/build/template/components/Logo.jsx +29 -0
  297. package/build/template/components/Logo.jsx.map +1 -0
  298. package/build/template/components/NotFound.d.ts +2 -0
  299. package/build/template/components/NotFound.d.ts.map +1 -0
  300. package/build/template/components/NotFound.jsx +26 -0
  301. package/build/template/components/NotFound.jsx.map +1 -0
  302. package/build/template/components/ThemeToggle.d.ts +3 -0
  303. package/build/template/components/ThemeToggle.d.ts.map +1 -0
  304. package/build/template/components/ThemeToggle.jsx +10 -0
  305. package/build/template/components/ThemeToggle.jsx.map +1 -0
  306. package/build/template/components/content/$$.d.ts +2 -0
  307. package/build/template/components/content/$$.d.ts.map +1 -0
  308. package/build/template/components/content/$$.js +2 -0
  309. package/build/template/components/content/$$.js.map +1 -0
  310. package/build/template/components/sidebar/Sidebar.d.ts +2 -2
  311. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  312. package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
  313. package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
  314. package/build/template/components/sidebar/SidebarItem.jsx +3 -3
  315. package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
  316. package/build/template/contexts/ThemeContext.d.ts +12 -0
  317. package/build/template/contexts/ThemeContext.d.ts.map +1 -0
  318. package/build/template/contexts/ThemeContext.jsx +41 -0
  319. package/build/template/contexts/ThemeContext.jsx.map +1 -0
  320. package/build/template/routes/reference.d.ts.map +1 -1
  321. package/build/template/routes/reference.jsx +4 -8
  322. package/build/template/routes/reference.jsx.map +1 -1
  323. package/build/template/routes/root.d.ts.map +1 -1
  324. package/build/template/routes/root.jsx +192 -55
  325. package/build/template/routes/root.jsx.map +1 -1
  326. package/build/template/server/app.d.ts.map +1 -1
  327. package/build/template/server/app.js +2 -21
  328. package/build/template/server/app.js.map +1 -1
  329. package/package.json +27 -13
  330. package/src/api/api.ts +1 -0
  331. package/src/api/config/configurator.ts +28 -6
  332. package/src/api/config/load.ts +5 -5
  333. package/src/api/config-resolver/resolve.ts +2 -2
  334. package/src/api/content/$$.ts +6 -0
  335. package/src/api/content/$.test.ts +72 -0
  336. package/src/api/content/$.ts +1 -0
  337. package/src/api/content/metadata.ts +11 -0
  338. package/src/api/content/navbar.test.ts +55 -0
  339. package/src/api/content/navbar.ts +61 -0
  340. package/src/api/content/page.ts +12 -0
  341. package/src/api/content/scan.ts +117 -0
  342. package/src/api/content/sidebar.test.ts +297 -0
  343. package/src/api/content/sidebar.ts +283 -0
  344. package/src/api/content/utils.ts +7 -0
  345. package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
  346. package/src/api/singletons/markdown/markdown.test.ts +1 -1
  347. package/src/api/static/index.ts +1 -0
  348. package/src/api/static/manifest.test.ts +106 -0
  349. package/src/api/static/manifest.ts +16 -0
  350. package/src/api/static/rebase.test.ts +229 -0
  351. package/src/api/static/rebase.ts +140 -0
  352. package/src/api/static/static.ts +2 -0
  353. package/src/api/utils/asset-url/asset-url.test.ts +4 -4
  354. package/src/api/vite/plugins/branding/index.ts +108 -0
  355. package/src/api/vite/plugins/build.ts +25 -1
  356. package/src/api/vite/plugins/core.ts +6 -7
  357. package/src/api/vite/plugins/main.ts +2 -0
  358. package/src/api/vite/plugins/pages.ts +131 -207
  359. package/src/api/vite/plugins/serve.ts +5 -5
  360. package/src/cli/_/self-contained-mode.ts +5 -5
  361. package/src/cli/commands/static/$default.ts +43 -0
  362. package/src/cli/commands/static/rebase.ts +37 -0
  363. package/src/cli/commands/static.ts +6 -0
  364. package/src/exports/components.ts +1 -0
  365. package/src/lib/demos/builder.ts +298 -0
  366. package/src/lib/demos/config-schema.ts +56 -0
  367. package/src/lib/demos/config.test.ts +193 -0
  368. package/src/lib/demos/config.ts +205 -0
  369. package/src/lib/demos/index.ts +9 -0
  370. package/src/lib/demos/ui/components.ts +739 -0
  371. package/src/lib/demos/ui/data-collector.ts +246 -0
  372. package/src/lib/demos/ui/landing-page-cli.ts +23 -0
  373. package/src/lib/demos/ui/landing-page.ts +126 -0
  374. package/src/lib/demos/ui/page-renderer.ts +124 -0
  375. package/src/lib/demos/utils.ts +43 -0
  376. package/src/lib/deployment/$$.ts +2 -0
  377. package/src/lib/deployment/$.test.ts +53 -0
  378. package/src/lib/deployment/$.ts +1 -0
  379. package/src/lib/deployment/metadata.ts +40 -0
  380. package/src/lib/deployment/path-manager.ts +186 -0
  381. package/src/lib/file-router/file-router.ts +0 -2
  382. package/src/lib/file-router/linter.test.ts +2 -0
  383. package/src/lib/file-router/route.ts +2 -0
  384. package/src/lib/file-router/scan.ts +26 -14
  385. package/src/lib/github-actions/git-controller.ts +151 -0
  386. package/src/lib/github-actions/github-actions.ts +6 -0
  387. package/src/lib/github-actions/index.ts +1 -0
  388. package/src/lib/github-actions/lib/get-pr-deployments.ts +76 -0
  389. package/src/lib/github-actions/pr-controller.test.ts +172 -0
  390. package/src/lib/github-actions/pr-controller.ts +183 -0
  391. package/src/lib/github-actions/run-step-cli.ts +84 -0
  392. package/src/lib/github-actions/runner.test.ts +192 -0
  393. package/src/lib/github-actions/runner.ts +226 -0
  394. package/src/lib/github-actions/schemas/context.ts +424 -0
  395. package/src/lib/github-actions/schemas/index.ts +5 -0
  396. package/src/lib/github-actions/search-module.test.ts +110 -0
  397. package/src/lib/github-actions/search-module.ts +76 -0
  398. package/src/lib/github-actions/step.test.ts +149 -0
  399. package/src/lib/github-actions/step.ts +232 -0
  400. package/src/lib/helpers.ts +4 -3
  401. package/src/lib/kit-temp.test-d.ts +115 -0
  402. package/src/lib/kit-temp.test.ts +127 -0
  403. package/src/lib/kit-temp.ts +128 -14
  404. package/src/lib/mask/$$.ts +2 -0
  405. package/src/lib/mask/$.test.ts +248 -0
  406. package/src/lib/mask/$.ts +1 -0
  407. package/src/lib/mask/apply.ts +134 -0
  408. package/src/lib/mask/mask.test-d.ts +144 -0
  409. package/src/lib/mask/mask.ts +244 -0
  410. package/src/lib/mutation-type.ts +20 -0
  411. package/src/lib/shiki/shiki.test.ts +1 -1
  412. package/src/lib/task/$$.ts +2 -0
  413. package/src/lib/task/$.test.ts +209 -0
  414. package/src/lib/task/$.ts +1 -0
  415. package/src/lib/task/report.ts +72 -0
  416. package/src/lib/task/task.ts +112 -0
  417. package/src/lib/version-history/index.test.ts +196 -0
  418. package/src/lib/version-history/index.ts +4 -0
  419. package/src/lib/version-history/types.ts +68 -0
  420. package/src/lib/version-history/version-history.ts +293 -0
  421. package/src/project-data.ts +0 -1
  422. package/src/sandbox.ts +20 -0
  423. package/src/singletons/debug.ts +1 -1
  424. package/src/template/components/CodeBlockEnhancer.tsx +192 -0
  425. package/src/template/components/HamburgerMenu.tsx +96 -0
  426. package/src/template/components/Link.tsx +1 -1
  427. package/src/template/components/Logo.tsx +46 -0
  428. package/src/template/components/NotFound.tsx +28 -0
  429. package/src/template/components/ThemeToggle.tsx +21 -0
  430. package/src/template/components/content/$$.ts +1 -0
  431. package/src/template/components/sidebar/Sidebar.tsx +2 -2
  432. package/src/template/components/sidebar/SidebarItem.tsx +12 -12
  433. package/src/template/contexts/ThemeContext.tsx +60 -0
  434. package/src/template/routes/reference.tsx +4 -8
  435. package/src/template/routes/root.tsx +216 -76
  436. package/src/template/server/app.ts +2 -27
  437. package/build/lib/file-router/scan-tree.d.ts +0 -20
  438. package/build/lib/file-router/scan-tree.d.ts.map +0 -1
  439. package/build/lib/file-router/scan-tree.js +0 -158
  440. package/build/lib/file-router/scan-tree.js.map +0 -1
  441. package/build/lib/file-router/sidebar/index.d.ts +0 -3
  442. package/build/lib/file-router/sidebar/index.d.ts.map +0 -1
  443. package/build/lib/file-router/sidebar/index.js +0 -4
  444. package/build/lib/file-router/sidebar/index.js.map +0 -1
  445. package/build/lib/file-router/sidebar/sidebar-tree.d.ts +0 -9
  446. package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +0 -1
  447. package/build/lib/file-router/sidebar/sidebar-tree.js +0 -85
  448. package/build/lib/file-router/sidebar/sidebar-tree.js.map +0 -1
  449. package/build/lib/file-router/sidebar/types.d.ts +0 -17
  450. package/build/lib/file-router/sidebar/types.d.ts.map +0 -1
  451. package/build/lib/file-router/sidebar/types.js +0 -2
  452. package/build/lib/file-router/sidebar/types.js.map +0 -1
  453. package/build/lib/tree/index.d.ts +0 -3
  454. package/build/lib/tree/index.d.ts.map +0 -1
  455. package/build/lib/tree/index.js +0 -2
  456. package/build/lib/tree/index.js.map +0 -1
  457. package/build/lib/tree/tree.d.ts +0 -62
  458. package/build/lib/tree/tree.d.ts.map +0 -1
  459. package/build/lib/tree/tree.js +0 -134
  460. package/build/lib/tree/tree.js.map +0 -1
  461. package/src/lib/file-router/scan-tree.test.ts +0 -189
  462. package/src/lib/file-router/scan-tree.ts +0 -205
  463. package/src/lib/file-router/sidebar/index.ts +0 -3
  464. package/src/lib/file-router/sidebar/sidebar-tree.test.ts +0 -123
  465. package/src/lib/file-router/sidebar/sidebar-tree.ts +0 -110
  466. package/src/lib/file-router/sidebar/types.ts +0 -19
  467. package/src/lib/tree/index.ts +0 -2
  468. package/src/lib/tree/tree.test.ts +0 -117
  469. package/src/lib/tree/tree.ts +0 -183
@@ -0,0 +1,106 @@
1
+ import { Err, Fs, Path } from '@wollybeard/kit'
2
+ import { afterEach, beforeEach, describe, expect, test } from 'vitest'
3
+ import { buildManifest, type PolenBuildManifest } from './manifest.ts'
4
+
5
+ describe('validate-build', () => {
6
+ let testDir: string
7
+ let manifestPath: string
8
+
9
+ beforeEach(async () => {
10
+ testDir = await Fs.makeTemporaryDirectory()
11
+ manifestPath = Path.join(testDir, '.polen', 'build.json')
12
+ })
13
+
14
+ afterEach(async () => {
15
+ if (testDir && await Fs.exists(testDir)) {
16
+ await Fs.remove(testDir)
17
+ }
18
+ })
19
+
20
+ describe('readBuildManifest', () => {
21
+ test('reads valid manifest', async () => {
22
+ const manifest: PolenBuildManifest = {
23
+ type: 'ssr',
24
+ version: '2.1.0',
25
+ basePath: '/docs/',
26
+ }
27
+ await Fs.write({
28
+ path: manifestPath,
29
+ content: JSON.stringify(manifest, null, 2),
30
+ })
31
+
32
+ const result = await buildManifest.read(testDir)
33
+ expect(Err.is(result)).toBe(false)
34
+ expect(result).toEqual(manifest)
35
+ })
36
+
37
+ test('returns error when manifest does not exist', async () => {
38
+ // Verify the file doesn't exist
39
+ const manifestExists = await Fs.exists(manifestPath)
40
+ expect(manifestExists).toBe(false)
41
+
42
+ const result = await buildManifest.read(testDir)
43
+ expect(Err.is(result)).toBe(true)
44
+ })
45
+
46
+ test('returns error for invalid manifest structure', async () => {
47
+ await Fs.write({
48
+ path: manifestPath,
49
+ content: JSON.stringify({ invalid: 'data' }, null, 2),
50
+ })
51
+ const result = await buildManifest.read(testDir)
52
+ expect(Err.is(result)).toBe(true)
53
+ })
54
+
55
+ test('returns error for invalid build type', async () => {
56
+ await Fs.write({
57
+ path: manifestPath,
58
+ content: JSON.stringify(
59
+ {
60
+ type: 'invalid',
61
+ version: '1.0.0',
62
+ basePath: '/',
63
+ },
64
+ null,
65
+ 2,
66
+ ),
67
+ })
68
+ const result = await buildManifest.read(testDir)
69
+ expect(Err.is(result)).toBe(true)
70
+ })
71
+
72
+ test('returns error when version is not a string', async () => {
73
+ await Fs.write({
74
+ path: manifestPath,
75
+ content: JSON.stringify(
76
+ {
77
+ type: 'ssg',
78
+ version: 123,
79
+ basePath: '/',
80
+ },
81
+ null,
82
+ 2,
83
+ ),
84
+ })
85
+ const result = await buildManifest.read(testDir)
86
+ expect(Err.is(result)).toBe(true)
87
+ })
88
+
89
+ test('returns error when basePath is not a string', async () => {
90
+ await Fs.write({
91
+ path: manifestPath,
92
+ content: JSON.stringify(
93
+ {
94
+ type: 'ssg',
95
+ version: '1.0.0',
96
+ basePath: null,
97
+ },
98
+ null,
99
+ 2,
100
+ ),
101
+ })
102
+ const result = await buildManifest.read(testDir)
103
+ expect(Err.is(result)).toBe(true)
104
+ })
105
+ })
106
+ })
@@ -0,0 +1,16 @@
1
+ import { Codec, Resource } from '@wollybeard/kit'
2
+ import { z } from 'zod/v4'
3
+
4
+ export const PolenBuildManifestSchema = z.object({
5
+ type: z.enum(['ssg', 'ssr']),
6
+ version: z.string(),
7
+ basePath: z.string(),
8
+ }).loose()
9
+
10
+ export type PolenBuildManifest = z.infer<typeof PolenBuildManifestSchema>
11
+
12
+ export const buildManifest = Resource.create({
13
+ name: 'polen-build-manifest',
14
+ path: '.polen/build.json',
15
+ codec: Codec.fromZod(PolenBuildManifestSchema),
16
+ })
@@ -0,0 +1,229 @@
1
+ import { Fs, Path } from '@wollybeard/kit'
2
+ import { afterEach, beforeEach, describe, expect, test } from 'vitest'
3
+ import { rebase, type RebasePlan } from './rebase.ts'
4
+
5
+ const testDir = 'temp/rebase-test'
6
+
7
+ const createTestBuild = async (dir: string, basePath: string = '/') => {
8
+ await Fs.makeDirectory(dir)
9
+
10
+ // Create Polen build manifest
11
+ const polenDir = Path.join(dir, '.polen')
12
+ await Fs.makeDirectory(polenDir)
13
+
14
+ const manifest = {
15
+ type: 'ssg' as const,
16
+ version: '1.0.0',
17
+ basePath,
18
+ }
19
+
20
+ await Fs.write({
21
+ path: Path.join(polenDir, 'build.json'),
22
+ content: JSON.stringify(manifest, null, 2),
23
+ })
24
+
25
+ // Create some HTML files
26
+ await Fs.write({
27
+ path: Path.join(dir, 'index.html'),
28
+ content: `<!DOCTYPE html>
29
+ <html>
30
+ <head>
31
+ <base href="${basePath}">
32
+ <title>Test</title>
33
+ </head>
34
+ <body>
35
+ <h1>Test Page</h1>
36
+ </body>
37
+ </html>`,
38
+ })
39
+
40
+ // Create nested HTML file
41
+ const nestedDir = Path.join(dir, 'docs')
42
+ await Fs.makeDirectory(nestedDir)
43
+
44
+ await Fs.write({
45
+ path: Path.join(nestedDir, 'page.html'),
46
+ content: `<!DOCTYPE html>
47
+ <html>
48
+ <head>
49
+ <title>Nested</title>
50
+ </head>
51
+ <body>
52
+ <h1>Nested Page</h1>
53
+ </body>
54
+ </html>`,
55
+ })
56
+ }
57
+
58
+ describe('rebase', () => {
59
+ beforeEach(async () => {
60
+ await Fs.remove(testDir)
61
+ })
62
+
63
+ afterEach(async () => {
64
+ await Fs.remove(testDir)
65
+ })
66
+
67
+ test('mutate mode updates base paths in place', async () => {
68
+ const buildDir = Path.join(testDir, 'build')
69
+ await createTestBuild(buildDir, '/old/')
70
+
71
+ const plan: RebasePlan = {
72
+ sourcePath: buildDir,
73
+ newBasePath: '/new/',
74
+ changeMode: 'mutate',
75
+ }
76
+
77
+ await rebase(plan)
78
+
79
+ // Check updated manifest
80
+ const manifest = await Fs.readJson(Path.join(buildDir, '.polen', 'build.json'))
81
+ expect(manifest).toMatchObject({
82
+ type: 'ssg',
83
+ version: '1.0.0',
84
+ basePath: '/new/',
85
+ })
86
+
87
+ // Check updated HTML file
88
+ const indexContent = await Fs.read(Path.join(buildDir, 'index.html'))
89
+ expect(indexContent).toContain('<base href="/new/">')
90
+
91
+ // Check nested HTML file (should have base tag inserted)
92
+ const nestedContent = await Fs.read(Path.join(buildDir, 'docs', 'page.html'))
93
+ expect(nestedContent).toContain('<base href="/new/">')
94
+ })
95
+
96
+ test('copy mode creates new build with updated base paths', async () => {
97
+ const buildDir = Path.join(testDir, 'build')
98
+ const copyDir = Path.join(testDir, 'copy')
99
+
100
+ await createTestBuild(buildDir, '/old/')
101
+
102
+ const plan: RebasePlan = {
103
+ sourcePath: buildDir,
104
+ targetPath: copyDir,
105
+ newBasePath: '/new/',
106
+ changeMode: 'copy',
107
+ }
108
+
109
+ await rebase(plan)
110
+
111
+ // Original should be unchanged
112
+ const originalManifest = await Fs.readJson(Path.join(buildDir, '.polen', 'build.json'))
113
+ expect(originalManifest).toMatchObject({
114
+ basePath: '/old/',
115
+ })
116
+
117
+ // Copy should be updated
118
+ const copyManifest = await Fs.readJson(Path.join(copyDir, '.polen', 'build.json'))
119
+ expect(copyManifest).toMatchObject({
120
+ basePath: '/new/',
121
+ })
122
+
123
+ const copyIndexContent = await Fs.read(Path.join(copyDir, 'index.html'))
124
+ expect(copyIndexContent).toContain('<base href="/new/">')
125
+ })
126
+
127
+ test('throws error for invalid base path', async () => {
128
+ const buildDir = Path.join(testDir, 'build')
129
+ await createTestBuild(buildDir)
130
+
131
+ const plan: RebasePlan = {
132
+ sourcePath: buildDir,
133
+ newBasePath: 'invalid-path',
134
+ changeMode: 'mutate',
135
+ }
136
+
137
+ await expect(rebase(plan)).rejects.toThrow('Invalid base path: invalid-path')
138
+ })
139
+
140
+ test('throws error when source is not a Polen build', async () => {
141
+ const buildDir = Path.join(testDir, 'not-polen')
142
+ await Fs.makeDirectory(buildDir)
143
+
144
+ const plan: RebasePlan = {
145
+ sourcePath: buildDir,
146
+ newBasePath: '/new/',
147
+ changeMode: 'mutate',
148
+ }
149
+
150
+ await expect(rebase(plan)).rejects.toThrow('Polen build manifest not found')
151
+ })
152
+
153
+ test('throws error when copy target exists and is not empty', async () => {
154
+ const buildDir = Path.join(testDir, 'build')
155
+ const copyDir = Path.join(testDir, 'copy')
156
+
157
+ await createTestBuild(buildDir)
158
+
159
+ // Create non-empty target
160
+ await Fs.makeDirectory(copyDir)
161
+ await Fs.write({
162
+ path: Path.join(copyDir, 'existing.txt'),
163
+ content: 'existing file',
164
+ })
165
+
166
+ const plan: RebasePlan = {
167
+ sourcePath: buildDir,
168
+ targetPath: copyDir,
169
+ newBasePath: '/new/',
170
+ changeMode: 'copy',
171
+ }
172
+
173
+ await expect(rebase(plan)).rejects.toThrow('Target path already exists and is not empty')
174
+ })
175
+
176
+ test('handles HTML file without existing base tag', async () => {
177
+ const buildDir = Path.join(testDir, 'build')
178
+ await createTestBuild(buildDir)
179
+
180
+ // Create HTML without base tag
181
+ await Fs.write({
182
+ path: Path.join(buildDir, 'no-base.html'),
183
+ content: `<!DOCTYPE html>
184
+ <html>
185
+ <head>
186
+ <title>No Base</title>
187
+ </head>
188
+ <body>
189
+ <h1>No Base Tag</h1>
190
+ </body>
191
+ </html>`,
192
+ })
193
+
194
+ const plan: RebasePlan = {
195
+ sourcePath: buildDir,
196
+ newBasePath: '/new/',
197
+ changeMode: 'mutate',
198
+ }
199
+
200
+ await rebase(plan)
201
+
202
+ const content = await Fs.read(Path.join(buildDir, 'no-base.html'))
203
+ expect(content).toContain('<base href="/new/">')
204
+ })
205
+
206
+ test('throws error for HTML file without head tag', async () => {
207
+ const buildDir = Path.join(testDir, 'build')
208
+ await createTestBuild(buildDir)
209
+
210
+ // Create invalid HTML without head
211
+ await Fs.write({
212
+ path: Path.join(buildDir, 'invalid.html'),
213
+ content: `<!DOCTYPE html>
214
+ <html>
215
+ <body>
216
+ <h1>Invalid HTML</h1>
217
+ </body>
218
+ </html>`,
219
+ })
220
+
221
+ const plan: RebasePlan = {
222
+ sourcePath: buildDir,
223
+ newBasePath: '/new/',
224
+ changeMode: 'mutate',
225
+ }
226
+
227
+ await expect(rebase(plan)).rejects.toThrow('Could not find <head> tag in HTML file')
228
+ })
229
+ })
@@ -0,0 +1,140 @@
1
+ import { TinyGlobby } from '#dep/tiny-globby/index'
2
+ import { Fs, Path } from '@wollybeard/kit'
3
+ import { Err } from '@wollybeard/kit'
4
+ import { buildManifest, type PolenBuildManifest } from './manifest.ts'
5
+
6
+ export type RebasePlan = RebaseOverwritePlan | RebaseCopyPlan
7
+
8
+ export interface RebaseOverwritePlan {
9
+ changeMode: 'mutate'
10
+ newBasePath: string
11
+ sourcePath: string
12
+ }
13
+
14
+ export interface RebaseCopyPlan {
15
+ changeMode: 'copy'
16
+ newBasePath: string
17
+ sourcePath: string
18
+ targetPath: string
19
+ }
20
+
21
+ export const rebase = async (plan: RebasePlan): Promise<void> => {
22
+ // 1. Validate source is a Polen build
23
+ const manifestResult = await buildManifest.read(plan.sourcePath)
24
+ if (Err.is(manifestResult)) {
25
+ throw new Error(`Polen build manifest not found at: ${Path.join(plan.sourcePath, '.polen', 'build.json')}`)
26
+ }
27
+ const manifest = manifestResult
28
+
29
+ // 2. Validate newBasePath is valid URL path
30
+ if (!isValidUrlPath(plan.newBasePath)) {
31
+ throw new Error(`Invalid base path: ${plan.newBasePath}`)
32
+ }
33
+
34
+ // 3. Handle copy vs mutate
35
+ let workingPath: string
36
+ if (plan.changeMode === 'copy') {
37
+ if (await Fs.exists(plan.targetPath)) {
38
+ const isEmpty = await Fs.isEmptyDir(plan.targetPath)
39
+ if (!isEmpty) {
40
+ throw new Error(`Target path already exists and is not empty: ${plan.targetPath}`)
41
+ }
42
+ }
43
+ await Fs.copyDir({ from: plan.sourcePath, to: plan.targetPath })
44
+ workingPath = plan.targetPath
45
+ } else {
46
+ workingPath = plan.sourcePath
47
+ }
48
+
49
+ // 4. Update HTML files with new base path
50
+ await updateHtmlFiles(workingPath, manifest.basePath, plan.newBasePath)
51
+
52
+ // 5. Update manifest
53
+ await updateManifest(workingPath, { basePath: plan.newBasePath })
54
+ }
55
+
56
+ //
57
+ //
58
+ //
59
+ //
60
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Local Helpers
61
+ //
62
+ //
63
+
64
+ // TODO: this is very generic, factor out to kit-temp
65
+ const isValidUrlPath = (path: string): boolean => {
66
+ // URL path should start with / and not contain invalid characters
67
+ if (!path.startsWith('/')) return false
68
+ if (!path.endsWith('/')) return false
69
+
70
+ // Basic validation - no spaces, proper URL characters
71
+ const urlPathRegex = /^\/[a-zA-Z0-9\-._~:/?#[\]@!$&'()*+,;=%]*\/$/
72
+ return urlPathRegex.test(path)
73
+ }
74
+
75
+ const updateHtmlFiles = async (buildPath: string, oldBasePath: string, newBasePath: string): Promise<void> => {
76
+ // Find all HTML files recursively
77
+ const htmlFiles = await findHtmlFiles(buildPath)
78
+
79
+ for (const htmlFile of htmlFiles) {
80
+ await updateHtmlFile(htmlFile, oldBasePath, newBasePath)
81
+ }
82
+ }
83
+
84
+ const findHtmlFiles = async (dir: string): Promise<string[]> => {
85
+ return await TinyGlobby.glob('**/*.html', {
86
+ absolute: true,
87
+ cwd: dir,
88
+ onlyFiles: true,
89
+ })
90
+ }
91
+
92
+ const updateHtmlFile = async (filePath: string, oldBasePath: string, newBasePath: string): Promise<void> => {
93
+ const content = await Fs.read(filePath)
94
+
95
+ if (content === null) {
96
+ throw new Error(`Could not read HTML file: ${filePath}`)
97
+ }
98
+
99
+ // Simple regex-based approach to update base tag
100
+ // Look for existing base tag first
101
+ const baseTagRegex = /<base\s+href\s*=\s*["']([^"']*)["'][^>]*>/i
102
+
103
+ let updatedContent: string
104
+
105
+ if (baseTagRegex.test(content)) {
106
+ // Update existing base tag
107
+ updatedContent = content.replace(baseTagRegex, `<base href="${newBasePath}">`)
108
+ } else {
109
+ // Insert new base tag in head
110
+ const headRegex = /<head[^>]*>/i
111
+ const headMatch = content.match(headRegex)
112
+
113
+ if (headMatch) {
114
+ const insertPosition = headMatch.index! + headMatch[0].length
115
+ updatedContent = content.slice(0, insertPosition)
116
+ + `\n <base href="${newBasePath}">`
117
+ + content.slice(insertPosition)
118
+ } else {
119
+ throw new Error(`Could not find <head> tag in HTML file: ${filePath}`)
120
+ }
121
+ }
122
+
123
+ await Fs.write({ path: filePath, content: updatedContent })
124
+ }
125
+
126
+ const updateManifest = async (buildPath: string, updates: Partial<PolenBuildManifest>): Promise<void> => {
127
+ const manifestPath = Path.join(buildPath, '.polen', 'build.json')
128
+ const manifestResult = await buildManifest.read(buildPath)
129
+ if (Err.is(manifestResult)) {
130
+ throw new Error(`Polen build manifest not found at: ${manifestPath}`)
131
+ }
132
+ const currentManifest = manifestResult
133
+
134
+ const updatedManifest = { ...currentManifest, ...updates }
135
+
136
+ await Fs.write({
137
+ path: manifestPath,
138
+ content: JSON.stringify(updatedManifest, null, 2),
139
+ })
140
+ }
@@ -0,0 +1,2 @@
1
+ export * from './manifest.ts'
2
+ export * from './rebase.ts'
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from 'vitest'
2
- import { assetUrl, faviconUrl, joinPaths, pageUrl } from './asset-url.js'
2
+ import { assetUrl, faviconUrl, joinPaths, pageUrl } from './asset-url.ts'
3
3
 
4
4
  describe('asset-url helpers', () => {
5
5
  describe('joinPaths', () => {
@@ -20,9 +20,9 @@ describe('asset-url helpers', () => {
20
20
 
21
21
  describe('assetUrl', () => {
22
22
  test('creates asset URLs with base path', () => {
23
- expect(assetUrl('assets/app.js', '/')).toBe('/assets/app.js')
24
- expect(assetUrl('assets/app.js', '/my-app/')).toBe('/my-app/assets/app.js')
25
- expect(assetUrl('/assets/app.js', '/my-app/')).toBe('/my-app/assets/app.js')
23
+ expect(assetUrl('assets/app.ts', '/')).toBe('/assets/app.ts')
24
+ expect(assetUrl('assets/app.ts', '/my-app/')).toBe('/my-app/assets/app.ts')
25
+ expect(assetUrl('/assets/app.ts', '/my-app/')).toBe('/my-app/assets/app.ts')
26
26
  })
27
27
  })
28
28
 
@@ -0,0 +1,108 @@
1
+ import type { Config } from '#api/api'
2
+ import { polenVirtual } from '#api/vite/vi'
3
+ import type { Vite } from '#dep/vite/index'
4
+ import { type ExistenceDiff, getMutationType, MutationType } from '#lib/mutation-type'
5
+ import { debugPolen } from '#singletons/debug'
6
+ import { Fs } from '@wollybeard/kit'
7
+ import type { Plugin } from 'vite'
8
+
9
+ const viLogo = polenVirtual(['project', 'assets', 'logo.svg'])
10
+
11
+ const generateDefaultLogo = async () => {
12
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
13
+ <circle cx="64" cy="64" r="48" fill="none" stroke="black" stroke-width="8"/>
14
+ </svg>`
15
+ }
16
+
17
+ export function Branding(config: Config.Config): Plugin {
18
+ const debug = debugPolen.sub('vite-plugin:branding')
19
+ debug('initialized')
20
+
21
+ return {
22
+ name: 'polen:branding',
23
+ enforce: 'pre',
24
+
25
+ async buildStart() {
26
+ this.addWatchFile(config.paths.project.absolute.public.logo)
27
+ },
28
+
29
+ async handleHotUpdate({ file, server }) {
30
+ return await handleWatchedFileChange({
31
+ watchedFile: config.paths.project.absolute.public.logo,
32
+ changedFile: file,
33
+ moduleId: viLogo.resolved,
34
+ server,
35
+ debug: debug,
36
+ })
37
+ },
38
+
39
+ resolveId(id) {
40
+ if (id === viLogo.id) {
41
+ return viLogo.resolved
42
+ }
43
+ },
44
+
45
+ async load(id) {
46
+ if (id === viLogo.resolved) {
47
+ const logoFileContent = await Fs.read(config.paths.project.absolute.public.logo)
48
+ const content = logoFileContent ? logoFileContent : await generateDefaultLogo()
49
+ const dataUrl = `data:image/svg+xml;base64,${Buffer.from(content).toString('base64')}`
50
+ return `export default ${JSON.stringify(dataUrl)}`
51
+ }
52
+ },
53
+ }
54
+ }
55
+
56
+ interface HandleWatchedFileChangeParams {
57
+ watchedFile: string
58
+ changedFile: string
59
+ moduleId: string
60
+ server: Vite.ViteDevServer
61
+ debug: (msg: string, data?: any) => void
62
+ }
63
+
64
+ const handleWatchedFileChange = async (
65
+ params: HandleWatchedFileChangeParams,
66
+ ): Promise<Array<Vite.ModuleNode> | void> => {
67
+ const { watchedFile, changedFile, moduleId, server, debug } = params
68
+
69
+ // Check if change is for watched file
70
+ if (changedFile !== watchedFile) return
71
+
72
+ // Check current existence
73
+ const existsNow = await Fs.exists(watchedFile)
74
+
75
+ // Check previous existence via module graph
76
+ const module = server.moduleGraph.getModuleById(moduleId)
77
+ const existedBefore = !!module
78
+
79
+ // Early return if no mutation
80
+ if (!existedBefore && !existsNow) {
81
+ debug(`no mutation detected - file didn't exist before or after`, { file: changedFile })
82
+ return
83
+ }
84
+
85
+ const mutationType = getMutationType({
86
+ before: existedBefore,
87
+ after: existsNow,
88
+ } as ExistenceDiff)
89
+
90
+ debug(`file ${mutationType}`, { file: changedFile })
91
+
92
+ switch (mutationType) {
93
+ case MutationType.Create:
94
+ // Full reload needed - module never existed
95
+ server.ws.send({
96
+ type: 'full-reload',
97
+ path: '*',
98
+ })
99
+ break
100
+
101
+ case MutationType.Update:
102
+ case MutationType.Delete:
103
+ // Invalidate module for HMR
104
+ server.moduleGraph.invalidateModule(module!)
105
+ // Return empty array to prevent default HMR
106
+ return []
107
+ }
108
+ }
@@ -1,7 +1,9 @@
1
1
  import type { Config } from '#api/config/index'
2
+ import type { PolenBuildManifest } from '#api/static/manifest'
2
3
  import { Vite } from '#dep/vite/index'
3
4
  import { ViteVirtual } from '#lib/vite-virtual/index'
4
5
  import { Fs, Path } from '@wollybeard/kit'
6
+ import packageJson from '../../../../package.json' with { type: 'json' }
5
7
  import { isKitUnusedExternalImport, isRadixModuleLevelDirective } from '../log-filters.ts'
6
8
  import { polenVirtual } from '../vi.ts'
7
9
 
@@ -10,7 +12,7 @@ export const Build = (config: Config.Config): Vite.Plugin[] => {
10
12
 
11
13
  // const outDir = Path.join(config.paths.project.rootDir, `dist`)
12
14
 
13
- return [Manifest(config), {
15
+ return [Manifest(config), BuildManifest(config), {
14
16
  name: `polen:build-client`,
15
17
  apply: `build`,
16
18
  applyToEnvironment: Vite.isEnvironmentClient,
@@ -144,3 +146,25 @@ const Manifest = (config: Config.Config): Vite.Plugin => {
144
146
  ),
145
147
  }
146
148
  }
149
+
150
+ const BuildManifest = (config: Config.Config): Vite.Plugin => {
151
+ return {
152
+ name: 'polen:build-manifest',
153
+ apply: 'build',
154
+ applyToEnvironment: Vite.isEnvironmentClient,
155
+ async generateBundle() {
156
+ const manifest: PolenBuildManifest = {
157
+ type: config.build.architecture === 'ssr' ? 'ssr' : 'ssg',
158
+ version: packageJson.version,
159
+ basePath: config.build.base || '/',
160
+ }
161
+
162
+ // Emit the manifest as an asset
163
+ this.emitFile({
164
+ type: 'asset',
165
+ fileName: '.polen/build.json',
166
+ source: JSON.stringify(manifest, null, 2),
167
+ })
168
+ },
169
+ }
170
+ }