void 0.26.0 → 0.27.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 +1 -3
- package/README.md +19 -9
- package/dist/{account-cmd-CDry3B5V.mjs → account-cmd-l-FM7Ioq.mjs} +8 -7
- package/dist/{application-analysis-DC2yPvzY.mjs → application-analysis-DKy02UY0.mjs} +21 -32
- package/dist/{application-routing-C9khgLiS.mjs → application-routing-DQyUh_5S.mjs} +1 -1
- package/dist/{auth-D52yG7hl.mjs → auth-Dn2vw-SG.mjs} +9 -9
- package/dist/{auth-B60QDbjg.mjs → auth-LMJcNESe.mjs} +1 -1
- package/dist/{auth-link-DjeOptYi.mjs → auth-link-vz9Z2kmG.mjs} +5 -5
- package/dist/{auth-migrations-9vif1uj8.mjs → auth-migrations-BwHgeEsD.mjs} +8 -18
- package/dist/{auth-router-BRxIuqDi.mjs → auth-router-DvsCUVw4.mjs} +6 -19
- package/dist/{better-auth-shared-BVkjZ3vM.d.mts → better-auth-shared-CPvWD3nG.d.mts} +0 -4
- package/dist/{better-auth-shared-hy6RPh9W.mjs → better-auth-shared-DPpj8zxc.mjs} +94 -16
- package/dist/{build-cmd-Ce3C8huo.mjs → build-cmd-D6we0VjO.mjs} +8 -7
- package/dist/{cache-CS8Yxr5a.mjs → cache-CZRdzKx1.mjs} +8 -8
- package/dist/{cancel-deploy-mZsD88Xa.mjs → cancel-deploy-CQ3NnMvf.mjs} +6 -5
- package/dist/{cf-access-YTlqvAsk.mjs → cf-access-BcIBSKqG.mjs} +11 -12
- package/dist/{cf-build-output-U8o1Gl6X.mjs → cf-build-output-DjvB_872.mjs} +62 -85
- package/dist/cf-build-output-H9a97vME.mjs +2 -0
- package/dist/cf-user-agent-lKblH3zU.mjs +17 -0
- package/dist/cli/cli.mjs +48 -83
- package/dist/cli/cloudflare-operation-process.mjs +78 -78
- package/dist/cli/env-schema-probe.mjs +5 -6
- package/dist/{client-mC-dFGDD.mjs → client-DlDJuY0s.mjs} +30 -8
- package/dist/client-tso2OfcG.mjs +2 -0
- package/dist/{cloudflare-auth-Qdc7tw8F.mjs → cloudflare-auth-CuxfF6OA.mjs} +9 -17
- package/dist/{cloudflare-cmd-bhwCxAN6.mjs → cloudflare-cmd-lHqNlJGW.mjs} +6 -5
- package/dist/{cloudflare-config-Bktvwtpf.mjs → cloudflare-config-BmhBv3HV.mjs} +1 -1
- package/dist/{cloudflare-connect-CuhRgk3k.mjs → cloudflare-connect-2G3rL2rP.mjs} +4 -4
- package/dist/{cloudflare-operations-DoQrVHAt.mjs → cloudflare-operations-BlYLlowZ.mjs} +1 -1
- package/dist/{cloudflare-operations-DYa3coIk.mjs → cloudflare-operations-CwI1bChl.mjs} +41 -70
- package/dist/{cloudflare-process-B-wekeR6.mjs → cloudflare-process-2-TfIEzB.mjs} +20 -22
- package/dist/{config-CyQ-wVd7.mjs → config-5r-YpMC-.mjs} +1 -1
- package/dist/{config-C_XRIPx2.mjs → config-B_ggY-IO.mjs} +3 -3
- package/dist/config-BtSFvXZx.mjs +2 -0
- package/dist/config-CLYAosnQ.mjs +78 -0
- package/dist/{config-BMHb8RCj.d.mts → config-CSa15FvD.d.mts} +1 -1
- package/dist/{config-Br_JZD6u.mjs → config-DiowPT80.mjs} +24 -30
- package/dist/config-entry.d.mts +1 -1
- package/dist/{config-write-B1f88wJA.mjs → config-write-AHGesphx.mjs} +8 -7
- package/dist/{connect-H6EvP62X.mjs → connect-BfPBHHm-.mjs} +12 -11
- package/dist/{create-project-B2kk9Q0o.mjs → create-project-BdXEFKal.mjs} +7 -7
- package/dist/{create-project-Dbb4uiN-.mjs → create-project-qFDC45zg.mjs} +1 -1
- package/dist/{db-DpCKZto0.mjs → db-Xs80hcaA.mjs} +101 -133
- package/dist/{delete-CxlSvsvW.mjs → delete-d2vuou3j.mjs} +7 -7
- package/dist/{deploy-CeEbnv4b.mjs → deploy-Bqe1PYBw.mjs} +2351 -2497
- package/dist/deploy-VsWsVQkw.mjs +2 -0
- package/dist/{dev-inbox-D64ZKUod.mjs → dev-inbox-CK-UuPob.mjs} +7 -16
- package/dist/{discover-BcPPiF1o.mjs → discover-CkCYv9T_.mjs} +1 -2
- package/dist/discover-EDUf6JJw.mjs +2 -0
- package/dist/{prompts-ZAuJlyCj.mjs → dist-Bx1z6Eva.mjs} +1 -1
- package/dist/{dist-AoCzRTJE.mjs → dist-Cegxq8gs.mjs} +8 -8
- package/dist/{prompts-6OSVA7DJ.mjs → dist-D3m88sjf.mjs} +10 -53
- package/dist/{domain-B_9VgOm6.mjs → domain-BsDUBAvt.mjs} +29 -30
- package/dist/{dotenv-VQxupEUv.mjs → dotenv-BfU6eqFt.mjs} +20 -32
- package/dist/{drizzle-Beb2Am5S.mjs → drizzle-CF84FOVM.mjs} +16 -13
- package/dist/{email-BokHgjKj.mjs → email-_lGAHOhp.mjs} +24 -19
- package/dist/{email--tEtMoj_.mjs → email-d_Aux1vM.mjs} +1 -1
- package/dist/{entry-CF5wvH4w.mjs → entry-CMAkqBmU.mjs} +6 -6
- package/dist/{env-_v349JBd.mjs → env-BxocywBB.mjs} +25 -6
- package/dist/{env-BdTc-K2L.mjs → env-C74QepDE.mjs} +10 -10
- package/dist/{env-D5liuQYR.mjs → env-DMA3cXZt.mjs} +1 -1
- package/dist/{env-raw-Cx8ElDdj.mjs → env-raw-jZpP5n47.mjs} +1 -2
- package/dist/{env-types-D5kds_OZ.mjs → env-types-CwXgeMgL.mjs} +1 -1
- package/dist/{env-validation-cZBvGWaP.mjs → env-validation-CrVNjsPm.mjs} +1 -1
- package/dist/{env-validation-vBSQ8gw5.mjs → env-validation-Dxdx_5wo.mjs} +17 -21
- package/dist/{fetch-_SeGZao9.d.mts → fetch-BPCYVi3H.d.mts} +20 -1
- package/dist/{fetch-BIZJh7vR.mjs → fetch-sAcwjzLO.mjs} +1 -1
- package/dist/{fetch-stream-Nm3hkZbT.mjs → fetch-stream-PGgz4uGz.mjs} +18 -23
- package/dist/{fetch-stream-Bjf0hoZb.d.mts → fetch-stream-obvZ7fvO.d.mts} +1 -16
- package/dist/{gen-BhDlTpwW.mjs → gen-DtkQhvQg.mjs} +40 -57
- package/dist/gen-dA9hW7AV.mjs +2 -0
- package/dist/{github-cmd-hhkTzlGS.mjs → github-cmd-DaDdBbSS.mjs} +65 -164
- package/dist/{handler-DghKr6dU.mjs → handler-BHAn2fZJ.mjs} +1 -0
- package/dist/{handler-BeK3weD4.d.mts → handler-CNAwjRcW.d.mts} +4 -11
- package/dist/{head-Do8P4puT.d.mts → head-C8K_iGe6.d.mts} +1 -1
- package/dist/{head-D_QRR5Yd.mjs → head-D2VF4ApL.mjs} +29 -51
- package/dist/{headers-2rKda9Y6.mjs → headers-DlfR78Nu.mjs} +3 -3
- package/dist/{help-Bv44e2tm.mjs → help-0bTe_lID.mjs} +13 -32
- package/dist/help-DfQYVfGY.mjs +2 -0
- package/dist/{inbound-fRkqcXaC.mjs → inbound-PfQDLXc5.mjs} +23 -24
- package/dist/index.d.mts +19 -2
- package/dist/index.mjs +619 -532
- package/dist/{info-DhtTKh65.mjs → info-PYWwkWyt.mjs} +4 -4
- package/dist/{init-BMf4T03q.mjs → init-DaBGmaXC.mjs} +161 -198
- package/dist/{link-BqYsSS_I.mjs → link-C6fjafep.mjs} +10 -10
- package/dist/{list-_kBToO-l.mjs → list-BTFBlqKl.mjs} +9 -8
- package/dist/{live-CB1y5IuC.mjs → live-CgQuTpqD.mjs} +15 -16
- package/dist/{live-iAuEH1hd.d.mts → live-Du8jXwOW.d.mts} +4 -2
- package/dist/{local-d1-fGxYrVD6.mjs → local-d1-ga5O_idV.mjs} +2 -2
- package/dist/{login-DFuo-RWO.mjs → login-GKcNUmtI.mjs} +7 -7
- package/dist/login-mx_ydhmp.mjs +2 -0
- package/dist/{logs-DYgnh6dH.mjs → logs-BiMSULmc.mjs} +28 -11
- package/dist/migrate-BHp07yJE.mjs +2 -0
- package/dist/{migrate-CV1on-yJ.mjs → migrate-NLsjBbuM.mjs} +34 -20
- package/dist/{mime-D5Nmdzf7.mjs → mime-DxCznlJq.mjs} +45 -95
- package/dist/{node-C6Q6e1Es.mjs → node-DJicPvPj.mjs} +5 -5
- package/dist/{operator-args-DdY54Bgb.mjs → operator-args-DOBhIaIg.mjs} +10 -1
- package/dist/{operator-auth-2dsGlTT5.mjs → operator-auth-BEZ_u0Cz.mjs} +2 -2
- package/dist/{operator-client-BFqpp6z0.mjs → operator-client-DbDv4vtE.mjs} +2 -2
- package/dist/{operator-cmd-CUGHXrQf.mjs → operator-cmd-BT4hgavL.mjs} +24 -11
- package/dist/operator-cmd-CwBB-1yb.mjs +2 -0
- package/dist/{output-BvdaehtE.mjs → output-C50ag2r3.mjs} +20 -2
- package/dist/pages/client.d.mts +19 -51
- package/dist/pages/client.mjs +204 -225
- package/dist/pages/head-client.d.mts +1 -1
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/head.mjs +1 -1
- package/dist/pages/index.d.mts +2 -2
- package/dist/pages/index.mjs +6 -12
- package/dist/pages/islands-plugin.d.mts +1 -1
- package/dist/pages/islands-plugin.mjs +21 -25
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -2
- package/dist/{plan-CJGEeTEI.mjs → plan-BhLO2p4w.mjs} +2 -1
- package/dist/plan-CH2G51je.mjs +2 -0
- package/dist/platform-args-D4E1PjVw.mjs +2 -0
- package/dist/{platform-args-DSV2p4nY.mjs → platform-args-DUeXY9Om.mjs} +1 -1
- package/dist/{platform-auth-config-Bosx7U1h.mjs → platform-auth-config-CkSx3usH.mjs} +40 -36
- package/dist/{platform-auth-protection-DcbL_LW_.mjs → platform-auth-protection-BJimB_p9.mjs} +9 -8
- package/dist/{platform-auth-recovery-WfTZ8K6o.mjs → platform-auth-recovery-BU6izFAU.mjs} +8 -7
- package/dist/{platform-cmd-DbKtQb_4.mjs → platform-cmd-BbY1dWiM.mjs} +14 -13
- package/dist/{platform-cmd-dyFUof0t.mjs → platform-cmd-BbmJiq5O.mjs} +1 -1
- package/dist/{platform-discovery-BC0HCKYt.mjs → platform-discovery-DIYz8V63.mjs} +1 -1
- package/dist/{platform-domain-Bsq43AJp.mjs → platform-domain-CHVS6cV0.mjs} +6 -6
- package/dist/{platform-lifecycle--5gWmDoI.mjs → platform-lifecycle-ByAlpkhV.mjs} +1 -1
- package/dist/{platform-lifecycle-Cfi0o6xM.mjs → platform-lifecycle-DzCwqhFq.mjs} +76 -387
- package/dist/{platform-management-Bbwf6-Dq.mjs → platform-management-CBOT4BSM.mjs} +1 -1
- package/dist/{platform-management-BrF9STZp.mjs → platform-management-CuuVDhyt.mjs} +7 -7
- package/dist/{platform-plans-config-DU-8nC2Y.mjs → platform-plans-config-CN-heS4q.mjs} +5 -4
- package/dist/{platform-recovery-DQAqAQYu.mjs → platform-recovery-CskSJgLh.mjs} +3 -3
- package/dist/{platform-registry-P387v42A.mjs → platform-registry-Cjv2Qf0r.mjs} +5 -1
- package/dist/platform-setup-BBxRxmFC.mjs +299 -0
- package/dist/{plugin-inference-CXWnn79A.mjs → plugin-inference-BlQbOL0P.mjs} +43 -42
- package/dist/prepare-DRUV-g3X.mjs +2 -0
- package/dist/{prepare-WoUubFKL.mjs → prepare-Do96654b.mjs} +8 -8
- package/dist/{prepare-BMrRWLwP.mjs → prepare-Dq9hTIbo.mjs} +4 -4
- package/dist/{prerender-render-D9qbLs2f.mjs → prerender-render-Ct20jftc.mjs} +17 -3
- package/dist/prerender-render.mjs +1 -1
- package/dist/{project-DQstYTxO.mjs → project-BAm2aB6Q.mjs} +1 -1
- package/dist/{project-BiaPQ7ur.mjs → project-DedqCp59.mjs} +1 -1
- package/dist/{project-cmd-BbH2LptN.mjs → project-cmd-DaoRrn-8.mjs} +19 -19
- package/dist/{project-team-Yiww3-go.mjs → project-team-Q_lCA7Io.mjs} +15 -18
- package/dist/{project-token-BrtT2NkY.mjs → project-token-BArgK9o1.mjs} +14 -17
- package/dist/{project-tsconfig-B8GeM0RM.mjs → project-tsconfig-CVJhNMxs.mjs} +2 -1
- package/dist/{project-zero-trust-nYJ2V2nc.mjs → project-zero-trust-KO9Hu2Pq.mjs} +12 -9
- package/dist/{protocol-BX8t2jiw.d.mts → protocol-BPZaNqBo.d.mts} +4 -2
- package/dist/{protocol-U7bfjHmA.mjs → protocol-CfaUwNs8.mjs} +46 -49
- package/dist/{providers-CJlNS3kT.mjs → providers-BXuhmuub.mjs} +1 -12
- package/dist/{provision-VeqAC77A.mjs → provision-BfaLiWbj.mjs} +38 -41
- package/dist/{provision-DMTPG8Rh.mjs → provision-Wu9ZBk9L.mjs} +2 -3
- package/dist/{requests-TIz_jtSu.mjs → requests-C7Oeoh5u.mjs} +5 -5
- package/dist/resolve-project-BIeYs9Cw.mjs +2 -0
- package/dist/{resolve-project-BG5ORGID.mjs → resolve-project-CP8rZs_p.mjs} +6 -1
- package/dist/{rollback-dBqICPzj.mjs → rollback-DVAtrLAl.mjs} +30 -37
- package/dist/{route-types-Clm4WD0B.mjs → route-types-CbtsIeFn.mjs} +1 -1
- package/dist/route-url-BgPja1GS.d.mts +5 -0
- package/dist/route-url-BjGv_KKY.mjs +28 -0
- package/dist/runner-9wjsSZx-.mjs +2 -0
- package/dist/{runner--2KF6Kua.mjs → runner-DMBKSrRk.mjs} +2 -2
- package/dist/{runner-mysql-DmWchSWJ.mjs → runner-mysql-CEzKtmFb.mjs} +8 -8
- package/dist/{runner-mysql-CEG5JozK.mjs → runner-mysql-CkFqZ6CE.mjs} +1 -1
- package/dist/{runner-pg-Bh4AgZdj.mjs → runner-pg-BGYRFdRp.mjs} +1 -1
- package/dist/runtime/ai.d.mts +1 -1
- package/dist/runtime/ai.mjs +34 -95
- package/dist/runtime/better-auth-mysql.d.mts +1 -1
- package/dist/runtime/better-auth-mysql.mjs +4 -9
- package/dist/runtime/better-auth-pg.d.mts +1 -1
- package/dist/runtime/better-auth-pg.mjs +5 -10
- package/dist/runtime/better-auth.d.mts +1 -1
- package/dist/runtime/better-auth.mjs +3 -3
- package/dist/runtime/client-react.d.mts +2 -3
- package/dist/runtime/client-react.mjs +2 -2
- package/dist/runtime/client-solid.d.mts +2 -3
- package/dist/runtime/client-solid.mjs +2 -2
- package/dist/runtime/client-svelte.d.mts +2 -3
- package/dist/runtime/client-svelte.mjs +2 -2
- package/dist/runtime/client-vue.d.mts +2 -3
- package/dist/runtime/client-vue.mjs +2 -2
- package/dist/runtime/client.d.mts +2 -3
- package/dist/runtime/client.mjs +2 -2
- package/dist/runtime/db.mjs +1 -1
- package/dist/runtime/durable.mjs +3 -10
- package/dist/runtime/email/testing.mjs +5 -5
- package/dist/runtime/email.d.mts +2 -1
- package/dist/runtime/email.mjs +11 -27
- package/dist/runtime/env-public.mjs +15 -20
- package/dist/runtime/env.mjs +1 -1
- package/dist/runtime/fetch-stream.d.mts +2 -2
- package/dist/runtime/fetch-stream.mjs +1 -1
- package/dist/runtime/fetch.d.mts +2 -3
- package/dist/runtime/fetch.mjs +1 -1
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/handler.mjs +2 -2
- package/dist/runtime/isr.mjs +1 -1
- package/dist/runtime/kv.mjs +10 -11
- package/dist/runtime/live-client.d.mts +1 -1
- package/dist/runtime/live-client.mjs +12 -22
- package/dist/runtime/live-server.mjs +27 -35
- package/dist/runtime/live.d.mts +2 -2
- package/dist/runtime/live.mjs +2 -2
- package/dist/runtime/migration-handler.mjs +4 -81
- package/dist/runtime/queues.mjs +1 -1
- package/dist/runtime/remote/binding-handler.d.mts +2 -2
- package/dist/runtime/remote/binding-handler.mjs +8 -9
- package/dist/runtime/remote/index.mjs +27 -77
- package/dist/runtime/route-url.d.mts +2 -4
- package/dist/runtime/route-url.mjs +1 -1
- package/dist/runtime/routing.d.mts +1 -1
- package/dist/runtime/routing.mjs +15 -26
- package/dist/runtime/sandbox.mjs +2 -2
- package/dist/runtime/sse.mjs +1 -1
- package/dist/runtime/storage.mjs +1 -1
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +2 -2
- package/dist/runtime/ws-server.mjs +30 -61
- package/dist/runtime/ws.d.mts +1 -1
- package/dist/runtime/ws.mjs +1 -1
- package/dist/{scan-C8dA7iM4.mjs → scan-C3uDzz6J.mjs} +12 -13
- package/dist/{secret-AKnNXNP5.mjs → secret-BvtB7IjY.mjs} +15 -15
- package/dist/{skills-BPQUGClu.mjs → skills-BgVMvQdy.mjs} +2 -2
- package/dist/{sse-CQNaDFFV.mjs → sse-CMvCgjNk.mjs} +1 -1
- package/dist/{subcommand-prompt-B6WS9Aoz.mjs → subcommand-prompt-BSlnD1fI.mjs} +2 -2
- package/dist/sveltekit.d.mts +0 -2
- package/dist/terminal-log-text-D9ACPOuG.mjs +32 -0
- package/dist/validate-BJr9LfXy.mjs +2 -0
- package/dist/{validate-ymhap6M_.mjs → validate-C9qJArv7.mjs} +9 -28
- package/dist/{defer-YsYDUoii.mjs → validation-error-Dg9Recn1.mjs} +11 -11
- package/dist/{wrangler-DhUerFkW.mjs → wrangler-D9KTuqnv.mjs} +89 -194
- package/dist/{ws-C79j4aED.d.mts → ws-CChrrAU-.d.mts} +1 -1
- package/dist/{yarn-pnp-BV4AzNul.mjs → yarn-pnp-CUX_iTPA.mjs} +19 -27
- package/{skills/void/docs → docs}/guide/ai.md +5 -3
- package/{skills/void/docs → docs}/guide/auth.md +37 -1
- package/{skills/void/docs → docs}/guide/database/postgresql.md +2 -2
- package/{skills/void/docs → docs}/guide/deployment.md +2 -2
- package/{skills/void/docs → docs}/guide/edge/revalidation.md +1 -1
- package/{skills/void/docs → docs}/guide/edge/rewrites.md +2 -4
- package/{skills/void/docs → docs}/guide/email/receiving.md +2 -2
- package/{skills/void/docs → docs}/guide/email/sending.md +0 -2
- package/{skills/void/docs → docs}/guide/env-vars.md +4 -0
- package/{skills/void/docs → docs}/guide/jobs.md +2 -2
- package/{skills/void/docs → docs}/guide/live.md +10 -5
- package/{skills/void/docs → docs}/guide/pages-routing/actions-and-forms.md +20 -8
- package/{skills/void/docs → docs}/guide/pages-routing/loaders.md +7 -3
- package/{skills/void/docs → docs}/guide/pages-routing/markdown.md +15 -23
- package/{skills/void/docs → docs}/guide/pages-routing/overview.md +6 -4
- package/{skills/void/docs → docs}/guide/platform/administration/access.md +3 -11
- package/{skills/void/docs → docs}/guide/platform/administration/operations.md +3 -12
- package/{skills/void/docs → docs}/guide/platform/administration/projects.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/development/local.md +4 -2
- package/{skills/void/docs → docs}/guide/platform/development/runtime.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/development/schema-ci.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/installation/domains.md +3 -1
- package/{skills/void/docs → docs}/guide/platform/installation/first-deployment.md +4 -2
- package/{skills/void/docs → docs}/guide/platform/installation/maintenance.md +4 -0
- package/{skills/void/docs → docs}/guide/project-collaboration.md +7 -3
- package/{skills/void/docs → docs}/guide/queues.md +0 -2
- package/{skills/void/docs → docs}/guide/remote-dev.md +5 -5
- package/{skills/void/docs → docs}/guide/sandboxes.md +2 -2
- package/{skills/void/docs → docs}/guide/sse.md +0 -2
- package/{skills/void/docs → docs}/guide/storage.md +7 -2
- package/{skills/void/docs → docs}/guide/websockets.md +4 -0
- package/docs/integrations/agents.md +37 -0
- package/{skills/void/docs → docs}/integrations/frameworks/astro.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/nuxt.md +6 -2
- package/{skills/void/docs → docs}/integrations/hono.md +15 -7
- package/{skills/void/docs → docs}/integrations/nodejs-bun-deno.md +1 -0
- package/{skills/void/docs → docs}/reference/api/auth.md +1 -1
- package/{skills/void/docs → docs}/reference/api/handlers.md +4 -2
- package/{skills/void/docs → docs}/reference/api/pages.md +4 -0
- package/{skills/void/docs → docs}/reference/cli/auth.md +1 -6
- package/{skills/void/docs → docs}/reference/cli/database.md +3 -4
- package/{skills/void/docs → docs}/reference/cli/deploy.md +1 -1
- package/{skills/void/docs → docs}/reference/cli/generate.md +1 -1
- package/{skills/void/docs → docs}/reference/cli/github.md +3 -12
- package/{skills/void/docs → docs}/reference/cli/platform-config.md +1 -1
- package/{skills/void/docs → docs}/reference/cli/platform-email.md +2 -3
- package/{skills/void/docs → docs}/reference/cli/platform-installation.md +1 -1
- package/{skills/void/docs → docs}/reference/cli/platform-operations.md +3 -0
- package/{skills/void/docs → docs}/reference/cli/platform-users.md +2 -2
- package/{skills/void/docs → docs}/reference/cli/project.md +5 -4
- package/{skills/void/docs → docs}/reference/cli/secrets.md +3 -3
- package/{skills/void/docs → docs}/reference/cli/setup.md +9 -11
- package/{skills/void/docs → docs}/reference/cli.md +1 -1
- package/{skills/void/docs → docs}/reference/config.md +13 -13
- package/{skills/void/docs → docs}/reference/resource-inference.md +1 -16
- package/package.json +34 -30
- package/schema.json +1 -1
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +4 -1
- package/skills/void/SKILL.md +9 -5
- package/dist/cf-build-output-ChY6-XWP.mjs +0 -2
- package/dist/client-BxVixJBI.mjs +0 -2
- package/dist/config-0acf1oys.mjs +0 -2
- package/dist/config-D8MOgiQV.mjs +0 -32
- package/dist/deploy-qmiLE1G1.mjs +0 -2
- package/dist/discover-AMCBXivQ.mjs +0 -2
- package/dist/fetch-error-Sp1R4mZv.d.mts +0 -20
- package/dist/gen-qCBwH3fZ.mjs +0 -2
- package/dist/help-Dw5f9Xrg.mjs +0 -2
- package/dist/login-D7meQg_3.mjs +0 -2
- package/dist/migrate-CEu2X5DB.mjs +0 -2
- package/dist/operator-cmd-DRPvhpjM.mjs +0 -2
- package/dist/plan-COtUvdMA.mjs +0 -2
- package/dist/platform-args-Dcy_5b_Y.mjs +0 -2
- package/dist/prepare-BBknoZI1.mjs +0 -2
- package/dist/resolve-project-DtbidV4y.mjs +0 -2
- package/dist/route-url-CG7U-cRN.mjs +0 -15
- package/dist/runner-voIltZrY.mjs +0 -2
- package/dist/validate-pna7R3Pv.mjs +0 -2
- package/skills/void/docs/integrations/agents.md +0 -26
- package/dist/{runner-pg-D4OPlil-.mjs → runner-pg-DV8p_zjA.mjs} +4 -4
- package/{skills/void/docs → docs}/guide/app-types.md +0 -0
- package/{skills/void/docs → docs}/guide/database/d1.md +2 -2
- package/{skills/void/docs → docs}/guide/database/mysql.md +0 -0
- package/{skills/void/docs → docs}/guide/database.md +8 -8
- package/{skills/void/docs → docs}/guide/durable-state.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/headers.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/prerendering.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/redirects.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/static-assets.md +0 -0
- package/{skills/void/docs → docs}/guide/email/domains.md +0 -0
- package/{skills/void/docs → docs}/guide/email.md +0 -0
- package/{skills/void/docs → docs}/guide/index.md +0 -0
- package/{skills/void/docs → docs}/guide/kv.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/head.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/islands.md +2 -2
- package/{skills/void/docs → docs}/guide/pages-routing/layouts.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/view-transitions.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/email.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/plans.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/zero-trust.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/ci.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/credentials.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/prerequisites.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/setup.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/uninstall.md +0 -0
- package/{skills/void/docs → docs}/guide/platform-administration.md +0 -0
- package/{skills/void/docs → docs}/guide/platform-development.md +0 -0
- package/{skills/void/docs → docs}/guide/quickstart.md +0 -0
- package/{skills/void/docs → docs}/guide/self-hosted-platform.md +0 -0
- package/{skills/void/docs → docs}/guide/server-routing.md +3 -3
- package/{skills/void/docs → docs}/guide/ssg.md +0 -0
- package/{skills/void/docs → docs}/guide/ssr.md +0 -0
- package/{skills/void/docs → docs}/guide/type-safety.md +0 -0
- package/{skills/void/docs → docs}/guide/typed-fetch.md +0 -0
- package/{skills/void/docs → docs}/index.md +0 -0
- package/{skills/void/docs → docs}/integrations/cloudflare.md +0 -0
- package/{skills/void/docs → docs}/integrations/frameworks/analog.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/overview.md +0 -0
- package/{skills/void/docs → docs}/integrations/frameworks/react-router.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/sveltekit.md +1 -1
- package/{skills/void/docs → docs}/integrations/frameworks/tanstack-start.md +2 -2
- package/{skills/void/docs → docs}/reference/api/client.md +0 -0
- package/{skills/void/docs → docs}/reference/api/database.md +2 -2
- /package/{skills/void/docs → docs}/reference/api/durable.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/env.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/plugin.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/resources.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/rewrites.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/types.md +0 -0
- /package/{skills/void/docs → docs}/reference/api.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/domains.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/email.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/platform-zero-trust.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/platform.md +0 -0
- /package/{skills/void/docs → docs}/reference/structure.md +0 -0
package/dist/pages/client.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as interpolateRouteParams } from "../route-url-
|
|
1
|
+
import { t as interpolateRouteParams } from "../route-url-BjGv_KKY.mjs";
|
|
2
2
|
import { n as initClientHead, t as applyClientHead } from "../head-client-DzmJGN4C.mjs";
|
|
3
3
|
import { n as parseCacheFor, t as PrefetchCache } from "../prefetch-Bsc_Pb6c.mjs";
|
|
4
4
|
import { readUsageLimit } from "@void/edge";
|
|
@@ -160,13 +160,13 @@ function createScrollRestoration() {
|
|
|
160
160
|
//#region src/pages/navigation-engine.ts
|
|
161
161
|
const PAGE_DATA_SCRIPT_ID = "__VOID_PAGE_DATA__";
|
|
162
162
|
const STATIC_PAGE_DATA_PREFIX = "/_void/pages";
|
|
163
|
-
function isFile
|
|
163
|
+
function isFile(value) {
|
|
164
164
|
return typeof File !== "undefined" && value instanceof File || value instanceof Blob || typeof FileList !== "undefined" && value instanceof FileList && value.length > 0;
|
|
165
165
|
}
|
|
166
|
-
function hasFiles
|
|
167
|
-
return isFile
|
|
166
|
+
function hasFiles(data) {
|
|
167
|
+
return isFile(data) || typeof data === "object" && data !== null && Object.values(data).some(hasFiles);
|
|
168
168
|
}
|
|
169
|
-
function objectToFormData
|
|
169
|
+
function objectToFormData(source, form, parentKey) {
|
|
170
170
|
form = form || new FormData();
|
|
171
171
|
for (const key in source) {
|
|
172
172
|
if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
|
|
@@ -175,24 +175,22 @@ function objectToFormData$1(source, form, parentKey) {
|
|
|
175
175
|
if (value instanceof File) form.append(composed, value, value.name);
|
|
176
176
|
else if (value instanceof Blob) form.append(composed, value);
|
|
177
177
|
else if (typeof FileList !== "undefined" && value instanceof FileList) for (let i = 0; i < value.length; i++) form.append(composed + "[]", value[i], value[i].name);
|
|
178
|
-
else if (Array.isArray(value)) for (let i = 0; i < value.length; i++) objectToFormData
|
|
178
|
+
else if (Array.isArray(value)) for (let i = 0; i < value.length; i++) objectToFormData({ [i]: value[i] }, form, composed);
|
|
179
179
|
else if (value instanceof Date) form.append(composed, value.toISOString());
|
|
180
180
|
else if (typeof value === "boolean") form.append(composed, value ? "1" : "0");
|
|
181
181
|
else if (typeof value === "string") form.append(composed, value);
|
|
182
182
|
else if (typeof value === "number") form.append(composed, String(value));
|
|
183
183
|
else if (value === null || value === void 0) form.append(composed, "");
|
|
184
|
-
else objectToFormData
|
|
184
|
+
else objectToFormData(value, form, composed);
|
|
185
185
|
}
|
|
186
186
|
return form;
|
|
187
187
|
}
|
|
188
188
|
function clonePageData(pageData) {
|
|
189
189
|
return JSON.parse(JSON.stringify(pageData));
|
|
190
190
|
}
|
|
191
|
-
function readInitialPageData(
|
|
191
|
+
function readInitialPageData() {
|
|
192
192
|
const scriptEl = document.getElementById(PAGE_DATA_SCRIPT_ID);
|
|
193
193
|
if (scriptEl?.textContent) return JSON.parse(scriptEl.textContent);
|
|
194
|
-
const legacyData = appEl.getAttribute("data-page");
|
|
195
|
-
if (legacyData) return JSON.parse(legacyData);
|
|
196
194
|
throw new Error("pages: Missing initial page payload.");
|
|
197
195
|
}
|
|
198
196
|
function parsePageDataFromHtml(html) {
|
|
@@ -204,9 +202,6 @@ function parsePageDataFromHtml(html) {
|
|
|
204
202
|
return null;
|
|
205
203
|
}
|
|
206
204
|
}
|
|
207
|
-
function isAbortError$1(error) {
|
|
208
|
-
return typeof error === "object" && error !== null && "name" in error && error.name === "AbortError";
|
|
209
|
-
}
|
|
210
205
|
function abortError() {
|
|
211
206
|
return new DOMException("Navigation aborted", "AbortError");
|
|
212
207
|
}
|
|
@@ -220,14 +215,13 @@ async function fetchPageResponse(fetchUrl, init) {
|
|
|
220
215
|
try {
|
|
221
216
|
return await fetch(fetchUrl, init);
|
|
222
217
|
} catch (error) {
|
|
223
|
-
if (init.signal?.aborted || isAbortError
|
|
218
|
+
if (init.signal?.aborted || isAbortError(error)) throw abortError();
|
|
224
219
|
return null;
|
|
225
220
|
}
|
|
226
221
|
}
|
|
227
222
|
async function createPageNavigationEngine(config) {
|
|
228
223
|
const { adapter, components, layoutTree, routeMeta, matchRoute, staticPageData: STATIC_PAGE_DATA_ENABLED = false, staticPageDataFastPath: STATIC_PAGE_DATA_FAST_PATH = STATIC_PAGE_DATA_ENABLED, prefetchHoverDelay: PREFETCH_HOVER_DELAY, prefetchDefaultCacheFor: PREFETCH_DEFAULT_CACHE_FOR, cacheVisitedPageData: CACHE_VISITED_PAGE_DATA = false } = config;
|
|
229
224
|
const _prefetchCache = new PrefetchCache();
|
|
230
|
-
const _staticPageDataCacheKeys = /* @__PURE__ */ new Set();
|
|
231
225
|
let _nextNavigationId = 0;
|
|
232
226
|
let _pendingResource = null;
|
|
233
227
|
let _committedResource = null;
|
|
@@ -238,9 +232,6 @@ async function createPageNavigationEngine(config) {
|
|
|
238
232
|
let initialScrollPosition = null;
|
|
239
233
|
const initialUrl = window.location.pathname + window.location.search + window.location.hash;
|
|
240
234
|
const scrollRestoration = createScrollRestoration();
|
|
241
|
-
function getPageDataCacheKey(url, method = "GET") {
|
|
242
|
-
return `${method}:${url}`;
|
|
243
|
-
}
|
|
244
235
|
async function resolveComponent(id) {
|
|
245
236
|
const loader = components[id];
|
|
246
237
|
if (!loader) throw new Error(`pages: Unknown page component '${id}'.`);
|
|
@@ -256,7 +247,7 @@ async function createPageNavigationEngine(config) {
|
|
|
256
247
|
return `${STATIC_PAGE_DATA_PREFIX}/${filePath}.json`;
|
|
257
248
|
}
|
|
258
249
|
function isUsablePageData(pageData, matchedId) {
|
|
259
|
-
return typeof pageData === "object" && pageData !== null && "component" in pageData && typeof pageData.component === "string" && "props" in pageData && typeof pageData.props === "object" && pageData.props !== null &&
|
|
250
|
+
return typeof pageData === "object" && pageData !== null && "component" in pageData && typeof pageData.component === "string" && "props" in pageData && typeof pageData.props === "object" && pageData.props !== null && pageData.component === matchedId && !routeMeta[pageData.component]?.island && Boolean(components[pageData.component]);
|
|
260
251
|
}
|
|
261
252
|
class DeferredRegistry {
|
|
262
253
|
active = true;
|
|
@@ -265,28 +256,17 @@ async function createPageNavigationEngine(config) {
|
|
|
265
256
|
groups = {};
|
|
266
257
|
preservedSource = null;
|
|
267
258
|
preservedKeys = null;
|
|
268
|
-
|
|
259
|
+
/** Create a deferred ref per key; `resolved` payloads already carry the values inline. */
|
|
260
|
+
setup(pageData, resolved = false) {
|
|
269
261
|
this.props = pageData.props;
|
|
270
262
|
this.keyRefs = {};
|
|
271
263
|
this.groups = {};
|
|
272
264
|
if (!pageData.deferredKeys) return;
|
|
273
265
|
for (const [key, group] of Object.entries(pageData.deferredKeys)) {
|
|
274
266
|
const ref = adapter.createDeferred();
|
|
275
|
-
|
|
276
|
-
this.
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
setupResolved(pageData) {
|
|
281
|
-
this.props = pageData.props;
|
|
282
|
-
this.keyRefs = {};
|
|
283
|
-
this.groups = {};
|
|
284
|
-
if (!pageData.deferredKeys) return;
|
|
285
|
-
for (const [key, group] of Object.entries(pageData.deferredKeys)) {
|
|
286
|
-
const ref = adapter.createDeferred();
|
|
287
|
-
const updated = adapter.resolveDeferred(ref, pageData.props[key]);
|
|
288
|
-
this.keyRefs[key] = updated;
|
|
289
|
-
this.props[key] = updated;
|
|
267
|
+
const value = resolved ? adapter.resolveDeferred(ref, pageData.props[key]) : ref;
|
|
268
|
+
this.keyRefs[key] = value;
|
|
269
|
+
this.props[key] = value;
|
|
290
270
|
(this.groups[group] ??= []).push(key);
|
|
291
271
|
}
|
|
292
272
|
}
|
|
@@ -380,9 +360,14 @@ async function createPageNavigationEngine(config) {
|
|
|
380
360
|
}
|
|
381
361
|
const _resourceDeferredRegistries = /* @__PURE__ */ new WeakMap();
|
|
382
362
|
const _preservedDeferredResources = /* @__PURE__ */ new WeakMap();
|
|
383
|
-
|
|
363
|
+
/** Route id for a non-island page that static page data can serve, or null. */
|
|
364
|
+
function matchStaticPageId(fetchUrl) {
|
|
384
365
|
const matchedId = matchRoute(fetchUrl || window.location.pathname + window.location.search);
|
|
385
|
-
|
|
366
|
+
return matchedId && !routeMeta[matchedId]?.island && components[matchedId] ? matchedId : null;
|
|
367
|
+
}
|
|
368
|
+
async function loadStaticPageDataFile(fetchUrl, signal) {
|
|
369
|
+
const matchedId = matchStaticPageId(fetchUrl);
|
|
370
|
+
if (!matchedId) return null;
|
|
386
371
|
try {
|
|
387
372
|
const pageDataResponse = await fetch(getStaticPageDataUrl(fetchUrl), {
|
|
388
373
|
headers: { Accept: "application/json" },
|
|
@@ -396,14 +381,14 @@ async function createPageNavigationEngine(config) {
|
|
|
396
381
|
};
|
|
397
382
|
}
|
|
398
383
|
} catch (error) {
|
|
399
|
-
if (signal?.aborted || isAbortError
|
|
384
|
+
if (signal?.aborted || isAbortError(error)) throw abortError();
|
|
400
385
|
}
|
|
401
386
|
return null;
|
|
402
387
|
}
|
|
403
388
|
async function loadStaticPageData(fetchUrl, response, signal, verifyPageResponse = false) {
|
|
404
389
|
if (!response.ok) return null;
|
|
405
|
-
const matchedId =
|
|
406
|
-
if (!matchedId
|
|
390
|
+
const matchedId = matchStaticPageId(fetchUrl);
|
|
391
|
+
if (!matchedId) return null;
|
|
407
392
|
const contentType = response.headers.get("content-type") || "";
|
|
408
393
|
if (contentType && !contentType.includes("text/html")) return null;
|
|
409
394
|
if (verifyPageResponse) {
|
|
@@ -424,15 +409,28 @@ async function createPageNavigationEngine(config) {
|
|
|
424
409
|
resolvedDeferred: false
|
|
425
410
|
};
|
|
426
411
|
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
412
|
+
/** Fetch page data for the prefetch cache; null means "fall back to a full page load". */
|
|
413
|
+
function fetchPrefetchPageData(url) {
|
|
414
|
+
const headers = {
|
|
415
|
+
"X-VoidPages": "true",
|
|
416
|
+
Accept: "application/json",
|
|
417
|
+
Purpose: "prefetch"
|
|
418
|
+
};
|
|
419
|
+
return (STATIC_PAGE_DATA_ENABLED && STATIC_PAGE_DATA_FAST_PATH ? loadStaticPageDataFile(url).then((result) => result?.pageData) : Promise.resolve(void 0)).then((pageData) => {
|
|
420
|
+
if (pageData !== void 0) return pageData;
|
|
421
|
+
return fetchPageResponse(url, {
|
|
422
|
+
method: "GET",
|
|
423
|
+
headers
|
|
424
|
+
}).then(async (r) => {
|
|
425
|
+
if (!r || r.redirected) return null;
|
|
426
|
+
if (!r.headers.get("X-VoidPages")) return (await loadStaticPageData(url, r, void 0, !STATIC_PAGE_DATA_FAST_PATH))?.pageData ?? null;
|
|
427
|
+
return r.json();
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
function restoreScroll(scrollPosition, hash) {
|
|
432
|
+
if (scrollPosition) {
|
|
433
|
+
window.scrollTo(scrollPosition.x, scrollPosition.y);
|
|
436
434
|
return;
|
|
437
435
|
}
|
|
438
436
|
if (hash) {
|
|
@@ -444,11 +442,24 @@ async function createPageNavigationEngine(config) {
|
|
|
444
442
|
}
|
|
445
443
|
window.scrollTo(0, 0);
|
|
446
444
|
}
|
|
445
|
+
const deferredWindow = window;
|
|
446
|
+
deferredWindow.__resolveDeferred = (group, data) => _htmlDeferredRegistry?.resolve(group, data, void 0);
|
|
447
|
+
deferredWindow.__rejectDeferred = (group, error) => _htmlDeferredRegistry?.resolve(group, void 0, error);
|
|
448
|
+
function commitHashNavigation(effectiveFetchUrl, hash, options, writeHistory) {
|
|
449
|
+
_currentFetchUrl = effectiveFetchUrl;
|
|
450
|
+
if (writeHistory) scrollRestoration.writeHistory(effectiveFetchUrl + hash, !!options.replace);
|
|
451
|
+
scrollRestoration.commit();
|
|
452
|
+
restoreScroll(options._scrollPosition, hash);
|
|
453
|
+
}
|
|
447
454
|
async function loadNavigationShell(id, url, fetchUrl, method, options, signal, commitTarget, deferredRegistry) {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
455
|
+
const target = new URL(url, window.location.origin);
|
|
456
|
+
if (target.protocol !== "http:" && target.protocol !== "https:") throw new Error(`Void Router: refusing to navigate to a ${target.protocol} URL.`);
|
|
457
|
+
if (target.origin !== window.location.origin) {
|
|
458
|
+
if (method !== "GET") throw new Error("Void Router: non-GET visits must target the current origin.");
|
|
459
|
+
window.location.href = url;
|
|
460
|
+
return;
|
|
451
461
|
}
|
|
462
|
+
if (method !== "GET") _prefetchCache.flushAll();
|
|
452
463
|
const headers = {
|
|
453
464
|
"X-VoidPages": "true",
|
|
454
465
|
Accept: "application/json"
|
|
@@ -459,7 +470,7 @@ async function createPageNavigationEngine(config) {
|
|
|
459
470
|
signal
|
|
460
471
|
};
|
|
461
472
|
if (options.data && method !== "GET") {
|
|
462
|
-
if (hasFiles
|
|
473
|
+
if (hasFiles(options.data)) fetchOptions.body = objectToFormData(options.data);
|
|
463
474
|
else {
|
|
464
475
|
headers["Content-Type"] = "application/json";
|
|
465
476
|
fetchOptions.body = JSON.stringify(options.data);
|
|
@@ -475,24 +486,9 @@ async function createPageNavigationEngine(config) {
|
|
|
475
486
|
return;
|
|
476
487
|
}
|
|
477
488
|
pageData = clonePageData(cachedPageData);
|
|
478
|
-
deferredRegistry.
|
|
489
|
+
deferredRegistry.setup(pageData, true);
|
|
479
490
|
if (!_prefetchCache.isFresh(cacheEntry)) {
|
|
480
|
-
const
|
|
481
|
-
"X-VoidPages": "true",
|
|
482
|
-
Accept: "application/json",
|
|
483
|
-
Purpose: "prefetch"
|
|
484
|
-
};
|
|
485
|
-
const bgFetch = (STATIC_PAGE_DATA_ENABLED && STATIC_PAGE_DATA_FAST_PATH && method === "GET" ? loadStaticPageDataFile(fetchUrl).then((result) => result?.pageData) : Promise.resolve(void 0)).then((pageData) => {
|
|
486
|
-
if (pageData !== void 0) return pageData;
|
|
487
|
-
return fetchPageResponse(fetchUrl, {
|
|
488
|
-
method,
|
|
489
|
-
headers: bgHeaders
|
|
490
|
-
}).then(async (r) => {
|
|
491
|
-
if (!r || r.redirected) return null;
|
|
492
|
-
if (!r.headers.get("X-VoidPages")) return (await loadStaticPageData(fetchUrl, r, void 0, !STATIC_PAGE_DATA_FAST_PATH))?.pageData ?? null;
|
|
493
|
-
return r.json();
|
|
494
|
-
});
|
|
495
|
-
});
|
|
491
|
+
const bgFetch = fetchPrefetchPageData(fetchUrl);
|
|
496
492
|
_prefetchCache.flush(fetchUrl, method);
|
|
497
493
|
_prefetchCache.set(fetchUrl, method, bgFetch, PREFETCH_DEFAULT_CACHE_FOR);
|
|
498
494
|
}
|
|
@@ -501,10 +497,8 @@ async function createPageNavigationEngine(config) {
|
|
|
501
497
|
const staticPageData = await loadStaticPageDataFile(fetchUrl, signal);
|
|
502
498
|
if (staticPageData) {
|
|
503
499
|
pageData = staticPageData.pageData;
|
|
504
|
-
_staticPageDataCacheKeys.add(getPageDataCacheKey(fetchUrl, method));
|
|
505
500
|
_prefetchCache.set(fetchUrl, method, Promise.resolve(clonePageData(pageData)), PREFETCH_DEFAULT_CACHE_FOR);
|
|
506
|
-
|
|
507
|
-
else deferredRegistry.setupPending(pageData);
|
|
501
|
+
deferredRegistry.setup(pageData, staticPageData.resolvedDeferred);
|
|
508
502
|
}
|
|
509
503
|
}
|
|
510
504
|
const response = pageData === void 0 ? method === "GET" ? await fetchPageResponse(fetchUrl, fetchOptions) : await fetch(fetchUrl, fetchOptions) : null;
|
|
@@ -533,8 +527,7 @@ async function createPageNavigationEngine(config) {
|
|
|
533
527
|
const staticPageData = await loadStaticPageData(fetchUrl, response, signal, !STATIC_PAGE_DATA_FAST_PATH);
|
|
534
528
|
if (staticPageData) {
|
|
535
529
|
pageData = staticPageData.pageData;
|
|
536
|
-
|
|
537
|
-
else deferredRegistry.setupPending(pageData);
|
|
530
|
+
deferredRegistry.setup(pageData, staticPageData.resolvedDeferred);
|
|
538
531
|
} else {
|
|
539
532
|
window.location.href = url;
|
|
540
533
|
return;
|
|
@@ -558,7 +551,7 @@ async function createPageNavigationEngine(config) {
|
|
|
558
551
|
if (!line) continue;
|
|
559
552
|
if (firstLine) {
|
|
560
553
|
pageData = JSON.parse(line);
|
|
561
|
-
deferredRegistry.
|
|
554
|
+
deferredRegistry.setup(pageData);
|
|
562
555
|
firstLine = false;
|
|
563
556
|
} else {
|
|
564
557
|
const msg = JSON.parse(line);
|
|
@@ -587,7 +580,7 @@ async function createPageNavigationEngine(config) {
|
|
|
587
580
|
})();
|
|
588
581
|
} else {
|
|
589
582
|
pageData = await response.json();
|
|
590
|
-
deferredRegistry.
|
|
583
|
+
deferredRegistry.setup(pageData);
|
|
591
584
|
}
|
|
592
585
|
if (CACHE_VISITED_PAGE_DATA && method === "GET" && response?.ok && response.headers.get("X-VoidPages") && pageData?.component === matchRoute(fetchUrl) && !pageData.deferredKeys) _prefetchCache.set(fetchUrl, method, Promise.resolve(clonePageData(pageData)), PREFETCH_DEFAULT_CACHE_FOR);
|
|
593
586
|
}
|
|
@@ -631,23 +624,16 @@ async function createPageNavigationEngine(config) {
|
|
|
631
624
|
scrollRestoration.writeHistory(historyUrl, !!options.replace);
|
|
632
625
|
}
|
|
633
626
|
scrollRestoration.commit();
|
|
634
|
-
|
|
635
|
-
if (options.preserveScroll)
|
|
636
|
-
|
|
637
|
-
else if (commitTarget.hash) {
|
|
638
|
-
const el = document.getElementById(commitTarget.hash.slice(1));
|
|
639
|
-
if (el) el.scrollIntoView();
|
|
640
|
-
else window.scrollTo(0, 0);
|
|
641
|
-
} else window.scrollTo(0, 0);
|
|
642
|
-
};
|
|
643
|
-
requestAnimationFrame(doScroll);
|
|
627
|
+
requestAnimationFrame(() => {
|
|
628
|
+
if (!options.preserveScroll) restoreScroll(options._scrollPosition, commitTarget.hash);
|
|
629
|
+
});
|
|
644
630
|
};
|
|
645
631
|
}
|
|
646
|
-
const initialPageData = readInitialPageData(
|
|
632
|
+
const initialPageData = readInitialPageData();
|
|
647
633
|
const [initialComponent, initialLayouts] = await Promise.all([resolveComponent(initialPageData.component), resolveLayouts(initialPageData.component)]);
|
|
648
634
|
if (CACHE_VISITED_PAGE_DATA && initialPageData.url === _currentFetchUrl && initialPageData.component === matchRoute(_currentFetchUrl) && initialPageData.errors === null && !initialPageData.deferredKeys) _prefetchCache.set(_currentFetchUrl, "GET", Promise.resolve(clonePageData(initialPageData)), PREFETCH_DEFAULT_CACHE_FOR);
|
|
649
635
|
const initialDeferredRegistry = new DeferredRegistry();
|
|
650
|
-
initialDeferredRegistry.
|
|
636
|
+
initialDeferredRegistry.setup(initialPageData);
|
|
651
637
|
_committedDeferredRegistry = initialDeferredRegistry;
|
|
652
638
|
_htmlDeferredRegistry = initialDeferredRegistry;
|
|
653
639
|
return {
|
|
@@ -691,6 +677,10 @@ async function createPageNavigationEngine(config) {
|
|
|
691
677
|
};
|
|
692
678
|
const shell = loadNavigationShell(id, url, effectiveFetchUrl, method, options, controller.signal, commitTarget, deferredRegistry);
|
|
693
679
|
let commitResource = async () => {};
|
|
680
|
+
const stop = () => {
|
|
681
|
+
controller.abort(abortError());
|
|
682
|
+
deferredRegistry.dispose();
|
|
683
|
+
};
|
|
694
684
|
const resource = {
|
|
695
685
|
id,
|
|
696
686
|
url,
|
|
@@ -700,17 +690,11 @@ async function createPageNavigationEngine(config) {
|
|
|
700
690
|
options,
|
|
701
691
|
immediate: false,
|
|
702
692
|
shell,
|
|
703
|
-
abort
|
|
704
|
-
controller.abort(abortError());
|
|
705
|
-
deferredRegistry.dispose();
|
|
706
|
-
},
|
|
693
|
+
abort: stop,
|
|
707
694
|
commit() {
|
|
708
695
|
return commitResource();
|
|
709
696
|
},
|
|
710
|
-
dispose
|
|
711
|
-
controller.abort(abortError());
|
|
712
|
-
deferredRegistry.dispose();
|
|
713
|
-
}
|
|
697
|
+
dispose: stop
|
|
714
698
|
};
|
|
715
699
|
_resourceDeferredRegistries.set(resource, deferredRegistry);
|
|
716
700
|
commitResource = makeCommit(commitTarget, options, shell, deferredRegistry, id, () => resource);
|
|
@@ -740,35 +724,15 @@ async function createPageNavigationEngine(config) {
|
|
|
740
724
|
const existing = _prefetchCache.get(prefetchUrl, method);
|
|
741
725
|
if (existing) return existing.response;
|
|
742
726
|
const ttl = options.cacheFor ? parseCacheFor(options.cacheFor) : PREFETCH_DEFAULT_CACHE_FOR;
|
|
743
|
-
const
|
|
744
|
-
"X-VoidPages": "true",
|
|
745
|
-
Accept: "application/json",
|
|
746
|
-
Purpose: "prefetch"
|
|
747
|
-
};
|
|
748
|
-
const fetchPromise = (STATIC_PAGE_DATA_ENABLED && STATIC_PAGE_DATA_FAST_PATH && method === "GET" ? loadStaticPageDataFile(prefetchUrl).then((result) => result?.pageData) : Promise.resolve(void 0)).then((pageData) => {
|
|
749
|
-
if (pageData !== void 0) return pageData;
|
|
750
|
-
return fetchPageResponse(prefetchUrl, {
|
|
751
|
-
method,
|
|
752
|
-
headers
|
|
753
|
-
}).then((r) => {
|
|
754
|
-
if (!r || r.redirected) return null;
|
|
755
|
-
if (!r.headers.get("X-VoidPages")) {
|
|
756
|
-
if (method !== "GET") return null;
|
|
757
|
-
return loadStaticPageData(prefetchUrl, r, void 0, !STATIC_PAGE_DATA_FAST_PATH).then((result) => result?.pageData ?? null);
|
|
758
|
-
}
|
|
759
|
-
return r.json();
|
|
760
|
-
});
|
|
761
|
-
});
|
|
727
|
+
const fetchPromise = fetchPrefetchPageData(prefetchUrl);
|
|
762
728
|
_prefetchCache.set(prefetchUrl, method, fetchPromise, ttl);
|
|
763
729
|
return fetchPromise;
|
|
764
730
|
},
|
|
765
731
|
flush(url, method = "GET") {
|
|
766
732
|
_prefetchCache.flush(url, method);
|
|
767
|
-
_staticPageDataCacheKeys.delete(getPageDataCacheKey(url, method));
|
|
768
733
|
},
|
|
769
734
|
flushAll() {
|
|
770
735
|
_prefetchCache.flushAll();
|
|
771
|
-
_staticPageDataCacheKeys.clear();
|
|
772
736
|
},
|
|
773
737
|
setPopStateHandler(handler) {
|
|
774
738
|
popStateHandler = handler;
|
|
@@ -805,6 +769,48 @@ async function createPageNavigationEngine(config) {
|
|
|
805
769
|
};
|
|
806
770
|
}
|
|
807
771
|
//#endregion
|
|
772
|
+
//#region src/pages/adapter-helpers.ts
|
|
773
|
+
function getValidationErrors(body) {
|
|
774
|
+
if (body && typeof body === "object" && "errors" in body && body.errors && typeof body.errors === "object" && !Array.isArray(body.errors)) return body.errors;
|
|
775
|
+
return null;
|
|
776
|
+
}
|
|
777
|
+
function appendQueryValue(params, key, value) {
|
|
778
|
+
if (value === null || value === void 0) return false;
|
|
779
|
+
if (value instanceof Date) {
|
|
780
|
+
params.append(key, value.toISOString());
|
|
781
|
+
return true;
|
|
782
|
+
}
|
|
783
|
+
if (Array.isArray(value)) {
|
|
784
|
+
let appended = false;
|
|
785
|
+
for (const item of value) appended = appendQueryValue(params, key, item) || appended;
|
|
786
|
+
return appended;
|
|
787
|
+
}
|
|
788
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
789
|
+
params.append(key, String(value));
|
|
790
|
+
return true;
|
|
791
|
+
}
|
|
792
|
+
throw new Error(`Link: GET data only supports primitive values and arrays. Remove nested data for '${key}'.`);
|
|
793
|
+
}
|
|
794
|
+
function mergeDataIntoHref(href, data) {
|
|
795
|
+
if (!data) return href;
|
|
796
|
+
const hashIndex = href.indexOf("#");
|
|
797
|
+
const beforeHash = hashIndex === -1 ? href : href.slice(0, hashIndex);
|
|
798
|
+
const hash = hashIndex === -1 ? "" : href.slice(hashIndex);
|
|
799
|
+
const searchIndex = beforeHash.indexOf("?");
|
|
800
|
+
const path = searchIndex === -1 ? beforeHash : beforeHash.slice(0, searchIndex);
|
|
801
|
+
const search = searchIndex === -1 ? "" : beforeHash.slice(searchIndex + 1);
|
|
802
|
+
const params = new URLSearchParams(search);
|
|
803
|
+
let appended = false;
|
|
804
|
+
for (const [key, value] of Object.entries(data)) appended = appendQueryValue(params, key, value) || appended;
|
|
805
|
+
if (!appended) return href;
|
|
806
|
+
const query = params.toString();
|
|
807
|
+
return `${path}${query ? `?${query}` : ""}${hash}`;
|
|
808
|
+
}
|
|
809
|
+
function isModifiedEvent(e) {
|
|
810
|
+
const target = e.currentTarget.getAttribute("target");
|
|
811
|
+
return target !== null && target !== "_self" || e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || e.button !== 0;
|
|
812
|
+
}
|
|
813
|
+
//#endregion
|
|
808
814
|
//#region src/pages/form-value-equality.ts
|
|
809
815
|
function isPlainObject(value) {
|
|
810
816
|
if (value === null || typeof value !== "object") return false;
|
|
@@ -955,31 +961,6 @@ function createSsrRouter(url = "/", params = {}) {
|
|
|
955
961
|
}
|
|
956
962
|
};
|
|
957
963
|
}
|
|
958
|
-
function isFile(value) {
|
|
959
|
-
return typeof File !== "undefined" && value instanceof File || value instanceof Blob || typeof FileList !== "undefined" && value instanceof FileList && value.length > 0;
|
|
960
|
-
}
|
|
961
|
-
function hasFiles(data) {
|
|
962
|
-
return isFile(data) || typeof data === "object" && data !== null && Object.values(data).some(hasFiles);
|
|
963
|
-
}
|
|
964
|
-
function objectToFormData(source, form, parentKey) {
|
|
965
|
-
form = form || new FormData();
|
|
966
|
-
for (const key in source) {
|
|
967
|
-
if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
|
|
968
|
-
const composed = parentKey ? parentKey + "[" + key + "]" : key;
|
|
969
|
-
const value = source[key];
|
|
970
|
-
if (value instanceof File) form.append(composed, value, value.name);
|
|
971
|
-
else if (value instanceof Blob) form.append(composed, value);
|
|
972
|
-
else if (typeof FileList !== "undefined" && value instanceof FileList) for (let i = 0; i < value.length; i++) form.append(composed + "[]", value[i], value[i].name);
|
|
973
|
-
else if (Array.isArray(value)) for (let i = 0; i < value.length; i++) objectToFormData({ [i]: value[i] }, form, composed);
|
|
974
|
-
else if (value instanceof Date) form.append(composed, value.toISOString());
|
|
975
|
-
else if (typeof value === "boolean") form.append(composed, value ? "1" : "0");
|
|
976
|
-
else if (typeof value === "string") form.append(composed, value);
|
|
977
|
-
else if (typeof value === "number") form.append(composed, String(value));
|
|
978
|
-
else if (value === null || value === void 0) form.append(composed, "");
|
|
979
|
-
else objectToFormData(value, form, composed);
|
|
980
|
-
}
|
|
981
|
-
return form;
|
|
982
|
-
}
|
|
983
964
|
const ssrProxy = createSsrRouter();
|
|
984
965
|
async function submitAction(router, url, options) {
|
|
985
966
|
try {
|
|
@@ -1030,90 +1011,88 @@ function createActionClient() {
|
|
|
1030
1011
|
};
|
|
1031
1012
|
}
|
|
1032
1013
|
async function createVoidRouter(config) {
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
setNavigation(idleNavigationState());
|
|
1067
|
-
}
|
|
1014
|
+
const engine = await createPageNavigationEngine(config);
|
|
1015
|
+
let routeUrl = currentUrl();
|
|
1016
|
+
let routeParams = engine.initialPageData.params ?? {};
|
|
1017
|
+
let activeNavigationId = null;
|
|
1018
|
+
const setRouteState = (url, params = routeParams) => {
|
|
1019
|
+
routeUrl = url;
|
|
1020
|
+
routeParams = params;
|
|
1021
|
+
config.onRouteChange?.(url);
|
|
1022
|
+
};
|
|
1023
|
+
const setNavigation = (navigation) => {
|
|
1024
|
+
config.onNavigationChange?.(navigation);
|
|
1025
|
+
};
|
|
1026
|
+
async function applyNavigationResource(resource) {
|
|
1027
|
+
activeNavigationId = resource.id;
|
|
1028
|
+
setNavigation(navigationStateFor(resource.fetchUrl + resource.hash, resource.method));
|
|
1029
|
+
try {
|
|
1030
|
+
const result = await resource.shell;
|
|
1031
|
+
if (!result) return;
|
|
1032
|
+
setRouteState(result.pageData.url || resource.fetchUrl + resource.hash, result.pageData.params ?? {});
|
|
1033
|
+
const applyUpdate = () => config.adapter.applyUpdate(result.pageData, result.component, result.layouts, { preserveState: resource.options.preserveState ?? resource.method !== "GET" });
|
|
1034
|
+
if ((resource.options.viewTransition ?? config.viewTransitions) && document.startViewTransition) await document.startViewTransition(() => applyUpdate()).updateCallbackDone;
|
|
1035
|
+
else await applyUpdate();
|
|
1036
|
+
await resource.commit();
|
|
1037
|
+
if (activeNavigationId === resource.id) setRouteState(currentUrl(), result.pageData.params ?? {});
|
|
1038
|
+
return result.pageData;
|
|
1039
|
+
} catch (error) {
|
|
1040
|
+
if (resource.method.toUpperCase() === "GET" && !resource.options._resolveOnShell && isAbortError(error)) return;
|
|
1041
|
+
throw error;
|
|
1042
|
+
} finally {
|
|
1043
|
+
if (activeNavigationId === resource.id) {
|
|
1044
|
+
activeNavigationId = null;
|
|
1045
|
+
setRouteState(currentUrl());
|
|
1046
|
+
setNavigation(idleNavigationState());
|
|
1068
1047
|
}
|
|
1069
1048
|
}
|
|
1070
|
-
const rawRouter = {
|
|
1071
|
-
_hoverDelay: engine._hoverDelay,
|
|
1072
|
-
get url() {
|
|
1073
|
-
return toUrl(routeUrl);
|
|
1074
|
-
},
|
|
1075
|
-
get path() {
|
|
1076
|
-
return this.url.pathname;
|
|
1077
|
-
},
|
|
1078
|
-
get query() {
|
|
1079
|
-
return this.url.searchParams;
|
|
1080
|
-
},
|
|
1081
|
-
get params() {
|
|
1082
|
-
return routeParams;
|
|
1083
|
-
},
|
|
1084
|
-
visit(url, options = {}) {
|
|
1085
|
-
return applyNavigationResource(engine.prepareVisit(normalizeUrl(url), options));
|
|
1086
|
-
},
|
|
1087
|
-
refresh(options = {}) {
|
|
1088
|
-
return rawRouter.visit(window.location.pathname + window.location.search, {
|
|
1089
|
-
preserveState: true,
|
|
1090
|
-
preserveScroll: true,
|
|
1091
|
-
...options
|
|
1092
|
-
});
|
|
1093
|
-
},
|
|
1094
|
-
prefetch(url, options = {}) {
|
|
1095
|
-
return engine.prefetch(normalizeUrl(url), options);
|
|
1096
|
-
},
|
|
1097
|
-
flush(url, method = "GET") {
|
|
1098
|
-
engine.flush(normalizeUrl(url), method);
|
|
1099
|
-
},
|
|
1100
|
-
flushAll() {
|
|
1101
|
-
engine.flushAll();
|
|
1102
|
-
}
|
|
1103
|
-
};
|
|
1104
|
-
const router = createRouterFacade(rawRouter, () => routeUrl, () => routeParams);
|
|
1105
|
-
engine.setPopStateHandler((url, options) => {
|
|
1106
|
-
router.visit(url, options);
|
|
1107
|
-
});
|
|
1108
|
-
return {
|
|
1109
|
-
router,
|
|
1110
|
-
initialPageData: engine.initialPageData,
|
|
1111
|
-
initialComponent: engine.initialComponent,
|
|
1112
|
-
initialLayouts: engine.initialLayouts,
|
|
1113
|
-
start: engine.start,
|
|
1114
|
-
commitInitialRender: engine.commitInitialRender
|
|
1115
|
-
};
|
|
1116
1049
|
}
|
|
1050
|
+
const rawRouter = {
|
|
1051
|
+
_hoverDelay: engine._hoverDelay,
|
|
1052
|
+
get url() {
|
|
1053
|
+
return toUrl(routeUrl);
|
|
1054
|
+
},
|
|
1055
|
+
get path() {
|
|
1056
|
+
return this.url.pathname;
|
|
1057
|
+
},
|
|
1058
|
+
get query() {
|
|
1059
|
+
return this.url.searchParams;
|
|
1060
|
+
},
|
|
1061
|
+
get params() {
|
|
1062
|
+
return routeParams;
|
|
1063
|
+
},
|
|
1064
|
+
visit(url, options = {}) {
|
|
1065
|
+
return applyNavigationResource(engine.prepareVisit(normalizeUrl(url), options));
|
|
1066
|
+
},
|
|
1067
|
+
refresh(options = {}) {
|
|
1068
|
+
return rawRouter.visit(window.location.pathname + window.location.search, {
|
|
1069
|
+
preserveState: true,
|
|
1070
|
+
preserveScroll: true,
|
|
1071
|
+
...options
|
|
1072
|
+
});
|
|
1073
|
+
},
|
|
1074
|
+
prefetch(url, options = {}) {
|
|
1075
|
+
return engine.prefetch(normalizeUrl(url), options);
|
|
1076
|
+
},
|
|
1077
|
+
flush(url, method = "GET") {
|
|
1078
|
+
engine.flush(normalizeUrl(url), method);
|
|
1079
|
+
},
|
|
1080
|
+
flushAll() {
|
|
1081
|
+
engine.flushAll();
|
|
1082
|
+
}
|
|
1083
|
+
};
|
|
1084
|
+
const router = createRouterFacade(rawRouter, () => routeUrl, () => routeParams);
|
|
1085
|
+
engine.setPopStateHandler((url, options) => {
|
|
1086
|
+
router.visit(url, options);
|
|
1087
|
+
});
|
|
1088
|
+
return {
|
|
1089
|
+
router,
|
|
1090
|
+
initialPageData: engine.initialPageData,
|
|
1091
|
+
initialComponent: engine.initialComponent,
|
|
1092
|
+
initialLayouts: engine.initialLayouts,
|
|
1093
|
+
start: engine.start,
|
|
1094
|
+
commitInitialRender: engine.commitInitialRender
|
|
1095
|
+
};
|
|
1117
1096
|
}
|
|
1118
1097
|
function scheduleHydration(el, loader, props, strategy, hydrateFn) {
|
|
1119
1098
|
const hydrate = () => loader().then((mod) => hydrateFn(el, mod, props));
|
|
@@ -1150,4 +1129,4 @@ function initIslands(islands, hydrateFn) {
|
|
|
1150
1129
|
});
|
|
1151
1130
|
}
|
|
1152
1131
|
//#endregion
|
|
1153
|
-
export { VoidActionError, categorizeActionError, createActionClient, createPageNavigationEngine, createRouterFacade, createSsrRouter, createVoidRouter, formErrorMessage, formRetryMessage, formSubmissionBlocked, hasFiles, idleNavigationState, initIslands, isAbortError, isCallSiteActionError, isEqualFormValue, isFile, objectToFormData, scheduleFormRetry, scheduleHydration, ssrProxy, submitAction };
|
|
1132
|
+
export { VoidActionError, categorizeActionError, createActionClient, createPageNavigationEngine, createRouterFacade, createSsrRouter, createVoidRouter, formErrorMessage, formRetryMessage, formSubmissionBlocked, getValidationErrors, hasFiles, idleNavigationState, initIslands, interpolateRouteParams, isAbortError, isCallSiteActionError, isEqualFormValue, isFile, isModifiedEvent, mergeDataIntoHref, objectToFormData, scheduleFormRetry, scheduleHydration, ssrProxy, submitAction };
|
package/dist/pages/head.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as renderHtmlAttrs, i as renderHeadToString, n as HeadDescriptor, o as resolveHead, r as renderBodyAttrs, t as HeadConfig } from "../head-
|
|
1
|
+
import { a as renderHtmlAttrs, i as renderHeadToString, n as HeadDescriptor, o as resolveHead, r as renderBodyAttrs, t as HeadConfig } from "../head-C8K_iGe6.mjs";
|
|
2
2
|
export { HeadConfig, HeadDescriptor, renderBodyAttrs, renderHeadToString, renderHtmlAttrs, resolveHead };
|