void 0.10.12 → 0.20.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/AGENTS_TEMPLATE.md +6 -0
- package/{skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md → LICENSE} +1 -1
- package/README.md +34 -8
- package/dist/{auth-qgMlYp7Z.d.mts → auth-DkcFflXV.d.mts} +10 -11
- package/dist/auth-W9WII-mN.mjs +630 -0
- package/dist/{auth-cmd-BqsdZJp5.mjs → auth-cmd-CYVhSNFy.mjs} +4 -3
- package/dist/{auth-migrations-BTZ-ATvQ.mjs → auth-migrations-9vif1uj8.mjs} +53 -12
- package/dist/{better-auth-shared-BQooDxbw.mjs → better-auth-shared-CYw1T3k4.mjs} +7 -10
- package/dist/{better-auth-shared-DealXecJ.d.mts → better-auth-shared-DSCeohOK.d.mts} +10 -5
- package/dist/{build-cmd-Bujrv5q-.mjs → build-cmd-CkVD1uOh.mjs} +6 -4
- package/dist/{cache-C11V8Fxq.mjs → cache-QcUfR-ff.mjs} +9 -5
- package/dist/{cancel-deploy-fwFYF04b.mjs → cancel-deploy-DsvWKFTe.mjs} +3 -2
- package/dist/cf-access-AJ1ehiFR.mjs +42 -0
- package/dist/cf-access-DsSsZUPr.mjs +67 -0
- package/dist/cli/cli.d.mts +1 -1
- package/dist/cli/cli.mjs +1592 -153
- package/dist/cli/env-schema-probe.d.mts +48 -61
- package/dist/cli/env-schema-probe.mjs +10 -58
- package/dist/{client-Gb71-XkG.mjs → client-CyCHWSO_.mjs} +61 -463
- package/dist/cloudflare-auth-DRkGe7-s.mjs +170 -0
- package/dist/cloudflare-cmd-D3ME2GAe.mjs +62 -0
- package/dist/cloudflare-connect-BivMefMA.mjs +56 -0
- package/dist/cloudflare-operations-CPTpRW6d.mjs +566 -0
- package/dist/{config-BkTvs43g.mjs → config-BQFq7QvD.mjs} +85 -41
- package/dist/{config-CutEMNGJ.mjs → config-NOG_U1aK.mjs} +10 -15
- package/dist/connect-D9Yr-T5f.mjs +79 -0
- package/dist/{create-project-DsYvl3TB.mjs → create-project-DMV-csEm.mjs} +26 -16
- package/dist/database-provider.d.mts +21 -0
- package/dist/database-provider.mjs +6 -0
- package/dist/{db-DOiJMRt2.mjs → db-BxoUWL0F.mjs} +600 -115
- package/dist/{delete-mh6p-zkQ.mjs → delete-iJOqxBz1.mjs} +9 -6
- package/dist/{deploy-u7Rv9q_q.mjs → deploy-CcDoeBIf.mjs} +3451 -1986
- package/dist/dev-inbox-DkgRWLkW.mjs +307 -0
- package/dist/{discover-CJHyvYfR.mjs → discover-xvfrgJeo.mjs} +3 -3
- package/dist/{magic-string.es-ZQjdJFFn.mjs → dist-BR1quN_w.mjs} +570 -216
- package/dist/{dist-DaKKDf8D.mjs → dist-BrsS7cai.mjs} +17 -2
- package/dist/{dist-BuiRJkTd.mjs → dist-m40_XgNh.mjs} +48 -33
- package/dist/{domain-DiaNQbrl.mjs → domain-gu_iaHmn.mjs} +41 -4
- package/dist/dotenv-VQxupEUv.mjs +181 -0
- package/dist/edge.d.mts +2 -0
- package/dist/edge.mjs +2 -0
- package/dist/email-Ce6SQq-i.mjs +182 -0
- package/dist/email-r6DHJyAB.mjs +262 -0
- package/dist/{entry-D7yy4xVH.mjs → entry-DU3oDoQ3.mjs} +2 -2
- package/dist/env-D4Emu-M_.mjs +95 -0
- package/dist/env-DmU2To0C.mjs +73 -0
- package/dist/env-helpers-CyKtOBpj.d.mts +22 -0
- package/dist/env-public-D_6u46fX.d.mts +135 -0
- package/dist/{env-types-QBj-ndax.mjs → env-types-BNPhro-M.mjs} +2 -2
- package/dist/{env-validation-Dea3v3ej.mjs → env-validation-ENpMy6Ez.mjs} +68 -122
- package/dist/{gen-o_w-8yI8.mjs → gen-BKw6qHIg.mjs} +70 -15
- package/dist/{github-cmd-DKcGUNsj.mjs → github-cmd-DJS5Ab-H.mjs} +39 -31
- package/dist/{handler-Cjh8uM3Y.d.mts → handler-D1hLsObx.d.mts} +124 -122
- package/dist/{head-nmvOgFjd.d.mts → head-Do8P4puT.d.mts} +9 -8
- package/dist/{headers-nsHIFixA.mjs → headers-D8QfRX9Y.mjs} +12 -10
- package/dist/inbound-BJ70in1n.d.mts +354 -0
- package/dist/inbound-CNKxb3FY.mjs +694 -0
- package/dist/index.d.mts +61 -34
- package/dist/index.mjs +1048 -321
- package/dist/{init-3rgHKBVi.mjs → init-Dx5cgKqK.mjs} +329 -271
- package/dist/link-D_rm5sRH.mjs +52 -0
- package/dist/{list-CPwFDZ_c.mjs → list-M8XShti7.mjs} +37 -5
- package/dist/{runner-kapo9aPs.mjs → local-d1-BE8KBbMy.mjs} +116 -6
- package/dist/{login-BT3H8PN3.mjs → login-C8-UuLnp.mjs} +17 -15
- package/dist/{logs-Bt313ax7.mjs → logs-DwFU7dMW.mjs} +16 -2
- package/dist/mime-BJD7d_qL.mjs +1216 -0
- package/dist/neon-DHwd2zvC.mjs +54 -0
- package/dist/{node-Da0UcsGA.mjs → node-BkaXcpAc.mjs} +29 -8
- package/dist/operator-cmd-DYWRbWUA.mjs +348 -0
- package/dist/{agents-CtgBYqld.mjs → output-tFQLLj26.mjs} +676 -211
- package/dist/{package-json-Cx1osYo6.mjs → package-json-CPoWX79C.mjs} +1 -1
- package/dist/pages/client.d.mts +43 -41
- package/dist/pages/client.mjs +40 -33
- package/dist/pages/head-client.d.mts +10 -12
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/index.d.mts +37 -14
- package/dist/pages/index.mjs +5 -5
- package/dist/pages/islands-plugin.d.mts +25 -27
- package/dist/pages/islands-plugin.mjs +6 -4
- package/dist/pages/prefetch.d.mts +6 -7
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -1
- package/dist/pages/serialize.d.mts +7 -8
- package/dist/platform-cmd-BEOVv1PN.mjs +123 -0
- package/dist/platform-domain-BszUfiS8.mjs +228 -0
- package/dist/platform-lifecycle-CjSr6xf0.mjs +4450 -0
- package/dist/platform-management-W30iCaTL.mjs +698 -0
- package/dist/platform-recovery-pHHv4ZSg.mjs +99 -0
- package/dist/{plugin-inference-DMeavIJ6.mjs → plugin-inference-BDRfZngg.mjs} +35 -19
- package/dist/prepare-BfJvFUtJ.mjs +14 -0
- package/dist/{prepare-BoKHgMNx.mjs → prepare-CBetXvsN.mjs} +15 -24
- package/dist/{preset-BjyR3lzz.mjs → preset-lAy0B0BQ.mjs} +25 -212
- package/dist/{project-cmd-D_w-4w5B.mjs → project-cmd-DCpk1cDt.mjs} +25 -12
- package/dist/{project-paths-BQd7OmIo.mjs → project-paths-SK8nMHPp.mjs} +3 -1
- package/dist/{project-tsconfig-B-QtXjLQ.mjs → project-tsconfig-Ql2XsSQp.mjs} +2 -2
- package/dist/{protocol-Bnb0LFp3.d.mts → protocol-C-pqYJjE.d.mts} +3 -4
- package/dist/{provision-rShh6MKY.mjs → provision-Blnstcm2.mjs} +78 -45
- package/dist/r2-conditions-D1Wk8i7b.mjs +30 -0
- package/dist/{requests-B8sZxaFM.mjs → requests-Dn8Vheh1.mjs} +5 -3
- package/dist/{resolve-project-BBMtLLV9.mjs → resolve-project--Vxawf7z.mjs} +2 -2
- package/dist/rollback-CtlPXEBi.mjs +166 -0
- package/dist/{rolldown-runtime-DJK8HYOj.mjs → rolldown-runtime-rQ84J-ij.mjs} +1 -1
- package/dist/{route-types-COI2DsZv.mjs → route-types-Da-DpyUp.mjs} +85 -26
- package/dist/routes-stub.d.mts +22 -23
- package/dist/runner-mysql-CgRFl3s6.mjs +61 -0
- package/dist/{runner-pg-CHM76xuC.mjs → runner-pg-DCkWPsWS.mjs} +18 -6
- package/dist/runtime/ai.d.mts +21 -14
- package/dist/runtime/ai.mjs +5 -4
- package/dist/runtime/auth-client-react.d.mts +3 -5
- package/dist/runtime/auth-client-solid.d.mts +3 -5
- package/dist/runtime/auth-client-svelte.d.mts +3 -5
- package/dist/runtime/auth-client-vue.d.mts +3 -5
- package/dist/runtime/auth-client.d.mts +3 -5
- package/dist/runtime/auth.d.mts +1 -1
- package/dist/runtime/better-auth-mysql.d.mts +10 -0
- package/dist/runtime/better-auth-mysql.mjs +49 -0
- package/dist/runtime/better-auth-pg.d.mts +8 -9
- package/dist/runtime/better-auth-pg.mjs +2 -2
- package/dist/runtime/better-auth.d.mts +8 -9
- package/dist/runtime/better-auth.mjs +2 -2
- package/dist/runtime/client-react.d.mts +1 -1
- package/dist/runtime/client-solid.d.mts +1 -1
- package/dist/runtime/client-svelte.d.mts +1 -1
- package/dist/runtime/client-vue.d.mts +1 -1
- package/dist/runtime/client.d.mts +1 -1
- package/dist/runtime/db-mysql.d.mts +2 -0
- package/dist/runtime/db-mysql.mjs +1 -0
- package/dist/runtime/db.d.mts +10 -11
- package/dist/runtime/durable.d.mts +47 -0
- package/dist/runtime/durable.mjs +146 -0
- package/dist/runtime/email/testing.d.mts +112 -0
- package/dist/runtime/email/testing.mjs +283 -0
- package/dist/runtime/email.d.mts +30 -0
- package/dist/runtime/email.mjs +573 -0
- package/dist/runtime/env-helpers.d.mts +2 -2
- package/dist/runtime/env-helpers.mjs +5 -42
- package/dist/runtime/env-public-client.d.mts +10 -11
- package/dist/runtime/env-public-client.mjs +1 -1
- package/dist/runtime/env-public.d.mts +2 -2
- package/dist/runtime/env-public.mjs +104 -49
- package/dist/runtime/env.d.mts +19 -18
- package/dist/runtime/env.mjs +15 -2
- package/dist/runtime/fetch-stream.d.mts +20 -21
- package/dist/runtime/fetch.d.mts +15 -16
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/isr.d.mts +21 -22
- package/dist/runtime/isr.mjs +26 -8
- package/dist/runtime/kv.d.mts +9 -10
- package/dist/runtime/live-client.d.mts +5 -7
- package/dist/runtime/live-client.mjs +9 -7
- package/dist/runtime/live-server.d.mts +4 -5
- package/dist/runtime/live.d.mts +22 -24
- package/dist/runtime/live.mjs +1 -1
- package/dist/runtime/log.d.mts +16 -17
- package/dist/runtime/migration-handler-mysql.d.mts +4 -0
- package/dist/runtime/migration-handler-mysql.mjs +81 -0
- package/dist/runtime/migration-handler-pg.d.mts +2 -4
- package/dist/runtime/migration-handler.d.mts +5 -6
- package/dist/runtime/migration-handler.mjs +4 -3
- package/dist/runtime/queues.d.mts +3 -4
- package/dist/runtime/queues.mjs +2 -1
- package/dist/runtime/remote/binding-handler.d.mts +10 -12
- package/dist/runtime/remote/binding-handler.mjs +24 -3
- package/dist/runtime/remote/index.d.mts +5 -6
- package/dist/runtime/remote/index.mjs +21 -18
- package/dist/runtime/response.d.mts +10 -11
- package/dist/runtime/sandbox.d.mts +56 -55
- package/dist/runtime/sandbox.mjs +57 -49
- package/dist/runtime/schema-mysql.d.mts +1 -0
- package/dist/runtime/schema-mysql.mjs +2 -0
- package/dist/runtime/seed.d.mts +14 -9
- package/dist/runtime/sse-client.d.mts +6 -7
- package/dist/runtime/sse.d.mts +11 -12
- package/dist/runtime/storage.d.mts +3 -4
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +12 -12
- package/dist/runtime/ws-server.mjs +32 -4
- package/dist/runtime/ws.d.mts +19 -21
- package/dist/{scan-DYXkrasO.mjs → scan-BMH4rzlv.mjs} +53 -31
- package/dist/{scan-DEwlM_Xy.mjs → scan-CpK-57ug.mjs} +9 -5
- package/dist/{secret-Dt32J6RI.mjs → secret-BqTxGqki.mjs} +62 -5
- package/dist/{skills-CLjN0uUO.mjs → skills-Q46GZMO-.mjs} +6 -4
- package/dist/{standard-schema-DJ0HW7QP.d.mts → standard-schema-Fo_vCAZh.d.mts} +6 -6
- package/dist/{subcommand-prompt-BzV8iQZo.mjs → subcommand-prompt-WfySCQ7S.mjs} +67 -48
- package/dist/sveltekit.d.mts +12 -11
- package/dist/sveltekit.mjs +1 -1
- package/dist/types-BAp5AEBU.d.mts +79 -0
- package/dist/types-CKWnYgfy.d.mts +1 -0
- package/dist/{validate-Cw_RLeTj.mjs → validate-Bihr8WBi.mjs} +3 -3
- package/dist/wrangler--imS8n0d.mjs +1796 -0
- package/dist/{yarn-pnp-DJn3SAHF.mjs → yarn-pnp-DxSInkzL.mjs} +1 -1
- package/package.json +79 -65
- package/schema.json +35 -3
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +1 -1
- package/skills/void/SKILL.md +59 -2
- package/skills/void/docs/guide/ai.md +32 -14
- package/skills/void/docs/guide/app-types.md +6 -6
- package/skills/void/docs/guide/auth.md +14 -16
- package/skills/void/docs/guide/database/d1.md +6 -0
- package/skills/void/docs/guide/database/mysql.md +60 -0
- package/skills/void/docs/guide/database/postgresql.md +14 -9
- package/skills/void/docs/guide/database.md +39 -26
- package/skills/void/docs/guide/deployment.md +163 -22
- package/skills/void/docs/guide/durable-state.md +140 -0
- package/skills/void/docs/guide/edge/headers.md +5 -5
- package/skills/void/docs/guide/edge/prerendering.md +2 -0
- package/skills/void/docs/guide/edge/revalidation.md +21 -6
- package/skills/void/docs/guide/edge/rewrites.md +18 -14
- package/skills/void/docs/guide/edge/static-assets.md +23 -8
- package/skills/void/docs/guide/email.md +609 -0
- package/skills/void/docs/guide/env-migration.md +109 -0
- package/skills/void/docs/guide/env-vars.md +70 -248
- package/skills/void/docs/guide/index.md +15 -17
- package/skills/void/docs/guide/jobs.md +8 -5
- package/skills/void/docs/guide/live.md +7 -15
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +8 -4
- package/skills/void/docs/guide/pages-routing/islands.md +3 -3
- package/skills/void/docs/guide/pages-routing/loaders.md +6 -4
- package/skills/void/docs/guide/pages-routing/overview.md +7 -7
- package/skills/void/docs/guide/platform-administration.md +212 -0
- package/skills/void/docs/guide/platform-development.md +235 -0
- package/skills/void/docs/guide/queues.md +10 -10
- package/skills/void/docs/guide/quickstart.md +46 -67
- package/skills/void/docs/guide/remote-dev.md +8 -6
- package/skills/void/docs/guide/sandboxes.md +33 -16
- package/skills/void/docs/guide/self-hosted-platform.md +553 -0
- package/skills/void/docs/guide/server-routing.md +25 -5
- package/skills/void/docs/guide/sse.md +4 -4
- package/skills/void/docs/guide/ssg.md +5 -3
- package/skills/void/docs/guide/storage.md +2 -2
- package/skills/void/docs/guide/websockets.md +18 -7
- package/skills/void/docs/index.md +3 -3
- package/skills/void/docs/integrations/agents.md +6 -64
- package/skills/void/docs/integrations/cloudflare.md +165 -146
- package/skills/void/docs/integrations/frameworks/analog.md +4 -4
- package/skills/void/docs/integrations/frameworks/astro.md +5 -5
- package/skills/void/docs/integrations/frameworks/nuxt.md +5 -5
- package/skills/void/docs/integrations/frameworks/overview.md +3 -3
- package/skills/void/docs/integrations/frameworks/react-router.md +3 -3
- package/skills/void/docs/integrations/frameworks/sveltekit.md +3 -3
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +2 -2
- package/skills/void/docs/integrations/nodejs-bun-deno.md +11 -4
- package/skills/void/docs/reference/api.md +42 -6
- package/skills/void/docs/reference/cli.md +637 -159
- package/skills/void/docs/reference/config.md +80 -25
- package/skills/void/docs/reference/resource-inference.md +13 -9
- package/skills/void/docs/reference/structure.md +10 -11
- package/AGENT_PROMPT.md +0 -19
- package/dist/cf-access-Bqw81xAf.mjs +0 -22
- package/dist/env-CZy5MorI.mjs +0 -299
- package/dist/env-helpers-z4stu8uc.d.mts +0 -52
- package/dist/env-mask-Dd47NbR6.mjs +0 -90
- package/dist/env-public-BfiLcMBk.d.mts +0 -140
- package/dist/link-CdGHSIy-.mjs +0 -45
- package/dist/mcp-DoM3_nhd.mjs +0 -377
- package/dist/project-paths-GpziKeQQ.d.mts +0 -25
- package/dist/providers-BNKRacMr.d.mts +0 -7
- package/dist/proxy-D-3_D-Gl.mjs +0 -5
- package/dist/rollback-CkvTFXx5.mjs +0 -90
- package/dist/runtime/isr-cache.d.mts +0 -207
- package/dist/runtime/isr-cache.mjs +0 -523
- package/dist/types-lLjNE9Qp.d.mts +0 -51
- package/getting-started-prompt.txt +0 -28
- package/skills/void/command/void.md +0 -7
- package/skills/void/docs/integrations/auth-providers.md +0 -0
- package/skills/void/docs/integrations/payment-processors.md +0 -0
- package/skills/void/docs/node_modules/@iconify/vue/README.md +0 -408
- package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +0 -5
- package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +0 -103
- package/skills/void/docs/node_modules/oxc-minify/README.md +0 -78
- package/skills/void/docs/node_modules/reka-ui/README.md +0 -80
- package/skills/void/docs/node_modules/vitepress/README.md +0 -28
- package/skills/void/docs/node_modules/vitepress/template/api-examples.md +0 -49
- package/skills/void/docs/node_modules/vitepress/template/index.md +0 -28
- package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +0 -85
- package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +0 -101
- package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +0 -19
- package/skills/void/docs/node_modules/void/CLAUDE.md +0 -219
- package/skills/void/docs/node_modules/void/README.md +0 -90
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +0 -685
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +0 -396
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +0 -219
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +0 -37
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +0 -189
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +0 -143
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +0 -1272
- package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +0 -19
- package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/proper-lockfile/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +0 -22
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +0 -153
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +0 -565
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +0 -127
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +0 -600
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +0 -386
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +0 -95
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-footnote/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathslash/README.md +0 -64
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +0 -25
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +0 -16
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +0 -220
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +0 -70
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +0 -26
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +0 -17
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +0 -18
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/build.md +0 -40
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +0 -107
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +0 -62
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +0 -341
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/dev.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +0 -175
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +0 -167
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/fmt.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/implode.md +0 -23
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +0 -134
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +0 -199
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/lint.md +0 -50
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +0 -197
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +0 -356
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/test.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/vpx.md +0 -66
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/why.md +0 -39
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/index.md +0 -12
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/team.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/generator/README.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/monorepo/README.md +0 -29
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +0 -58
- package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +0 -32
- package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +0 -99
- package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +0 -79
- package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +0 -44
- package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +0 -65
- package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +0 -403
- package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +0 -48
- package/skills/void/docs/node_modules/void/node_modules/hono/README.md +0 -85
- package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +0 -452
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +0 -76
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +0 -325
- package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +0 -398
- package/skills/void/docs/node_modules/void/node_modules/pathslash/README.md +0 -64
- package/skills/void/docs/node_modules/void/node_modules/pg/README.md +0 -96
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/CHANGELOG.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/README.md +0 -183
- package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +0 -25
- package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +0 -94
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +0 -16
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +0 -220
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +0 -70
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +0 -26
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +0 -17
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +0 -18
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/build.md +0 -40
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +0 -107
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +0 -62
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +0 -341
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/dev.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +0 -175
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +0 -167
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/fmt.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/implode.md +0 -23
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +0 -134
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +0 -199
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/lint.md +0 -50
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +0 -197
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +0 -356
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/test.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/vpx.md +0 -66
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/why.md +0 -39
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/index.md +0 -12
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/team.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/generator/README.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/monorepo/README.md +0 -29
- package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +0 -63
- package/skills/void/docs/node_modules/void/node_modules/zod/README.md +0 -191
- package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +0 -175
- package/skills/void/docs/node_modules/void/skills/void/SKILL.md +0 -76
- package/skills/void/docs/node_modules/void/skills/void/command/void.md +0 -7
- package/skills/void/docs/node_modules/void/test/e2e/README.md +0 -85
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
//#region src/runtime/isr-cache.ts
|
|
2
|
-
/**
|
|
3
|
-
* Build the normalized path segment for an ISR-cached page.
|
|
4
|
-
* Root path `/` maps to `__index__` to avoid trailing-slash ambiguity.
|
|
5
|
-
*/
|
|
6
|
-
function normalizeIsrPath(pathname) {
|
|
7
|
-
let normalized = pathname;
|
|
8
|
-
if (normalized === "/") normalized = "__index__";
|
|
9
|
-
else {
|
|
10
|
-
normalized = normalized.startsWith("/") ? normalized.slice(1) : normalized;
|
|
11
|
-
if (normalized.endsWith("/")) normalized = normalized.slice(0, -1);
|
|
12
|
-
}
|
|
13
|
-
return normalized;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Inverse of `normalizeIsrPath`: turn a normalized segment back into a
|
|
17
|
-
* pathname starting with `/`.
|
|
18
|
-
*/
|
|
19
|
-
function denormalizeIsrPath(normalized) {
|
|
20
|
-
return normalized === "__index__" ? "/" : `/${normalized}`;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Canonicalize an inbound pathname to the form used inside edge cache URLs.
|
|
24
|
-
* Equivalent to `denormalizeIsrPath(normalizeIsrPath(pathname))` — strips any
|
|
25
|
-
* trailing slash except for root.
|
|
26
|
-
*/
|
|
27
|
-
function canonicalIsrPathname(pathname) {
|
|
28
|
-
return denormalizeIsrPath(normalizeIsrPath(pathname));
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* KV cache key for an ISR-cached page. Deployment- AND host-scoped: cached HTML
|
|
32
|
-
* cannot outlive the hashed assets of the deployment that produced it (a fresh
|
|
33
|
-
* `wrangler deploy` mints a new deployment id → cold cache), and one host's
|
|
34
|
-
* cached content never bleeds into another host served by the same worker
|
|
35
|
-
* (custom domain + workers.dev, apex + www, etc.).
|
|
36
|
-
*/
|
|
37
|
-
function isrKey(deploymentId, host, pathname) {
|
|
38
|
-
return `void-isr/${deploymentId}/${host}/${normalizeIsrPath(pathname)}`;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Host-registry key. Every host that has written cached content registers itself
|
|
42
|
-
* under `void-isr-hosts/<id>/<host>` (value `''`) so a purge with no request host
|
|
43
|
-
* (cron / queue `revalidate({ paths })`) can enumerate the hosts to purge.
|
|
44
|
-
* Scoped by deployment id so registrations from an old deploy do not leak.
|
|
45
|
-
*/
|
|
46
|
-
function hostRegistryKey(deploymentId, host) {
|
|
47
|
-
return `void-isr-hosts/${deploymentId}/${host}`;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Edge-cache (`caches.default`) key for the HTML variant. The public URL stays
|
|
51
|
-
* clean; this internal key carries the deployment id so a new deploy never
|
|
52
|
-
* reads HTML produced by an older deploy.
|
|
53
|
-
*/
|
|
54
|
-
function htmlEdgeKey(host, pathname, id) {
|
|
55
|
-
return `https://${host}${canonicalIsrPathname(pathname)}?__void_isr=${id}`;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Edge-cache key for the JSON (pages-protocol) variant. Separated from HTML by
|
|
59
|
-
* the `&__void=json` marker.
|
|
60
|
-
*/
|
|
61
|
-
function jsonEdgeKey(host, pathname, id) {
|
|
62
|
-
return `${htmlEdgeKey(host, pathname, id)}&__void=json`;
|
|
63
|
-
}
|
|
64
|
-
const MAX_CACHE = 256;
|
|
65
|
-
const literalRegexCache = /* @__PURE__ */ new Map();
|
|
66
|
-
/**
|
|
67
|
-
* Match a pattern against a pathname using LITERAL semantics — no named
|
|
68
|
-
* captures. Two wildcards are special: `*` matches any characters INCLUDING `/`
|
|
69
|
-
* (a splat), and a WHOLE-segment `:name` (preceded by `/` or start, followed by
|
|
70
|
-
* `/` or end) matches exactly ONE path segment (`[^/]+`). A mid-segment literal
|
|
71
|
-
* `:` (e.g. `/api/v1:health`) is left alone. This is a strict SUPERSET of the
|
|
72
|
-
* old `*`-only matcher (old `*`-only manifests match identically). Malformed
|
|
73
|
-
* patterns yield `false` rather than throwing.
|
|
74
|
-
*/
|
|
75
|
-
function matchLiteralPattern(pattern, pathname) {
|
|
76
|
-
let regex = literalRegexCache.get(pattern);
|
|
77
|
-
if (regex) {
|
|
78
|
-
literalRegexCache.delete(pattern);
|
|
79
|
-
literalRegexCache.set(pattern, regex);
|
|
80
|
-
} else {
|
|
81
|
-
try {
|
|
82
|
-
const escaped = pattern.replace(/(^|\/):[A-Za-z0-9_]+(?=\/|$)/g, "$1").replace(/[.+?^${}()|[\]\\]/g, "\\$&").replaceAll("*", ".*").replaceAll("", "[^/]+");
|
|
83
|
-
regex = new RegExp(`^${escaped}$`);
|
|
84
|
-
} catch {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
if (literalRegexCache.size >= MAX_CACHE) {
|
|
88
|
-
const first = literalRegexCache.keys().next();
|
|
89
|
-
if (!first.done) literalRegexCache.delete(first.value);
|
|
90
|
-
}
|
|
91
|
-
literalRegexCache.set(pattern, regex);
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
return regex.test(pathname);
|
|
95
|
-
} catch {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Pack response headers + body into a single ArrayBuffer.
|
|
101
|
-
* Format: [4 bytes uint32 LE header length][UTF-8 header JSON][raw body]
|
|
102
|
-
*/
|
|
103
|
-
function packIsrValue(headers, body) {
|
|
104
|
-
const headerJson = new TextEncoder().encode(JSON.stringify(headers));
|
|
105
|
-
const buffer = new ArrayBuffer(4 + headerJson.byteLength + body.byteLength);
|
|
106
|
-
new DataView(buffer).setUint32(0, headerJson.byteLength, true);
|
|
107
|
-
new Uint8Array(buffer, 4, headerJson.byteLength).set(headerJson);
|
|
108
|
-
new Uint8Array(buffer, 4 + headerJson.byteLength).set(new Uint8Array(body));
|
|
109
|
-
return buffer;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Unpack headers + body from a packed ArrayBuffer.
|
|
113
|
-
* Returns null if the buffer is too small or malformed.
|
|
114
|
-
*/
|
|
115
|
-
function unpackIsrValue(buffer) {
|
|
116
|
-
if (buffer.byteLength < 4) return null;
|
|
117
|
-
const headerLen = new DataView(buffer).getUint32(0, true);
|
|
118
|
-
if (buffer.byteLength < 4 + headerLen) return null;
|
|
119
|
-
try {
|
|
120
|
-
const headerBytes = new Uint8Array(buffer, 4, headerLen);
|
|
121
|
-
return {
|
|
122
|
-
headers: JSON.parse(new TextDecoder().decode(headerBytes)),
|
|
123
|
-
body: buffer.slice(4 + headerLen)
|
|
124
|
-
};
|
|
125
|
-
} catch {
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Read an ISR cache entry from KV. Returns null on cache miss, malformed
|
|
131
|
-
* metadata, or ANY KV error (fail-open → caller renders live). The KV key is
|
|
132
|
-
* deployment-scoped via `env.__VOID_ISR_DEPLOYMENT_ID` (see module header) and
|
|
133
|
-
* host-scoped via `host` so one host never reads another host's cached bytes.
|
|
134
|
-
*/
|
|
135
|
-
async function readIsrCache(env, host, pathname) {
|
|
136
|
-
const kv = env.ISR_CACHE;
|
|
137
|
-
if (!kv) return null;
|
|
138
|
-
const key = isrKey(env.__VOID_ISR_DEPLOYMENT_ID ?? "", host, pathname);
|
|
139
|
-
let value;
|
|
140
|
-
let metadata;
|
|
141
|
-
try {
|
|
142
|
-
const result = await kv.getWithMetadata(key, "arrayBuffer");
|
|
143
|
-
value = result.value;
|
|
144
|
-
metadata = result.metadata;
|
|
145
|
-
} catch {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
if (!value || !metadata) return null;
|
|
149
|
-
const unpacked = unpackIsrValue(value);
|
|
150
|
-
if (!unpacked) return null;
|
|
151
|
-
if (!Number.isInteger(metadata.s) || metadata.s < 200 || metadata.s > 599) return null;
|
|
152
|
-
if (!Number.isFinite(metadata.c) || metadata.c <= 0 || !Number.isFinite(metadata.t) || metadata.t <= 0) return null;
|
|
153
|
-
try {
|
|
154
|
-
new Headers(unpacked.headers);
|
|
155
|
-
} catch {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
return {
|
|
159
|
-
body: new ReadableStream({ start(controller) {
|
|
160
|
-
controller.enqueue(new Uint8Array(unpacked.body));
|
|
161
|
-
controller.close();
|
|
162
|
-
} }),
|
|
163
|
-
status: metadata.s,
|
|
164
|
-
headers: unpacked.headers,
|
|
165
|
-
createdAt: metadata.c,
|
|
166
|
-
ttl: metadata.t
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Write an ISR cache entry to KV. The `response.clone()` is taken SYNCHRONOUSLY
|
|
171
|
-
* before any `await` so a caller that consumes `response.body` for the client
|
|
172
|
-
* response (after kicking us off via `ctx.waitUntil`) cannot race the body
|
|
173
|
-
* away. Any KV error is swallowed (fail-open on the write path).
|
|
174
|
-
*/
|
|
175
|
-
async function writeIsrCache(env, host, pathname, response, ttl) {
|
|
176
|
-
const kv = env.ISR_CACHE;
|
|
177
|
-
if (!kv) return;
|
|
178
|
-
const responseClone = response.clone();
|
|
179
|
-
const headers = serializeHeaders(responseClone);
|
|
180
|
-
const status = responseClone.status;
|
|
181
|
-
const id = env.__VOID_ISR_DEPLOYMENT_ID ?? "";
|
|
182
|
-
try {
|
|
183
|
-
const packed = packIsrValue(headers, await responseClone.arrayBuffer());
|
|
184
|
-
await kv.put(isrKey(id, host, pathname), packed, { metadata: {
|
|
185
|
-
s: status,
|
|
186
|
-
c: Date.now(),
|
|
187
|
-
t: ttl
|
|
188
|
-
} });
|
|
189
|
-
} catch {}
|
|
190
|
-
await registerIsrHost(kv, id, host);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* In-isolate guard: `${id}/${host}` values whose host-registry key this isolate
|
|
194
|
-
* has already written (or attempted). Bounds host registration to ~one KV write
|
|
195
|
-
* per (isolate, deployment, host) instead of one per page write.
|
|
196
|
-
*/
|
|
197
|
-
const registeredHosts = /* @__PURE__ */ new Set();
|
|
198
|
-
async function registerIsrHost(kv, deploymentId, host) {
|
|
199
|
-
const guardKey = `${deploymentId}/${host}`;
|
|
200
|
-
if (registeredHosts.has(guardKey)) return;
|
|
201
|
-
registeredHosts.add(guardKey);
|
|
202
|
-
try {
|
|
203
|
-
await kv.put(hostRegistryKey(deploymentId, host), "");
|
|
204
|
-
} catch {
|
|
205
|
-
registeredHosts.delete(guardKey);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* List every host that has registered cached content for a deployment. Used by
|
|
210
|
-
* the on-demand `revalidate({ paths })` purge when there is no request host
|
|
211
|
-
* (cron / queue). Fail-open: a registry read error yields the hosts collected so
|
|
212
|
-
* far (or none) rather than throwing — degraded purge coverage, never a 500.
|
|
213
|
-
*/
|
|
214
|
-
async function listIsrHosts(kv, deploymentId) {
|
|
215
|
-
const prefix = `void-isr-hosts/${deploymentId}/`;
|
|
216
|
-
const hosts = [];
|
|
217
|
-
try {
|
|
218
|
-
let cursor;
|
|
219
|
-
do {
|
|
220
|
-
const list = await kv.list({
|
|
221
|
-
prefix,
|
|
222
|
-
cursor
|
|
223
|
-
});
|
|
224
|
-
for (const key of list.keys) hosts.push(key.name.slice(prefix.length));
|
|
225
|
-
cursor = list.list_complete ? void 0 : list.cursor;
|
|
226
|
-
} while (cursor);
|
|
227
|
-
} catch {}
|
|
228
|
-
return hosts;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Delete an ISR cache entry from KV. Used when a worker permanently opts out
|
|
232
|
-
* via `x-revalidate: 0`. Any KV error is swallowed (fail-open).
|
|
233
|
-
*/
|
|
234
|
-
async function deleteIsrCache(env, host, pathname) {
|
|
235
|
-
const kv = env.ISR_CACHE;
|
|
236
|
-
if (!kv) return;
|
|
237
|
-
try {
|
|
238
|
-
await kv.delete(isrKey(env.__VOID_ISR_DEPLOYMENT_ID ?? "", host, pathname));
|
|
239
|
-
} catch {}
|
|
240
|
-
}
|
|
241
|
-
/** Check if a cached entry is stale. */
|
|
242
|
-
function isStale(entry) {
|
|
243
|
-
return Date.now() - entry.createdAt > entry.ttl * 1e3;
|
|
244
|
-
}
|
|
245
|
-
/** Build a Response from an ISR cache entry. */
|
|
246
|
-
function isrCacheResponse(entry, stale) {
|
|
247
|
-
const headers = new Headers(entry.headers);
|
|
248
|
-
headers.set("x-isr-cache", stale ? "STALE" : "HIT");
|
|
249
|
-
if (stale) {
|
|
250
|
-
const staleTtl = Math.min(10, entry.ttl);
|
|
251
|
-
headers.set("Cache-Control", `public, s-maxage=${staleTtl}, max-age=0, must-revalidate`);
|
|
252
|
-
} else {
|
|
253
|
-
const remainingSeconds = Math.max(0, Math.floor((entry.createdAt + entry.ttl * 1e3 - Date.now()) / 1e3));
|
|
254
|
-
headers.set("Cache-Control", `public, s-maxage=${remainingSeconds}, max-age=0, must-revalidate`);
|
|
255
|
-
}
|
|
256
|
-
return new Response(entry.body, {
|
|
257
|
-
status: entry.status,
|
|
258
|
-
headers
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Read the `x-revalidate` header from a worker response.
|
|
263
|
-
* Returns the override TTL, or the default. A value of 0 means "do not cache".
|
|
264
|
-
*/
|
|
265
|
-
function resolveRevalidateTtl(response, defaultTtl) {
|
|
266
|
-
const header = response.headers.get("x-revalidate");
|
|
267
|
-
if (header === null) return defaultTtl;
|
|
268
|
-
const value = parseInt(header, 10);
|
|
269
|
-
if (isNaN(value) || value < 0) return defaultTtl;
|
|
270
|
-
return value;
|
|
271
|
-
}
|
|
272
|
-
function acceptsEventStream(request) {
|
|
273
|
-
return request.headers.get("Accept")?.toLowerCase().split(",").some((part) => part.split(";", 1)[0]?.trim() === "text/event-stream") ?? false;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* ISR should be bypassed for requests with credentials and EventSource
|
|
277
|
-
* requests. Pages protocol navigation (X-VoidPages) uses a separate JSON edge
|
|
278
|
-
* cache.
|
|
279
|
-
*/
|
|
280
|
-
function shouldBypassIsr(request) {
|
|
281
|
-
return request.headers.has("Cookie") || request.headers.has("Authorization") || acceptsEventStream(request);
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Resolve the ISR TTL for a given pathname.
|
|
285
|
-
* Accepts the `revalidate` config (number, object, or undefined). For the
|
|
286
|
-
* object form, the first matching pattern wins.
|
|
287
|
-
*/
|
|
288
|
-
function resolvePathTtl(revalidate, pathname) {
|
|
289
|
-
if (revalidate == null) return 0;
|
|
290
|
-
if (typeof revalidate === "number") return revalidate;
|
|
291
|
-
for (const [pattern, ttl] of Object.entries(revalidate)) if (matchLiteralPattern(pattern, pathname)) return ttl;
|
|
292
|
-
return 0;
|
|
293
|
-
}
|
|
294
|
-
/** Extract response headers as a plain object, skipping ISR-managed headers. */
|
|
295
|
-
const SKIP_HEADERS = /* @__PURE__ */ new Set([
|
|
296
|
-
"cache-control",
|
|
297
|
-
"x-isr-cache",
|
|
298
|
-
"x-void-page-data",
|
|
299
|
-
"set-cookie"
|
|
300
|
-
]);
|
|
301
|
-
function serializeHeaders(response) {
|
|
302
|
-
const result = {};
|
|
303
|
-
response.headers.forEach((value, key) => {
|
|
304
|
-
if (!SKIP_HEADERS.has(key.toLowerCase())) result[key] = value;
|
|
305
|
-
});
|
|
306
|
-
return result;
|
|
307
|
-
}
|
|
308
|
-
const PAGE_DATA_SCRIPT_RE = /<script\b[^>]*\bid=(["'])__VOID_PAGE_DATA__\1[^>]*>([\s\S]*?)<\/script>/i;
|
|
309
|
-
function normalizePageDataForJsonCache(raw) {
|
|
310
|
-
try {
|
|
311
|
-
const parsed = JSON.parse(raw);
|
|
312
|
-
if (parsed.deferred !== void 0 || parsed.deferredKeys !== void 0) return null;
|
|
313
|
-
return raw;
|
|
314
|
-
} catch {
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
function extractPageDataFromHtml(html) {
|
|
319
|
-
const match = html.match(PAGE_DATA_SCRIPT_RE);
|
|
320
|
-
if (!match) return null;
|
|
321
|
-
return normalizePageDataForJsonCache(match[2]);
|
|
322
|
-
}
|
|
323
|
-
const CLIENT_REVALIDATE_CACHE_CONTROL = "public, max-age=0, must-revalidate";
|
|
324
|
-
function clientRevalidateResponse(response) {
|
|
325
|
-
const res = new Response(response.body, response);
|
|
326
|
-
res.headers.set("Cache-Control", CLIENT_REVALIDATE_CACHE_CONTROL);
|
|
327
|
-
return res;
|
|
328
|
-
}
|
|
329
|
-
function isEventStreamResponse(response) {
|
|
330
|
-
return response.headers.get("content-type")?.toLowerCase().split(";", 1)[0]?.trim() === "text/event-stream";
|
|
331
|
-
}
|
|
332
|
-
function jsonCacheResponse(pageData, ttl, state) {
|
|
333
|
-
return new Response(pageData, { headers: {
|
|
334
|
-
"content-type": "application/json",
|
|
335
|
-
"X-VoidPages": "true",
|
|
336
|
-
Vary: "X-VoidPages",
|
|
337
|
-
"Cache-Control": `public, s-maxage=${ttl}, max-age=0, must-revalidate`,
|
|
338
|
-
"x-isr-cache": state
|
|
339
|
-
} });
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Populate the JSON edge cache from a response's embedded page data (the
|
|
343
|
-
* `x-void-page-data` header or the `__VOID_PAGE_DATA__` inline script). No-ops
|
|
344
|
-
* when there is no extractable page data. Any cache error is swallowed
|
|
345
|
-
* (fail-open) so this is always safe to fire inside `ctx.waitUntil`.
|
|
346
|
-
*/
|
|
347
|
-
async function populateJsonEdgeCache(cache, cacheKey, response, ttl, state) {
|
|
348
|
-
if (!cache) return;
|
|
349
|
-
try {
|
|
350
|
-
const fromHeader = response.headers.get("x-void-page-data");
|
|
351
|
-
const pageData = fromHeader ? normalizePageDataForJsonCache(fromHeader) : extractPageDataFromHtml(await response.clone().text());
|
|
352
|
-
if (!pageData) return;
|
|
353
|
-
await cache.put(cacheKey, jsonCacheResponse(pageData, ttl, state));
|
|
354
|
-
} catch {}
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* The per-colo edge cache (`caches.default`), or `undefined` when the Cache API
|
|
358
|
-
* is absent/degraded. Accessed through a cast because this package has both
|
|
359
|
-
* `@types/node` and `@cloudflare/workers-types` in scope, and Node's ambient
|
|
360
|
-
* `CacheStorage` (which lacks `.default`) otherwise shadows the Workers one on
|
|
361
|
-
* the `caches` global.
|
|
362
|
-
*
|
|
363
|
-
* Non-throwing by contract: dereferencing `caches.default` can throw if the
|
|
364
|
-
* Cache API is missing (e.g. a non-worker runtime) or degraded. We swallow that
|
|
365
|
-
* here and return `undefined` so `handleIsr` never rejects before its fail-open
|
|
366
|
-
* guards run — the serving invariant is a degraded cache must render live, never
|
|
367
|
-
* 500. Every call site guards `undefined` (via `if (!cache)` or `cache?.`).
|
|
368
|
-
*/
|
|
369
|
-
function edgeCache() {
|
|
370
|
-
try {
|
|
371
|
-
return caches.default;
|
|
372
|
-
} catch {
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
async function safeCachePut(cache, key, response) {
|
|
377
|
-
if (!cache) return;
|
|
378
|
-
try {
|
|
379
|
-
await cache.put(key, response);
|
|
380
|
-
} catch {}
|
|
381
|
-
}
|
|
382
|
-
async function safeCacheDelete(cache, key) {
|
|
383
|
-
if (!cache) return;
|
|
384
|
-
try {
|
|
385
|
-
await cache.delete(key);
|
|
386
|
-
} catch {}
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Build a new Request with the `X-VoidPages` header removed. Headers on an
|
|
390
|
-
* existing Request are immutable, so we must clone into a fresh Request. ISR
|
|
391
|
-
* only runs for GET, so there is no body to preserve.
|
|
392
|
-
*/
|
|
393
|
-
function cloneWithoutVoidPages(request) {
|
|
394
|
-
const headers = new Headers(request.headers);
|
|
395
|
-
headers.delete("X-VoidPages");
|
|
396
|
-
return new Request(request, { headers });
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Revalidate an ISR page in the background. Re-renders as HTML (X-VoidPages
|
|
400
|
-
* stripped), writes fresh HTML to KV + HTML edge cache, and populates the JSON
|
|
401
|
-
* edge cache from embedded page data. Errors are caught and logged — serve
|
|
402
|
-
* stale, don't retry. `ttl === 0` means the worker permanently opted out:
|
|
403
|
-
* delete the KV entry and both edge variants.
|
|
404
|
-
*/
|
|
405
|
-
async function revalidateInBackground(env, request, host, pathname, defaultTtl, keys, render) {
|
|
406
|
-
try {
|
|
407
|
-
const response = await render(cloneWithoutVoidPages(request));
|
|
408
|
-
if (isEventStreamResponse(response)) return;
|
|
409
|
-
const ttl = resolveRevalidateTtl(response, defaultTtl);
|
|
410
|
-
const cache = edgeCache();
|
|
411
|
-
if (ttl > 0 && response.status === 200) {
|
|
412
|
-
await writeIsrCache(env, host, pathname, response, ttl);
|
|
413
|
-
const headers = new Headers(response.headers);
|
|
414
|
-
headers.set("x-isr-cache", "HIT");
|
|
415
|
-
headers.set("Cache-Control", `public, s-maxage=${ttl}, max-age=0, must-revalidate`);
|
|
416
|
-
headers.delete("set-cookie");
|
|
417
|
-
headers.delete("x-void-page-data");
|
|
418
|
-
await safeCachePut(cache, keys.htmlKey, new Response(response.clone().body, {
|
|
419
|
-
status: response.status,
|
|
420
|
-
headers
|
|
421
|
-
}));
|
|
422
|
-
await populateJsonEdgeCache(cache, keys.jsonKey, response, ttl, "HIT");
|
|
423
|
-
} else if (ttl === 0) {
|
|
424
|
-
await deleteIsrCache(env, host, pathname);
|
|
425
|
-
await safeCacheDelete(cache, keys.htmlKey);
|
|
426
|
-
await safeCacheDelete(cache, keys.jsonKey);
|
|
427
|
-
}
|
|
428
|
-
} catch (err) {
|
|
429
|
-
console.error("ISR revalidation failed:", err);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Run the ISR caching ladder for a request.
|
|
434
|
-
*
|
|
435
|
-
* Returns a cached/rendered `Response` when ISR applies, or `null` when the
|
|
436
|
-
* caller should render live itself (request not ISR-eligible, or a read/hit
|
|
437
|
-
* cache op failed open).
|
|
438
|
-
*
|
|
439
|
-
* Ladder:
|
|
440
|
-
* - Bail (`null`) if not GET, a Range request, `shouldBypassIsr`, or the path
|
|
441
|
-
* has no ISR TTL. Range requests bail BEFORE any cache read/write so they
|
|
442
|
-
* render live (correct 206) and never touch the shared full-response entry.
|
|
443
|
-
* - JSON (X-VoidPages) path: edge match → hit serves `clientRevalidateResponse`;
|
|
444
|
-
* miss renders live JSON and returns it — the JSON path never writes the edge
|
|
445
|
-
* cache. The JSON edge variant is warmed only as a side-effect of the HTML
|
|
446
|
-
* render path (cold colo re-renders JSON).
|
|
447
|
-
* - HTML path: L1 edge match → L2 KV. Hit serves `isrCacheResponse`
|
|
448
|
-
* (stale hits also queue a background revalidation). Miss renders live and,
|
|
449
|
-
* when cacheable, writes KV + JSON edge + HTML edge in the background.
|
|
450
|
-
*/
|
|
451
|
-
async function handleIsr(request, env, ctx, options, render) {
|
|
452
|
-
const { revalidate, deploymentId } = options;
|
|
453
|
-
if (request.method !== "GET") return null;
|
|
454
|
-
if (request.headers.has("range")) return null;
|
|
455
|
-
if (shouldBypassIsr(request)) return null;
|
|
456
|
-
const url = new URL(request.url);
|
|
457
|
-
const pathname = url.pathname;
|
|
458
|
-
const isrTtl = resolvePathTtl(revalidate, pathname);
|
|
459
|
-
if (isrTtl <= 0) return null;
|
|
460
|
-
env.__VOID_ISR_DEPLOYMENT_ID ??= deploymentId;
|
|
461
|
-
const host = url.hostname;
|
|
462
|
-
const cache = edgeCache();
|
|
463
|
-
if (request.headers.has("X-VoidPages")) {
|
|
464
|
-
const jsonKey = jsonEdgeKey(host, pathname, deploymentId);
|
|
465
|
-
let jsonCached;
|
|
466
|
-
try {
|
|
467
|
-
jsonCached = await cache?.match(jsonKey);
|
|
468
|
-
} catch {
|
|
469
|
-
return null;
|
|
470
|
-
}
|
|
471
|
-
if (jsonCached) return clientRevalidateResponse(jsonCached);
|
|
472
|
-
return render(request);
|
|
473
|
-
}
|
|
474
|
-
const htmlKey = htmlEdgeKey(host, pathname, deploymentId);
|
|
475
|
-
const jsonKey = jsonEdgeKey(host, pathname, deploymentId);
|
|
476
|
-
let edgeCached;
|
|
477
|
-
try {
|
|
478
|
-
edgeCached = await cache?.match(htmlKey);
|
|
479
|
-
} catch {
|
|
480
|
-
return null;
|
|
481
|
-
}
|
|
482
|
-
if (edgeCached) return clientRevalidateResponse(edgeCached);
|
|
483
|
-
const cached = await readIsrCache(env, host, pathname);
|
|
484
|
-
if (cached) try {
|
|
485
|
-
const stale = isStale(cached);
|
|
486
|
-
if (stale) ctx.waitUntil(revalidateInBackground(env, request, host, pathname, isrTtl, {
|
|
487
|
-
htmlKey,
|
|
488
|
-
jsonKey
|
|
489
|
-
}, render));
|
|
490
|
-
const cacheResponse = isrCacheResponse(cached, stale);
|
|
491
|
-
ctx.waitUntil(safeCachePut(cache, htmlKey, cacheResponse.clone()));
|
|
492
|
-
return clientRevalidateResponse(cacheResponse);
|
|
493
|
-
} catch {
|
|
494
|
-
return null;
|
|
495
|
-
}
|
|
496
|
-
const response = await render(request);
|
|
497
|
-
if (isEventStreamResponse(response)) return response;
|
|
498
|
-
const ttl = resolveRevalidateTtl(response, isrTtl);
|
|
499
|
-
if (ttl > 0 && response.status === 200) {
|
|
500
|
-
ctx.waitUntil(writeIsrCache(env, host, pathname, response, ttl));
|
|
501
|
-
ctx.waitUntil(populateJsonEdgeCache(cache, jsonKey, response, ttl, "MISS"));
|
|
502
|
-
const cacheHeaders = new Headers(response.headers);
|
|
503
|
-
cacheHeaders.set("Cache-Control", `public, s-maxage=${ttl}, max-age=0, must-revalidate`);
|
|
504
|
-
cacheHeaders.set("x-isr-cache", "MISS");
|
|
505
|
-
cacheHeaders.delete("x-void-page-data");
|
|
506
|
-
cacheHeaders.delete("set-cookie");
|
|
507
|
-
const cacheResponse = new Response(response.clone().body, {
|
|
508
|
-
status: response.status,
|
|
509
|
-
headers: cacheHeaders
|
|
510
|
-
});
|
|
511
|
-
ctx.waitUntil(safeCachePut(cache, htmlKey, cacheResponse));
|
|
512
|
-
const clientHeaders = new Headers(cacheHeaders);
|
|
513
|
-
clientHeaders.set("Cache-Control", CLIENT_REVALIDATE_CACHE_CONTROL);
|
|
514
|
-
for (const cookie of response.headers.getSetCookie()) clientHeaders.append("set-cookie", cookie);
|
|
515
|
-
return new Response(response.body, {
|
|
516
|
-
status: response.status,
|
|
517
|
-
headers: clientHeaders
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
return response;
|
|
521
|
-
}
|
|
522
|
-
//#endregion
|
|
523
|
-
export { canonicalIsrPathname, clientRevalidateResponse, cloneWithoutVoidPages, deleteIsrCache, denormalizeIsrPath, extractPageDataFromHtml, handleIsr, hostRegistryKey, htmlEdgeKey, isEventStreamResponse, isStale, isrCacheResponse, isrKey, jsonEdgeKey, listIsrHosts, matchLiteralPattern, normalizeIsrPath, normalizePageDataForJsonCache, packIsrValue, populateJsonEdgeCache, readIsrCache, resolvePathTtl, resolveRevalidateTtl, serializeHeaders, shouldBypassIsr, unpackIsrValue, writeIsrCache };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
//#region src/pages/types.d.ts
|
|
2
|
-
type ExplicitBoolean = true | false | undefined;
|
|
3
|
-
type SsrMode = "auto" | "server" | "client";
|
|
4
|
-
type PrerenderMode = "auto" | "force" | "disabled";
|
|
5
|
-
type PageRenderMode = "server" | "client" | "island";
|
|
6
|
-
type PageDefinition = {
|
|
7
|
-
/** URL pattern, e.g. "/users/:id" */pattern: string; /** Route params, e.g. ["id"] */
|
|
8
|
-
params: Array<string>; /** Whether this is a catch-all route */
|
|
9
|
-
catchAll: boolean; /** Component file relative path, e.g. "users/[id].vue" */
|
|
10
|
-
componentPath: string; /** Server handler file relative path, e.g. "users/[id].server.ts" */
|
|
11
|
-
serverPath: string | null; /** HTTP methods exported by server handler */
|
|
12
|
-
methods: Array<string>; /** Component ID used in page object, e.g. "users/[id]" */
|
|
13
|
-
componentId: string; /** Edge caching revalidate TTL in seconds, from .server.ts export */
|
|
14
|
-
revalidate?: number; /** Whether `export const prerender = true/false` is set in server handler */
|
|
15
|
-
prerender?: ExplicitBoolean; /** Whether `export const ssr = true/false` is set in server handler */
|
|
16
|
-
ssr?: ExplicitBoolean; /** Normalized SSR mode from the public `ssr` export */
|
|
17
|
-
ssrMode: SsrMode; /** Normalized prerender mode from the public `prerender` export */
|
|
18
|
-
prerenderMode: PrerenderMode; /** Normalized page render mode */
|
|
19
|
-
renderMode: PageRenderMode; /** Whether this page should participate in prerender collection */
|
|
20
|
-
shouldPrerender: boolean; /** Whether `export function getPrerenderPaths` is defined in server handler */
|
|
21
|
-
hasGetPrerenderPaths?: boolean; /** Whether this is an island page (.island.tsx/.island.vue) */
|
|
22
|
-
island?: boolean; /** Frontmatter metadata extracted from .md files (title, description) */
|
|
23
|
-
metadata?: {
|
|
24
|
-
title?: string;
|
|
25
|
-
description?: string;
|
|
26
|
-
}; /** Named layout selection: "name", "!name", false, or relative path */
|
|
27
|
-
layout?: string | false;
|
|
28
|
-
};
|
|
29
|
-
type LayoutDefinition = {
|
|
30
|
-
/** Directory path relative to pages/, e.g. "" (root) or "users" */directory: string; /** Layout file relative path, e.g. "layout.vue" or "users/layout.vue" */
|
|
31
|
-
filePath: string; /** Whether this is an island layout (layout.island.tsx/.island.vue) */
|
|
32
|
-
island?: boolean;
|
|
33
|
-
};
|
|
34
|
-
type NamedLayoutDefinition = {
|
|
35
|
-
/** Layout name, e.g. "home", "post" */name: string; /** Directory containing _layouts/, e.g. "" (root) or "guide" */
|
|
36
|
-
directory: string; /** File path relative to pages/, e.g. "_layouts/home.vue" */
|
|
37
|
-
filePath: string; /** Whether this is an island layout */
|
|
38
|
-
island?: boolean;
|
|
39
|
-
};
|
|
40
|
-
type PageScanResult = {
|
|
41
|
-
pages: Array<PageDefinition>;
|
|
42
|
-
layouts: Array<LayoutDefinition>;
|
|
43
|
-
namedLayouts: Array<NamedLayoutDefinition>;
|
|
44
|
-
};
|
|
45
|
-
type DevCssAsset = {
|
|
46
|
-
/** Vite client URL used to request the CSS module. */url: string; /** Vite dev style id used by the client to adopt/update SSR-inlined styles. */
|
|
47
|
-
id?: string; /** CSS bytes returned by Vite's client environment transform with ?inline. */
|
|
48
|
-
css: string;
|
|
49
|
-
};
|
|
50
|
-
//#endregion
|
|
51
|
-
export { PageRenderMode as a, PageDefinition as i, LayoutDefinition as n, PageScanResult as o, NamedLayoutDefinition as r, DevCssAsset as t };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
Void is a fullstack Vite framework and deployment platform for Cloudflare.
|
|
2
|
-
In an empty directory, set up a new app like this:
|
|
3
|
-
|
|
4
|
-
npm install -D void
|
|
5
|
-
|
|
6
|
-
Then run:
|
|
7
|
-
|
|
8
|
-
npx void init
|
|
9
|
-
|
|
10
|
-
In an empty directory, `void init` will add the matching Pages adapter and starter dependencies after you choose a scaffold toolchain and framework. Vite+ is the default toolchain. In an existing app, it configures Void in place by adding missing Vite scripts and creating or patching `vite.config.*` with `voidPlugin()`.
|
|
11
|
-
|
|
12
|
-
During `void init`, choose Vite+ unless you specifically want plain Vite scripts, then choose a Pages framework (React, Vue, Svelte, or Solid). Choose D1 for a zero-config, fully managed default or PostgreSQL if you already have Postgres infrastructure or expect heavier writes and more complex queries.
|
|
13
|
-
|
|
14
|
-
At the end of the interactive flow, `void init` can also log you in and link or create your Void project so your first deploy is just:
|
|
15
|
-
|
|
16
|
-
void deploy
|
|
17
|
-
|
|
18
|
-
To deploy to your OWN Cloudflare account instead of the Void platform, use `void deploy --backend cloudflare` (add `--provision` on the first deploy to create the D1/KV/R2/Queues/Hyperdrive resources your app needs). Pin an account first (`account_id` in `wrangler.jsonc` or `CLOUDFLARE_ACCOUNT_ID`) and keep real secrets in `wrangler secret put` — `.env` values ship as plaintext worker vars. v1 deploys full Void apps on the Cloudflare Workers target only (D1/KV/R2/Queues/Hyperdrive; auth and ISR on D1/SQLite); framework SSR of every kind (TanStack Start, React Router, vinext, SvelteKit, Nuxt, Analog, Astro), static/SPA/SSG apps (including output: "static"), WebSocket/Durable Object apps (*.ws.ts), a custom migrations_pattern, node/bun/deno targets, and PostgreSQL apps with auth all fail closed with guidance, and auth apps need checked-in migrations that produce the Better Auth schema. `--provision` is a single-operator, dev-machine step and is disabled in CI.
|
|
19
|
-
|
|
20
|
-
Database workflow: define Drizzle tables in `db/schema.ts`, import `db` from `void/db` and tables from `@schema`. Use `void db push` to prototype (applies schema directly, no migration files). Use `void db generate` when ready to create production migration files in `db/migrations/`. `drizzle-orm` and `drizzle-kit` ship with void — no extra install needed. Scaffold new tables with `void gen model <name> [columns...]`.
|
|
21
|
-
|
|
22
|
-
Routing extras: declare static redirects/rewrites/fallbacks in `void.json` under `routing.*`, or in a `public/_redirects` file. For dynamic rewrites, call `c.rewrite(path)` in a `defineMiddleware`.
|
|
23
|
-
|
|
24
|
-
Logs: surface app-level errors via `import { logger } from "void/log"` and `logger.error(msg, fields?)` (also `.warn` / `.info`) so they appear under `void project logs --level error`. Errors only persisted to your own DB are invisible to Cloudflare Tail. Logs only exist where a worker ran — for 5xx generated by the edge router or on static/SPA projects, use `void project requests --status 5xx` instead.
|
|
25
|
-
|
|
26
|
-
CI / fresh clones: run `void prepare` after install to generate `.void/routes.d.ts`, `.void/db.d.ts`, `.void/queues.d.ts`, `.void/env.d.ts`, and `.void/tsconfig.json` without booting Vite. `vite dev` / `vite build` populate these during normal app workflows.
|
|
27
|
-
|
|
28
|
-
Now ask me what I want to build.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# `/void` Command Flow
|
|
2
|
-
|
|
3
|
-
1. Open `SKILL.md`.
|
|
4
|
-
2. If no task/arguments are provided, run the brief app status check from `SKILL.md`.
|
|
5
|
-
3. If a task is provided, route to the smallest relevant set of `docs/*.md` files.
|
|
6
|
-
4. For CLI syntax and flags, always use `docs/cli.md`.
|
|
7
|
-
5. Execute, verify, and report concise next actions.
|
|
File without changes
|
|
File without changes
|