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.
- package/AGENT_PROMPT.md +15 -0
- package/README.md +62 -123
- package/dist/auth-BdsJ0Aff.d.mts +43 -0
- package/dist/auth-cmd-Dx8oPKZC.mjs +43 -0
- package/dist/auth-migrations-BAtAck2g.mjs +117 -0
- package/dist/better-auth-shared-C9_GHSkR.d.mts +71 -0
- package/dist/better-auth-shared-CdYmQGry.mjs +163 -0
- package/dist/cache-W82I8ihI.mjs +47 -0
- package/dist/cancel-deploy-BOBTqqh0.mjs +59 -0
- package/dist/cf-access-Dee5cXxL.mjs +22 -0
- package/dist/chunk-DJd-R1mw.mjs +34 -0
- package/dist/cli/cli.d.mts +1 -0
- package/dist/cli/cli.mjs +1807 -0
- package/dist/client-snXOjrp1.mjs +565 -0
- package/dist/collect-CjeZgz5D.mjs +55 -0
- package/dist/config-BIa9HwVX.mjs +573 -0
- package/dist/config-BzM9Dy7T.mjs +37 -0
- package/dist/config-CvHtTM0q.mjs +30 -0
- package/dist/create-project-BIA15W7z.mjs +90 -0
- package/dist/db-DsRoMcfN.mjs +895 -0
- package/dist/defer-DcxEsVH1.mjs +49 -0
- package/dist/delete-DAP6yDc7.mjs +64 -0
- package/dist/deploy-BPKblFx6.mjs +2424 -0
- package/dist/discover-B7FkXBLB.mjs +40 -0
- package/dist/dist-DUyXJLkq.mjs +2667 -0
- package/dist/dist-Dayj3gCK.mjs +1287 -0
- package/dist/domain-BGofcQ6I.mjs +79 -0
- package/dist/dotenv-DwO4ti0Z.mjs +173 -0
- package/dist/drizzle-NnudE_UN.mjs +232 -0
- package/dist/env-CyG3tvU0.mjs +301 -0
- package/dist/env-helpers-Dr9Y7RnE.d.mts +52 -0
- package/dist/env-raw-BDL4TvdN.mjs +32 -0
- package/dist/env-types-DknSA4SO.mjs +64 -0
- package/dist/env-validation-DJKjR_8q.mjs +163 -0
- package/dist/fetch-error-BQ8sZ5Nd.mjs +266 -0
- package/dist/fetch-error-CVZ5CGA-.d.mts +20 -0
- package/dist/gen-U0Ktr4Zd.mjs +761 -0
- package/dist/handler-B0ds0OHJ.d.mts +269 -0
- package/dist/head-P-egrtFE.d.mts +45 -0
- package/dist/headers-DCXc7mDs.mjs +279 -0
- package/dist/index.d.mts +32 -0
- package/dist/index.mjs +4695 -0
- package/dist/init-C7wS5iGP.mjs +2625 -0
- package/dist/link-p2R6NbgN.mjs +49 -0
- package/dist/list-Bfel-QLc.mjs +113 -0
- package/dist/log-DXdqnmhF.mjs +26 -0
- package/dist/login-CkcXUiIu.mjs +72 -0
- package/dist/logs-DmkrRvx6.mjs +98 -0
- package/dist/magic-string.es-D6g9UnIy.mjs +1011 -0
- package/dist/mcp-CaQzfeUi.mjs +373 -0
- package/dist/node-DDfXj10V.mjs +54 -0
- package/dist/output-BwlcIYSR.mjs +139 -0
- package/dist/pages/client.d.mts +198 -0
- package/dist/pages/client.mjs +980 -0
- package/dist/pages/head-client.d.mts +15 -0
- package/dist/pages/head-client.mjs +90 -0
- package/dist/pages/head.d.mts +2 -0
- package/dist/pages/head.mjs +112 -0
- package/dist/pages/index.d.mts +38 -0
- package/dist/pages/index.mjs +76 -0
- package/dist/pages/islands-plugin.d.mts +50 -0
- package/dist/pages/islands-plugin.mjs +195 -0
- package/dist/pages/prefetch.d.mts +31 -0
- package/dist/pages/prefetch.mjs +90 -0
- package/dist/pages/protocol.d.mts +3 -0
- package/dist/pages/protocol.mjs +193 -0
- package/dist/pages/serialize.d.mts +10 -0
- package/dist/pages/serialize.mjs +14 -0
- package/dist/pathe.M-eThtNZ-D-kmWkCS.mjs +150 -0
- package/dist/plugin-inference-oZ6Ybu2_.mjs +2447 -0
- package/dist/prepare-BAtWufvm.mjs +99 -0
- package/dist/preset-D4I73kT4.mjs +221 -0
- package/dist/project-TqORyHn8.mjs +72 -0
- package/dist/project-cmd-B7lQp3F3.mjs +67 -0
- package/dist/project-slug-CKam8lF9.mjs +11 -0
- package/dist/project-tsconfig-DfkESbDL.mjs +63 -0
- package/dist/protocol-BWzXs2A2.d.mts +34 -0
- package/dist/providers-B3aMxWzP.mjs +67 -0
- package/dist/resolve-project-Br5BR03U.mjs +29 -0
- package/dist/rollback-gyC59l7U.mjs +92 -0
- package/dist/route-types-DReF1gUY.mjs +255 -0
- package/dist/routes-stub.d.mts +55 -0
- package/dist/routes-stub.mjs +1 -0
- package/dist/runner-6Ep3fNQu.mjs +123 -0
- package/dist/runner-pg-D0wWHYnr.mjs +57 -0
- package/dist/runtime/ai.d.mts +127 -0
- package/dist/runtime/ai.mjs +348 -0
- package/dist/runtime/auth-client-react.d.mts +8 -0
- package/dist/runtime/auth-client-react.mjs +6 -0
- package/dist/runtime/auth-client-solid.d.mts +8 -0
- package/dist/runtime/auth-client-solid.mjs +6 -0
- package/dist/runtime/auth-client-svelte.d.mts +8 -0
- package/dist/runtime/auth-client-svelte.mjs +6 -0
- package/dist/runtime/auth-client-vue.d.mts +8 -0
- package/dist/runtime/auth-client-vue.mjs +6 -0
- package/dist/runtime/auth-client.d.mts +8 -0
- package/dist/runtime/auth-client.mjs +6 -0
- package/dist/runtime/auth.d.mts +2 -0
- package/dist/runtime/auth.mjs +22 -0
- package/dist/runtime/better-auth-pg.d.mts +11 -0
- package/dist/runtime/better-auth-pg.mjs +51 -0
- package/dist/runtime/better-auth.d.mts +11 -0
- package/dist/runtime/better-auth.mjs +33 -0
- package/dist/runtime/client.d.mts +6 -0
- package/dist/runtime/client.mjs +5 -0
- package/dist/runtime/db-pg.d.mts +2 -0
- package/dist/runtime/db-pg.mjs +1 -0
- package/dist/runtime/db.d.mts +17 -0
- package/dist/runtime/db.mjs +30 -0
- package/dist/runtime/drizzle-arktype.d.mts +1 -0
- package/dist/runtime/drizzle-arktype.mjs +2 -0
- package/dist/runtime/drizzle-valibot.d.mts +1 -0
- package/dist/runtime/drizzle-valibot.mjs +2 -0
- package/dist/runtime/drizzle-zod.d.mts +1 -0
- package/dist/runtime/drizzle-zod.mjs +2 -0
- package/dist/runtime/env-helpers.d.mts +2 -0
- package/dist/runtime/env-helpers.mjs +173 -0
- package/dist/runtime/env-public-client.d.mts +22 -0
- package/dist/runtime/env-public-client.mjs +54 -0
- package/dist/runtime/env-public.d.mts +143 -0
- package/dist/runtime/env-public.mjs +366 -0
- package/dist/runtime/env.d.mts +13 -0
- package/dist/runtime/env.mjs +51 -0
- package/dist/runtime/fetch-stream.d.mts +51 -0
- package/dist/runtime/fetch-stream.mjs +81 -0
- package/dist/runtime/fetch.d.mts +59 -0
- package/dist/runtime/fetch.mjs +18 -0
- package/dist/runtime/handler.d.mts +3 -0
- package/dist/runtime/handler.mjs +85 -0
- package/dist/runtime/isr.d.mts +26 -0
- package/dist/runtime/isr.mjs +43 -0
- package/dist/runtime/kv.d.mts +48 -0
- package/dist/runtime/kv.mjs +106 -0
- package/dist/runtime/log.d.mts +24 -0
- package/dist/runtime/log.mjs +31 -0
- package/dist/runtime/migration-handler-pg.d.mts +6 -0
- package/dist/runtime/migration-handler-pg.mjs +85 -0
- package/dist/runtime/migration-handler.d.mts +19 -0
- package/dist/runtime/migration-handler.mjs +92 -0
- package/dist/runtime/queues.d.mts +7 -0
- package/dist/runtime/queues.mjs +8 -0
- package/dist/runtime/remote/binding-handler.d.mts +15 -0
- package/dist/runtime/remote/binding-handler.mjs +208 -0
- package/dist/runtime/remote/index.d.mts +8 -0
- package/dist/runtime/remote/index.mjs +461 -0
- package/dist/runtime/response.d.mts +14 -0
- package/dist/runtime/response.mjs +30 -0
- package/dist/runtime/sandbox.d.mts +17 -0
- package/dist/runtime/sandbox.mjs +19 -0
- package/dist/runtime/schema-d1.d.mts +1 -0
- package/dist/runtime/schema-d1.mjs +2 -0
- package/dist/runtime/schema-pg.d.mts +1 -0
- package/dist/runtime/schema-pg.mjs +2 -0
- package/dist/runtime/seed.d.mts +30 -0
- package/dist/runtime/seed.mjs +6 -0
- package/dist/runtime/storage.d.mts +7 -0
- package/dist/runtime/storage.mjs +14 -0
- package/dist/runtime/validator.d.mts +2 -0
- package/dist/runtime/validator.mjs +72 -0
- package/dist/runtime/ws-server.d.mts +26 -0
- package/dist/runtime/ws-server.mjs +296 -0
- package/dist/runtime/ws.d.mts +123 -0
- package/dist/runtime/ws.mjs +103 -0
- package/dist/scan-Ba4hFwlH.mjs +324 -0
- package/dist/scan-C6HMEIdW.mjs +318 -0
- package/dist/secret-CeRSukgM.mjs +109 -0
- package/dist/skills-ipldjlKE.mjs +62 -0
- package/dist/standard-schema-9CRjx-uR.d.mts +42 -0
- package/dist/subcommand-prompt-BKjuNAPb.mjs +349 -0
- package/dist/sveltekit.d.mts +20 -0
- package/dist/sveltekit.mjs +61 -0
- package/dist/types-mHOEwpW4.d.mts +57 -0
- package/dist/validate-CaMavMxu.mjs +146 -0
- package/dist/yarn-pnp-BFqMV_bl.mjs +196 -0
- package/getting-started-prompt.txt +26 -0
- package/package.json +322 -30
- package/schema.json +364 -0
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
- package/skills/void/SKILL.md +75 -0
- package/skills/void/command/void.md +7 -0
- package/skills/void/docs/guide/ai.md +235 -0
- package/skills/void/docs/guide/app-types.md +103 -0
- package/skills/void/docs/guide/auth.md +257 -0
- package/skills/void/docs/guide/database/d1.md +106 -0
- package/skills/void/docs/guide/database/postgresql.md +106 -0
- package/skills/void/docs/guide/database.md +418 -0
- package/skills/void/docs/guide/deployment.md +98 -0
- package/skills/void/docs/guide/edge/headers.md +79 -0
- package/skills/void/docs/guide/edge/prerendering.md +83 -0
- package/skills/void/docs/guide/edge/redirects.md +116 -0
- package/skills/void/docs/guide/edge/revalidation.md +131 -0
- package/skills/void/docs/guide/edge/rewrites.md +354 -0
- package/skills/void/docs/guide/edge/static-assets.md +72 -0
- package/skills/void/docs/guide/env-vars.md +298 -0
- package/skills/void/docs/guide/index.md +80 -0
- package/skills/void/docs/guide/jobs.md +91 -0
- package/skills/void/docs/guide/kv.md +107 -0
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +419 -0
- package/skills/void/docs/guide/pages-routing/head.md +130 -0
- package/skills/void/docs/guide/pages-routing/islands.md +405 -0
- package/skills/void/docs/guide/pages-routing/layouts.md +362 -0
- package/skills/void/docs/guide/pages-routing/loaders.md +267 -0
- package/skills/void/docs/guide/pages-routing/markdown.md +625 -0
- package/skills/void/docs/guide/pages-routing/overview.md +236 -0
- package/skills/void/docs/guide/pages-routing/view-transitions.md +140 -0
- package/skills/void/docs/guide/queues.md +140 -0
- package/skills/void/docs/guide/quickstart.md +233 -0
- package/skills/void/docs/guide/remote-dev.md +67 -0
- package/skills/void/docs/guide/sandboxes.md +82 -0
- package/skills/void/docs/guide/server-routing.md +246 -0
- package/skills/void/docs/guide/ssg.md +74 -0
- package/skills/void/docs/guide/ssr.md +105 -0
- package/skills/void/docs/guide/storage.md +67 -0
- package/skills/void/docs/guide/type-safety.md +179 -0
- package/skills/void/docs/guide/typed-fetch.md +113 -0
- package/skills/void/docs/guide/websockets.md +190 -0
- package/skills/void/docs/index.md +48 -0
- package/skills/void/docs/integrations/agents.md +84 -0
- package/skills/void/docs/integrations/cloudflare.md +284 -0
- package/skills/void/docs/integrations/frameworks/analog.md +182 -0
- package/skills/void/docs/integrations/frameworks/astro.md +197 -0
- package/skills/void/docs/integrations/frameworks/nuxt.md +164 -0
- package/skills/void/docs/integrations/frameworks/overview.md +136 -0
- package/skills/void/docs/integrations/frameworks/react-router.md +137 -0
- package/skills/void/docs/integrations/frameworks/sveltekit.md +191 -0
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +140 -0
- package/skills/void/docs/integrations/hono.md +97 -0
- package/skills/void/docs/integrations/nodejs-bun-deno.md +210 -0
- package/skills/void/docs/node_modules/@iconify/vue/README.md +408 -0
- package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +5 -0
- package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +103 -0
- package/skills/void/docs/node_modules/oxc-minify/README.md +78 -0
- package/skills/void/docs/node_modules/reka-ui/README.md +80 -0
- package/skills/void/docs/node_modules/vitepress/README.md +28 -0
- package/skills/void/docs/node_modules/vitepress/template/api-examples.md +49 -0
- package/skills/void/docs/node_modules/vitepress/template/index.md +28 -0
- package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +85 -0
- package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +101 -0
- package/skills/void/docs/node_modules/void/AGENTS.md +204 -0
- package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +15 -0
- package/skills/void/docs/node_modules/void/README.md +89 -0
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +591 -0
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +375 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +174 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +37 -0
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +135 -0
- package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +189 -0
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +143 -0
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +1272 -0
- package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +19 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +22 -0
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +69 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +152 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +24 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +565 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +124 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +600 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +386 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +95 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +101 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathe/README.md +73 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +15 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +25 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tsdown/README.md +55 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/LICENSE.md +2230 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite/README.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +58 -0
- package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +165 -0
- package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +32 -0
- package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +99 -0
- package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +108 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +51 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +79 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +44 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +51 -0
- package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +65 -0
- package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +390 -0
- package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +48 -0
- package/skills/void/docs/node_modules/void/node_modules/hono/README.md +85 -0
- package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +452 -0
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +76 -0
- package/{LICENSE → skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md} +21 -21
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +364 -0
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +41 -0
- package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +325 -0
- package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +398 -0
- package/skills/void/docs/node_modules/void/node_modules/pathe/README.md +73 -0
- package/skills/void/docs/node_modules/void/node_modules/pg/README.md +95 -0
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md +21 -0
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +135 -0
- package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +21 -0
- package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +25 -0
- package/skills/void/docs/node_modules/void/node_modules/tsdown/README.md +55 -0
- package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +9 -0
- package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +94 -0
- package/skills/void/docs/node_modules/void/node_modules/vite/LICENSE.md +2230 -0
- package/skills/void/docs/node_modules/void/node_modules/vite/README.md +20 -0
- package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +63 -0
- package/skills/void/docs/node_modules/void/node_modules/zod/README.md +191 -0
- package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +175 -0
- package/skills/void/docs/node_modules/void/skills/void/SKILL.md +75 -0
- package/skills/void/docs/node_modules/void/skills/void/command/void.md +7 -0
- package/skills/void/docs/reference/api.md +917 -0
- package/skills/void/docs/reference/cli.md +561 -0
- package/skills/void/docs/reference/config.md +408 -0
- package/skills/void/docs/reference/resource-inference.md +149 -0
- package/skills/void/docs/reference/structure.md +176 -0
- package/.npmignore +0 -29
- package/.travis.yml +0 -9
- package/favicon.ico +0 -0
- package/index.js +0 -14
- package/lib/Job.js +0 -150
- package/lib/Void.js +0 -99
- package/lib/scan.js +0 -19
- package/test/credentials.js +0 -20
- package/test/job.js +0 -64
- package/test/static/dir1/test6.html +0 -0
- package/test/static/dir2/test7.html +0 -0
- package/test/static/dir2/test8.html +0 -0
- package/test/static/dir2/test9.html +0 -0
- package/test/static/test1.html +0 -0
- package/test/static/test2.html +0 -0
- package/test/static/test3.html +0 -0
- package/test/void.js +0 -31
- /package/{test/static/dir1/test4.html → skills/void/docs/integrations/auth-providers.md} +0 -0
- /package/{test/static/dir1/test5.html → skills/void/docs/integrations/payment-processors.md} +0 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
---
|
|
2
|
+
outline: deep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<script setup>
|
|
6
|
+
function islandItems(ext) {
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
name: "pages/",
|
|
10
|
+
children: [
|
|
11
|
+
{
|
|
12
|
+
name: "blog/",
|
|
13
|
+
children: [
|
|
14
|
+
{ name: `index.island${ext}`, description: "← island page" },
|
|
15
|
+
{ name: "index.server.ts" },
|
|
16
|
+
{ name: `_Counter${ext}`, description: "regular component, used as island" },
|
|
17
|
+
{ name: `_PostForm${ext}` },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function mixedItems(ext) {
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
name: "pages/",
|
|
29
|
+
children: [
|
|
30
|
+
{ name: `index${ext}`, description: "regular page (full hydration, Void Router)" },
|
|
31
|
+
{ name: `about${ext}`, description: "regular page" },
|
|
32
|
+
{
|
|
33
|
+
name: "blog/",
|
|
34
|
+
children: [
|
|
35
|
+
{ name: `index.island${ext}`, description: "island page (partial hydration, static HTML)" },
|
|
36
|
+
{ name: `[slug].island${ext}`, description: "island page" },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
# Islands
|
|
47
|
+
|
|
48
|
+
Islands mode is a partial hydration architecture inspired by [Astro](https://docs.astro.build/en/concepts/islands/). Instead of hydrating the whole page on the client, only the interactive components, or "islands," ship JavaScript to the browser. The rest of the page stays as static server-rendered HTML.
|
|
49
|
+
|
|
50
|
+
This gives you the best of both worlds: fast initial page loads with minimal client-side JavaScript, plus rich interactivity exactly where you need it.
|
|
51
|
+
|
|
52
|
+
::: tip Prerequisites
|
|
53
|
+
Islands mode builds on top of [Pages Routing](./overview). You need a working Pages setup (framework adapter installed, `pages/` directory, Vite config) before using islands.
|
|
54
|
+
:::
|
|
55
|
+
|
|
56
|
+
## When to Use Islands
|
|
57
|
+
|
|
58
|
+
Islands mode is a good fit when:
|
|
59
|
+
|
|
60
|
+
- **Most of your page is static content:** blog posts, marketing pages, or documentation
|
|
61
|
+
- **Only a few components need interactivity:** a counter, a form, or a live widget
|
|
62
|
+
- **Performance is critical:** you want near-zero JavaScript for static content
|
|
63
|
+
|
|
64
|
+
If your entire page is interactive (dashboards, apps with lots of client state), stick with regular [Pages Routing](./overview).
|
|
65
|
+
|
|
66
|
+
## Creating an Island Page
|
|
67
|
+
|
|
68
|
+
Name your page file with the `.island` suffix:
|
|
69
|
+
|
|
70
|
+
<FileTree :items="islandItems" adapter-tabs default-expanded />
|
|
71
|
+
|
|
72
|
+
The `.island` suffix tells Void to:
|
|
73
|
+
|
|
74
|
+
1. **Server-render the full page** as static HTML (no `data-page` attribute, no Void Router)
|
|
75
|
+
2. **Only hydrate** the components you explicitly mark as islands
|
|
76
|
+
3. **Skip the Inertia protocol:** navigation between island pages uses full page loads
|
|
77
|
+
4. **Auto-prerender:** island pages with no `loader` and no dynamic params are automatically [prerendered](/guide/edge/prerendering) at deploy time. Opt out with `export const prerender = false` in the companion `.server.ts` file.
|
|
78
|
+
|
|
79
|
+
## Marking Components as Islands
|
|
80
|
+
|
|
81
|
+
Use [import attributes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with) to mark which components should be interactive on the client:
|
|
82
|
+
|
|
83
|
+
::: code-group
|
|
84
|
+
|
|
85
|
+
```tsx [React]
|
|
86
|
+
// pages/blog/index.island.tsx
|
|
87
|
+
import Counter from './_Counter' with { island: 'load' };
|
|
88
|
+
import PostForm from './_PostForm' with { island: 'visible' };
|
|
89
|
+
|
|
90
|
+
export default function BlogIndex({ posts }) {
|
|
91
|
+
return (
|
|
92
|
+
<div>
|
|
93
|
+
<h1>Blog</h1>
|
|
94
|
+
<Counter />
|
|
95
|
+
{posts.map((post) => (
|
|
96
|
+
<a key={post.slug} href={`/blog/${post.slug}`}>
|
|
97
|
+
{post.title}
|
|
98
|
+
</a>
|
|
99
|
+
))}
|
|
100
|
+
<PostForm />
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```vue [Vue]
|
|
107
|
+
<!-- pages/blog/index.island.vue -->
|
|
108
|
+
<script setup>
|
|
109
|
+
import Counter from './_Counter.vue' with { island: 'load' };
|
|
110
|
+
import PostForm from './_PostForm.vue' with { island: 'visible' };
|
|
111
|
+
|
|
112
|
+
defineProps({ posts: Array });
|
|
113
|
+
</script>
|
|
114
|
+
|
|
115
|
+
<template>
|
|
116
|
+
<div>
|
|
117
|
+
<h1>Blog</h1>
|
|
118
|
+
<Counter />
|
|
119
|
+
<a v-for="post in posts" :key="post.slug" :href="`/blog/${post.slug}`">
|
|
120
|
+
{{ post.title }}
|
|
121
|
+
</a>
|
|
122
|
+
<PostForm />
|
|
123
|
+
</div>
|
|
124
|
+
</template>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```svelte [Svelte]
|
|
128
|
+
<!-- pages/blog/index.island.svelte -->
|
|
129
|
+
<script>
|
|
130
|
+
import Counter from "./_Counter.svelte" with { island: "load" };
|
|
131
|
+
import PostForm from "./_PostForm.svelte" with { island: "visible" };
|
|
132
|
+
|
|
133
|
+
let { posts } = $props();
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
<div>
|
|
137
|
+
<h1>Blog</h1>
|
|
138
|
+
<Counter />
|
|
139
|
+
{#each posts as post}
|
|
140
|
+
<a href="/blog/{post.slug}">{post.title}</a>
|
|
141
|
+
{/each}
|
|
142
|
+
<PostForm />
|
|
143
|
+
</div>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```tsx [Solid]
|
|
147
|
+
// pages/blog/index.island.tsx
|
|
148
|
+
import Counter from './_Counter' with { island: 'load' };
|
|
149
|
+
import PostForm from './_PostForm' with { island: 'visible' };
|
|
150
|
+
import { For } from 'solid-js';
|
|
151
|
+
|
|
152
|
+
export default function BlogIndex(props) {
|
|
153
|
+
return (
|
|
154
|
+
<div>
|
|
155
|
+
<h1>Blog</h1>
|
|
156
|
+
<Counter />
|
|
157
|
+
<For each={props.posts}>{(post) => <a href={`/blog/${post.slug}`}>{post.title}</a>}</For>
|
|
158
|
+
<PostForm />
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
:::
|
|
165
|
+
|
|
166
|
+
Components imported _without_ the `island` attribute are rendered as static HTML only. No JavaScript is sent to the browser for them.
|
|
167
|
+
|
|
168
|
+
::: warning TypeScript configuration
|
|
169
|
+
Import attributes require `"module": "ESNext"` in your `tsconfig.json`:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"compilerOptions": {
|
|
174
|
+
"module": "ESNext"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
:::
|
|
180
|
+
|
|
181
|
+
## Hydration Strategies
|
|
182
|
+
|
|
183
|
+
The `island` attribute value controls _when_ the component hydrates:
|
|
184
|
+
|
|
185
|
+
| Strategy | Hydrates when... | Use case |
|
|
186
|
+
| ----------------- | --------------------------- | ------------------------------------------ |
|
|
187
|
+
| `"load"` | Page loads | Critical interactive UI (forms, nav menus) |
|
|
188
|
+
| `"visible"` | Element enters the viewport | Below-the-fold content |
|
|
189
|
+
| `"idle"` | Browser is idle | Non-critical enhancements |
|
|
190
|
+
| `"media:(query)"` | CSS media query matches | Responsive components (e.g., mobile-only) |
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
import CookieBanner from './_CookieBanner' with { island: 'idle' };
|
|
194
|
+
import MobileMenu from './_MobileMenu' with { island: 'media:(max-width: 768px)' };
|
|
195
|
+
import Comments from './_Comments' with { island: 'visible' };
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Server Handlers
|
|
199
|
+
|
|
200
|
+
Island pages use the same `loader` and `action` pattern as regular pages. The `.server.ts` companion file works identically:
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
// pages/blog/index.server.ts
|
|
204
|
+
import { defineHandler } from 'void';
|
|
205
|
+
|
|
206
|
+
export const loader = defineHandler((c) => {
|
|
207
|
+
return c.json({ posts: getAllPosts() });
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
export const action = defineHandler(async (c) => {
|
|
211
|
+
const body = await c.req.json();
|
|
212
|
+
// validate, create post...
|
|
213
|
+
return c.json({ success: true });
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
The key difference is what happens after a successful action. On a regular page, the Inertia protocol redirects and the Void Router fetches fresh props as JSON. On an island page, there is no Void Router, so successful actions cause a full page reload or a redirect through `window.location`.
|
|
218
|
+
|
|
219
|
+
## Forms
|
|
220
|
+
|
|
221
|
+
Island pages cannot use `useForm` because it depends on the Void Router. Use `useIslandForm` instead. It has the same API, but it uses `fetch()` directly:
|
|
222
|
+
|
|
223
|
+
::: code-group
|
|
224
|
+
|
|
225
|
+
```tsx [React]
|
|
226
|
+
import { useIslandForm } from '@void/react';
|
|
227
|
+
|
|
228
|
+
export default function PostForm() {
|
|
229
|
+
const form = useIslandForm({ title: '', body: '' });
|
|
230
|
+
|
|
231
|
+
return (
|
|
232
|
+
<form
|
|
233
|
+
onSubmit={(e) => {
|
|
234
|
+
e.preventDefault();
|
|
235
|
+
return form.post('/blog');
|
|
236
|
+
}}
|
|
237
|
+
>
|
|
238
|
+
<label htmlFor="title">Title:</label>
|
|
239
|
+
<input
|
|
240
|
+
id="title"
|
|
241
|
+
value={form.data.title}
|
|
242
|
+
onChange={(e) => form.setData('title', e.target.value)}
|
|
243
|
+
/>
|
|
244
|
+
{form.errors.title && <span>{form.errors.title}</span>}
|
|
245
|
+
|
|
246
|
+
<label htmlFor="body">Body:</label>
|
|
247
|
+
<textarea
|
|
248
|
+
id="body"
|
|
249
|
+
value={form.data.body}
|
|
250
|
+
onChange={(e) => form.setData('body', e.target.value)}
|
|
251
|
+
/>
|
|
252
|
+
{form.errors.body && <span>{form.errors.body}</span>}
|
|
253
|
+
|
|
254
|
+
<button disabled={form.pending}>{form.pending ? 'Saving...' : 'Add Post'}</button>
|
|
255
|
+
</form>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```vue [Vue]
|
|
261
|
+
<script setup>
|
|
262
|
+
import { useIslandForm } from '@void/vue';
|
|
263
|
+
|
|
264
|
+
const form = useIslandForm({ title: '', body: '' });
|
|
265
|
+
|
|
266
|
+
function submit() {
|
|
267
|
+
return form.post('/blog');
|
|
268
|
+
}
|
|
269
|
+
</script>
|
|
270
|
+
|
|
271
|
+
<template>
|
|
272
|
+
<form @submit.prevent="submit">
|
|
273
|
+
<label for="title">Title:</label>
|
|
274
|
+
<input id="title" v-model="form.data.title" />
|
|
275
|
+
<span v-if="form.errors.title">{{ form.errors.title }}</span>
|
|
276
|
+
|
|
277
|
+
<label for="body">Body:</label>
|
|
278
|
+
<textarea id="body" v-model="form.data.body" />
|
|
279
|
+
<span v-if="form.errors.body">{{ form.errors.body }}</span>
|
|
280
|
+
|
|
281
|
+
<button :disabled="form.pending">
|
|
282
|
+
{{ form.pending ? 'Saving...' : 'Add Post' }}
|
|
283
|
+
</button>
|
|
284
|
+
</form>
|
|
285
|
+
</template>
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
```svelte [Svelte]
|
|
289
|
+
<script>
|
|
290
|
+
import { useIslandForm } from "@void/svelte";
|
|
291
|
+
|
|
292
|
+
const form = useIslandForm({ title: "", body: "" });
|
|
293
|
+
|
|
294
|
+
function submit() {
|
|
295
|
+
return form.post("/blog");
|
|
296
|
+
}
|
|
297
|
+
</script>
|
|
298
|
+
|
|
299
|
+
<form on:submit|preventDefault={submit}>
|
|
300
|
+
<label for="title">Title:</label>
|
|
301
|
+
<input id="title" bind:value={form.data.title} />
|
|
302
|
+
{#if form.errors.title}<span>{form.errors.title}</span>{/if}
|
|
303
|
+
|
|
304
|
+
<label for="body">Body:</label>
|
|
305
|
+
<textarea id="body" bind:value={form.data.body} />
|
|
306
|
+
{#if form.errors.body}<span>{form.errors.body}</span>{/if}
|
|
307
|
+
|
|
308
|
+
<button disabled={form.pending}>
|
|
309
|
+
{form.pending ? "Saving..." : "Add Post"}
|
|
310
|
+
</button>
|
|
311
|
+
</form>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```tsx [Solid]
|
|
315
|
+
import { useIslandForm } from '@void/solid';
|
|
316
|
+
import { Show } from 'solid-js';
|
|
317
|
+
|
|
318
|
+
export default function PostForm() {
|
|
319
|
+
const form = useIslandForm({ title: '', body: '' });
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<form
|
|
323
|
+
onSubmit={(e) => {
|
|
324
|
+
e.preventDefault();
|
|
325
|
+
return form.post('/blog');
|
|
326
|
+
}}
|
|
327
|
+
>
|
|
328
|
+
<label for="title">Title:</label>
|
|
329
|
+
<input
|
|
330
|
+
id="title"
|
|
331
|
+
value={form.data.title}
|
|
332
|
+
onInput={(e) => form.setData('title', e.target.value)}
|
|
333
|
+
/>
|
|
334
|
+
<Show when={form.errors.title}>
|
|
335
|
+
<span>{form.errors.title}</span>
|
|
336
|
+
</Show>
|
|
337
|
+
|
|
338
|
+
<label for="body">Body:</label>
|
|
339
|
+
<textarea
|
|
340
|
+
id="body"
|
|
341
|
+
value={form.data.body}
|
|
342
|
+
onInput={(e) => form.setData('body', e.target.value)}
|
|
343
|
+
/>
|
|
344
|
+
<Show when={form.errors.body}>
|
|
345
|
+
<span>{form.errors.body}</span>
|
|
346
|
+
</Show>
|
|
347
|
+
|
|
348
|
+
<button disabled={form.pending}>{form.pending ? 'Saving...' : 'Add Post'}</button>
|
|
349
|
+
</form>
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
:::
|
|
355
|
+
|
|
356
|
+
`useIslandForm` returns the same shape as `useForm`:
|
|
357
|
+
|
|
358
|
+
| Property | Type | Description |
|
|
359
|
+
| ------------------------- | ------------------------- | ------------------------------------------ |
|
|
360
|
+
| `data` | `T` | Reactive form state |
|
|
361
|
+
| `setData(field, value)` | Function | Update a field |
|
|
362
|
+
| `errors` | `Record<string, string>` | Validation errors from 422 responses |
|
|
363
|
+
| `error` | `VoidActionError \| null` | Non-validation call-site action error |
|
|
364
|
+
| `pending` | `boolean` | Submission in progress |
|
|
365
|
+
| `hasChanges` | `boolean` | Form has unsaved changes |
|
|
366
|
+
| `wasSuccessful` | `boolean` | Last submission succeeded |
|
|
367
|
+
| `recentlySuccessful` | `boolean` | Success within last 2 seconds |
|
|
368
|
+
| `reset(...fields?)` | Function | Reset to defaults (all or specific fields) |
|
|
369
|
+
| `clearErrors(...fields?)` | Function | Clear errors (all or specific fields) |
|
|
370
|
+
| `clearError()` | Function | Clear the non-validation call-site error |
|
|
371
|
+
| `post(url)` | Function | Submit via POST |
|
|
372
|
+
| `put(url)` | Function | Submit via PUT |
|
|
373
|
+
| `patch(url)` | Function | Submit via PATCH |
|
|
374
|
+
| `delete(url)` | Function | Submit via DELETE |
|
|
375
|
+
|
|
376
|
+
The submit helpers return `Promise<void>` so callers and framework event
|
|
377
|
+
handlers can observe boundary-class failures. On success (200), the page reloads.
|
|
378
|
+
On validation error (422), `errors` is populated from the response
|
|
379
|
+
`{ errors: { field: "message" } }`. On redirect, the browser follows it.
|
|
380
|
+
|
|
381
|
+
## Navigation
|
|
382
|
+
|
|
383
|
+
Island pages do not have a Void Router. Use regular `<a>` tags for navigation:
|
|
384
|
+
|
|
385
|
+
```tsx
|
|
386
|
+
// ✅ Use regular links in island pages
|
|
387
|
+
<a href="/blog/my-post">Read more</a>
|
|
388
|
+
|
|
389
|
+
// ❌ Don't use <Link>; there is no Void Router to handle it
|
|
390
|
+
<Link href="/blog/my-post">Read more</Link>
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
When navigating _from_ a regular page to an island page (e.g., via `<Link>`), the router detects that the target is an island page and falls back to a full-page navigation automatically.
|
|
394
|
+
|
|
395
|
+
## Layouts
|
|
396
|
+
|
|
397
|
+
Island pages support [layouts](./layouts) the same way as regular pages. The layout wraps the page during server rendering. Layout components in island pages are **static only**, so they are not hydrated on the client.
|
|
398
|
+
|
|
399
|
+
## Mixing Island and Regular Pages
|
|
400
|
+
|
|
401
|
+
Island pages and regular pages can coexist in the same app:
|
|
402
|
+
|
|
403
|
+
<FileTree :items="mixedItems" adapter-tabs default-expanded />
|
|
404
|
+
|
|
405
|
+
The Void Router handles navigation between regular pages. Navigating to or from an island page triggers a full-page load.
|