polen 0.9.1-next.1 → 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 (481) 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.d.ts.map +1 -1
  47. package/build/api/schema/data-sources/schema-directory/schema-directory.js +3 -2
  48. package/build/api/schema/data-sources/schema-directory/schema-directory.js.map +1 -1
  49. package/build/api/static/index.d.ts +2 -0
  50. package/build/api/static/index.d.ts.map +1 -0
  51. package/build/api/static/index.js +2 -0
  52. package/build/api/static/index.js.map +1 -0
  53. package/build/api/static/manifest.d.ts +18 -0
  54. package/build/api/static/manifest.d.ts.map +1 -0
  55. package/build/api/static/manifest.js +13 -0
  56. package/build/api/static/manifest.js.map +1 -0
  57. package/build/api/static/rebase.d.ts +14 -0
  58. package/build/api/static/rebase.d.ts.map +1 -0
  59. package/build/api/static/rebase.js +110 -0
  60. package/build/api/static/rebase.js.map +1 -0
  61. package/build/api/static/static.d.ts +3 -0
  62. package/build/api/static/static.d.ts.map +1 -0
  63. package/build/api/static/static.js +3 -0
  64. package/build/api/static/static.js.map +1 -0
  65. package/build/api/vite/plugins/branding/index.d.ts +4 -0
  66. package/build/api/vite/plugins/branding/index.d.ts.map +1 -0
  67. package/build/api/vite/plugins/branding/index.js +80 -0
  68. package/build/api/vite/plugins/branding/index.js.map +1 -0
  69. package/build/api/vite/plugins/build.d.ts.map +1 -1
  70. package/build/api/vite/plugins/build.js +22 -1
  71. package/build/api/vite/plugins/build.js.map +1 -1
  72. package/build/api/vite/plugins/core.d.ts +2 -2
  73. package/build/api/vite/plugins/core.d.ts.map +1 -1
  74. package/build/api/vite/plugins/core.js +4 -5
  75. package/build/api/vite/plugins/core.js.map +1 -1
  76. package/build/api/vite/plugins/main.d.ts.map +1 -1
  77. package/build/api/vite/plugins/main.js +2 -1
  78. package/build/api/vite/plugins/main.js.map +1 -1
  79. package/build/api/vite/plugins/pages.d.ts +8 -14
  80. package/build/api/vite/plugins/pages.d.ts.map +1 -1
  81. package/build/api/vite/plugins/pages.js +110 -183
  82. package/build/api/vite/plugins/pages.js.map +1 -1
  83. package/build/api/vite/plugins/serve.js +5 -5
  84. package/build/api/vite/plugins/serve.js.map +1 -1
  85. package/build/cli/_/self-contained-mode.js +5 -5
  86. package/build/cli/_/self-contained-mode.js.map +1 -1
  87. package/build/cli/commands/static/$default.d.ts +3 -0
  88. package/build/cli/commands/static/$default.d.ts.map +1 -0
  89. package/build/cli/commands/static/$default.js +38 -0
  90. package/build/cli/commands/static/$default.js.map +1 -0
  91. package/build/cli/commands/static/rebase.d.ts +2 -0
  92. package/build/cli/commands/static/rebase.d.ts.map +1 -0
  93. package/build/cli/commands/static/rebase.js +26 -0
  94. package/build/cli/commands/static/rebase.js.map +1 -0
  95. package/build/cli/commands/static.d.ts +3 -0
  96. package/build/cli/commands/static.d.ts.map +1 -0
  97. package/build/cli/commands/static.js +5 -0
  98. package/build/cli/commands/static.js.map +1 -0
  99. package/build/exports/components.d.ts +2 -0
  100. package/build/exports/components.d.ts.map +1 -0
  101. package/build/exports/components.js +2 -0
  102. package/build/exports/components.js.map +1 -0
  103. package/build/lib/demos/builder.d.ts +83 -0
  104. package/build/lib/demos/builder.d.ts.map +1 -0
  105. package/build/lib/demos/builder.js +237 -0
  106. package/build/lib/demos/builder.js.map +1 -0
  107. package/build/lib/demos/config-schema.d.ts +243 -0
  108. package/build/lib/demos/config-schema.d.ts.map +1 -0
  109. package/build/lib/demos/config-schema.js +52 -0
  110. package/build/lib/demos/config-schema.js.map +1 -0
  111. package/build/lib/demos/config.d.ts +40 -0
  112. package/build/lib/demos/config.d.ts.map +1 -0
  113. package/build/lib/demos/config.js +180 -0
  114. package/build/lib/demos/config.js.map +1 -0
  115. package/build/lib/demos/index.d.ts +9 -0
  116. package/build/lib/demos/index.d.ts.map +1 -0
  117. package/build/lib/demos/index.js +8 -0
  118. package/build/lib/demos/index.js.map +1 -0
  119. package/build/lib/demos/ui/components.d.ts +33 -0
  120. package/build/lib/demos/ui/components.d.ts.map +1 -0
  121. package/build/lib/demos/ui/components.js +699 -0
  122. package/build/lib/demos/ui/components.js.map +1 -0
  123. package/build/lib/demos/ui/data-collector.d.ts +88 -0
  124. package/build/lib/demos/ui/data-collector.d.ts.map +1 -0
  125. package/build/lib/demos/ui/data-collector.js +174 -0
  126. package/build/lib/demos/ui/data-collector.js.map +1 -0
  127. package/build/lib/demos/ui/landing-page-cli.d.ts +3 -0
  128. package/build/lib/demos/ui/landing-page-cli.d.ts.map +1 -0
  129. package/build/lib/demos/ui/landing-page-cli.js +21 -0
  130. package/build/lib/demos/ui/landing-page-cli.js.map +1 -0
  131. package/build/lib/demos/ui/landing-page.d.ts +32 -0
  132. package/build/lib/demos/ui/landing-page.d.ts.map +1 -0
  133. package/build/lib/demos/ui/landing-page.js +83 -0
  134. package/build/lib/demos/ui/landing-page.js.map +1 -0
  135. package/build/lib/demos/ui/page-renderer.d.ts +26 -0
  136. package/build/lib/demos/ui/page-renderer.d.ts.map +1 -0
  137. package/build/lib/demos/ui/page-renderer.js +104 -0
  138. package/build/lib/demos/ui/page-renderer.js.map +1 -0
  139. package/build/lib/demos/utils.d.ts +14 -0
  140. package/build/lib/demos/utils.d.ts.map +1 -0
  141. package/build/lib/demos/utils.js +37 -0
  142. package/build/lib/demos/utils.js.map +1 -0
  143. package/build/lib/deployment/$$.d.ts +3 -0
  144. package/build/lib/deployment/$$.d.ts.map +1 -0
  145. package/build/lib/deployment/$$.js +3 -0
  146. package/build/lib/deployment/$$.js.map +1 -0
  147. package/build/lib/deployment/$.d.ts +2 -0
  148. package/build/lib/deployment/$.d.ts.map +1 -0
  149. package/build/lib/deployment/$.js +2 -0
  150. package/build/lib/deployment/$.js.map +1 -0
  151. package/build/lib/deployment/metadata.d.ts +32 -0
  152. package/build/lib/deployment/metadata.d.ts.map +1 -0
  153. package/build/lib/deployment/metadata.js +37 -0
  154. package/build/lib/deployment/metadata.js.map +1 -0
  155. package/build/lib/deployment/path-manager.d.ts +41 -0
  156. package/build/lib/deployment/path-manager.d.ts.map +1 -0
  157. package/build/lib/deployment/path-manager.js +157 -0
  158. package/build/lib/deployment/path-manager.js.map +1 -0
  159. package/build/lib/file-router/file-router.d.ts +0 -2
  160. package/build/lib/file-router/file-router.d.ts.map +1 -1
  161. package/build/lib/file-router/file-router.js +0 -2
  162. package/build/lib/file-router/file-router.js.map +1 -1
  163. package/build/lib/file-router/route.d.ts +2 -0
  164. package/build/lib/file-router/route.d.ts.map +1 -1
  165. package/build/lib/file-router/route.js.map +1 -1
  166. package/build/lib/file-router/scan.d.ts.map +1 -1
  167. package/build/lib/file-router/scan.js +22 -13
  168. package/build/lib/file-router/scan.js.map +1 -1
  169. package/build/lib/github-actions/git-controller.d.ts +50 -0
  170. package/build/lib/github-actions/git-controller.d.ts.map +1 -0
  171. package/build/lib/github-actions/git-controller.js +90 -0
  172. package/build/lib/github-actions/git-controller.js.map +1 -0
  173. package/build/lib/github-actions/github-actions.d.ts +7 -0
  174. package/build/lib/github-actions/github-actions.d.ts.map +1 -0
  175. package/build/lib/github-actions/github-actions.js +7 -0
  176. package/build/lib/github-actions/github-actions.js.map +1 -0
  177. package/build/lib/github-actions/index.d.ts +2 -0
  178. package/build/lib/github-actions/index.d.ts.map +1 -0
  179. package/build/lib/github-actions/index.js +2 -0
  180. package/build/lib/github-actions/index.js.map +1 -0
  181. package/build/lib/github-actions/lib/get-pr-deployments.d.ts +12 -0
  182. package/build/lib/github-actions/lib/get-pr-deployments.d.ts.map +1 -0
  183. package/build/lib/github-actions/lib/get-pr-deployments.js +51 -0
  184. package/build/lib/github-actions/lib/get-pr-deployments.js.map +1 -0
  185. package/build/lib/github-actions/pr-controller.d.ts +39 -0
  186. package/build/lib/github-actions/pr-controller.d.ts.map +1 -0
  187. package/build/lib/github-actions/pr-controller.js +122 -0
  188. package/build/lib/github-actions/pr-controller.js.map +1 -0
  189. package/build/lib/github-actions/run-step-cli.d.ts +9 -0
  190. package/build/lib/github-actions/run-step-cli.d.ts.map +1 -0
  191. package/build/lib/github-actions/run-step-cli.js +71 -0
  192. package/build/lib/github-actions/run-step-cli.js.map +1 -0
  193. package/build/lib/github-actions/runner.d.ts +17 -0
  194. package/build/lib/github-actions/runner.d.ts.map +1 -0
  195. package/build/lib/github-actions/runner.js +195 -0
  196. package/build/lib/github-actions/runner.js.map +1 -0
  197. package/build/lib/github-actions/schemas/context.d.ts +933 -0
  198. package/build/lib/github-actions/schemas/context.d.ts.map +1 -0
  199. package/build/lib/github-actions/schemas/context.js +407 -0
  200. package/build/lib/github-actions/schemas/context.js.map +1 -0
  201. package/build/lib/github-actions/schemas/index.d.ts +5 -0
  202. package/build/lib/github-actions/schemas/index.d.ts.map +1 -0
  203. package/build/lib/github-actions/schemas/index.js +5 -0
  204. package/build/lib/github-actions/schemas/index.js.map +1 -0
  205. package/build/lib/github-actions/search-module.d.ts +38 -0
  206. package/build/lib/github-actions/search-module.d.ts.map +1 -0
  207. package/build/lib/github-actions/search-module.js +40 -0
  208. package/build/lib/github-actions/search-module.js.map +1 -0
  209. package/build/lib/github-actions/step.d.ts +163 -0
  210. package/build/lib/github-actions/step.d.ts.map +1 -0
  211. package/build/lib/github-actions/step.js +121 -0
  212. package/build/lib/github-actions/step.js.map +1 -0
  213. package/build/lib/helpers.d.ts.map +1 -1
  214. package/build/lib/helpers.js +5 -3
  215. package/build/lib/helpers.js.map +1 -1
  216. package/build/lib/kit-temp.d.ts +54 -0
  217. package/build/lib/kit-temp.d.ts.map +1 -1
  218. package/build/lib/kit-temp.js +82 -14
  219. package/build/lib/kit-temp.js.map +1 -1
  220. package/build/lib/kit-temp.test-d.d.ts +2 -0
  221. package/build/lib/kit-temp.test-d.d.ts.map +1 -0
  222. package/build/lib/kit-temp.test-d.js +75 -0
  223. package/build/lib/kit-temp.test-d.js.map +1 -0
  224. package/build/lib/mask/$$.d.ts +3 -0
  225. package/build/lib/mask/$$.d.ts.map +1 -0
  226. package/build/lib/mask/$$.js +3 -0
  227. package/build/lib/mask/$$.js.map +1 -0
  228. package/build/lib/mask/$.d.ts +2 -0
  229. package/build/lib/mask/$.d.ts.map +1 -0
  230. package/build/lib/mask/$.js +2 -0
  231. package/build/lib/mask/$.js.map +1 -0
  232. package/build/lib/mask/apply.d.ts +86 -0
  233. package/build/lib/mask/apply.d.ts.map +1 -0
  234. package/build/lib/mask/apply.js +86 -0
  235. package/build/lib/mask/apply.js.map +1 -0
  236. package/build/lib/mask/mask.d.ts +124 -0
  237. package/build/lib/mask/mask.d.ts.map +1 -0
  238. package/build/lib/mask/mask.js +137 -0
  239. package/build/lib/mask/mask.js.map +1 -0
  240. package/build/lib/mask/mask.test-d.d.ts +2 -0
  241. package/build/lib/mask/mask.test-d.d.ts.map +1 -0
  242. package/build/lib/mask/mask.test-d.js +102 -0
  243. package/build/lib/mask/mask.test-d.js.map +1 -0
  244. package/build/lib/mutation-type.d.ts +18 -0
  245. package/build/lib/mutation-type.d.ts.map +1 -0
  246. package/build/lib/mutation-type.js +16 -0
  247. package/build/lib/mutation-type.js.map +1 -0
  248. package/build/lib/task/$$.d.ts +3 -0
  249. package/build/lib/task/$$.d.ts.map +1 -0
  250. package/build/lib/task/$$.js +3 -0
  251. package/build/lib/task/$$.js.map +1 -0
  252. package/build/lib/task/$.d.ts +2 -0
  253. package/build/lib/task/$.d.ts.map +1 -0
  254. package/build/lib/task/$.js +2 -0
  255. package/build/lib/task/$.js.map +1 -0
  256. package/build/lib/task/report.d.ts +28 -0
  257. package/build/lib/task/report.d.ts.map +1 -0
  258. package/build/lib/task/report.js +33 -0
  259. package/build/lib/task/report.js.map +1 -0
  260. package/build/lib/task/task.d.ts +44 -0
  261. package/build/lib/task/task.d.ts.map +1 -0
  262. package/build/lib/task/task.js +63 -0
  263. package/build/lib/task/task.js.map +1 -0
  264. package/build/lib/version-history/index.d.ts +3 -0
  265. package/build/lib/version-history/index.d.ts.map +1 -0
  266. package/build/lib/version-history/index.js +2 -0
  267. package/build/lib/version-history/index.js.map +1 -0
  268. package/build/lib/version-history/types.d.ts +64 -0
  269. package/build/lib/version-history/types.d.ts.map +1 -0
  270. package/build/lib/version-history/types.js +5 -0
  271. package/build/lib/version-history/types.js.map +1 -0
  272. package/build/lib/version-history/version-history.d.ts +85 -0
  273. package/build/lib/version-history/version-history.d.ts.map +1 -0
  274. package/build/lib/version-history/version-history.js +248 -0
  275. package/build/lib/version-history/version-history.js.map +1 -0
  276. package/build/lib/vite-virtual/debug.d.ts +1 -1
  277. package/build/lib/vite-virtual/debug.d.ts.map +1 -1
  278. package/build/lib/vite-virtual/debug.js +1 -1
  279. package/build/lib/vite-virtual/debug.js.map +1 -1
  280. package/build/project-data.d.ts +0 -1
  281. package/build/project-data.d.ts.map +1 -1
  282. package/build/sandbox.d.ts +2 -0
  283. package/build/sandbox.d.ts.map +1 -0
  284. package/build/sandbox.js +18 -0
  285. package/build/sandbox.js.map +1 -0
  286. package/build/singletons/debug.d.ts +2 -2
  287. package/build/singletons/debug.d.ts.map +1 -1
  288. package/build/singletons/debug.js +2 -2
  289. package/build/singletons/debug.js.map +1 -1
  290. package/build/template/components/HamburgerMenu.d.ts +9 -0
  291. package/build/template/components/HamburgerMenu.d.ts.map +1 -0
  292. package/build/template/components/HamburgerMenu.jsx +53 -0
  293. package/build/template/components/HamburgerMenu.jsx.map +1 -0
  294. package/build/template/components/Link.jsx +1 -1
  295. package/build/template/components/Logo.d.ts +9 -0
  296. package/build/template/components/Logo.d.ts.map +1 -0
  297. package/build/template/components/Logo.jsx +29 -0
  298. package/build/template/components/Logo.jsx.map +1 -0
  299. package/build/template/components/NotFound.d.ts +2 -0
  300. package/build/template/components/NotFound.d.ts.map +1 -0
  301. package/build/template/components/NotFound.jsx +26 -0
  302. package/build/template/components/NotFound.jsx.map +1 -0
  303. package/build/template/components/ThemeToggle.d.ts +3 -0
  304. package/build/template/components/ThemeToggle.d.ts.map +1 -0
  305. package/build/template/components/ThemeToggle.jsx +10 -0
  306. package/build/template/components/ThemeToggle.jsx.map +1 -0
  307. package/build/template/components/content/$$.d.ts +2 -0
  308. package/build/template/components/content/$$.d.ts.map +1 -0
  309. package/build/template/components/content/$$.js +2 -0
  310. package/build/template/components/content/$$.js.map +1 -0
  311. package/build/template/components/sidebar/Sidebar.d.ts +2 -2
  312. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  313. package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
  314. package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
  315. package/build/template/components/sidebar/SidebarItem.jsx +1 -1
  316. package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
  317. package/build/template/contexts/ThemeContext.d.ts +12 -0
  318. package/build/template/contexts/ThemeContext.d.ts.map +1 -0
  319. package/build/template/contexts/ThemeContext.jsx +41 -0
  320. package/build/template/contexts/ThemeContext.jsx.map +1 -0
  321. package/build/template/routes/root.d.ts.map +1 -1
  322. package/build/template/routes/root.jsx +66 -53
  323. package/build/template/routes/root.jsx.map +1 -1
  324. package/build/template/server/app.d.ts.map +1 -1
  325. package/build/template/server/app.js +2 -21
  326. package/build/template/server/app.js.map +1 -1
  327. package/package.json +42 -28
  328. package/src/api/api.ts +1 -0
  329. package/src/api/config/configurator.ts +28 -6
  330. package/src/api/config/load.ts +5 -5
  331. package/src/api/config-resolver/resolve.ts +2 -2
  332. package/src/api/content/$$.ts +6 -0
  333. package/src/api/content/$.test.ts +72 -0
  334. package/src/api/content/$.ts +1 -0
  335. package/src/api/content/metadata.ts +11 -0
  336. package/src/api/content/navbar.test.ts +55 -0
  337. package/src/api/content/navbar.ts +61 -0
  338. package/src/api/content/page.ts +12 -0
  339. package/src/api/content/scan.ts +117 -0
  340. package/src/api/content/sidebar.test.ts +297 -0
  341. package/src/api/content/sidebar.ts +283 -0
  342. package/src/api/content/utils.ts +7 -0
  343. package/src/api/schema/data-sources/schema-directory/schema-directory.ts +3 -2
  344. package/src/api/singletons/markdown/markdown.test.ts +1 -1
  345. package/src/api/static/index.ts +1 -0
  346. package/src/api/static/manifest.test.ts +106 -0
  347. package/src/api/static/manifest.ts +16 -0
  348. package/src/api/static/rebase.test.ts +229 -0
  349. package/src/api/static/rebase.ts +140 -0
  350. package/src/api/static/static.ts +2 -0
  351. package/src/api/utils/asset-url/asset-url.test.ts +4 -4
  352. package/src/api/vite/plugins/branding/index.ts +108 -0
  353. package/src/api/vite/plugins/build.ts +25 -1
  354. package/src/api/vite/plugins/core.ts +6 -7
  355. package/src/api/vite/plugins/main.ts +2 -0
  356. package/src/api/vite/plugins/pages.ts +131 -207
  357. package/src/api/vite/plugins/serve.ts +5 -5
  358. package/src/cli/_/self-contained-mode.ts +5 -5
  359. package/src/cli/commands/static/$default.ts +43 -0
  360. package/src/cli/commands/static/rebase.ts +37 -0
  361. package/src/cli/commands/static.ts +6 -0
  362. package/src/exports/components.ts +1 -0
  363. package/src/lib/demos/builder.ts +298 -0
  364. package/src/lib/demos/config-schema.ts +56 -0
  365. package/src/lib/demos/config.test.ts +193 -0
  366. package/src/lib/demos/config.ts +205 -0
  367. package/src/lib/demos/index.ts +9 -0
  368. package/src/lib/demos/ui/components.ts +739 -0
  369. package/src/lib/demos/ui/data-collector.ts +246 -0
  370. package/src/lib/demos/ui/landing-page-cli.ts +23 -0
  371. package/src/lib/demos/ui/landing-page.ts +126 -0
  372. package/src/lib/demos/ui/page-renderer.ts +124 -0
  373. package/src/lib/demos/utils.ts +43 -0
  374. package/src/lib/deployment/$$.ts +2 -0
  375. package/src/lib/deployment/$.test.ts +53 -0
  376. package/src/lib/deployment/$.ts +1 -0
  377. package/src/lib/deployment/metadata.ts +40 -0
  378. package/src/lib/deployment/path-manager.ts +186 -0
  379. package/src/lib/file-router/file-router.ts +0 -2
  380. package/src/lib/file-router/linter.test.ts +2 -0
  381. package/src/lib/file-router/route.ts +2 -0
  382. package/src/lib/file-router/scan.ts +26 -14
  383. package/src/lib/github-actions/git-controller.ts +151 -0
  384. package/src/lib/github-actions/github-actions.ts +6 -0
  385. package/src/lib/github-actions/index.ts +1 -0
  386. package/src/lib/github-actions/lib/get-pr-deployments.ts +76 -0
  387. package/src/lib/github-actions/pr-controller.test.ts +172 -0
  388. package/src/lib/github-actions/pr-controller.ts +183 -0
  389. package/src/lib/github-actions/run-step-cli.ts +84 -0
  390. package/src/lib/github-actions/runner.test.ts +192 -0
  391. package/src/lib/github-actions/runner.ts +226 -0
  392. package/src/lib/github-actions/schemas/context.ts +424 -0
  393. package/src/lib/github-actions/schemas/index.ts +5 -0
  394. package/src/lib/github-actions/search-module.test.ts +110 -0
  395. package/src/lib/github-actions/search-module.ts +76 -0
  396. package/src/lib/github-actions/step.test.ts +149 -0
  397. package/src/lib/github-actions/step.ts +232 -0
  398. package/src/lib/helpers.ts +4 -3
  399. package/src/lib/kit-temp.test-d.ts +115 -0
  400. package/src/lib/kit-temp.test.ts +127 -0
  401. package/src/lib/kit-temp.ts +128 -14
  402. package/src/lib/mask/$$.ts +2 -0
  403. package/src/lib/mask/$.test.ts +248 -0
  404. package/src/lib/mask/$.ts +1 -0
  405. package/src/lib/mask/apply.ts +134 -0
  406. package/src/lib/mask/mask.test-d.ts +144 -0
  407. package/src/lib/mask/mask.ts +244 -0
  408. package/src/lib/mutation-type.ts +20 -0
  409. package/src/lib/shiki/shiki.test.ts +1 -1
  410. package/src/lib/task/$$.ts +2 -0
  411. package/src/lib/task/$.test.ts +209 -0
  412. package/src/lib/task/$.ts +1 -0
  413. package/src/lib/task/report.ts +72 -0
  414. package/src/lib/task/task.ts +112 -0
  415. package/src/lib/version-history/index.test.ts +196 -0
  416. package/src/lib/version-history/index.ts +4 -0
  417. package/src/lib/version-history/types.ts +68 -0
  418. package/src/lib/version-history/version-history.ts +293 -0
  419. package/src/lib/vite-virtual/debug.ts +1 -1
  420. package/src/project-data.ts +0 -1
  421. package/src/sandbox.ts +20 -0
  422. package/src/singletons/debug.ts +2 -2
  423. package/src/template/components/HamburgerMenu.tsx +96 -0
  424. package/src/template/components/Link.tsx +1 -1
  425. package/src/template/components/Logo.tsx +46 -0
  426. package/src/template/components/NotFound.tsx +28 -0
  427. package/src/template/components/ThemeToggle.tsx +21 -0
  428. package/src/template/components/content/$$.ts +1 -0
  429. package/src/template/components/sidebar/Sidebar.tsx +2 -2
  430. package/src/template/components/sidebar/SidebarItem.tsx +8 -8
  431. package/src/template/contexts/ThemeContext.tsx +60 -0
  432. package/src/template/routes/root.tsx +85 -74
  433. package/src/template/server/app.ts +2 -27
  434. package/build/lib/debug/debug.d.ts +0 -13
  435. package/build/lib/debug/debug.d.ts.map +0 -1
  436. package/build/lib/debug/debug.js +0 -86
  437. package/build/lib/debug/debug.js.map +0 -1
  438. package/build/lib/debug/environment-variable.d.ts +0 -6
  439. package/build/lib/debug/environment-variable.d.ts.map +0 -1
  440. package/build/lib/debug/environment-variable.js +0 -48
  441. package/build/lib/debug/environment-variable.js.map +0 -1
  442. package/build/lib/debug/index.d.ts +0 -2
  443. package/build/lib/debug/index.d.ts.map +0 -1
  444. package/build/lib/debug/index.js +0 -2
  445. package/build/lib/debug/index.js.map +0 -1
  446. package/build/lib/file-router/scan-tree.d.ts +0 -20
  447. package/build/lib/file-router/scan-tree.d.ts.map +0 -1
  448. package/build/lib/file-router/scan-tree.js +0 -158
  449. package/build/lib/file-router/scan-tree.js.map +0 -1
  450. package/build/lib/file-router/sidebar/index.d.ts +0 -3
  451. package/build/lib/file-router/sidebar/index.d.ts.map +0 -1
  452. package/build/lib/file-router/sidebar/index.js +0 -4
  453. package/build/lib/file-router/sidebar/index.js.map +0 -1
  454. package/build/lib/file-router/sidebar/sidebar-tree.d.ts +0 -9
  455. package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +0 -1
  456. package/build/lib/file-router/sidebar/sidebar-tree.js +0 -85
  457. package/build/lib/file-router/sidebar/sidebar-tree.js.map +0 -1
  458. package/build/lib/file-router/sidebar/types.d.ts +0 -17
  459. package/build/lib/file-router/sidebar/types.d.ts.map +0 -1
  460. package/build/lib/file-router/sidebar/types.js +0 -2
  461. package/build/lib/file-router/sidebar/types.js.map +0 -1
  462. package/build/lib/tree/index.d.ts +0 -3
  463. package/build/lib/tree/index.d.ts.map +0 -1
  464. package/build/lib/tree/index.js +0 -2
  465. package/build/lib/tree/index.js.map +0 -1
  466. package/build/lib/tree/tree.d.ts +0 -62
  467. package/build/lib/tree/tree.d.ts.map +0 -1
  468. package/build/lib/tree/tree.js +0 -134
  469. package/build/lib/tree/tree.js.map +0 -1
  470. package/src/lib/debug/debug.ts +0 -120
  471. package/src/lib/debug/environment-variable.ts +0 -56
  472. package/src/lib/debug/index.ts +0 -1
  473. package/src/lib/file-router/scan-tree.test.ts +0 -189
  474. package/src/lib/file-router/scan-tree.ts +0 -205
  475. package/src/lib/file-router/sidebar/index.ts +0 -3
  476. package/src/lib/file-router/sidebar/sidebar-tree.test.ts +0 -123
  477. package/src/lib/file-router/sidebar/sidebar-tree.ts +0 -110
  478. package/src/lib/file-router/sidebar/types.ts +0 -19
  479. package/src/lib/tree/index.ts +0 -2
  480. package/src/lib/tree/tree.test.ts +0 -117
  481. package/src/lib/tree/tree.ts +0 -183
@@ -0,0 +1,183 @@
1
+ import type { Context } from '@actions/github/lib/context.ts'
2
+ import type { GitHub } from '@actions/github/lib/utils.ts'
3
+ import { type Deployment, fetchPullRequestDeployments } from './lib/get-pr-deployments.ts'
4
+
5
+ const createCommentMarker = (id: string) => `<!-- comment-id: ${id} -->`
6
+
7
+ export interface CommentOptions {
8
+ /**
9
+ * Unique identifier for the comment. Used to find and update existing comments.
10
+ * If not provided, uses the current step name as the ID.
11
+ */
12
+ id?: string
13
+ /**
14
+ * Markdown content of the comment
15
+ */
16
+ content: string
17
+ /**
18
+ * Whether this comment is optional. If true, errors are logged but not thrown
19
+ * when not in a PR context. Defaults to false.
20
+ */
21
+ optional?: boolean
22
+ }
23
+
24
+ /**
25
+ * Create a PR controller. Returns a no-op controller when not in PR context.
26
+ */
27
+ export function createPullRequestController(
28
+ github: InstanceType<typeof GitHub>,
29
+ context: Context,
30
+ defaultCommentId?: string,
31
+ ): PullRequestController {
32
+ // Check if this is a PR-related event
33
+ let prNumber: number | null = null
34
+
35
+ if (context.payload.pull_request?.number) {
36
+ // Direct PR events
37
+ prNumber = context.payload.pull_request.number
38
+ } else if (context.eventName === 'issue_comment' && context.payload.issue?.['pull_request']) {
39
+ // Issue comment on a PR (not on a regular issue)
40
+ prNumber = context.payload.issue.number
41
+ }
42
+
43
+ return new PullRequestController(github, context, prNumber, defaultCommentId)
44
+ }
45
+
46
+ // /**
47
+ // * Check if the current event is PR-related
48
+ // */
49
+ // function isPREvent(context: Context): boolean {
50
+ // const prEvents = [
51
+ // 'pull_request',
52
+ // 'pull_request_review',
53
+ // 'pull_request_review_comment',
54
+ // 'pull_request_target',
55
+ // 'issue_comment', // Can be on PRs too
56
+ // ]
57
+
58
+ // return prEvents.includes(context.eventName)
59
+ // || (context.eventName === 'issue_comment' && context.payload.issue?.['pull_request'])
60
+ // }
61
+
62
+ /**
63
+ * PR Controller for GitHub Actions
64
+ * Provides easy-to-use methods for interacting with pull requests
65
+ */
66
+ export class PullRequestController {
67
+ public readonly isActive: boolean
68
+ public readonly number: number
69
+
70
+ constructor(
71
+ private github: InstanceType<typeof GitHub>,
72
+ private context: Context,
73
+ prNumber: number | null,
74
+ private defaultCommentId?: string,
75
+ ) {
76
+ this.isActive = prNumber !== null
77
+ this.number = prNumber || 0
78
+ }
79
+
80
+ async comment(options: CommentOptions): Promise<void> {
81
+ if (!this.isActive) {
82
+ if (options.optional) {
83
+ console.log('[skip] Not in a PR context, cannot create comment')
84
+ return
85
+ }
86
+ throw new Error('Not in a PR context, cannot create comment')
87
+ }
88
+
89
+ const { owner, repo } = this.context.repo
90
+
91
+ // Use provided ID or fall back to default
92
+ const commentId = options.id || this.defaultCommentId || 'default'
93
+
94
+ // Search for existing comment with the ID in the body
95
+ const commentMarker = createCommentMarker(commentId)
96
+ const body = `${options.content}\n\n${commentMarker}`
97
+
98
+ // Find existing comment
99
+ const { data: comments } = await this.github.rest.issues.listComments({
100
+ owner,
101
+ repo,
102
+ issue_number: this.number,
103
+ per_page: 100,
104
+ })
105
+
106
+ const existingComment = comments.find(comment => comment.body?.includes(commentMarker))
107
+
108
+ if (existingComment) {
109
+ // Update existing comment
110
+ await this.github.rest.issues.updateComment({
111
+ owner,
112
+ repo,
113
+ comment_id: existingComment.id,
114
+ body,
115
+ })
116
+ } else {
117
+ // Create new comment
118
+ await this.github.rest.issues.createComment({
119
+ owner,
120
+ repo,
121
+ issue_number: this.number,
122
+ body,
123
+ })
124
+ }
125
+ }
126
+
127
+ async fetchDeployments(): Promise<Deployment[]> {
128
+ if (!this.isActive) {
129
+ console.log('[skip] Not in a PR context, cannot fetch deployments')
130
+ return []
131
+ }
132
+ return await fetchPullRequestDeployments(
133
+ this.github,
134
+ this.context.repo.owner,
135
+ this.context.repo.repo,
136
+ this.number,
137
+ )
138
+ }
139
+
140
+ async deleteComment(id: string): Promise<void> {
141
+ if (!this.isActive) {
142
+ console.log('[skip] Not in a PR context, cannot delete comment')
143
+ return
144
+ }
145
+ const { owner, repo } = this.context.repo
146
+ const commentMarker = createCommentMarker(id)
147
+
148
+ // Find existing comment
149
+ const { data: comments } = await this.github.rest.issues.listComments({
150
+ owner,
151
+ repo,
152
+ issue_number: this.number,
153
+ per_page: 100,
154
+ })
155
+
156
+ const existingComment = comments.find(comment => comment.body?.includes(commentMarker))
157
+
158
+ if (existingComment) {
159
+ await this.github.rest.issues.deleteComment({
160
+ owner,
161
+ repo,
162
+ comment_id: existingComment.id,
163
+ })
164
+ }
165
+ }
166
+
167
+ // async getComments(): Promise<Array<{ id: number; body: string; created_at: string }>> {
168
+ // const { owner, repo } = this.context.repo
169
+
170
+ // const { data: comments } = await this.github.rest.issues.listComments({
171
+ // owner,
172
+ // repo,
173
+ // issue_number: this.number,
174
+ // per_page: 100,
175
+ // })
176
+
177
+ // return comments.map(comment => ({
178
+ // id: comment.id,
179
+ // body: comment.body || '',
180
+ // created_at: comment.created_at,
181
+ // }))
182
+ // }
183
+ }
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI for running workflow steps
4
+ *
5
+ * This is designed to be called from GitHub Actions workflows
6
+ * with our convention of steps being in .github/steps/<name>.ts
7
+ */
8
+
9
+ import * as core from '@actions/core'
10
+ import { runStep, runStepByName } from './runner.ts'
11
+
12
+ async function main() {
13
+ const stepName = process.argv[2]
14
+ const workflowName = process.argv[3]
15
+ const pathOverride = process.argv[4]
16
+ const inputsJson = process.argv[5] || '{}'
17
+ const previousJson = process.argv[7] || '{}'
18
+
19
+ if (!stepName) {
20
+ core.setFailed('Missing required step name parameter')
21
+ core.error(
22
+ 'Usage: run-step-cli <step-name> <workflow-name> [path-override] [inputs-json] [previous-json]',
23
+ )
24
+ core.error('This runner expects steps to be in .github/steps/<name>.ts')
25
+ process.exit(1)
26
+ }
27
+
28
+ // Module discovery is now handled by the runner
29
+
30
+ try {
31
+ core.info(`Running workflow step: ${stepName}`)
32
+
33
+ // Parse all inputs
34
+ const inputs = JSON.parse(inputsJson)
35
+ const previous = JSON.parse(previousJson)
36
+
37
+ // Debug logging
38
+ core.debug(`Parsed inputs: ${JSON.stringify(inputs)}`)
39
+ core.debug(`Parsed previous: ${JSON.stringify(previous)}`)
40
+
41
+ const mergedInputs = {
42
+ ...inputs,
43
+ previous,
44
+ }
45
+
46
+ core.debug(`Merged inputs: ${JSON.stringify(mergedInputs)}`)
47
+
48
+ // If path override is provided and not empty, use it directly
49
+ if (pathOverride && pathOverride !== '') {
50
+ await runStep(pathOverride, JSON.stringify(mergedInputs))
51
+ } else {
52
+ await runStepByName(stepName, workflowName, JSON.stringify(mergedInputs))
53
+ }
54
+ } catch (error) {
55
+ const message = error instanceof Error ? error.message : String(error)
56
+ const stack = error instanceof Error ? error.stack : undefined
57
+
58
+ core.error(`Failed to run step ${stepName}: ${message}`)
59
+ if (stack) {
60
+ core.error(`Stack trace:`)
61
+ core.error(stack)
62
+ }
63
+
64
+ core.error(`Step name: ${stepName}`)
65
+ core.error(`Workflow name: ${workflowName || 'none'}`)
66
+ core.error(`Path override: ${pathOverride || 'none'}`)
67
+ core.error(`Inputs: ${inputsJson}`)
68
+ core.error(`Previous: ${previousJson}`)
69
+
70
+ // Check for common issues
71
+ if (error instanceof Error) {
72
+ if (error.message.includes('Cannot find module')) {
73
+ core.error(`Module import error - check that all dependencies are installed`)
74
+ } else if (error.message.includes('SyntaxError')) {
75
+ core.error(`Syntax error in step file - check TypeScript compilation`)
76
+ }
77
+ }
78
+
79
+ core.setFailed(`Step execution failed: ${message}`)
80
+ process.exit(1)
81
+ }
82
+ }
83
+
84
+ main()
@@ -0,0 +1,192 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
2
+ import { z } from 'zod/v4'
3
+ import { runStep } from './runner.ts'
4
+ import { createStep } from './step.ts'
5
+
6
+ // Mock the discovery module
7
+ vi.mock('./discovery.ts')
8
+
9
+ // Mock @actions/core
10
+ vi.mock('@actions/core', () => ({
11
+ startGroup: vi.fn(),
12
+ endGroup: vi.fn(),
13
+ debug: vi.fn(),
14
+ info: vi.fn(),
15
+ warning: vi.fn(),
16
+ error: vi.fn(),
17
+ setOutput: vi.fn(),
18
+ setFailed: vi.fn(),
19
+ }))
20
+
21
+ // Mock GitHub context
22
+ vi.mock('@actions/github', () => ({
23
+ context: {
24
+ repo: { owner: 'test', repo: 'test' },
25
+ eventName: 'push',
26
+ payload: {},
27
+ },
28
+ getOctokit: vi.fn(() => ({
29
+ rest: {
30
+ issues: {
31
+ listComments: vi.fn().mockResolvedValue({ data: [] }),
32
+ createComment: vi.fn(),
33
+ updateComment: vi.fn(),
34
+ deleteComment: vi.fn(),
35
+ },
36
+ },
37
+ })),
38
+ }))
39
+
40
+ describe('runner', () => {
41
+ beforeEach(() => {
42
+ vi.clearAllMocks()
43
+ process.env['GITHUB_TOKEN'] = 'test-token'
44
+ })
45
+
46
+ describe('runStep', () => {
47
+ it('validates inputs before running step', async () => {
48
+ const TestStep = createStep({
49
+ name: 'test-step',
50
+ description: 'Test step',
51
+ inputs: z.object({
52
+ required: z.string(),
53
+ number: z.number(),
54
+ }),
55
+ outputs: z.object({ result: z.string() }),
56
+ async run({ inputs }) {
57
+ return { result: `Got ${inputs.required} and ${inputs.number}` }
58
+ },
59
+ })
60
+
61
+ // Mock the module import
62
+ vi.doMock('./test-step.ts', () => ({
63
+ default: TestStep,
64
+ }))
65
+
66
+ await runStep(
67
+ './test-step.ts',
68
+ JSON.stringify({
69
+ required: 'value',
70
+ number: 42,
71
+ }),
72
+ )
73
+
74
+ const core = await import('@actions/core')
75
+ expect(core.startGroup).toHaveBeenCalledWith('test-step: Test step')
76
+ expect(core.setOutput).toHaveBeenCalledWith('result', 'Got value and 42')
77
+ })
78
+
79
+ it('handles validation errors', async () => {
80
+ const TestStep = createStep({
81
+ name: 'test-step',
82
+ description: 'Test step',
83
+ inputs: z.object({
84
+ required: z.string(),
85
+ number: z.number(),
86
+ }),
87
+ outputs: z.object({ result: z.string() }),
88
+ async run() {
89
+ return { result: 'ok' }
90
+ },
91
+ })
92
+
93
+ vi.doMock('./test-step.ts', () => ({
94
+ default: TestStep,
95
+ }))
96
+
97
+ const core = await import('@actions/core')
98
+
99
+ await expect(runStep(
100
+ './test-step.ts',
101
+ JSON.stringify({
102
+ required: 'value',
103
+ number: 'not-a-number', // Invalid type
104
+ }),
105
+ )).rejects.toThrow()
106
+
107
+ expect(core.error).toHaveBeenCalledWith(
108
+ expect.stringContaining('Validation error in step test-step'),
109
+ )
110
+ })
111
+
112
+ it('warns about unknown inputs', async () => {
113
+ const TestStep = createStep({
114
+ name: 'test-step',
115
+ description: 'Test step',
116
+ inputs: z.object({
117
+ known: z.string(),
118
+ }),
119
+ outputs: z.object({ result: z.string() }),
120
+ async run({ inputs }) {
121
+ return { result: inputs.known }
122
+ },
123
+ })
124
+
125
+ vi.doMock('./test-step.ts', () => ({
126
+ default: TestStep,
127
+ }))
128
+
129
+ await runStep(
130
+ './test-step.ts',
131
+ JSON.stringify({
132
+ known: 'value',
133
+ unknown1: 'should-warn',
134
+ unknown2: 'also-warn',
135
+ }),
136
+ )
137
+
138
+ const core = await import('@actions/core')
139
+ expect(core.warning).toHaveBeenCalledWith(
140
+ `Step 'test-step' received unknown inputs: unknown1, unknown2. These inputs will be ignored.`,
141
+ )
142
+ })
143
+
144
+ it('validates and exports outputs', async () => {
145
+ const TestStep = createStep({
146
+ name: 'test-step',
147
+ description: 'Test step',
148
+ inputs: z.object({}),
149
+ outputs: z.object({
150
+ status: z.string(),
151
+ count: z.number(),
152
+ }),
153
+ async run() {
154
+ return { status: 'complete', count: 5 }
155
+ },
156
+ })
157
+
158
+ vi.doMock('./test-step.ts', () => ({
159
+ default: TestStep,
160
+ }))
161
+
162
+ await runStep('./test-step.ts', '{}')
163
+
164
+ const core = await import('@actions/core')
165
+ expect(core.setOutput).toHaveBeenCalledWith('status', 'complete')
166
+ expect(core.setOutput).toHaveBeenCalledWith('count', '5')
167
+ })
168
+
169
+ it('warns when step returns outputs without schema', async () => {
170
+ const TestStep = createStep({
171
+ name: 'test-step',
172
+ description: 'Test step',
173
+ inputs: z.object({}),
174
+ // No outputs schema defined
175
+ async run() {
176
+ return { unexpected: 'output' } as any
177
+ },
178
+ })
179
+
180
+ vi.doMock('./test-step.ts', () => ({
181
+ default: TestStep,
182
+ }))
183
+
184
+ await runStep('./test-step.ts', '{}')
185
+
186
+ const core = await import('@actions/core')
187
+ expect(core.warning).toHaveBeenCalledWith(
188
+ expect.stringContaining('Step did not define outputs schema, but returned outputs'),
189
+ )
190
+ })
191
+ })
192
+ })
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Runner utilities for executing workflow steps in GitHub Actions
3
+ */
4
+
5
+ import * as core from '@actions/core'
6
+ import { context, getOctokit } from '@actions/github'
7
+ import { Obj, Path, Str } from '@wollybeard/kit'
8
+ import { promises as fs } from 'node:fs'
9
+ import { z } from 'zod/v4'
10
+ import { $ } from 'zx'
11
+ import { createGitController } from './git-controller.ts'
12
+ import { createPullRequestController } from './pr-controller.ts'
13
+ import { searchModule } from './search-module.ts'
14
+ import type { Args, Step } from './step.ts'
15
+
16
+ /**
17
+ * Create a workflow context with all necessary tools
18
+ */
19
+ export function createArgs(stepName: string): Args {
20
+ const githubToken = process.env['GITHUB_TOKEN']
21
+ if (!githubToken) {
22
+ throw new Error('GITHUB_TOKEN environment variable is required')
23
+ }
24
+
25
+ const github = getOctokit(githubToken)
26
+ const pr = createPullRequestController(github, context, stepName)
27
+ const git = createGitController($)
28
+
29
+ return {
30
+ core,
31
+ github,
32
+ context,
33
+ $,
34
+ fs,
35
+ pr,
36
+ git,
37
+ inputs: {},
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Run a workflow step by name using discovery
43
+ */
44
+ export async function runStepByName(
45
+ stepName: string,
46
+ workflowName?: string,
47
+ inputsJson?: string,
48
+ ): Promise<void> {
49
+ // Discover the step module
50
+ const moduleLocation = searchModule({ stepName, workflowName })
51
+
52
+ if (!moduleLocation.found || !moduleLocation.path) {
53
+ core.error(`Step '${stepName}' not found`)
54
+ core.error(`Searched paths:`)
55
+ moduleLocation.searchedPaths.forEach(path => core.error(` - ${path}`))
56
+ throw new Error(`Step '${stepName}' not found`)
57
+ }
58
+
59
+ core.debug(`Found step at: ${moduleLocation.path}`)
60
+ await runStep(moduleLocation.path, inputsJson)
61
+ }
62
+
63
+ /**
64
+ * Run a workflow step by importing it from a path
65
+ */
66
+ export async function runStep(
67
+ stepPath: string,
68
+ inputsJson?: string,
69
+ ): Promise<void> {
70
+ const rawInputs = inputsJson ? JSON.parse(inputsJson) : {}
71
+
72
+ try {
73
+ // Dynamically import the step module
74
+ let stepModule: any
75
+
76
+ // Check if this is a test scenario (mocked module)
77
+ if (process.env['NODE_ENV'] === 'test' && stepPath.startsWith('./test-')) {
78
+ // For tests, use direct import path
79
+ stepModule = await import(stepPath)
80
+ } else {
81
+ // For real usage, convert to absolute path
82
+ const { resolve } = await import('node:path')
83
+ const { pathToFileURL } = await import('node:url')
84
+
85
+ // Resolve to absolute path and convert to file URL for proper ESM import
86
+ const absolutePath = resolve(process.cwd(), stepPath)
87
+ const importUrl = pathToFileURL(absolutePath).href
88
+
89
+ stepModule = await import(importUrl)
90
+ }
91
+
92
+ const step: Step = stepModule.default
93
+
94
+ if (!step || !step.run || !step.definition) {
95
+ throw new Error(`Module at ${stepPath} does not export a valid workflow step as default export`)
96
+ }
97
+
98
+ //
99
+ //
100
+ //
101
+ //
102
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Process Step Definition
103
+ // Validate Inputs
104
+ // Warning about excess properties
105
+ // Validate expected GitHub event versus actual
106
+ //
107
+ //
108
+
109
+ const { definition } = step
110
+ const stepName = definition.name ?? Path.parse(stepPath).name
111
+
112
+ // todo: allow step definition to opt-out of runtime validation
113
+ // Validate context if schema is provided
114
+ let validatedContext: any = context
115
+ if (definition.contextSchema) {
116
+ const contextValidation = definition.contextSchema.safeParse(context)
117
+ if (!contextValidation.success) {
118
+ const errorMessage = `Step '${stepName}' expects a different GitHub event context`
119
+ core.error(errorMessage)
120
+ core.error(`Expected context: ${JSON.stringify(contextValidation.error.issues, null, 2)}`)
121
+ core.error(`Actual event: ${context.eventName}`)
122
+
123
+ // For now, default to hard error. We can make this configurable later
124
+ throw new Error(errorMessage)
125
+ }
126
+ validatedContext = contextValidation.data
127
+ }
128
+
129
+ // Validate inputs
130
+ let inputs: Record<string, unknown> = {}
131
+ if (definition.inputsSchema) {
132
+ const parseResult = definition.inputsSchema.safeParse(rawInputs)
133
+ if (parseResult.success) {
134
+ inputs = parseResult.data
135
+ } else {
136
+ core.error(`Validation error in step ${stepName}: ${parseResult.error.message}`)
137
+ core.debug(`Validation issues: ${JSON.stringify(parseResult.error.issues, null, 2)}`)
138
+ core.debug(`Received data: ${JSON.stringify(rawInputs, null, 2)}`)
139
+ throw parseResult.error
140
+ }
141
+
142
+ // todo: let step define if it wants to silence this warning
143
+ // Check for excess properties if using object schema
144
+ if (definition.inputsSchema instanceof z.ZodObject && typeof rawInputs === 'object' && rawInputs !== null) {
145
+ const knownKeys = Object.keys(definition.inputsSchema.shape)
146
+ const providedKeys = Object.keys(rawInputs)
147
+ const unknownKeys = providedKeys.filter(key => !knownKeys.includes(key))
148
+
149
+ if (unknownKeys.length > 0) {
150
+ core.warning(
151
+ `Step '${stepName}' received unknown inputs: ${unknownKeys.join(', ')}. These inputs will be ignored.`,
152
+ )
153
+ core.debug(`Known inputs: ${knownKeys.join(', ')}`)
154
+ core.debug(`Provided inputs: ${JSON.stringify(rawInputs, null, 2)}`)
155
+ }
156
+ }
157
+ }
158
+
159
+ //
160
+ //
161
+ //
162
+ //
163
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Run Step
164
+ //
165
+ //
166
+
167
+ // Create context with validated inputs
168
+ const args = createArgs(stepName)
169
+ const stepArgs = {
170
+ ...args,
171
+ context: validatedContext,
172
+ inputs: inputs as any,
173
+ }
174
+
175
+ core.startGroup(`${definition.name}: ${definition.description}`)
176
+ core.debug(`Inputs: ${JSON.stringify(inputs)}`)
177
+
178
+ // Execute step
179
+ const outputRaw = await step.run(stepArgs)
180
+
181
+ //
182
+ //
183
+ //
184
+ //
185
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Handle Step Output
186
+ //
187
+ //
188
+
189
+ // Validate & Export outputs
190
+ // todo: allow step definition to opt-out of output validation
191
+ if (definition.outputsSchema) {
192
+ const outputs = definition.outputsSchema.parse(outputRaw)
193
+ const json = JSON.stringify(outputs)
194
+ core.setOutput('json', json)
195
+ for (const [key, value] of Obj.entries(outputs)) {
196
+ // todo: if key === json raise an error, it is a reserved name
197
+ core.setOutput(key, Str.is(value) ? value : JSON.stringify(value))
198
+ }
199
+ } else if (outputRaw !== undefined && outputRaw !== null) {
200
+ core.warning(
201
+ `Step did not define outputs schema, but returned outputs. These will not be validated or exported. Outputs were: ${
202
+ JSON.stringify(outputRaw)
203
+ }`,
204
+ )
205
+ }
206
+
207
+ core.endGroup()
208
+ } catch (error) {
209
+ core.endGroup()
210
+
211
+ // Log error details once (if not already logged)
212
+ if (error instanceof Error && !(error instanceof z.ZodError)) {
213
+ core.error(`Step failed: ${error.message}`)
214
+ core.debug(`Stack: ${error.stack}`)
215
+ } else if (!(error instanceof z.ZodError)) {
216
+ core.error(`Step failed: ${String(error)}`)
217
+ }
218
+
219
+ if (inputsJson) {
220
+ core.debug(`Step inputs: ${inputsJson}`)
221
+ }
222
+
223
+ // Re-throw to let CLI handle the error
224
+ throw error
225
+ }
226
+ }