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,362 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ <script setup>
6
+ function layoutBasicItems(ext) {
7
+ return [
8
+ {
9
+ name: "pages/",
10
+ children: [
11
+ { name: `layout${ext}`, description: "Root layout (nav, footer)" },
12
+ { name: `index${ext}` },
13
+ {
14
+ name: "users/",
15
+ children: [
16
+ { name: `layout${ext}`, description: "Nested layout for /users/*" },
17
+ { name: `index${ext}` },
18
+ { name: `[id]${ext}` },
19
+ ],
20
+ },
21
+ ],
22
+ },
23
+ ]
24
+ }
25
+
26
+ function namedLayoutItems(ext) {
27
+ return [
28
+ {
29
+ name: "pages/",
30
+ children: [
31
+ {
32
+ name: "_layouts/",
33
+ children: [
34
+ { name: `landing${ext}`, description: 'named "landing"' },
35
+ { name: `post${ext}`, description: 'named "post"' },
36
+ ],
37
+ },
38
+ { name: `layout${ext}`, description: "default root layout" },
39
+ { name: `index${ext}` },
40
+ {
41
+ name: "blog/",
42
+ children: [
43
+ { name: "hello.md", description: "layout: post" },
44
+ { name: "archive.md", description: "layout: landing" },
45
+ ],
46
+ },
47
+ { name: `pricing${ext}`, description: "layout: !landing (exclusive)" },
48
+ ],
49
+ },
50
+ ]
51
+ }
52
+
53
+ function blogLayoutItems(ext) {
54
+ return [
55
+ {
56
+ name: "pages/",
57
+ children: [
58
+ {
59
+ name: "_layouts/",
60
+ children: [
61
+ { name: `post${ext}`, description: "sidebar, date, author" },
62
+ ],
63
+ },
64
+ { name: `layout${ext}`, description: "nav + footer" },
65
+ {
66
+ name: "blog/",
67
+ children: [
68
+ { name: `layout${ext}`, description: "blog sidebar" },
69
+ { name: "hello.md", description: "layout: post → chain: [root, _layouts/post]" },
70
+ { name: `archive${ext}`, description: "(no layout) → chain: [root, blog/layout]" },
71
+ ],
72
+ },
73
+ ],
74
+ },
75
+ ]
76
+ }
77
+
78
+ </script>
79
+
80
+ # Layouts & Shared Data
81
+
82
+ ## Layouts
83
+
84
+ Place a layout file in any `pages/` directory to wrap all pages in that subtree:
85
+
86
+ <FileTree :items="layoutBasicItems" adapter-tabs default-expanded />
87
+
88
+ ::: code-group
89
+
90
+ ```tsx [React]
91
+ // pages/layout.tsx
92
+ import { useShared, Link } from '@void/react';
93
+
94
+ export default function Layout({ children }: { children: React.ReactNode }) {
95
+ const { auth } = useShared();
96
+ return (
97
+ <>
98
+ <nav>
99
+ <Link href="/">Home</Link>
100
+ <Link href="/users">Users</Link>
101
+ {auth?.user && <span>{auth.user.name}</span>}
102
+ </nav>
103
+ <main>{children}</main>
104
+ </>
105
+ );
106
+ }
107
+ ```
108
+
109
+ ```vue [Vue]
110
+ <!-- pages/layout.vue -->
111
+ <script setup lang="ts">
112
+ import { useShared, Link } from '@void/vue';
113
+ const { auth } = useShared();
114
+ </script>
115
+
116
+ <template>
117
+ <nav>
118
+ <Link href="/">Home</Link>
119
+ <Link href="/users">Users</Link>
120
+ <span v-if="auth?.user">{{ auth.user.name }}</span>
121
+ </nav>
122
+ <main>
123
+ <slot />
124
+ </main>
125
+ </template>
126
+ ```
127
+
128
+ ```svelte [Svelte]
129
+ <!-- pages/layout.svelte -->
130
+ <script>
131
+ import { useShared, Link } from "@void/svelte";
132
+ let { children } = $props();
133
+ const { auth } = useShared();
134
+ </script>
135
+
136
+ <nav>
137
+ <Link href="/">Home</Link>
138
+ <Link href="/users">Users</Link>
139
+ {#if auth?.user}<span>{auth.user.name}</span>{/if}
140
+ </nav>
141
+ <main>
142
+ {@render children()}
143
+ </main>
144
+ ```
145
+
146
+ ```tsx [Solid]
147
+ // pages/layout.tsx
148
+ import { useShared, Link } from '@void/solid';
149
+ import type { JSX } from 'solid-js';
150
+
151
+ export default function Layout(props: { children: JSX.Element }) {
152
+ const shared = useShared<{ auth: { user: { name: string } | null } }>();
153
+ return (
154
+ <>
155
+ <nav>
156
+ <Link href="/">Home</Link>
157
+ <Link href="/users">Users</Link>
158
+ {shared.auth?.user && <span>{shared.auth.user.name}</span>}
159
+ </nav>
160
+ <main>{props.children}</main>
161
+ </>
162
+ );
163
+ }
164
+ ```
165
+
166
+ :::
167
+
168
+ When a page renders, the layout wraps it. The page component is injected as the layout's children in React, Solid, and Svelte, or as a slot in Vue:
169
+
170
+ <img src="./layout-nesting.svg" alt="Layout nesting diagram: pages/layout wraps pages/users/layout wraps pages/users/[id] page component" style="max-width: 520px; width: 100%;" />
171
+
172
+ Layouts nest automatically and persist across navigations within their subtree, so component state is preserved.
173
+
174
+ ## Named Layouts
175
+
176
+ Named layouts let individual pages opt into a different layout without changing the URL structure. Define them in `_layouts/` directories within `pages/`:
177
+
178
+ <FileTree :items="namedLayoutItems" adapter-tabs default-expanded />
179
+
180
+ ### Selecting a named layout
181
+
182
+ Export a `layout` constant from any page:
183
+
184
+ ::: code-group
185
+
186
+ ```tsx [React]
187
+ export const layout = 'landing';
188
+
189
+ export default function Page() {
190
+ return <div>This page uses the landing layout</div>;
191
+ }
192
+ ```
193
+
194
+ ```vue [Vue]
195
+ <script>
196
+ export const layout = 'landing';
197
+ </script>
198
+
199
+ <template>
200
+ <div>This page uses the landing layout</div>
201
+ </template>
202
+ ```
203
+
204
+ ```svelte [Svelte]
205
+ <script context="module">
206
+ export const layout = "landing";
207
+ </script>
208
+
209
+ <div>This page uses the landing layout</div>
210
+ ```
211
+
212
+ ```tsx [Solid]
213
+ export const layout = 'landing';
214
+
215
+ export default function Page() {
216
+ return <div>This page uses the landing layout</div>;
217
+ }
218
+ ```
219
+
220
+ :::
221
+
222
+ For markdown pages, use frontmatter:
223
+
224
+ ```md
225
+ ---
226
+ layout: post
227
+ ---
228
+
229
+ # My Blog Post
230
+ ```
231
+
232
+ ### Layout modes
233
+
234
+ | Value | Behavior |
235
+ | ------------ | ------------------------------------------------------------------------------ |
236
+ | `"landing"` | Replace the innermost layout in the chain. Outer ancestor layouts still apply. |
237
+ | `"!landing"` | Replace the **entire** chain. Only the named layout wraps the page. |
238
+ | `false` | No layout wrapping at all. Page renders standalone. |
239
+
240
+ "Innermost" means the deepest layout in the resolved chain. If the chain is `[root, docs/layout]`, the named layout replaces `docs/layout`. If the chain is only `[root]`, it replaces root.
241
+
242
+ ### Resolution order
243
+
244
+ When a page specifies `layout: "post"`, the scanner walks up the directory tree to find `_layouts/post`:
245
+
246
+ ```
247
+ pages/guide/intro.md (layout: post)
248
+
249
+ 1. pages/guide/_layouts/post.vue → not found
250
+ 2. pages/_layouts/post.vue → found ✓
251
+ ```
252
+
253
+ Closest ancestor wins, same as default layout chain. If no matching named layout is found in any ancestor, the build fails with a clear error.
254
+
255
+ ### Examples
256
+
257
+ **Blog with shared nav but post-specific layout:**
258
+
259
+ <FileTree :items="blogLayoutItems" adapter-tabs default-expanded />
260
+
261
+ `layout: post` on `blog/hello.md` replaces the innermost default layout (`blog/layout`) with `_layouts/post`. The root layout still wraps.
262
+
263
+ **Fullscreen page with no layout:**
264
+
265
+ ::: code-group
266
+
267
+ ```tsx [React]
268
+ export const layout = false;
269
+
270
+ export default function Landing() {
271
+ return (
272
+ <div className="hero fullscreen">
273
+ <h1>Welcome</h1>
274
+ </div>
275
+ );
276
+ }
277
+ ```
278
+
279
+ ```vue [Vue]
280
+ <script>
281
+ export const layout = false;
282
+ </script>
283
+
284
+ <template>
285
+ <div class="hero fullscreen"><h1>Welcome</h1></div>
286
+ </template>
287
+ ```
288
+
289
+ :::
290
+
291
+ **Exclusive layout (skip all ancestors):**
292
+
293
+ ```md
294
+ ---
295
+ layout: '!landing'
296
+ ---
297
+
298
+ # Standalone Landing Page
299
+ ```
300
+
301
+ Only `_layouts/landing` wraps this page, and the root layout is skipped entirely.
302
+
303
+ ## Shared Data
304
+
305
+ Middleware can inject data available on every page via `c.set("shared", {...})`. Augment `CloudContextVariables` to type the shared data, and `useShared()` will infer the type automatically:
306
+
307
+ ```ts
308
+ // middleware/01.auth.ts
309
+ import { defineMiddleware } from 'void';
310
+
311
+ declare module 'void' {
312
+ interface CloudContextVariables {
313
+ shared: { auth: { user: { name: string } | null } };
314
+ }
315
+ }
316
+
317
+ export default defineMiddleware(async (c, next) => {
318
+ const user = await getSessionUser(c);
319
+ c.set('shared', { auth: { user } });
320
+ await next();
321
+ });
322
+ ```
323
+
324
+ Access it on the client with `useShared()`. The return type is inferred from your augmentation:
325
+
326
+ ::: code-group
327
+
328
+ ```tsx [React]
329
+ import { useShared } from '@void/react';
330
+
331
+ export default function Page() {
332
+ const { auth } = useShared(); // { auth: { user: { name: string } | null } }
333
+ return <p>Hello, {auth?.user?.name}</p>;
334
+ }
335
+ ```
336
+
337
+ ```vue [Vue]
338
+ <script setup lang="ts">
339
+ import { useShared } from '@void/vue';
340
+ const { auth } = useShared(); // { auth: { user: { name: string } | null } }
341
+ </script>
342
+ ```
343
+
344
+ ```svelte [Svelte]
345
+ <script>
346
+ import { useShared } from "@void/svelte";
347
+ const { auth } = useShared(); // { auth: { user: { name: string } | null } }
348
+ </script>
349
+ ```
350
+
351
+ ```tsx [Solid]
352
+ import { useShared } from '@void/solid';
353
+
354
+ export default function Page() {
355
+ const shared = useShared(); // { auth: { user: { name: string } | null } }
356
+ return <p>Hello, {shared.auth?.user?.name}</p>;
357
+ }
358
+ ```
359
+
360
+ :::
361
+
362
+ Shared data is separate from page props. Props come from the loader, while `useShared()` returns global data from middleware. See [Type Safety](../type-safety.md#context-variables) for more on augmenting `CloudContextVariables`.
@@ -0,0 +1,267 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Loaders & Props
6
+
7
+ Every page can have a companion `.server.ts` file that exports a `loader`. Server handlers use the same `defineHandler` API as [server routes](../server-routing.md), so you get the same typed `c.env` bindings and Hono context methods.
8
+
9
+ ## Defining a Loader
10
+
11
+ `loader` runs on GET requests and returns an object that becomes the page's props:
12
+
13
+ ```ts
14
+ // pages/users/index.server.ts
15
+ import { defineHandler } from 'void';
16
+ import type { InferProps } from 'void';
17
+ import { db } from 'void/db';
18
+ import { users } from '@schema';
19
+
20
+ export type Props = InferProps<typeof loader>; // [!code highlight]
21
+
22
+ export const loader = defineHandler(async (c) => {
23
+ return { users: await db.select().from(users) };
24
+ });
25
+ ```
26
+
27
+ `InferProps` extracts the return type from a `defineHandler` call, so you don't need to maintain a separate interface. You can also write the interface explicitly if you prefer:
28
+
29
+ ```ts
30
+ export interface Props {
31
+ users: Array<{ id: number; name: string; email: string }>;
32
+ }
33
+
34
+ export const loader = defineHandler<Props>(async (c) => {
35
+ return { users: await db.select().from(users) };
36
+ });
37
+ ```
38
+
39
+ ## Using the Data in Page Components
40
+
41
+ The component receives loader data as props. Export the props type from your `.server.ts` file to keep the contract in one place:
42
+
43
+ ::: code-group
44
+
45
+ ```tsx [React]
46
+ // pages/users/index.tsx
47
+ import type { Props } from './index.server';
48
+
49
+ export default function UsersPage({ users }: Props) {
50
+ return (
51
+ <ul>
52
+ {users.map((u) => (
53
+ <li key={u.id}>{u.name}</li>
54
+ ))}
55
+ </ul>
56
+ );
57
+ }
58
+ ```
59
+
60
+ ```vue [Vue]
61
+ <!-- pages/users/index.vue -->
62
+ <script setup lang="ts">
63
+ import type { Props } from './index.server';
64
+ defineProps<Props>();
65
+ </script>
66
+
67
+ <template>
68
+ <h1>Users</h1>
69
+ <ul>
70
+ <li v-for="u in users" :key="u.id">{{ u.name }}</li>
71
+ </ul>
72
+ </template>
73
+ ```
74
+
75
+ ```svelte [Svelte]
76
+ <!-- pages/users/index.svelte -->
77
+ <script lang="ts">
78
+ import type { Props } from "./index.server";
79
+
80
+ let { users }: Props = $props();
81
+ </script>
82
+
83
+ <h1>Users</h1>
84
+ <ul>
85
+ {#each users as u (u.id)}
86
+ <li>{u.name}</li>
87
+ {/each}
88
+ </ul>
89
+ ```
90
+
91
+ ```tsx [Solid]
92
+ // pages/users/index.tsx
93
+ import type { Props } from './index.server';
94
+ import { For } from 'solid-js';
95
+
96
+ export default function UsersPage(props: Props) {
97
+ return (
98
+ <>
99
+ <h1>Users</h1>
100
+ <ul>
101
+ <For each={props.users}>{(u) => <li>{u.name}</li>}</For>
102
+ </ul>
103
+ </>
104
+ );
105
+ }
106
+ ```
107
+
108
+ :::
109
+
110
+ ## Deferred Props
111
+
112
+ Loaders sometimes need to fetch slower data such as analytics, external API responses, or AI inference. `defer()` lets you return a placeholder immediately so the page renders quickly, then streams the real data when it resolves:
113
+
114
+ ```ts
115
+ // pages/dashboard.server.ts
116
+ import { defineHandler, defer } from 'void';
117
+ import type { InferProps } from 'void';
118
+ import { db } from 'void/db';
119
+ import { projects } from '@schema';
120
+
121
+ export type Props = InferProps<typeof loader>;
122
+
123
+ export const loader = defineHandler(async (c) => {
124
+ const allProjects = await db.select().from(projects); // fast, returns immediately
125
+ return {
126
+ projects: allProjects,
127
+ usage: defer(async () => {
128
+ return await fetchUsageMetrics(); // slow, streams when ready
129
+ }),
130
+ };
131
+ });
132
+ ```
133
+
134
+ The page renders immediately with `projects` available. The `usage` prop is a framework-native deferred resource: React consumes it with Suspense and `use()`, while the other adapters expose a `{ loading, value, error }` state object.
135
+
136
+ ### Handling Deferred State
137
+
138
+ In React, `Deferred<T>` is consumed as a promise. Put the deferred read under a `<Suspense>` boundary and call `use()` where the value is needed:
139
+
140
+ ::: code-group
141
+
142
+ ```tsx [React]
143
+ import { Suspense, use } from 'react';
144
+ import type { Props } from './dashboard.server';
145
+
146
+ function Usage({ usage }: Pick<Props, 'usage'>) {
147
+ const resolved = use(usage);
148
+ return <p>{resolved.requests} requests</p>;
149
+ }
150
+
151
+ export default function Dashboard({ projects, usage }: Props) {
152
+ return (
153
+ <div>
154
+ <h1>Projects ({projects.length})</h1>
155
+ <Suspense fallback={<p>Loading usage...</p>}>
156
+ <Usage usage={usage} />
157
+ </Suspense>
158
+ </div>
159
+ );
160
+ }
161
+ ```
162
+
163
+ :::
164
+
165
+ Rejected deferred props throw from `use()`. Put a normal React error boundary
166
+ around the Suspense boundary when the page should render a custom failure state.
167
+ For explicit React prop annotations, import `Deferred` from `@void/react`; the
168
+ adapter export is typed as `Promise<T>`.
169
+
170
+ In Vue, Svelte, and Solid, `Deferred<T>` behaves as a [discriminated union](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions) with three states:
171
+
172
+ ```ts
173
+ type Deferred<T> =
174
+ | { loading: true; value: null; error: null } // pending
175
+ | { loading: false; value: T; error: null } // resolved
176
+ | { loading: false; value: null; error: Error }; // rejected
177
+ ```
178
+
179
+ Check `loading` first, then `error`. TypeScript narrows `value` to `T` in the resolved branch:
180
+
181
+ ::: code-group
182
+
183
+ ```vue [Vue]
184
+ <script setup lang="ts">
185
+ import type { Props } from './dashboard.server';
186
+ defineProps<Props>();
187
+ </script>
188
+
189
+ <template>
190
+ <div>
191
+ <h1>Projects ({{ projects.length }})</h1>
192
+ <p v-if="usage.loading">Loading usage...</p>
193
+ <p v-else-if="usage.error">Failed: {{ usage.error.message }}</p>
194
+ <p v-else>{{ usage.value.requests }} requests</p>
195
+ </div>
196
+ </template>
197
+ ```
198
+
199
+ ```svelte [Svelte]
200
+ <script lang="ts">
201
+ import type { Props } from "./dashboard.server";
202
+ let { projects, usage }: Props = $props();
203
+ </script>
204
+
205
+ <div>
206
+ <h1>Projects ({projects.length})</h1>
207
+ {#if usage.loading}
208
+ <p>Loading usage...</p>
209
+ {:else if usage.error}
210
+ <p>Failed: {usage.error.message}</p>
211
+ {:else}
212
+ <p>{usage.value.requests} requests</p>
213
+ {/if}
214
+ </div>
215
+ ```
216
+
217
+ ```tsx [Solid]
218
+ import type { Props } from './dashboard.server';
219
+
220
+ export default function Dashboard(props: Props) {
221
+ return (
222
+ <div>
223
+ <h1>Projects ({props.projects.length})</h1>
224
+ {props.usage.loading ? (
225
+ <p>Loading usage...</p>
226
+ ) : props.usage.error ? (
227
+ <p>Failed: {props.usage.error.message}</p>
228
+ ) : (
229
+ <p>{props.usage.value.requests} requests</p>
230
+ )}
231
+ </div>
232
+ );
233
+ }
234
+ ```
235
+
236
+ :::
237
+
238
+ ### How Streaming Works
239
+
240
+ On the initial page load (SSR), React uses React 19 streaming SSR and renders the nearest Suspense fallback for deferred props; the other adapters render their loading state. As each deferred function resolves, the server streams an inline `<script>` tag that delivers the data, so no extra HTTP request is needed. On SPA navigation, deferred data streams via NDJSON over the same response.
241
+
242
+ ### Deferred Props After Mutations
243
+
244
+ ::: info
245
+ When a mutation runs, the loader runs again to provide fresh props, but deferred props cannot stream over a mutation response. The client preserves the last resolved value for each deferred prop, so the UI keeps showing the previous data until the next full page load or SPA navigation.
246
+ :::
247
+
248
+ ### Grouped Deferred Props
249
+
250
+ When multiple props depend on the same slow operation, use a named group to resolve them together with a single function call:
251
+
252
+ ```ts
253
+ export const loader = defineHandler<Props>(async (c) => {
254
+ const analyticsResolver = async () => {
255
+ const data = await fetchAnalytics(); // one slow call
256
+ return { metrics: data.metrics, chart: data.chart };
257
+ };
258
+
259
+ return {
260
+ projects: await db.select().from(projects),
261
+ metrics: defer('analytics', analyticsResolver),
262
+ chart: defer('analytics', analyticsResolver),
263
+ };
264
+ });
265
+ ```
266
+
267
+ Both `metrics` and `chart` resolve from a single invocation of the analytics resolver. The component receives them as separate `Deferred<T>` props.