void 0.1.6 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/AGENT_PROMPT.md +15 -0
  2. package/README.md +62 -123
  3. package/dist/auth-BdsJ0Aff.d.mts +43 -0
  4. package/dist/auth-cmd-Dx8oPKZC.mjs +43 -0
  5. package/dist/auth-migrations-BAtAck2g.mjs +117 -0
  6. package/dist/better-auth-shared-C9_GHSkR.d.mts +71 -0
  7. package/dist/better-auth-shared-CdYmQGry.mjs +163 -0
  8. package/dist/cache-W82I8ihI.mjs +47 -0
  9. package/dist/cancel-deploy-BOBTqqh0.mjs +59 -0
  10. package/dist/cf-access-Dee5cXxL.mjs +22 -0
  11. package/dist/chunk-DJd-R1mw.mjs +34 -0
  12. package/dist/cli/cli.d.mts +1 -0
  13. package/dist/cli/cli.mjs +1807 -0
  14. package/dist/client-snXOjrp1.mjs +565 -0
  15. package/dist/collect-CjeZgz5D.mjs +55 -0
  16. package/dist/config-BIa9HwVX.mjs +573 -0
  17. package/dist/config-BzM9Dy7T.mjs +37 -0
  18. package/dist/config-CvHtTM0q.mjs +30 -0
  19. package/dist/create-project-BIA15W7z.mjs +90 -0
  20. package/dist/db-DsRoMcfN.mjs +895 -0
  21. package/dist/defer-DcxEsVH1.mjs +49 -0
  22. package/dist/delete-DAP6yDc7.mjs +64 -0
  23. package/dist/deploy-BPKblFx6.mjs +2424 -0
  24. package/dist/discover-B7FkXBLB.mjs +40 -0
  25. package/dist/dist-DUyXJLkq.mjs +2667 -0
  26. package/dist/dist-Dayj3gCK.mjs +1287 -0
  27. package/dist/domain-BGofcQ6I.mjs +79 -0
  28. package/dist/dotenv-DwO4ti0Z.mjs +173 -0
  29. package/dist/drizzle-NnudE_UN.mjs +232 -0
  30. package/dist/env-CyG3tvU0.mjs +301 -0
  31. package/dist/env-helpers-Dr9Y7RnE.d.mts +52 -0
  32. package/dist/env-raw-BDL4TvdN.mjs +32 -0
  33. package/dist/env-types-DknSA4SO.mjs +64 -0
  34. package/dist/env-validation-DJKjR_8q.mjs +163 -0
  35. package/dist/fetch-error-BQ8sZ5Nd.mjs +266 -0
  36. package/dist/fetch-error-CVZ5CGA-.d.mts +20 -0
  37. package/dist/gen-U0Ktr4Zd.mjs +761 -0
  38. package/dist/handler-B0ds0OHJ.d.mts +269 -0
  39. package/dist/head-P-egrtFE.d.mts +45 -0
  40. package/dist/headers-DCXc7mDs.mjs +279 -0
  41. package/dist/index.d.mts +32 -0
  42. package/dist/index.mjs +4695 -0
  43. package/dist/init-C7wS5iGP.mjs +2625 -0
  44. package/dist/link-p2R6NbgN.mjs +49 -0
  45. package/dist/list-Bfel-QLc.mjs +113 -0
  46. package/dist/log-DXdqnmhF.mjs +26 -0
  47. package/dist/login-CkcXUiIu.mjs +72 -0
  48. package/dist/logs-DmkrRvx6.mjs +98 -0
  49. package/dist/magic-string.es-D6g9UnIy.mjs +1011 -0
  50. package/dist/mcp-CaQzfeUi.mjs +373 -0
  51. package/dist/node-DDfXj10V.mjs +54 -0
  52. package/dist/output-BwlcIYSR.mjs +139 -0
  53. package/dist/pages/client.d.mts +198 -0
  54. package/dist/pages/client.mjs +980 -0
  55. package/dist/pages/head-client.d.mts +15 -0
  56. package/dist/pages/head-client.mjs +90 -0
  57. package/dist/pages/head.d.mts +2 -0
  58. package/dist/pages/head.mjs +112 -0
  59. package/dist/pages/index.d.mts +38 -0
  60. package/dist/pages/index.mjs +76 -0
  61. package/dist/pages/islands-plugin.d.mts +50 -0
  62. package/dist/pages/islands-plugin.mjs +195 -0
  63. package/dist/pages/prefetch.d.mts +31 -0
  64. package/dist/pages/prefetch.mjs +90 -0
  65. package/dist/pages/protocol.d.mts +3 -0
  66. package/dist/pages/protocol.mjs +193 -0
  67. package/dist/pages/serialize.d.mts +10 -0
  68. package/dist/pages/serialize.mjs +14 -0
  69. package/dist/pathe.M-eThtNZ-D-kmWkCS.mjs +150 -0
  70. package/dist/plugin-inference-oZ6Ybu2_.mjs +2447 -0
  71. package/dist/prepare-BAtWufvm.mjs +99 -0
  72. package/dist/preset-D4I73kT4.mjs +221 -0
  73. package/dist/project-TqORyHn8.mjs +72 -0
  74. package/dist/project-cmd-B7lQp3F3.mjs +67 -0
  75. package/dist/project-slug-CKam8lF9.mjs +11 -0
  76. package/dist/project-tsconfig-DfkESbDL.mjs +63 -0
  77. package/dist/protocol-BWzXs2A2.d.mts +34 -0
  78. package/dist/providers-B3aMxWzP.mjs +67 -0
  79. package/dist/resolve-project-Br5BR03U.mjs +29 -0
  80. package/dist/rollback-gyC59l7U.mjs +92 -0
  81. package/dist/route-types-DReF1gUY.mjs +255 -0
  82. package/dist/routes-stub.d.mts +55 -0
  83. package/dist/routes-stub.mjs +1 -0
  84. package/dist/runner-6Ep3fNQu.mjs +123 -0
  85. package/dist/runner-pg-D0wWHYnr.mjs +57 -0
  86. package/dist/runtime/ai.d.mts +127 -0
  87. package/dist/runtime/ai.mjs +348 -0
  88. package/dist/runtime/auth-client-react.d.mts +8 -0
  89. package/dist/runtime/auth-client-react.mjs +6 -0
  90. package/dist/runtime/auth-client-solid.d.mts +8 -0
  91. package/dist/runtime/auth-client-solid.mjs +6 -0
  92. package/dist/runtime/auth-client-svelte.d.mts +8 -0
  93. package/dist/runtime/auth-client-svelte.mjs +6 -0
  94. package/dist/runtime/auth-client-vue.d.mts +8 -0
  95. package/dist/runtime/auth-client-vue.mjs +6 -0
  96. package/dist/runtime/auth-client.d.mts +8 -0
  97. package/dist/runtime/auth-client.mjs +6 -0
  98. package/dist/runtime/auth.d.mts +2 -0
  99. package/dist/runtime/auth.mjs +22 -0
  100. package/dist/runtime/better-auth-pg.d.mts +11 -0
  101. package/dist/runtime/better-auth-pg.mjs +51 -0
  102. package/dist/runtime/better-auth.d.mts +11 -0
  103. package/dist/runtime/better-auth.mjs +33 -0
  104. package/dist/runtime/client.d.mts +6 -0
  105. package/dist/runtime/client.mjs +5 -0
  106. package/dist/runtime/db-pg.d.mts +2 -0
  107. package/dist/runtime/db-pg.mjs +1 -0
  108. package/dist/runtime/db.d.mts +17 -0
  109. package/dist/runtime/db.mjs +30 -0
  110. package/dist/runtime/drizzle-arktype.d.mts +1 -0
  111. package/dist/runtime/drizzle-arktype.mjs +2 -0
  112. package/dist/runtime/drizzle-valibot.d.mts +1 -0
  113. package/dist/runtime/drizzle-valibot.mjs +2 -0
  114. package/dist/runtime/drizzle-zod.d.mts +1 -0
  115. package/dist/runtime/drizzle-zod.mjs +2 -0
  116. package/dist/runtime/env-helpers.d.mts +2 -0
  117. package/dist/runtime/env-helpers.mjs +173 -0
  118. package/dist/runtime/env-public-client.d.mts +22 -0
  119. package/dist/runtime/env-public-client.mjs +54 -0
  120. package/dist/runtime/env-public.d.mts +143 -0
  121. package/dist/runtime/env-public.mjs +366 -0
  122. package/dist/runtime/env.d.mts +13 -0
  123. package/dist/runtime/env.mjs +51 -0
  124. package/dist/runtime/fetch-stream.d.mts +51 -0
  125. package/dist/runtime/fetch-stream.mjs +81 -0
  126. package/dist/runtime/fetch.d.mts +59 -0
  127. package/dist/runtime/fetch.mjs +18 -0
  128. package/dist/runtime/handler.d.mts +3 -0
  129. package/dist/runtime/handler.mjs +85 -0
  130. package/dist/runtime/isr.d.mts +26 -0
  131. package/dist/runtime/isr.mjs +43 -0
  132. package/dist/runtime/kv.d.mts +48 -0
  133. package/dist/runtime/kv.mjs +106 -0
  134. package/dist/runtime/log.d.mts +24 -0
  135. package/dist/runtime/log.mjs +31 -0
  136. package/dist/runtime/migration-handler-pg.d.mts +6 -0
  137. package/dist/runtime/migration-handler-pg.mjs +85 -0
  138. package/dist/runtime/migration-handler.d.mts +19 -0
  139. package/dist/runtime/migration-handler.mjs +92 -0
  140. package/dist/runtime/queues.d.mts +7 -0
  141. package/dist/runtime/queues.mjs +8 -0
  142. package/dist/runtime/remote/binding-handler.d.mts +15 -0
  143. package/dist/runtime/remote/binding-handler.mjs +208 -0
  144. package/dist/runtime/remote/index.d.mts +8 -0
  145. package/dist/runtime/remote/index.mjs +461 -0
  146. package/dist/runtime/response.d.mts +14 -0
  147. package/dist/runtime/response.mjs +30 -0
  148. package/dist/runtime/sandbox.d.mts +17 -0
  149. package/dist/runtime/sandbox.mjs +19 -0
  150. package/dist/runtime/schema-d1.d.mts +1 -0
  151. package/dist/runtime/schema-d1.mjs +2 -0
  152. package/dist/runtime/schema-pg.d.mts +1 -0
  153. package/dist/runtime/schema-pg.mjs +2 -0
  154. package/dist/runtime/seed.d.mts +30 -0
  155. package/dist/runtime/seed.mjs +6 -0
  156. package/dist/runtime/storage.d.mts +7 -0
  157. package/dist/runtime/storage.mjs +14 -0
  158. package/dist/runtime/validator.d.mts +2 -0
  159. package/dist/runtime/validator.mjs +72 -0
  160. package/dist/runtime/ws-server.d.mts +26 -0
  161. package/dist/runtime/ws-server.mjs +296 -0
  162. package/dist/runtime/ws.d.mts +123 -0
  163. package/dist/runtime/ws.mjs +103 -0
  164. package/dist/scan-Ba4hFwlH.mjs +324 -0
  165. package/dist/scan-C6HMEIdW.mjs +318 -0
  166. package/dist/secret-CeRSukgM.mjs +109 -0
  167. package/dist/skills-ipldjlKE.mjs +62 -0
  168. package/dist/standard-schema-9CRjx-uR.d.mts +42 -0
  169. package/dist/subcommand-prompt-BKjuNAPb.mjs +349 -0
  170. package/dist/sveltekit.d.mts +20 -0
  171. package/dist/sveltekit.mjs +61 -0
  172. package/dist/types-mHOEwpW4.d.mts +57 -0
  173. package/dist/validate-CaMavMxu.mjs +146 -0
  174. package/dist/yarn-pnp-BFqMV_bl.mjs +196 -0
  175. package/getting-started-prompt.txt +26 -0
  176. package/package.json +322 -30
  177. package/schema.json +364 -0
  178. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
  179. package/skills/void/SKILL.md +75 -0
  180. package/skills/void/command/void.md +7 -0
  181. package/skills/void/docs/guide/ai.md +235 -0
  182. package/skills/void/docs/guide/app-types.md +103 -0
  183. package/skills/void/docs/guide/auth.md +257 -0
  184. package/skills/void/docs/guide/database/d1.md +106 -0
  185. package/skills/void/docs/guide/database/postgresql.md +106 -0
  186. package/skills/void/docs/guide/database.md +418 -0
  187. package/skills/void/docs/guide/deployment.md +98 -0
  188. package/skills/void/docs/guide/edge/headers.md +79 -0
  189. package/skills/void/docs/guide/edge/prerendering.md +83 -0
  190. package/skills/void/docs/guide/edge/redirects.md +116 -0
  191. package/skills/void/docs/guide/edge/revalidation.md +131 -0
  192. package/skills/void/docs/guide/edge/rewrites.md +354 -0
  193. package/skills/void/docs/guide/edge/static-assets.md +72 -0
  194. package/skills/void/docs/guide/env-vars.md +298 -0
  195. package/skills/void/docs/guide/index.md +80 -0
  196. package/skills/void/docs/guide/jobs.md +91 -0
  197. package/skills/void/docs/guide/kv.md +107 -0
  198. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +419 -0
  199. package/skills/void/docs/guide/pages-routing/head.md +130 -0
  200. package/skills/void/docs/guide/pages-routing/islands.md +405 -0
  201. package/skills/void/docs/guide/pages-routing/layouts.md +362 -0
  202. package/skills/void/docs/guide/pages-routing/loaders.md +267 -0
  203. package/skills/void/docs/guide/pages-routing/markdown.md +625 -0
  204. package/skills/void/docs/guide/pages-routing/overview.md +236 -0
  205. package/skills/void/docs/guide/pages-routing/view-transitions.md +140 -0
  206. package/skills/void/docs/guide/queues.md +140 -0
  207. package/skills/void/docs/guide/quickstart.md +233 -0
  208. package/skills/void/docs/guide/remote-dev.md +67 -0
  209. package/skills/void/docs/guide/sandboxes.md +82 -0
  210. package/skills/void/docs/guide/server-routing.md +246 -0
  211. package/skills/void/docs/guide/ssg.md +74 -0
  212. package/skills/void/docs/guide/ssr.md +105 -0
  213. package/skills/void/docs/guide/storage.md +67 -0
  214. package/skills/void/docs/guide/type-safety.md +179 -0
  215. package/skills/void/docs/guide/typed-fetch.md +113 -0
  216. package/skills/void/docs/guide/websockets.md +190 -0
  217. package/skills/void/docs/index.md +48 -0
  218. package/skills/void/docs/integrations/agents.md +84 -0
  219. package/skills/void/docs/integrations/cloudflare.md +284 -0
  220. package/skills/void/docs/integrations/frameworks/analog.md +182 -0
  221. package/skills/void/docs/integrations/frameworks/astro.md +197 -0
  222. package/skills/void/docs/integrations/frameworks/nuxt.md +164 -0
  223. package/skills/void/docs/integrations/frameworks/overview.md +136 -0
  224. package/skills/void/docs/integrations/frameworks/react-router.md +137 -0
  225. package/skills/void/docs/integrations/frameworks/sveltekit.md +191 -0
  226. package/skills/void/docs/integrations/frameworks/tanstack-start.md +140 -0
  227. package/skills/void/docs/integrations/hono.md +97 -0
  228. package/skills/void/docs/integrations/nodejs-bun-deno.md +210 -0
  229. package/skills/void/docs/node_modules/@iconify/vue/README.md +408 -0
  230. package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +5 -0
  231. package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +103 -0
  232. package/skills/void/docs/node_modules/oxc-minify/README.md +78 -0
  233. package/skills/void/docs/node_modules/reka-ui/README.md +80 -0
  234. package/skills/void/docs/node_modules/vitepress/README.md +28 -0
  235. package/skills/void/docs/node_modules/vitepress/template/api-examples.md +49 -0
  236. package/skills/void/docs/node_modules/vitepress/template/index.md +28 -0
  237. package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +85 -0
  238. package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +101 -0
  239. package/skills/void/docs/node_modules/void/AGENTS.md +204 -0
  240. package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +15 -0
  241. package/skills/void/docs/node_modules/void/README.md +89 -0
  242. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +591 -0
  243. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +375 -0
  244. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +174 -0
  245. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +37 -0
  246. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +135 -0
  247. package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +189 -0
  248. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +143 -0
  249. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +1272 -0
  250. package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +19 -0
  251. package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +15 -0
  252. package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +15 -0
  253. package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +15 -0
  254. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +22 -0
  255. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +69 -0
  256. package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +152 -0
  257. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +9 -0
  258. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +9 -0
  259. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +15 -0
  260. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +24 -0
  261. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +565 -0
  262. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +124 -0
  263. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +600 -0
  264. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +386 -0
  265. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +95 -0
  266. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +101 -0
  267. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathe/README.md +73 -0
  268. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +15 -0
  269. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +25 -0
  270. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tsdown/README.md +55 -0
  271. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/LICENSE.md +2230 -0
  272. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/README.md +20 -0
  273. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +58 -0
  274. package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +165 -0
  275. package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +20 -0
  276. package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +32 -0
  277. package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +99 -0
  278. package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +108 -0
  279. package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +51 -0
  280. package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +79 -0
  281. package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +44 -0
  282. package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +51 -0
  283. package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +65 -0
  284. package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +390 -0
  285. package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +48 -0
  286. package/skills/void/docs/node_modules/void/node_modules/hono/README.md +85 -0
  287. package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +452 -0
  288. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +76 -0
  289. package/{LICENSE → skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md} +21 -21
  290. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +364 -0
  291. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +41 -0
  292. package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +325 -0
  293. package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +398 -0
  294. package/skills/void/docs/node_modules/void/node_modules/pathe/README.md +73 -0
  295. package/skills/void/docs/node_modules/void/node_modules/pg/README.md +95 -0
  296. package/skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md +21 -0
  297. package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +135 -0
  298. package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +21 -0
  299. package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +25 -0
  300. package/skills/void/docs/node_modules/void/node_modules/tsdown/README.md +55 -0
  301. package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +9 -0
  302. package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +94 -0
  303. package/skills/void/docs/node_modules/void/node_modules/vite/LICENSE.md +2230 -0
  304. package/skills/void/docs/node_modules/void/node_modules/vite/README.md +20 -0
  305. package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +63 -0
  306. package/skills/void/docs/node_modules/void/node_modules/zod/README.md +191 -0
  307. package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
  308. package/skills/void/docs/node_modules/void/skills/void/SKILL.md +75 -0
  309. package/skills/void/docs/node_modules/void/skills/void/command/void.md +7 -0
  310. package/skills/void/docs/reference/api.md +917 -0
  311. package/skills/void/docs/reference/cli.md +561 -0
  312. package/skills/void/docs/reference/config.md +408 -0
  313. package/skills/void/docs/reference/resource-inference.md +149 -0
  314. package/skills/void/docs/reference/structure.md +176 -0
  315. package/.npmignore +0 -29
  316. package/.travis.yml +0 -9
  317. package/favicon.ico +0 -0
  318. package/index.js +0 -14
  319. package/lib/Job.js +0 -150
  320. package/lib/Void.js +0 -99
  321. package/lib/scan.js +0 -19
  322. package/test/credentials.js +0 -20
  323. package/test/job.js +0 -64
  324. package/test/static/dir1/test6.html +0 -0
  325. package/test/static/dir2/test7.html +0 -0
  326. package/test/static/dir2/test8.html +0 -0
  327. package/test/static/dir2/test9.html +0 -0
  328. package/test/static/test1.html +0 -0
  329. package/test/static/test2.html +0 -0
  330. package/test/static/test3.html +0 -0
  331. package/test/void.js +0 -31
  332. /package/{test/static/dir1/test4.html → skills/void/docs/integrations/auth-providers.md} +0 -0
  333. /package/{test/static/dir1/test5.html → skills/void/docs/integrations/payment-processors.md} +0 -0
@@ -0,0 +1,761 @@
1
+ import { a as join, n as dirname, o as relative } from "./pathe.M-eThtNZ-D-kmWkCS.mjs";
2
+ import { n as cliTitle } from "./output-BwlcIYSR.mjs";
3
+ import { _ as me, c as R, g as ge, i as Ee, x as q, y as ye } from "./dist-Dayj3gCK.mjs";
4
+ import { c as getDatabaseDialect, f as readConfig } from "./config-BIa9HwVX.mjs";
5
+ import { n as ensureProjectTsconfig } from "./project-tsconfig-DfkESbDL.mjs";
6
+ import { n as writeDrizzleConfig } from "./config-BzM9Dy7T.mjs";
7
+ import { r as readJournal, t as collectMigrations } from "./collect-CjeZgz5D.mjs";
8
+ import { n as listDrizzleArtifacts, t as assertJournalCoherence } from "./validate-CaMavMxu.mjs";
9
+ import { t as buildDrizzleKitSpawnEnv } from "./yarn-pnp-BFqMV_bl.mjs";
10
+ import { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from "node:fs";
11
+ import { fileURLToPath } from "node:url";
12
+ import { spawnSync } from "node:child_process";
13
+ //#region src/cli/gen.ts
14
+ const drizzleKitBin = join(fileURLToPath(import.meta.resolve("drizzle-kit")), "..", "bin.cjs");
15
+ async function runGenCommand(root, args) {
16
+ console.log();
17
+ ge(cliTitle("gen"));
18
+ if (args.subcommand === "model") await runModel(root, args.name, args.columns);
19
+ else if (args.subcommand === "migration") runMigration(root, args.name);
20
+ else if (args.subcommand === "route") runRoute(root, args.path, args.methods);
21
+ else if (args.subcommand === "middleware") runMiddleware(root, args.name);
22
+ else if (args.subcommand === "cron") runCron(root, args.name);
23
+ else if (args.subcommand === "queue") runQueue(root, args.name);
24
+ else runSsr(root, args.framework);
25
+ }
26
+ function writeIfNotExists(filePath, content) {
27
+ if (existsSync(filePath)) {
28
+ R.warn(`Skipped (already exists): ${filePath}`);
29
+ return false;
30
+ }
31
+ mkdirSync(dirname(filePath), { recursive: true });
32
+ writeFileSync(filePath, content);
33
+ R.success(`Created ${filePath}`);
34
+ return true;
35
+ }
36
+ function formatTimestamp(date) {
37
+ const pad = (n) => String(n).padStart(2, "0");
38
+ return String(date.getUTCFullYear()) + pad(date.getUTCMonth() + 1) + pad(date.getUTCDate()) + pad(date.getUTCHours()) + pad(date.getUTCMinutes()) + pad(date.getUTCSeconds());
39
+ }
40
+ function getMigrationTimestamp(migrationsDir) {
41
+ const now = /* @__PURE__ */ new Date();
42
+ let ts = formatTimestamp(now);
43
+ while (readdirSync(migrationsDir).some((f) => f.startsWith(ts + "_"))) {
44
+ now.setSeconds(now.getSeconds() + 1);
45
+ ts = formatTimestamp(now);
46
+ }
47
+ return ts;
48
+ }
49
+ function getNextMiddlewareNumber(middlewareDir) {
50
+ if (!existsSync(middlewareDir)) return "01";
51
+ const files = readdirSync(middlewareDir);
52
+ let max = 0;
53
+ for (const file of files) {
54
+ const match = file.match(/^(\d+)\./);
55
+ if (match) max = Math.max(max, Number(match[1]));
56
+ }
57
+ return String(max + 1).padStart(2, "0");
58
+ }
59
+ function drizzleColumnDef(col) {
60
+ const { name, type } = col;
61
+ switch (type) {
62
+ case "string":
63
+ case "text": return ` ${name}: text("${name}").notNull(),`;
64
+ case "integer": return ` ${name}: integer("${name}").notNull(),`;
65
+ case "boolean": return ` ${name}: integer("${name}", { mode: "boolean" }).notNull().default(false),`;
66
+ case "real": return ` ${name}: real("${name}").notNull(),`;
67
+ default: return ` ${name}: text("${name}"),`;
68
+ }
69
+ }
70
+ function drizzleImportsForColumns(columns) {
71
+ const types = new Set(["text", "integer"]);
72
+ for (const col of columns) switch (col.type) {
73
+ case "string":
74
+ case "text":
75
+ types.add("text");
76
+ break;
77
+ case "integer":
78
+ types.add("integer");
79
+ break;
80
+ case "boolean":
81
+ types.add("integer");
82
+ break;
83
+ case "real":
84
+ types.add("real");
85
+ break;
86
+ default: types.add("text");
87
+ }
88
+ return [...types].sort();
89
+ }
90
+ function drizzleColumnDefPg(col) {
91
+ const { name, type } = col;
92
+ switch (type) {
93
+ case "string":
94
+ case "text": return ` ${name}: text("${name}").notNull(),`;
95
+ case "integer": return ` ${name}: integer("${name}").notNull(),`;
96
+ case "boolean": return ` ${name}: boolean("${name}").notNull().default(false),`;
97
+ case "real": return ` ${name}: doublePrecision("${name}").notNull(),`;
98
+ default: return ` ${name}: text("${name}"),`;
99
+ }
100
+ }
101
+ function drizzleImportsForColumnsPg(columns) {
102
+ const types = new Set([
103
+ "text",
104
+ "serial",
105
+ "timestamp"
106
+ ]);
107
+ for (const col of columns) switch (col.type) {
108
+ case "string":
109
+ case "text":
110
+ types.add("text");
111
+ break;
112
+ case "integer":
113
+ types.add("integer");
114
+ break;
115
+ case "boolean":
116
+ types.add("boolean");
117
+ break;
118
+ case "real":
119
+ types.add("doublePrecision");
120
+ break;
121
+ default: types.add("text");
122
+ }
123
+ return [...types].sort();
124
+ }
125
+ function detectValidator(root) {
126
+ const pkgPath = join(root, "package.json");
127
+ if (!existsSync(pkgPath)) return null;
128
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
129
+ const allDeps = {
130
+ ...pkg.dependencies,
131
+ ...pkg.devDependencies
132
+ };
133
+ if ("valibot" in allDeps) return "valibot";
134
+ if ("zod" in allDeps) return "zod";
135
+ if ("arktype" in allDeps) return "arktype";
136
+ return null;
137
+ }
138
+ async function resolveValidator(root) {
139
+ const detected = detectValidator(root);
140
+ if (detected) {
141
+ R.info(`Detected validator: ${detected}`);
142
+ return detected;
143
+ }
144
+ const choice = await Ee({
145
+ message: "No validation library detected. Which would you like to use?",
146
+ options: [
147
+ {
148
+ value: "valibot",
149
+ label: "Valibot"
150
+ },
151
+ {
152
+ value: "zod",
153
+ label: "Zod"
154
+ },
155
+ {
156
+ value: "arktype",
157
+ label: "ArkType"
158
+ },
159
+ {
160
+ value: "none",
161
+ label: "No validation"
162
+ }
163
+ ]
164
+ });
165
+ if (q(choice)) {
166
+ me("Cancelled.");
167
+ process.exit(0);
168
+ }
169
+ if (choice !== "none") R.warn(`Remember to install ${choice}: npm install ${choice}`);
170
+ return choice;
171
+ }
172
+ function validatorTypeFor(validator, col) {
173
+ if (validator === "valibot") return valibotType(col);
174
+ if (validator === "zod") return zodType(col);
175
+ return arktypeType(col);
176
+ }
177
+ function valibotType(col) {
178
+ let base;
179
+ switch (col.type) {
180
+ case "string":
181
+ case "text":
182
+ case "datetime":
183
+ base = "v.string()";
184
+ break;
185
+ case "integer":
186
+ case "real":
187
+ base = "v.number()";
188
+ break;
189
+ case "boolean":
190
+ base = "v.boolean()";
191
+ break;
192
+ case "blob":
193
+ base = "v.instance(Blob)";
194
+ break;
195
+ default: base = "v.string()";
196
+ }
197
+ return col.nullable ? `v.optional(${base})` : base;
198
+ }
199
+ function zodType(col) {
200
+ let base;
201
+ switch (col.type) {
202
+ case "string":
203
+ case "text":
204
+ case "datetime":
205
+ base = "z.string()";
206
+ break;
207
+ case "integer":
208
+ case "real":
209
+ base = "z.number()";
210
+ break;
211
+ case "boolean":
212
+ base = "z.boolean()";
213
+ break;
214
+ case "blob":
215
+ base = "z.instanceof(Blob)";
216
+ break;
217
+ default: base = "z.string()";
218
+ }
219
+ return col.nullable ? `${base}.optional()` : base;
220
+ }
221
+ function arktypeType(col) {
222
+ let base;
223
+ switch (col.type) {
224
+ case "string":
225
+ case "text":
226
+ case "datetime":
227
+ base = "string";
228
+ break;
229
+ case "integer":
230
+ case "real":
231
+ base = "number";
232
+ break;
233
+ case "boolean":
234
+ base = "boolean";
235
+ break;
236
+ case "blob":
237
+ base = "instanceof Blob";
238
+ break;
239
+ default: base = "string";
240
+ }
241
+ return col.nullable ? `${base} | undefined` : base;
242
+ }
243
+ function getImportLine(validator) {
244
+ switch (validator) {
245
+ case "valibot": return "import * as v from \"valibot\";";
246
+ case "zod": return "import { z } from \"zod\";";
247
+ case "arktype": return "import { type } from \"arktype\";";
248
+ case "none": return null;
249
+ }
250
+ }
251
+ function getBodySchema(validator, columns) {
252
+ if (validator === "arktype") return `type({\n${columns.map((c) => ` ${c.name}: "${arktypeType(c)}",`).join("\n")}\n })`;
253
+ const fields = columns.map((c) => ` ${c.name}: ${validatorTypeFor(validator, c)},`).join("\n");
254
+ return `${validator === "valibot" ? "v" : "z"}.object({\n${fields}\n })`;
255
+ }
256
+ function getParamsSchema(validator) {
257
+ switch (validator) {
258
+ case "valibot": return "v.object({ id: v.string() })";
259
+ case "zod": return "z.object({ id: z.string() })";
260
+ case "arktype": return "type({ id: \"string\" })";
261
+ case "none": return "";
262
+ }
263
+ }
264
+ function generateIndexRoute(name, columns, validator) {
265
+ const imports = [
266
+ getImportLine(validator),
267
+ "import { defineHandler } from \"void\";",
268
+ "import { db } from \"void/db\";",
269
+ `import { ${name} } from "@schema";`
270
+ ].filter(Boolean).join("\n");
271
+ const insertFields = columns.map((c) => `${c.name}: body.${c.name}`).join(", ");
272
+ if (columns.length === 0 || validator === "none") {
273
+ if (columns.length > 0) return `import { defineHandler } from "void";
274
+ import { db } from "void/db";
275
+ import { ${name} } from "@schema";
276
+
277
+ export const GET = defineHandler(async () => {
278
+ return db.select().from(${name});
279
+ });
280
+
281
+ export const POST = defineHandler(async (c) => {
282
+ const body = await c.req.json();
283
+ await db.insert(${name}).values({ ${insertFields} });
284
+ return { created: true };
285
+ });
286
+ `;
287
+ return `import { defineHandler } from "void";
288
+ import { db } from "void/db";
289
+ import { ${name} } from "@schema";
290
+
291
+ export const GET = defineHandler(async () => {
292
+ return db.select().from(${name});
293
+ });
294
+
295
+ export const POST = defineHandler(async (c) => {
296
+ const body = await c.req.json();
297
+ await db.insert(${name}).values(body);
298
+ return { created: true };
299
+ });
300
+ `;
301
+ }
302
+ return `${imports}
303
+
304
+ export const GET = defineHandler(async () => {
305
+ return db.select().from(${name});
306
+ });
307
+
308
+ export const POST = defineHandler.withValidator({
309
+ body: ${getBodySchema(validator, columns)},
310
+ })(async (c, { body }) => {
311
+ await db.insert(${name}).values({ ${insertFields} });
312
+ return { created: true };
313
+ });
314
+ `;
315
+ }
316
+ function generateIdRoute(name, validator) {
317
+ if (validator === "none") return `import { defineHandler } from "void";
318
+ import { db, eq } from "void/db";
319
+ import { ${name} } from "@schema";
320
+
321
+ export const GET = defineHandler(async (c) => {
322
+ const id = c.req.param("id");
323
+ const [row] = await db.select().from(${name}).where(eq(${name}.id, Number(id)));
324
+
325
+ if (!row) {
326
+ return new Response("Not found", { status: 404 });
327
+ }
328
+ return row;
329
+ });
330
+ `;
331
+ return `${getImportLine(validator)}
332
+ import { defineHandler } from "void";
333
+ import { db, eq } from "void/db";
334
+ import { ${name} } from "@schema";
335
+
336
+ export const GET = defineHandler.withValidator({
337
+ params: ${getParamsSchema(validator)},
338
+ })(async (c, { params }) => {
339
+ const [row] = await db.select().from(${name}).where(eq(${name}.id, Number(params.id)));
340
+
341
+ if (!row) {
342
+ return new Response("Not found", { status: 404 });
343
+ }
344
+ return row;
345
+ });
346
+ `;
347
+ }
348
+ async function runModel(root, name, columns) {
349
+ const validator = await resolveValidator(root);
350
+ const dialect = getDatabaseDialect(readConfig(root));
351
+ const schemaDir = join(root, "db", "schema");
352
+ const barrelPath = join(root, "db", "schema.ts");
353
+ const modelPath = join(schemaDir, `${name}.ts`);
354
+ let content;
355
+ if (dialect === "postgresql") {
356
+ const colDefs = columns.map((col) => drizzleColumnDefPg(col));
357
+ const columnImports = drizzleImportsForColumnsPg(columns);
358
+ const allCols = [
359
+ ` id: serial("id").primaryKey(),`,
360
+ ...colDefs,
361
+ ` createdAt: timestamp("created_at").notNull().defaultNow(),`,
362
+ ` updatedAt: timestamp("updated_at").notNull().defaultNow(),`
363
+ ];
364
+ content = [
365
+ `import { pgTable, ${columnImports.join(", ")} } from "void/schema-pg";`,
366
+ "",
367
+ `export const ${name} = pgTable("${name}", {`,
368
+ ...allCols,
369
+ "});",
370
+ ""
371
+ ].join("\n");
372
+ } else {
373
+ const colDefs = columns.map((col) => drizzleColumnDef(col));
374
+ const columnImports = drizzleImportsForColumns(columns);
375
+ const allCols = [
376
+ ` id: integer("id").primaryKey({ autoIncrement: true }),`,
377
+ ...colDefs,
378
+ " createdAt: text(\"created_at\").notNull().default(sql`(datetime('now'))`),",
379
+ " updatedAt: text(\"updated_at\").notNull().default(sql`(datetime('now'))`),"
380
+ ];
381
+ content = [
382
+ `import { sqliteTable, ${columnImports.join(", ")} } from "void/schema-d1";`,
383
+ `import { sql } from "void/db";`,
384
+ "",
385
+ `export const ${name} = sqliteTable("${name}", {`,
386
+ ...allCols,
387
+ "});",
388
+ ""
389
+ ].join("\n");
390
+ }
391
+ mkdirSync(schemaDir, { recursive: true });
392
+ writeIfNotExists(modelPath, content);
393
+ const exportLine = `export * from "./schema/${name}";`;
394
+ if (existsSync(barrelPath)) {
395
+ const existing = readFileSync(barrelPath, "utf-8");
396
+ if (!existing.includes(exportLine)) writeFileSync(barrelPath, existing.trimEnd() + "\n" + exportLine + "\n");
397
+ } else writeFileSync(barrelPath, exportLine + "\n");
398
+ ensureProjectTsconfig(root, void 0, true, true);
399
+ R.success(`Created ${relative(root, modelPath)}`);
400
+ R.success(`Updated ${relative(root, barrelPath)}`);
401
+ writeIfNotExists(join(root, "routes", "api", name, "index.ts"), generateIndexRoute(name, columns, validator));
402
+ writeIfNotExists(join(root, "routes", "api", name, "[id].ts"), generateIdRoute(name, validator));
403
+ ye("Model scaffolding complete. Run `void db push` to apply.");
404
+ }
405
+ function runMigration(root, name) {
406
+ const migrationsDir = join(root, "db", "migrations");
407
+ mkdirSync(migrationsDir, { recursive: true });
408
+ const currentMigrations = collectMigrations(migrationsDir);
409
+ try {
410
+ assertJournalCoherence(migrationsDir, currentMigrations);
411
+ } catch (err) {
412
+ R.error(err instanceof Error ? err.message : String(err));
413
+ process.exit(1);
414
+ }
415
+ if (existsSync(join(migrationsDir, "migrations.js"))) {
416
+ R.error("Your project uses Drizzle's bundled migration format (db/migrations/migrations.js).\n`void gen migration` cannot add custom hand-written migrations to a bundled project\nbecause the bundle must be regenerated by drizzle-kit.\n\nEither run `drizzle-kit generate` to regenerate the bundle, or migrate away from\nbundled mode by deleting db/migrations/migrations.js and re-running `void db generate`.");
417
+ process.exit(1);
418
+ }
419
+ const existingJournal = readJournal(migrationsDir);
420
+ if (existingJournal !== void 0 && existingJournal.entries.length > 0) {
421
+ const lastEntry = existingJournal.entries[existingJournal.entries.length - 1];
422
+ const metaDir = join(migrationsDir, "meta");
423
+ const lastSnapshotPrefix = lastEntry.tag.split("_")[0];
424
+ if (!existsSync(join(metaDir, `${lastSnapshotPrefix}_snapshot.json`))) {
425
+ R.error(`db/migrations/meta/_journal.json's last entry is \`${lastEntry.tag}\` but the matching snapshot \`${lastSnapshotPrefix}_snapshot.json\` is missing under meta/.`);
426
+ R.error("Restore the snapshot from version control, or regenerate migrations with `void db generate` before running `void gen migration`.");
427
+ process.exit(1);
428
+ }
429
+ const journalPath = join(metaDir, "_journal.json");
430
+ const originalJournalBytes = existsSync(journalPath) ? readFileSync(journalPath) : null;
431
+ const snapshotsBefore = new Set(readdirSync(metaDir).filter((f) => f.endsWith("_snapshot.json")));
432
+ const sqlFilesBefore = new Set(readdirSync(migrationsDir).filter((f) => f.endsWith(".sql")));
433
+ let journalDialect;
434
+ if (existingJournal.dialect === "sqlite") journalDialect = "sqlite";
435
+ else if (existingJournal.dialect === "postgresql") journalDialect = "postgresql";
436
+ else {
437
+ R.error(`db/migrations/meta/_journal.json has an unsupported dialect: \`${existingJournal.dialect}\`.`);
438
+ R.error("void supports `sqlite` and `postgresql` only. Restore the journal from version control, or drop db/migrations/ and regenerate from scratch.");
439
+ process.exit(1);
440
+ }
441
+ const configDialect = getDatabaseDialect(readConfig(root));
442
+ if (configDialect !== journalDialect) {
443
+ R.error(`db/migrations/meta/_journal.json was generated for ${journalDialect}, but void.json is configured for ${configDialect}.`);
444
+ R.error(`Generating a new custom migration now would append a snapshot in the wrong dialect. Revert void.json's \`database\` field to ${journalDialect}, or drop db/migrations/ and regenerate from scratch.`);
445
+ process.exit(1);
446
+ }
447
+ const configPath = journalDialect === "postgresql" ? writeDrizzleConfig(root, "postgresql://dummy", "postgresql") : writeDrizzleConfig(root, ":memory:");
448
+ const childEnv = buildDrizzleKitSpawnEnv(root);
449
+ const result = spawnSync(process.execPath, [
450
+ drizzleKitBin,
451
+ "generate",
452
+ "--config",
453
+ configPath,
454
+ "--custom",
455
+ "--name",
456
+ name
457
+ ], {
458
+ cwd: root,
459
+ stdio: "pipe",
460
+ encoding: "utf-8",
461
+ shell: process.platform === "win32",
462
+ env: childEnv
463
+ });
464
+ if (result.error || result.status !== 0) {
465
+ if (originalJournalBytes !== null) try {
466
+ writeFileSync(journalPath, originalJournalBytes);
467
+ } catch {}
468
+ if (existsSync(metaDir)) {
469
+ for (const f of readdirSync(metaDir)) if (f.endsWith("_snapshot.json") && !snapshotsBefore.has(f)) try {
470
+ unlinkSync(join(metaDir, f));
471
+ } catch {}
472
+ }
473
+ for (const f of readdirSync(migrationsDir)) if (f.endsWith(".sql") && !sqlFilesBefore.has(f)) try {
474
+ unlinkSync(join(migrationsDir, f));
475
+ } catch {}
476
+ const detail = [result.stderr, result.stdout].filter(Boolean).join("\n").trim();
477
+ R.error([
478
+ `Failed to run \`drizzle-kit generate --custom --name ${name}\`.`,
479
+ ...detail ? [detail] : [],
480
+ "",
481
+ "This is usually a schema-compilation error. Fix any TypeScript errors in db/schema.ts and try again."
482
+ ].join("\n"));
483
+ process.exit(1);
484
+ }
485
+ const newSqlFile = readdirSync(migrationsDir).filter((f) => f.endsWith(".sql")).find((f) => !sqlFilesBefore.has(f));
486
+ if (newSqlFile) R.success(`Created db/migrations/${newSqlFile}`);
487
+ ye("Migration created and journal updated.");
488
+ return;
489
+ }
490
+ if (existingJournal !== void 0 && existingJournal.entries.length === 0) {
491
+ if (listDrizzleArtifacts(migrationsDir).length > 0) {
492
+ R.error("db/migrations/meta/_journal.json has empty entries but stale drizzle-kit snapshots are on disk.");
493
+ R.error("Restore the journal entries from version control (or run `void db generate`), or delete the stale drizzle artifacts and rerun.");
494
+ process.exit(1);
495
+ }
496
+ }
497
+ writeIfNotExists(join(migrationsDir, `${`${getMigrationTimestamp(migrationsDir)}_${name}`}.sql`), `-- ${name}\n`);
498
+ ye("Migration created.");
499
+ }
500
+ function runRoute(root, routePath, methods) {
501
+ writeIfNotExists(join(root, "routes", routePath + ".ts"), `import { defineHandler } from "void";
502
+
503
+ ${methods.map((m) => {
504
+ const upper = m.toUpperCase();
505
+ return `export const ${upper} = defineHandler(async () => {
506
+ return { message: "${upper} ${routePath}" };
507
+ });`;
508
+ }).join("\n\n")}
509
+ `);
510
+ ye("Route created.");
511
+ }
512
+ function runMiddleware(root, name) {
513
+ const middlewareDir = join(root, "middleware");
514
+ mkdirSync(middlewareDir, { recursive: true });
515
+ writeIfNotExists(join(middlewareDir, `${getNextMiddlewareNumber(middlewareDir)}.${name}.ts`), `import { defineMiddleware } from "void";
516
+
517
+ export default defineMiddleware(async (c, next) => {
518
+ // TODO: implement ${name} middleware
519
+ await next();
520
+ });
521
+ `);
522
+ ye("Middleware created.");
523
+ }
524
+ function runCron(root, name) {
525
+ writeIfNotExists(join(root, "crons", name + ".ts"), `import { defineScheduled } from "void";
526
+
527
+ export const cron = "* * * * *";
528
+
529
+ export default defineScheduled(async (controller, env) => {
530
+ // TODO: implement ${name}
531
+ });
532
+ `);
533
+ ye("Cron job created.");
534
+ }
535
+ function runQueue(root, name) {
536
+ writeIfNotExists(join(root, "queues", name + ".ts"), `import { defineQueue } from "void";
537
+
538
+ interface Message {}
539
+
540
+ // export const maxBatchSize = 10;
541
+ // export const maxBatchTimeout = 5;
542
+
543
+ export default defineQueue<Message>(async (batch, env) => {
544
+ for (const message of batch.messages) {
545
+ // TODO: process message
546
+ }
547
+ });
548
+ `);
549
+ ye("Queue consumer created.");
550
+ }
551
+ function runSsr(root, framework) {
552
+ if (!framework) framework = detectFramework(root);
553
+ if (framework === "react") writeReactSsr(root);
554
+ else if (framework === "vue") writeVueSsr(root);
555
+ else if (framework === "svelte") writeSvelteSsr(root);
556
+ else writeSolidSsr(root);
557
+ ye("SSR scaffolding complete.");
558
+ }
559
+ function detectFramework(root) {
560
+ const pkgPath = join(root, "package.json");
561
+ if (!existsSync(pkgPath)) {
562
+ R.error("No package.json found. Use --react, --vue, --svelte, or --solid to specify a framework.");
563
+ process.exit(1);
564
+ }
565
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
566
+ const allDeps = {
567
+ ...pkg.dependencies,
568
+ ...pkg.devDependencies
569
+ };
570
+ if ("react" in allDeps) return "react";
571
+ if ("vue" in allDeps) return "vue";
572
+ if ("svelte" in allDeps) return "svelte";
573
+ if ("solid-js" in allDeps) return "solid";
574
+ R.error("Could not detect framework from package.json. Use --react, --vue, --svelte, or --solid.");
575
+ process.exit(1);
576
+ }
577
+ function writeReactSsr(root) {
578
+ writeIfNotExists(join(root, "src/main.ssr.tsx"), `import { renderToString } from "react-dom/server";
579
+ import { defineRender } from "void";
580
+ import App from "./App";
581
+
582
+ export default defineRender(async (c, assetTags) => {
583
+ const appHtml = renderToString(<App />);
584
+ const html = \`<!doctype html>
585
+ <html lang="en">
586
+ <head>
587
+ <meta charset="UTF-8" />
588
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
589
+ <title>App</title>
590
+ \${assetTags.css}\${assetTags.preloads}
591
+ </head>
592
+ <body>
593
+ <div id="root">\${appHtml}</div>
594
+ \${assetTags.body}
595
+ </body>
596
+ </html>\`;
597
+
598
+ return new Response(html, {
599
+ headers: { "content-type": "text/html; charset=utf-8" },
600
+ });
601
+ });
602
+ `);
603
+ writeIfNotExists(join(root, "src/main.client.tsx"), `import { hydrateRoot } from "react-dom/client";
604
+ import App from "./App";
605
+
606
+ hydrateRoot(document.getElementById("root")!, <App />);
607
+ `);
608
+ writeIfNotExists(join(root, "src/App.tsx"), `import { useState } from "react";
609
+
610
+ export default function App() {
611
+ const [count, setCount] = useState(0);
612
+
613
+ return (
614
+ <main>
615
+ <h1>Hello Void</h1>
616
+ <button type="button" onClick={() => setCount((c) => c + 1)}>
617
+ Count: {count}
618
+ </button>
619
+ </main>
620
+ );
621
+ }
622
+ `);
623
+ }
624
+ function writeVueSsr(root) {
625
+ writeIfNotExists(join(root, "src/main.ssr.ts"), `import { createSSRApp } from "vue";
626
+ import { renderToString } from "vue/server-renderer";
627
+ import { defineRender } from "void";
628
+ import App from "./App.vue";
629
+
630
+ export default defineRender(async (c, assetTags) => {
631
+ const app = createSSRApp(App);
632
+ const appHtml = await renderToString(app);
633
+ const html = \`<!doctype html>
634
+ <html lang="en">
635
+ <head>
636
+ <meta charset="UTF-8" />
637
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
638
+ <title>App</title>
639
+ \${assetTags.css}\${assetTags.preloads}
640
+ </head>
641
+ <body>
642
+ <div id="app">\${appHtml}</div>
643
+ \${assetTags.body}
644
+ </body>
645
+ </html>\`;
646
+
647
+ return new Response(html, {
648
+ headers: { "content-type": "text/html; charset=utf-8" },
649
+ });
650
+ });
651
+ `);
652
+ writeIfNotExists(join(root, "src/main.client.ts"), `import { createSSRApp } from "vue";
653
+ import App from "./App.vue";
654
+
655
+ const app = createSSRApp(App);
656
+ app.mount("#app");
657
+ `);
658
+ writeIfNotExists(join(root, "src/App.vue"), `<script setup lang="ts">
659
+ import { ref } from "vue";
660
+
661
+ const count = ref(0);
662
+ <\/script>
663
+
664
+ <template>
665
+ <main>
666
+ <h1>Hello Void</h1>
667
+ <button type="button" @click="count++">Count: {{ count }}</button>
668
+ </main>
669
+ </template>
670
+ `);
671
+ }
672
+ function writeSvelteSsr(root) {
673
+ writeIfNotExists(join(root, "src/main.ssr.ts"), `import { render } from "svelte/server";
674
+ import { defineRender } from "void";
675
+ import App from "./App.svelte";
676
+
677
+ export default defineRender(async (c, assetTags) => {
678
+ const { html: appHtml } = render(App);
679
+ const html = \`<!doctype html>
680
+ <html lang="en">
681
+ <head>
682
+ <meta charset="UTF-8" />
683
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
684
+ <title>App</title>
685
+ \${assetTags.css}\${assetTags.preloads}
686
+ </head>
687
+ <body>
688
+ <div id="app">\${appHtml}</div>
689
+ \${assetTags.body}
690
+ </body>
691
+ </html>\`;
692
+
693
+ return new Response(html, {
694
+ headers: { "content-type": "text/html; charset=utf-8" },
695
+ });
696
+ });
697
+ `);
698
+ writeIfNotExists(join(root, "src/main.client.ts"), `import { hydrate } from "svelte";
699
+ import App from "./App.svelte";
700
+
701
+ hydrate(App, { target: document.getElementById("app")! });
702
+ `);
703
+ writeIfNotExists(join(root, "src/App.svelte"), `<script>
704
+ let count = $state(0);
705
+ <\/script>
706
+
707
+ <main>
708
+ <h1>Hello Void</h1>
709
+ <button type="button" onclick={() => count++}>Count: {count}</button>
710
+ </main>
711
+ `);
712
+ }
713
+ function writeSolidSsr(root) {
714
+ writeIfNotExists(join(root, "src/main.ssr.tsx"), `import { renderToString } from "solid-js/web";
715
+ import { defineRender } from "void";
716
+ import App from "./App";
717
+
718
+ export default defineRender(async (c, assetTags) => {
719
+ const appHtml = renderToString(() => <App />);
720
+ const html = \`<!doctype html>
721
+ <html lang="en">
722
+ <head>
723
+ <meta charset="UTF-8" />
724
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
725
+ <title>App</title>
726
+ \${assetTags.css}\${assetTags.preloads}
727
+ </head>
728
+ <body>
729
+ <div id="app">\${appHtml}</div>
730
+ \${assetTags.body}
731
+ </body>
732
+ </html>\`;
733
+
734
+ return new Response(html, {
735
+ headers: { "content-type": "text/html; charset=utf-8" },
736
+ });
737
+ });
738
+ `);
739
+ writeIfNotExists(join(root, "src/main.client.tsx"), `import { hydrate } from "solid-js/web";
740
+ import App from "./App";
741
+
742
+ hydrate(() => <App />, document.getElementById("app")!);
743
+ `);
744
+ writeIfNotExists(join(root, "src/App.tsx"), `import { createSignal } from "solid-js";
745
+
746
+ export default function App() {
747
+ const [count, setCount] = createSignal(0);
748
+
749
+ return (
750
+ <main>
751
+ <h1>Hello Void</h1>
752
+ <button type="button" onClick={() => setCount((c) => c + 1)}>
753
+ Count: {count()}
754
+ </button>
755
+ </main>
756
+ );
757
+ }
758
+ `);
759
+ }
760
+ //#endregion
761
+ export { formatTimestamp, runGenCommand };