void 0.22.0 → 0.23.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/README.md +5 -1
- package/dist/{account-cmd-CjyxcGkM.mjs → account-cmd-C84Ee8cO.mjs} +4 -4
- package/dist/{scan-ClYmX3sa.mjs → application-analysis-BVsVqc11.mjs} +135 -18
- package/dist/application-routing-B7QEjqSR.mjs +27 -0
- package/dist/{auth-CZuiVsFh.mjs → auth-CCjt0hcq.mjs} +1 -1
- package/dist/{auth-DLNN0D3Z.mjs → auth-CSkdO2Bb.mjs} +4 -47
- package/dist/{auth-link-BLO4ptzo.mjs → auth-link-CioEg6uY.mjs} +4 -4
- package/dist/{auth-router-ZUg9MF_U.mjs → auth-router-BsR981d4.mjs} +4 -4
- package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
- package/dist/{build-cmd-BxR5FROK.mjs → build-cmd-LzvNJORH.mjs} +17 -5
- package/dist/{cache-D0sWhgKI.mjs → cache-C4MvnrMH.mjs} +2 -2
- package/dist/{cancel-deploy-D4NUqFbi.mjs → cancel-deploy-abUxpP2n.mjs} +2 -2
- package/dist/{cf-build-output-BJ6yGEIS.mjs → cf-build-output-BPqOT964.mjs} +2 -1
- package/dist/cf-build-output-_0HNWysu.mjs +2 -0
- package/dist/cli/cli.mjs +80 -455
- package/dist/cli/{cf-compat.mjs → cloudflare-operation-process.mjs} +442 -421
- package/dist/cli/env-schema-probe.d.mts +2 -1
- package/dist/cli/env-schema-probe.mjs +3 -3
- package/dist/client-Cu7jWiF1.mjs +2 -0
- package/dist/{client-BTZ3XkrB.mjs → client-RV8NVeB8.mjs} +140 -21
- package/dist/{cloudflare-auth-DQkqoMYa.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -38
- package/dist/{cloudflare-cmd-BKlfGHAy.mjs → cloudflare-cmd-BcrVyTmJ.mjs} +5 -5
- package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
- package/dist/{cloudflare-connect-Ctmrw579.mjs → cloudflare-connect-B8uPZ4nx.mjs} +3 -3
- package/dist/{cloudflare-operations-BT6OWFBk.mjs → cloudflare-operations-AiWashgg.mjs} +1 -1
- package/dist/{cloudflare-operations-B9tzgjmf.mjs → cloudflare-operations-fxHb-byx.mjs} +116 -172
- package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
- package/dist/{config-VavjpDnp.d.mts → config-BMHb8RCj.d.mts} +1 -0
- package/dist/config-C_XRIPx2.mjs +89 -0
- package/dist/config-entry.d.mts +1 -1
- package/dist/{connect-Dg-WkW-C.mjs → connect-Bd4kJd9U.mjs} +5 -5
- package/dist/{create-project-DdoqwFLF.mjs → create-project-Boczwj5r.mjs} +1 -1
- package/dist/{create-project-l9J7pbtm.mjs → create-project-bMf6ffLZ.mjs} +2 -2
- package/dist/{db-gp2sCXyN.mjs → db-8uG64XLl.mjs} +21 -21
- package/dist/{delete-TTedbH6B.mjs → delete-NvbiyeJf.mjs} +2 -2
- package/dist/{deploy-CH-o2CaZ.mjs → deploy-DzAIwqNU.mjs} +908 -582
- package/dist/{deploy-B19L2Bra.mjs → deploy-bjXdFCtn.mjs} +1 -1
- package/dist/{domain-JRF59P_r.mjs → domain-y5Tvydvo.mjs} +3 -3
- package/dist/{email-Bo6G9LOZ.mjs → email-B3umsW75.mjs} +13 -28
- package/dist/{env-BYOrWQnv.mjs → env-BS6qYHDb.mjs} +4 -4
- package/dist/{env-public-BxU_0yTL.d.mts → env-public-BX_r8HR6.d.mts} +1 -1
- package/dist/{env-validation-BB4GkLxn.mjs → env-validation-BPn7vk-V.mjs} +18 -71
- package/dist/{env-validation-BXge7uyK.mjs → env-validation-DbTg7-ar.mjs} +1 -1
- package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
- package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
- package/dist/{gen-sCtlCOdA.mjs → gen-B580--vC.mjs} +2 -2
- package/dist/gen-BVaUUumi.mjs +2 -0
- package/dist/{github-cmd-0-7PexDq.mjs → github-cmd-v45BdfKX.mjs} +2 -2
- package/dist/{handler-HEcZsaij.d.mts → handler-CZ4nAylQ.d.mts} +1 -1
- package/dist/help-DofyZuY7.mjs +2 -0
- package/dist/{help-GKtwl07I.mjs → help-daGKjXGk.mjs} +229 -747
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +288 -1502
- package/dist/info-B97bTX9N.mjs +113 -0
- package/dist/{init-FZx3Elvz.mjs → init-Bvy7zrBo.mjs} +46 -15
- package/dist/limits-Bq5LG8Id.d.mts +27 -0
- package/dist/limits-Cjuk2VPm.mjs +68 -0
- package/dist/{link-BrQfb_CU.mjs → link-CDqqCjFl.mjs} +3 -3
- package/dist/{list-D44jmIAM.mjs → list-CZj0dzKY.mjs} +3 -3
- package/dist/{live-CKJlvlNp.d.mts → live-Chw1eIMv.d.mts} +1 -1
- package/dist/{local-d1-Bg9OzEEO.mjs → local-d1-2CMnpuW_.mjs} +2 -2
- package/dist/login-DYt_An22.mjs +2 -0
- package/dist/{login-CAsAsQ-_.mjs → login-UZKFM_u7.mjs} +3 -3
- package/dist/{logs-BjKvFnVM.mjs → logs-CUZ6t9t3.mjs} +3 -3
- package/dist/migrate-8_2u55MD.mjs +2 -0
- package/dist/{migrate-BPITvDJN.mjs → migrate-DHul7PRV.mjs} +2 -1
- package/dist/{node-Dt7z256D.mjs → node-BkyRWRx8.mjs} +1 -1
- package/dist/operator-args-CLgKGlwU.mjs +690 -0
- package/dist/{operator-cmd-BK5CCiT9.mjs → operator-cmd-DBA6dl0m.mjs} +68 -22
- package/dist/pages/client.d.mts +34 -2
- package/dist/pages/client.mjs +59 -3
- package/dist/pages/index.d.mts +1 -1
- package/dist/pages/index.mjs +1 -1
- package/dist/pages/islands-plugin.mjs +1 -1
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -308
- package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
- package/dist/plan-D1Q5rf-r.mjs +2 -0
- package/dist/plan-NPpwZ_kc.mjs +58 -0
- package/dist/platform-args-BJdRtlLq.mjs +506 -0
- package/dist/platform-args-D3RXyR6h.mjs +2 -0
- package/dist/{platform-auth-config-BlN8xTdD.mjs → platform-auth-config-B56E9YP1.mjs} +3 -3
- package/dist/{platform-auth-protection-7d5aV2Jg.mjs → platform-auth-protection-BDWO_aER.mjs} +2 -2
- package/dist/{platform-auth-recovery-Dxij8ZbR.mjs → platform-auth-recovery-1gg4CSRe.mjs} +3 -3
- package/dist/{platform-cmd-E0FuL212.mjs → platform-cmd-Bt-1w6pY.mjs} +1 -1
- package/dist/{platform-cmd-B3hwKrFK.mjs → platform-cmd-DMcQStSc.mjs} +24 -3
- package/dist/{platform-domain-D6Xcy9ZX.mjs → platform-domain-BNkcz0OB.mjs} +2 -2
- package/dist/{platform-lifecycle-k0E0xoxx.mjs → platform-lifecycle-9OyBALhH.mjs} +327 -215
- package/dist/{platform-lifecycle-DMh_qrry.mjs → platform-lifecycle-BE6C_jxh.mjs} +1 -1
- package/dist/{platform-management-Brz_BDiT.mjs → platform-management-CjwLVQwN.mjs} +6 -3
- package/dist/{platform-management-DOtss0BN.mjs → platform-management-CnyTdcWX.mjs} +1 -1
- package/dist/platform-plans-config-BNGKGr4P.mjs +359 -0
- package/dist/{platform-recovery-BvtcXON5.mjs → platform-recovery-D6KSpuFm.mjs} +2 -2
- package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
- package/dist/{prepare-C-6YZyyg.mjs → prepare-B5Mkic5u.mjs} +1 -1
- package/dist/{prepare-CRhJbVrG.mjs → prepare-DOsL0CC9.mjs} +4 -20
- package/dist/prepare-cgvDMtSb.mjs +2 -0
- package/dist/{project-cmd-BZLCqOqw.mjs → project-cmd-CNzrqvBv.mjs} +16 -16
- package/dist/{project-team-BvgM0WoX.mjs → project-team-DQOWPfQT.mjs} +2 -2
- package/dist/{project-token-l5DqK6Az.mjs → project-token-CTDYU0Cc.mjs} +2 -2
- package/dist/{project-zero-trust-v6Mvpp8y.mjs → project-zero-trust-BNAkW-_0.mjs} +2 -2
- package/dist/{protocol-BBa6cstI.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
- package/dist/protocol-U7bfjHmA.mjs +331 -0
- package/dist/{provision-Fr9pRqce.mjs → provision-C4ORE7G7.mjs} +1 -1
- package/dist/{provision-C4IGqkBf.mjs → provision-CJFgTZY8.mjs} +89 -198
- package/dist/{requests-DN-BbNiM.mjs → requests-MhxYnau8.mjs} +2 -2
- package/dist/resource-name-C7LVpcRm.mjs +11 -0
- package/dist/{rollback-D7rzSaZM.mjs → rollback-CJ6iSDoU.mjs} +3 -3
- package/dist/route-url-CG7U-cRN.mjs +15 -0
- package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
- package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
- package/dist/runtime/ai.d.mts +12 -8
- package/dist/runtime/ai.mjs +84 -17
- package/dist/runtime/better-auth-mysql.mjs +1 -1
- package/dist/runtime/better-auth-pg.mjs +1 -1
- package/dist/runtime/better-auth.mjs +1 -1
- package/dist/runtime/client-react.mjs +2 -2
- package/dist/runtime/client-solid.mjs +2 -2
- package/dist/runtime/client-svelte.mjs +2 -2
- package/dist/runtime/client-vue.mjs +2 -2
- package/dist/runtime/client.mjs +2 -2
- package/dist/runtime/durable.d.mts +3 -1
- package/dist/runtime/durable.mjs +4 -1
- package/dist/runtime/email/testing.mjs +1 -1
- package/dist/runtime/env-public.d.mts +1 -1
- package/dist/runtime/fetch-stream.mjs +1 -1
- package/dist/runtime/fetch.mjs +1 -1
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/kv.mjs +0 -1
- package/dist/runtime/limits.d.mts +2 -0
- package/dist/runtime/limits.mjs +2 -0
- package/dist/runtime/live-client.d.mts +1 -1
- package/dist/runtime/live-server.mjs +25 -16
- package/dist/runtime/live.d.mts +1 -1
- package/dist/runtime/migration-handler.mjs +62 -42
- package/dist/runtime/route-url.d.mts +4 -0
- package/dist/runtime/route-url.mjs +2 -0
- package/dist/runtime/routing.d.mts +180 -0
- package/dist/runtime/routing.mjs +1082 -0
- package/dist/runtime/sandbox-container.d.mts +1 -1
- package/dist/runtime/sandbox-container.mjs +1 -1
- package/dist/runtime/sandbox.d.mts +3 -3
- package/dist/runtime/sandbox.mjs +75 -45
- package/dist/runtime/sse.mjs +1 -1
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +4 -2
- package/dist/runtime/ws-server.mjs +27 -2
- package/dist/runtime/ws.d.mts +2 -2
- package/dist/runtime/ws.mjs +8 -6
- package/dist/{sandbox-qpNBT8a3.d.mts → sandbox-XZAqzFlG.d.mts} +11 -8
- package/dist/{sandbox-container-DdNEBfCc.d.mts → sandbox-container-Bo0eiFKz.d.mts} +2 -1
- package/dist/{sandbox-container-4fdqLnyb.mjs → sandbox-container-C6ItmVuN.mjs} +4 -2
- package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
- package/dist/{secret-BOtOl_cb.mjs → secret-Dli5fP0B.mjs} +4 -4
- package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
- package/dist/validate-Dq_L3s0S.mjs +2 -0
- package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
- package/dist/{wrangler-DQF1vKyf.mjs → wrangler-7K-bW_DL.mjs} +8 -239
- package/dist/{ws-BoY7vQML.d.mts → ws-CL1w7GXU.d.mts} +13 -2
- package/package.json +15 -8
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
- package/skills/void/SKILL.md +50 -135
- package/skills/void/docs/guide/ai.md +94 -84
- package/skills/void/docs/guide/app-types.md +3 -32
- package/skills/void/docs/guide/auth.md +12 -116
- package/skills/void/docs/guide/database/d1.md +9 -54
- package/skills/void/docs/guide/database/mysql.md +1 -1
- package/skills/void/docs/guide/database/postgresql.md +5 -26
- package/skills/void/docs/guide/database.md +23 -75
- package/skills/void/docs/guide/deployment.md +27 -113
- package/skills/void/docs/guide/durable-state.md +43 -18
- package/skills/void/docs/guide/edge/headers.md +3 -47
- package/skills/void/docs/guide/edge/prerendering.md +5 -20
- package/skills/void/docs/guide/edge/redirects.md +11 -64
- package/skills/void/docs/guide/edge/revalidation.md +5 -18
- package/skills/void/docs/guide/edge/rewrites.md +56 -284
- package/skills/void/docs/guide/edge/static-assets.md +22 -72
- package/skills/void/docs/guide/email/domains.md +112 -0
- package/skills/void/docs/guide/email/receiving.md +139 -0
- package/skills/void/docs/guide/email/sending.md +231 -0
- package/skills/void/docs/guide/email.md +13 -619
- package/skills/void/docs/guide/env-migration.md +11 -11
- package/skills/void/docs/guide/env-vars.md +9 -29
- package/skills/void/docs/guide/index.md +0 -15
- package/skills/void/docs/guide/jobs.md +3 -18
- package/skills/void/docs/guide/kv.md +5 -11
- package/skills/void/docs/guide/live.md +5 -56
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
- package/skills/void/docs/guide/pages-routing/head.md +10 -10
- package/skills/void/docs/guide/pages-routing/islands.md +6 -36
- package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
- package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
- package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
- package/skills/void/docs/guide/pages-routing/overview.md +7 -17
- package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
- package/skills/void/docs/guide/platform/administration/access.md +1 -4
- package/skills/void/docs/guide/platform/administration/email.md +35 -8
- package/skills/void/docs/guide/platform/administration/operations.md +26 -4
- package/skills/void/docs/guide/platform/administration/plans.md +126 -0
- package/skills/void/docs/guide/platform/administration/projects.md +5 -2
- package/skills/void/docs/guide/platform/administration/zero-trust.md +23 -152
- package/skills/void/docs/guide/platform/development/runtime.md +3 -13
- package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
- package/skills/void/docs/guide/platform/installation/credentials.md +6 -4
- package/skills/void/docs/guide/platform/installation/domains.md +30 -2
- package/skills/void/docs/guide/platform/installation/first-deployment.md +2 -0
- package/skills/void/docs/guide/platform/installation/maintenance.md +3 -1
- package/skills/void/docs/guide/platform/installation/prerequisites.md +20 -15
- package/skills/void/docs/guide/platform/installation/setup.md +9 -5
- package/skills/void/docs/guide/platform-administration.md +1 -0
- package/skills/void/docs/guide/queues.md +7 -9
- package/skills/void/docs/guide/quickstart.md +38 -37
- package/skills/void/docs/guide/remote-dev.md +4 -9
- package/skills/void/docs/guide/sandboxes.md +29 -21
- package/skills/void/docs/guide/server-routing.md +9 -72
- package/skills/void/docs/guide/sse.md +4 -18
- package/skills/void/docs/guide/ssg.md +3 -15
- package/skills/void/docs/guide/ssr.md +14 -62
- package/skills/void/docs/guide/storage.md +9 -4
- package/skills/void/docs/guide/type-safety.md +3 -14
- package/skills/void/docs/guide/typed-fetch.md +3 -7
- package/skills/void/docs/guide/websockets.md +68 -40
- package/skills/void/docs/integrations/agents.md +3 -3
- package/skills/void/docs/integrations/cloudflare.md +85 -316
- package/skills/void/docs/integrations/frameworks/analog.md +5 -64
- package/skills/void/docs/integrations/frameworks/astro.md +4 -73
- package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
- package/skills/void/docs/integrations/frameworks/overview.md +11 -54
- package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
- package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
- package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
- package/skills/void/docs/reference/api/auth.md +156 -0
- package/skills/void/docs/reference/api/client.md +87 -0
- package/skills/void/docs/reference/api/database.md +95 -0
- package/skills/void/docs/reference/api/durable.md +46 -0
- package/skills/void/docs/reference/api/env.md +50 -0
- package/skills/void/docs/reference/api/handlers.md +254 -0
- package/skills/void/docs/reference/api/pages.md +241 -0
- package/skills/void/docs/reference/api/plugin.md +39 -0
- package/skills/void/docs/reference/api/resources.md +109 -0
- package/skills/void/docs/reference/api/rewrites.md +76 -0
- package/skills/void/docs/reference/api/types.md +92 -0
- package/skills/void/docs/reference/api.md +56 -1218
- package/skills/void/docs/reference/cli/auth.md +88 -0
- package/skills/void/docs/reference/cli/database.md +128 -0
- package/skills/void/docs/reference/cli/deploy.md +85 -0
- package/skills/void/docs/reference/cli/domains.md +41 -0
- package/skills/void/docs/reference/cli/email.md +129 -0
- package/skills/void/docs/reference/cli/generate.md +116 -0
- package/skills/void/docs/reference/cli/github.md +189 -0
- package/skills/void/docs/reference/cli/platform-config.md +92 -0
- package/skills/void/docs/reference/cli/platform-email.md +81 -0
- package/skills/void/docs/reference/cli/platform-installation.md +127 -0
- package/skills/void/docs/reference/cli/platform-operations.md +90 -0
- package/skills/void/docs/reference/cli/platform-users.md +89 -0
- package/skills/void/docs/reference/cli/platform-zero-trust.md +45 -0
- package/skills/void/docs/reference/cli/platform.md +70 -0
- package/skills/void/docs/reference/cli/project.md +214 -0
- package/skills/void/docs/reference/cli/secrets.md +76 -0
- package/skills/void/docs/reference/cli/setup.md +70 -0
- package/skills/void/docs/reference/cli.md +32 -1682
- package/skills/void/docs/reference/config.md +12 -18
- package/skills/void/docs/reference/resource-inference.md +3 -58
- package/skills/void/docs/reference/structure.md +14 -41
- package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
- package/dist/client-Czz8o5jP.mjs +0 -2
- package/dist/gen-CNJ62MM7.mjs +0 -2
- package/dist/help-CmZzxUba.mjs +0 -2
- package/dist/login-CGcRKEoi.mjs +0 -2
- package/dist/migrate-CYfbKkXh.mjs +0 -2
- package/dist/plan-BEZ8VJW0.mjs +0 -256
- package/dist/plan-DpuOr14e.mjs +0 -2
- package/dist/prepare-Bm3iq-u4.mjs +0 -2
- package/dist/validate-EKmJWxmy.mjs +0 -2
- /package/dist/cli/{cf-compat.d.mts → cloudflare-operation-process.d.mts} +0 -0
|
@@ -1,243 +1,12 @@
|
|
|
1
|
-
import { a as join,
|
|
1
|
+
import { a as join, n as dirname, o as normalize, t as basename } from "./dist-BVqXeR_h.mjs";
|
|
2
2
|
import "./project-paths-GgcMozYz.mjs";
|
|
3
3
|
import { m as readConfig } from "./config-Br_JZD6u.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { a as hasSandboxSqliteMigration, c as resolveSandboxConfig, i as assertSandboxNamespaceConfig, l as sandboxContainerConfig, r as SANDBOX_MIGRATION_TAG } from "./config-C_XRIPx2.mjs";
|
|
5
|
+
import { i as persistCloudflareConfig, r as materializeCloudflareConfig } from "./cloudflare-config-Bktvwtpf.mjs";
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { appendSqliteClassMigration } from "@void/deploy-core";
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
8
9
|
import { SyntaxKind, applyEdits, createScanner, findNodeAtLocation, modify, parse, parseTree } from "jsonc-parser";
|
|
9
|
-
import { isDeepStrictEqual } from "node:util";
|
|
10
|
-
//#region src/cloudflare-config.ts
|
|
11
|
-
const MATERIALIZED_CLOUDFLARE_FILE = ".void-wrangler.jsonc";
|
|
12
|
-
const VOID_LOCK_FILE = "void.lock.json";
|
|
13
|
-
const PREVIEW_POINTER_FILE = "preview-deploy-config.json";
|
|
14
|
-
function isObject(value) {
|
|
15
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
-
}
|
|
17
|
-
function arrayIdentity(value) {
|
|
18
|
-
if (isObject(value)) {
|
|
19
|
-
for (const key of [
|
|
20
|
-
"binding",
|
|
21
|
-
"name",
|
|
22
|
-
"tag",
|
|
23
|
-
"class_name",
|
|
24
|
-
"pattern",
|
|
25
|
-
"route"
|
|
26
|
-
]) if (typeof value[key] === "string") return `${key}:${value[key]}`;
|
|
27
|
-
}
|
|
28
|
-
return JSON.stringify(value) ?? String(value);
|
|
29
|
-
}
|
|
30
|
-
/** Keep authored values authoritative while retaining fields produced by Void. */
|
|
31
|
-
function mergeConfig(previous, resolved, authored) {
|
|
32
|
-
if (isDeepStrictEqual(previous, authored)) return resolved;
|
|
33
|
-
if (Array.isArray(previous) && Array.isArray(resolved) && Array.isArray(authored)) {
|
|
34
|
-
const previousByIdentity = new Map(previous.map((item) => [arrayIdentity(item), item]));
|
|
35
|
-
const resolvedByIdentity = new Map(resolved.map((item) => [arrayIdentity(item), item]));
|
|
36
|
-
const authoredIdentities = new Set(authored.map(arrayIdentity));
|
|
37
|
-
return [...authored.map((item) => {
|
|
38
|
-
const identity = arrayIdentity(item);
|
|
39
|
-
return previousByIdentity.has(identity) && resolvedByIdentity.has(identity) ? mergeConfig(previousByIdentity.get(identity), resolvedByIdentity.get(identity), item) : item;
|
|
40
|
-
}), ...resolved.filter((item) => {
|
|
41
|
-
const identity = arrayIdentity(item);
|
|
42
|
-
return !previousByIdentity.has(identity) && !authoredIdentities.has(identity);
|
|
43
|
-
})];
|
|
44
|
-
}
|
|
45
|
-
if (isObject(previous) && isObject(resolved) && isObject(authored)) {
|
|
46
|
-
const result = {};
|
|
47
|
-
for (const key of /* @__PURE__ */ new Set([
|
|
48
|
-
...Object.keys(previous),
|
|
49
|
-
...Object.keys(resolved),
|
|
50
|
-
...Object.keys(authored)
|
|
51
|
-
])) {
|
|
52
|
-
if (!(key in authored)) {
|
|
53
|
-
if (!(key in previous) && key in resolved) Object.defineProperty(result, key, {
|
|
54
|
-
value: resolved[key],
|
|
55
|
-
enumerable: true,
|
|
56
|
-
writable: true,
|
|
57
|
-
configurable: true
|
|
58
|
-
});
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const value = mergeConfig(previous[key], resolved[key], authored[key]);
|
|
62
|
-
Object.defineProperty(result, key, {
|
|
63
|
-
value,
|
|
64
|
-
enumerable: true,
|
|
65
|
-
writable: true,
|
|
66
|
-
configurable: true
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
return result;
|
|
70
|
-
}
|
|
71
|
-
return authored;
|
|
72
|
-
}
|
|
73
|
-
function parseCloudflareText(text, path) {
|
|
74
|
-
const errors = [];
|
|
75
|
-
const value = parse(text.replace(/^\uFEFF/, ""), errors, { allowTrailingComma: true });
|
|
76
|
-
if (errors.length > 0 || !isObject(value)) throw new Error(`config: ${path} must contain a valid JSON/JSONC object.`);
|
|
77
|
-
return value;
|
|
78
|
-
}
|
|
79
|
-
function readState(root) {
|
|
80
|
-
const path = join(root, VOID_LOCK_FILE);
|
|
81
|
-
if (!existsSync(path)) return;
|
|
82
|
-
let value;
|
|
83
|
-
try {
|
|
84
|
-
value = JSON.parse(readFileSync(path, "utf8"));
|
|
85
|
-
} catch {
|
|
86
|
-
throw new Error(`config: Invalid ${VOID_LOCK_FILE}. Fix or restore it before continuing.`);
|
|
87
|
-
}
|
|
88
|
-
if (!isObject(value) || value.version !== 1 || !isObject(value.source) || !isObject(value.resolved) || typeof value.text !== "string") throw new Error(`config: Invalid ${VOID_LOCK_FILE}. Fix or restore it before continuing.`);
|
|
89
|
-
const state = value;
|
|
90
|
-
if (!isDeepStrictEqual(parseCloudflareText(state.text, "void.lock.json"), state.resolved)) state.text = `${provenance(state.text)}${JSON.stringify(state.resolved, null, 2)}\n`;
|
|
91
|
-
return state;
|
|
92
|
-
}
|
|
93
|
-
function writeAtomic(path, content) {
|
|
94
|
-
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
95
|
-
writeFileSync(temporary, content, { flag: "wx" });
|
|
96
|
-
try {
|
|
97
|
-
renameSync(temporary, path);
|
|
98
|
-
} finally {
|
|
99
|
-
rmSync(temporary, { force: true });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function writeState(root, state) {
|
|
103
|
-
const path = join(root, VOID_LOCK_FILE);
|
|
104
|
-
const content = `${JSON.stringify(state, null, 2)}\n`;
|
|
105
|
-
if (existsSync(path)) try {
|
|
106
|
-
if (isDeepStrictEqual(JSON.parse(readFileSync(path, "utf8")), state)) return;
|
|
107
|
-
} catch {}
|
|
108
|
-
writeAtomic(path, content);
|
|
109
|
-
}
|
|
110
|
-
/** Keep Vite preview usable without leaving Wrangler's implicit deploy pointer after a build. */
|
|
111
|
-
function stashCloudflareDeployPointer(root) {
|
|
112
|
-
const pointer = join(root, ".wrangler", "deploy", "config.json");
|
|
113
|
-
if (!existsSync(pointer)) return;
|
|
114
|
-
const directory = join(root, ".void");
|
|
115
|
-
mkdirSync(directory, { recursive: true });
|
|
116
|
-
writeAtomic(join(directory, PREVIEW_POINTER_FILE), readFileSync(pointer, "utf8"));
|
|
117
|
-
rmSync(pointer, { force: true });
|
|
118
|
-
}
|
|
119
|
-
function restoreCloudflarePreviewPointer(root) {
|
|
120
|
-
const saved = join(root, ".void", PREVIEW_POINTER_FILE);
|
|
121
|
-
if (!existsSync(saved)) return false;
|
|
122
|
-
const directory = join(root, ".wrangler", "deploy");
|
|
123
|
-
mkdirSync(directory, { recursive: true });
|
|
124
|
-
writeAtomic(join(directory, "config.json"), readFileSync(saved, "utf8"));
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
/** Preserve Void's JSONC provenance comments when authored settings change. */
|
|
128
|
-
function provenance(text) {
|
|
129
|
-
const lines = text.match(/^\s*\/\/ void:(?:managed-queues|published-traffic):v1:[A-Za-z0-9_-]+\s*$/gm);
|
|
130
|
-
return lines ? `${lines.join("\n")}\n` : "";
|
|
131
|
-
}
|
|
132
|
-
/** Resolve the config file passed to Cloudflare tooling. Typed projects use a generated file. */
|
|
133
|
-
function materializeCloudflareConfig(root) {
|
|
134
|
-
if (!existsSync(join(root, "void.config.ts"))) {
|
|
135
|
-
for (const name of ["wrangler.jsonc", "wrangler.json"]) if (existsSync(join(root, name))) return join(root, name);
|
|
136
|
-
return join(root, "wrangler.jsonc");
|
|
137
|
-
}
|
|
138
|
-
if (["wrangler.jsonc", "wrangler.json"].some((name) => existsSync(join(root, name)))) throw new Error("config: Run `void migrate` to move the root Wrangler config into void.config.ts.");
|
|
139
|
-
const authored = readConfig(root).cloudflare ?? {};
|
|
140
|
-
const state = readState(root);
|
|
141
|
-
const resolved = state ? mergeConfig(state.source, state.resolved, authored) : authored;
|
|
142
|
-
const text = state && isDeepStrictEqual(resolved, state.resolved) && isDeepStrictEqual(authored, state.source) ? state.text : `${provenance(state?.text ?? "")}${JSON.stringify(resolved, null, 2)}\n`;
|
|
143
|
-
const path = join(root, MATERIALIZED_CLOUDFLARE_FILE);
|
|
144
|
-
if (!existsSync(path) || readFileSync(path, "utf8") !== text) writeAtomic(path, text);
|
|
145
|
-
if (state) writeState(root, {
|
|
146
|
-
version: 1,
|
|
147
|
-
source: authored,
|
|
148
|
-
resolved,
|
|
149
|
-
text
|
|
150
|
-
});
|
|
151
|
-
return path;
|
|
152
|
-
}
|
|
153
|
-
/** Record Cloudflare settings written by Void so later builds reproduce them. */
|
|
154
|
-
function persistCloudflareConfig(root) {
|
|
155
|
-
if (!existsSync(join(root, "void.config.ts"))) return;
|
|
156
|
-
const path = join(root, MATERIALIZED_CLOUDFLARE_FILE);
|
|
157
|
-
if (!existsSync(path)) throw new Error(`config: Missing generated ${MATERIALIZED_CLOUDFLARE_FILE}.`);
|
|
158
|
-
const text = readFileSync(path, "utf8");
|
|
159
|
-
const resolved = parseCloudflareText(text, path);
|
|
160
|
-
const authored = readConfig(root).cloudflare ?? {};
|
|
161
|
-
if (readState(root) || !isDeepStrictEqual(resolved, authored) || text !== `${JSON.stringify(authored, null, 2)}\n`) writeState(root, {
|
|
162
|
-
version: 1,
|
|
163
|
-
source: authored,
|
|
164
|
-
resolved,
|
|
165
|
-
text
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
/** Seed the checked-in lock from a root Wrangler file during migration. */
|
|
169
|
-
function seedCloudflareConfig(root, source, text) {
|
|
170
|
-
const existing = readState(root);
|
|
171
|
-
if (existing) {
|
|
172
|
-
if (isDeepStrictEqual(existing.source, source) && isDeepStrictEqual(existing.resolved, source)) return;
|
|
173
|
-
throw new Error(`migrate: ${VOID_LOCK_FILE} already exists with different settings. Resolve it before migrating.`);
|
|
174
|
-
}
|
|
175
|
-
if (!isDeepStrictEqual(parseCloudflareText(text, ".void-wrangler.jsonc"), source)) throw new Error("migrate: The Cloudflare config changed during migration. Retry.");
|
|
176
|
-
writeState(root, {
|
|
177
|
-
version: 1,
|
|
178
|
-
source,
|
|
179
|
-
resolved: source,
|
|
180
|
-
text
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
const DEFAULT_SANDBOX_CLASS_NAME = "SandboxV1";
|
|
184
|
-
const SANDBOX_MIGRATION_TAG = "void-sandbox-v2";
|
|
185
|
-
function isSandboxEnabled(config) {
|
|
186
|
-
return config.sandbox !== void 0 && config.sandbox !== false;
|
|
187
|
-
}
|
|
188
|
-
function getDefaultSandboxImage() {
|
|
189
|
-
return fileURLToPath(new URL("../../sandbox.Dockerfile", import.meta.resolve("void/sandbox")));
|
|
190
|
-
}
|
|
191
|
-
function getDefaultSandboxPlatformImage() {
|
|
192
|
-
return "cloudflare/debian-trixie";
|
|
193
|
-
}
|
|
194
|
-
function isLocalSandboxImage(image) {
|
|
195
|
-
const lowerImage = image.toLowerCase();
|
|
196
|
-
return isAbsolute(image) || image.startsWith("./") || image.startsWith("../") || lowerImage === "dockerfile" || lowerImage.includes("dockerfile") || lowerImage.endsWith("/dockerfile") || lowerImage.endsWith("\\dockerfile");
|
|
197
|
-
}
|
|
198
|
-
function requiresSandboxPlatformImage(config) {
|
|
199
|
-
if (typeof config.sandbox !== "object" || config.sandbox === null) return false;
|
|
200
|
-
return typeof config.sandbox.image === "string" && isLocalSandboxImage(config.sandbox.image) && config.sandbox.platformImage === void 0;
|
|
201
|
-
}
|
|
202
|
-
function resolveSandboxConfig(config, root = process.cwd()) {
|
|
203
|
-
const raw = typeof config.sandbox === "object" ? config.sandbox : {};
|
|
204
|
-
const image = raw.image ?? getDefaultSandboxImage();
|
|
205
|
-
const imageBuildContext = raw.imageBuildContext;
|
|
206
|
-
const platformImage = raw.platformImage ?? (raw.image && !isLocalSandboxImage(raw.image) ? raw.image : getDefaultSandboxPlatformImage());
|
|
207
|
-
if (!isLocalSandboxImage(image) && !isSandboxRegistryImage(image)) throw new Error("sandbox.image must be a Dockerfile or a digest-pinned Cloudflare registry image (registry.cloudflare.com/<account>/<image>@sha256:<digest>).");
|
|
208
|
-
if (platformImage !== getDefaultSandboxPlatformImage() && !isSandboxRegistryImage(platformImage)) throw new Error("sandbox.platformImage must be a digest-pinned Cloudflare registry image (registry.cloudflare.com/<account>/<image>@sha256:<digest>).");
|
|
209
|
-
return {
|
|
210
|
-
binding: raw.binding ?? "SANDBOX",
|
|
211
|
-
className: raw.className ?? "SandboxV1",
|
|
212
|
-
containerName: raw.containerName ?? "void-sandbox-v1",
|
|
213
|
-
image: resolveSandboxImage(image, root),
|
|
214
|
-
platformImage,
|
|
215
|
-
...imageBuildContext && { imageBuildContext: isAbsolute(imageBuildContext) ? imageBuildContext : join(root, imageBuildContext) },
|
|
216
|
-
...raw.instanceType && { instanceType: raw.instanceType }
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function resolveSandboxImage(image, root) {
|
|
220
|
-
if (!isLocalSandboxImage(image) || isAbsolute(image)) return image;
|
|
221
|
-
return join(root, image);
|
|
222
|
-
}
|
|
223
|
-
function sandboxContainerConfig(sandbox) {
|
|
224
|
-
return {
|
|
225
|
-
name: sandbox.containerName,
|
|
226
|
-
class_name: sandbox.className,
|
|
227
|
-
scheduling_policy: "durable_object",
|
|
228
|
-
images: { default: isLocalSandboxImage(sandbox.image) ? {
|
|
229
|
-
dockerfile: sandbox.image,
|
|
230
|
-
...sandbox.imageBuildContext && { build_context: sandbox.imageBuildContext }
|
|
231
|
-
} : { image: sandbox.image } }
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
/** Refuse namespace reuse before either uploader can change a live Worker. */
|
|
235
|
-
function assertSandboxNamespaceConfig(config, sandbox) {
|
|
236
|
-
const containers = Array.isArray(config.containers) ? config.containers : [];
|
|
237
|
-
const durable = config.durable_objects;
|
|
238
|
-
if (containers.some((container) => container.class_name === sandbox.className && container.scheduling_policy !== "durable_object") || durable?.bindings?.some((binding) => binding.name === sandbox.binding && binding.class_name !== sandbox.className)) throw new Error("Sandbox SDK 1.0 needs a new Durable Object namespace. Back up existing Sandbox data and deploy to a fresh Worker name with the new Sandbox configuration; remove legacy Sandbox bindings, containers, and migrations from that new Worker configuration. See https://developers.cloudflare.com/containers/guides/migrate-to-durable-object-scheduling-policy/.");
|
|
239
|
-
}
|
|
240
|
-
//#endregion
|
|
241
10
|
//#region src/cli/wrangler.ts
|
|
242
11
|
const COMPAT_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
243
12
|
/** UTF-8 byte-order mark. Node's utf-8 read preserves a leading one. */
|
|
@@ -620,7 +389,7 @@ function syncWranglerBindings(root, bindings, options) {
|
|
|
620
389
|
modified = true;
|
|
621
390
|
}
|
|
622
391
|
const migrations = Array.isArray(parsed.migrations) ? parsed.migrations : [];
|
|
623
|
-
if (!migrations
|
|
392
|
+
if (!hasSandboxSqliteMigration(migrations, className)) {
|
|
624
393
|
parsed.migrations = [...migrations, {
|
|
625
394
|
tag: SANDBOX_MIGRATION_TAG,
|
|
626
395
|
new_sqlite_classes: [className]
|
|
@@ -1991,4 +1760,4 @@ function canonicalize(value) {
|
|
|
1991
1760
|
return value;
|
|
1992
1761
|
}
|
|
1993
1762
|
//#endregion
|
|
1994
|
-
export {
|
|
1763
|
+
export { writeProvisionedWranglerConfig as A, readWranglerPublishedTrafficSnapshot as C, syncWranglerDurableObjects as D, syncWranglerBindings as E, syncWranglerWebSockets as O, readWranglerManagedQueueCleanupCandidates as S, resolveLiveBindingConfig as T, readExistingLiveBindingConfig as _, LIVE_MIGRATION_TAG as a, readWranglerCompat as b, bindingEntriesForField as c, ensureWranglerCompatibilityDate as d, ensureWranglerNodejsAlsFlag as f, normalizeWranglerCompatibilityFlags as g, nextDurableObjectMigrationTag as h, LATEST_KNOWN_COMPAT_DATE as i, writeWranglerPublishedTrafficSnapshot as j, updateWranglerCustomDomain as k, bindingNamesForField as l, hasDurableObjectSqliteMigration as m, DEFAULT_LIVE_CLASS as n, acknowledgeWranglerManagedQueueRemovals as o, findBindingNameOwner as p, FRIENDLY_BINDING_NAMES as r, assertNoDuplicateMembers as s, DEFAULT_LIVE_BINDING as t, ensureWranglerCompat as u, readProvisionedBindingEntry as v, readWranglerWebSocketTombstones as w, readWranglerCustomDomains as x, readRootWranglerConfig as y };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { t as StandardSchemaV1 } from "./standard-schema-Fo_vCAZh.mjs";
|
|
2
2
|
import { r as AuthUser } from "./auth-DkcFflXV.mjs";
|
|
3
|
-
import { a as CloudEnv } from "./handler-
|
|
3
|
+
import { a as CloudEnv } from "./handler-CZ4nAylQ.mjs";
|
|
4
4
|
import { WebSocketRouteMap } from "void/routes";
|
|
5
5
|
//#region src/runtime/ws.d.ts
|
|
6
6
|
type MaybePromise<T> = T | Promise<T>;
|
|
7
7
|
type ParamsRecord = Record<string, string>;
|
|
8
|
+
type WebSocketInstanceKey = (context: {
|
|
9
|
+
params: ParamsRecord;
|
|
10
|
+
}) => string;
|
|
8
11
|
type WsEntry<P extends keyof WebSocketRouteMap> = WebSocketRouteMap[P];
|
|
9
12
|
type ParamsOf<P extends keyof WebSocketRouteMap> = WsEntry<P> extends {
|
|
10
13
|
params: infer T;
|
|
@@ -45,6 +48,10 @@ type SocketContext<ServerEvent = unknown> = WebSocketBaseContext & {
|
|
|
45
48
|
};
|
|
46
49
|
type RoomDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, ServerSchema extends StandardSchemaV1 = StandardSchemaV1> = {
|
|
47
50
|
readonly __kind: "room";
|
|
51
|
+
/** Optional persistent resource name. Pin the name reported by `void info` before moving this route. */
|
|
52
|
+
readonly name?: string;
|
|
53
|
+
/** Optional instance key; preserve existing keys when renaming route parameters. */
|
|
54
|
+
readonly key?: WebSocketInstanceKey;
|
|
48
55
|
readonly messages: {
|
|
49
56
|
client: ClientSchema;
|
|
50
57
|
server: ServerSchema;
|
|
@@ -61,6 +68,10 @@ type RoomDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, Se
|
|
|
61
68
|
};
|
|
62
69
|
type SocketDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, ServerSchema extends StandardSchemaV1 = StandardSchemaV1> = {
|
|
63
70
|
readonly __kind: "socket";
|
|
71
|
+
/** Optional persistent resource name. Pin the name reported by `void info` before moving this route. */
|
|
72
|
+
readonly name?: string;
|
|
73
|
+
/** Optional instance key; preserve existing keys when renaming route parameters. */
|
|
74
|
+
readonly key?: WebSocketInstanceKey;
|
|
64
75
|
readonly messages: {
|
|
65
76
|
client: ClientSchema;
|
|
66
77
|
server: ServerSchema;
|
|
@@ -119,4 +130,4 @@ declare class VoidSocket<P extends keyof WebSocketRouteMap & string> {
|
|
|
119
130
|
declare function connect<P extends keyof WebSocketRouteMap & string>(path: HasParams<P> extends false ? P : never): VoidSocket<P>;
|
|
120
131
|
declare function connect<P extends keyof WebSocketRouteMap & string>(path: P, options: ConnectOptions<P>): VoidSocket<P>;
|
|
121
132
|
//#endregion
|
|
122
|
-
export { RoomDefinition as a, VoidSocket as c, WebSocketConnection as d,
|
|
133
|
+
export { RoomDefinition as a, VoidSocket as c, WebSocketConnection as d, WebSocketInstanceKey as f, defineWebSocket as h, RoomController as i, VoidSocketCloseEvent as l, defineRoom as m, ConnectCommonOptions as n, SocketContext as o, connect as p, RoomContext as r, SocketDefinition as s, AnyWebSocketDefinition as t, WebSocketBaseContext as u };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "void",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/voidzero-dev/void.git",
|
|
@@ -39,10 +39,12 @@
|
|
|
39
39
|
"#self/runtime/live-server": "./dist/runtime/live-server.mjs",
|
|
40
40
|
"#self/runtime/fetch": "./dist/runtime/fetch.mjs",
|
|
41
41
|
"#self/runtime/fetch-stream": "./dist/runtime/fetch-stream.mjs",
|
|
42
|
+
"#self/runtime/route-url": "./dist/runtime/route-url.mjs",
|
|
42
43
|
"#self/runtime/migration-handler": "./dist/runtime/migration-handler.mjs",
|
|
43
44
|
"#self/runtime/migration-handler-pg": "./dist/runtime/migration-handler-pg.mjs",
|
|
44
45
|
"#self/runtime/migration-handler-mysql": "./dist/runtime/migration-handler-mysql.mjs",
|
|
45
|
-
"#self/runtime/ws-server": "./dist/runtime/ws-server.mjs"
|
|
46
|
+
"#self/runtime/ws-server": "./dist/runtime/ws-server.mjs",
|
|
47
|
+
"#self/runtime/routing": "./dist/runtime/routing.mjs"
|
|
46
48
|
},
|
|
47
49
|
"exports": {
|
|
48
50
|
".": {
|
|
@@ -321,6 +323,11 @@
|
|
|
321
323
|
"./_sandbox-container": {
|
|
322
324
|
"types": "./dist/runtime/sandbox-container.d.mts",
|
|
323
325
|
"import": "./dist/runtime/sandbox-container.mjs"
|
|
326
|
+
},
|
|
327
|
+
"./limits": {
|
|
328
|
+
"types": "./dist/runtime/limits.d.mts",
|
|
329
|
+
"import": "./dist/runtime/limits.mjs",
|
|
330
|
+
"require": "./dist/runtime/limits.mjs"
|
|
324
331
|
}
|
|
325
332
|
},
|
|
326
333
|
"dependencies": {
|
|
@@ -332,11 +339,11 @@
|
|
|
332
339
|
"@cloudflare/workers-auth": "0.9.5",
|
|
333
340
|
"@cloudflare/workers-types": "^4.20260702.1",
|
|
334
341
|
"@napi-rs/keyring": "2.1.0",
|
|
335
|
-
"@void/deploy-cloudflare": "0.
|
|
336
|
-
"@void/deploy-core": "0.
|
|
337
|
-
"@void/edge": "0.
|
|
338
|
-
"@void/isr": "0.
|
|
339
|
-
"@void/platform": "0.
|
|
342
|
+
"@void/deploy-cloudflare": "0.23.0",
|
|
343
|
+
"@void/deploy-core": "0.23.0",
|
|
344
|
+
"@void/edge": "0.23.0",
|
|
345
|
+
"@void/isr": "0.23.0",
|
|
346
|
+
"@void/platform": "0.23.0",
|
|
340
347
|
"acorn": "^8.18.0",
|
|
341
348
|
"better-auth": "^1.7.6",
|
|
342
349
|
"better-sqlite3": "^13.0.3",
|
|
@@ -387,7 +394,7 @@
|
|
|
387
394
|
"zod": "^4.6.5"
|
|
388
395
|
},
|
|
389
396
|
"peerDependencies": {
|
|
390
|
-
"@void/md": "0.
|
|
397
|
+
"@void/md": "0.23.0",
|
|
391
398
|
"arktype": ">=2.0.0",
|
|
392
399
|
"valibot": ">=1.0.0-beta.7",
|
|
393
400
|
"vite": "^8.0.0",
|
|
@@ -1,175 +1,52 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: migrate-cloudflare-to-void
|
|
3
|
-
description: Migrate an existing Vite app using @cloudflare/vite-plugin to
|
|
3
|
+
description: Migrate an existing Vite app using @cloudflare/vite-plugin to Void while preserving its routes, bindings, and deployment identity.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Migrate
|
|
6
|
+
# Migrate a Cloudflare Vite app to Void
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Read the app's package manifest, Vite config, Worker entry, Cloudflare config,
|
|
9
|
+
and migrations. Identify its framework, endpoints, bindings, and deployed Worker
|
|
10
|
+
before changing them.
|
|
9
11
|
|
|
10
|
-
Use
|
|
12
|
+
Use the bundled guides under `../void/docs/`:
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
- `integrations/cloudflare.md` for existing Worker handoff and configuration.
|
|
15
|
+
- `integrations/frameworks/overview.md` and the matching framework guide when
|
|
16
|
+
another framework owns routing and SSR.
|
|
17
|
+
- `guide/server-routing.md` for native Void handlers and middleware.
|
|
18
|
+
- `guide/database.md` for schema and migration setup.
|
|
19
|
+
- `reference/cli.md` before running commands.
|
|
13
20
|
|
|
14
|
-
|
|
21
|
+
Add `void` and replace `cloudflare()` with `voidPlugin()`, preserving the
|
|
22
|
+
framework plugins and unrelated Vite settings. Remove dependencies and scripts
|
|
23
|
+
only when their replacement is working and no other workflow uses them.
|
|
15
24
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- `package.json`
|
|
19
|
-
- `vite.config.*`
|
|
20
|
-
- `wrangler.jsonc` (if present)
|
|
21
|
-
- Current worker entrypoint (`src/worker.*`, `src/index.*`, etc.)
|
|
22
|
-
- Any existing API handlers and migration SQL files
|
|
23
|
-
|
|
24
|
-
Confirm:
|
|
25
|
-
|
|
26
|
-
- existing routes/endpoints and HTTP methods
|
|
27
|
-
- bindings currently used (`DB`, `KV`, `R2`, etc.)
|
|
28
|
-
- whether the app uses framework SSR or only SPA + API
|
|
29
|
-
|
|
30
|
-
## Migration workflow
|
|
31
|
-
|
|
32
|
-
1. Update dependencies
|
|
33
|
-
|
|
34
|
-
- Remove `@cloudflare/vite-plugin` if it is only used for runtime/deploy.
|
|
35
|
-
- Add `void`.
|
|
36
|
-
- Keep existing framework plugins (React/Vue/Svelte/etc.).
|
|
37
|
-
|
|
38
|
-
2. Update Vite config
|
|
39
|
-
|
|
40
|
-
- Replace `cloudflare(...)` plugin usage with `voidPlugin()`.
|
|
41
|
-
- Keep plugin order stable unless there is a known conflict.
|
|
42
|
-
- Keep unrelated Vite settings unchanged.
|
|
43
|
-
|
|
44
|
-
Target shape:
|
|
25
|
+
For native Void routes, use one file per URL with named HTTP method exports:
|
|
45
26
|
|
|
46
27
|
```ts
|
|
47
|
-
|
|
48
|
-
import {
|
|
28
|
+
// routes/api/users/[id].ts
|
|
29
|
+
import { defineHandler } from 'void';
|
|
49
30
|
|
|
50
|
-
export
|
|
51
|
-
|
|
31
|
+
export const GET = defineHandler((c) => {
|
|
32
|
+
return { id: c.req.param('id') };
|
|
52
33
|
});
|
|
53
34
|
```
|
|
54
35
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
- Convert each existing endpoint into route files:
|
|
59
|
-
- `routes/api/users.get.ts`
|
|
60
|
-
- `routes/api/users.post.ts`
|
|
61
|
-
- `routes/api/users/[id].get.ts`
|
|
62
|
-
- Use `defineHandler` from `void`.
|
|
63
|
-
- If there is shared logic, move it into regular modules and import from route files.
|
|
64
|
-
|
|
65
|
-
4. Migrate middleware
|
|
66
|
-
|
|
67
|
-
- Move request-wide middleware to `middleware/*.ts`.
|
|
68
|
-
- Export with `defineMiddleware`.
|
|
69
|
-
- Preserve behavior order by filename prefix when needed (`01.auth.ts`, `02.logger.ts`).
|
|
70
|
-
|
|
71
|
-
5. Preserve bindings with Void conventions
|
|
72
|
-
|
|
73
|
-
- Keep Cloudflare-style uppercase names on `c.env` (`DB`, `KV`, `STORAGE`, etc.).
|
|
74
|
-
- Remove manual binding config from Vite plugin config where Void now infers usage.
|
|
75
|
-
- Ensure route code actually references required bindings so inference can detect them.
|
|
76
|
-
|
|
77
|
-
6. Migrations
|
|
78
|
-
|
|
79
|
-
- Place SQL files in `migrations/` (sorted by filename).
|
|
80
|
-
- Keep destructive operations gated by explicit pragma if needed.
|
|
81
|
-
- If old migrations live elsewhere, copy/rename into this directory with stable ordering.
|
|
82
|
-
|
|
83
|
-
7. Deploy workflow migration
|
|
84
|
-
|
|
85
|
-
- Replace old deploy instructions with:
|
|
86
|
-
- `void account login`
|
|
87
|
-
- `void deploy`
|
|
88
|
-
- If CI must target a specific project, use:
|
|
89
|
-
- `void deploy --project <slug>`
|
|
90
|
-
- or `VOID_PROJECT=<slug> void deploy`
|
|
91
|
-
|
|
92
|
-
8. Post-migration cleanup (remove obsolete Wrangler wiring)
|
|
93
|
-
|
|
94
|
-
- If the app no longer uses direct Wrangler workflows, remove `wrangler.jsonc`.
|
|
95
|
-
- Remove direct `wrangler` dependency/devDependency from `package.json` when it is only used for old deploy/dev scripts.
|
|
96
|
-
- Remove or rewrite npm scripts that call `wrangler` directly (for example old deploy/publish scripts).
|
|
97
|
-
- Keep Wrangler only if the project still has explicit non-Void workflows that require it.
|
|
98
|
-
|
|
99
|
-
## Routing behavior reference (use during file conversion)
|
|
100
|
-
|
|
101
|
-
Apply these filename rules exactly when mapping old handlers to `routes/`:
|
|
102
|
-
|
|
103
|
-
1. Extension and suffix parsing order
|
|
104
|
-
|
|
105
|
-
- Strip extension (`.ts`, `.js`, `.mts`, `.mjs`).
|
|
106
|
-
- Strip env suffix (`.dev`, `.prod`). The suffix restricts the route to that environment, so only use it for handlers that must not ship to the other one.
|
|
107
|
-
- Strip HTTP method suffix (`.get`, `.post`, `.put`, `.delete`, `.patch`).
|
|
108
|
-
- Strip trailing `index` segment.
|
|
109
|
-
- Remove route group segments `(group-name)` from URL path.
|
|
110
|
-
|
|
111
|
-
2. Method mapping
|
|
112
|
-
|
|
113
|
-
- `users.get.ts` matches only `GET /users`.
|
|
114
|
-
- `users.post.ts` matches only `POST /users`.
|
|
115
|
-
- `users.ts` matches all methods.
|
|
116
|
-
- Split multi-method handlers into one file per method when preserving behavior matters.
|
|
117
|
-
|
|
118
|
-
3. Dynamic and catch-all params
|
|
119
|
-
|
|
120
|
-
- `[id]` -> `:id`
|
|
121
|
-
- `[...slug]` -> catch-all named param
|
|
122
|
-
- `[...]` -> catch-all unnamed fallback
|
|
123
|
-
- Use folder nesting for multiple params: `routes/api/org/[org]/repo/[repo].get.ts`.
|
|
124
|
-
|
|
125
|
-
4. Route groups and organization
|
|
126
|
-
|
|
127
|
-
- Directories like `(internal)` are for code organization only and do not appear in URL.
|
|
128
|
-
- Use them when reorganizing large route sets without changing public paths.
|
|
129
|
-
|
|
130
|
-
5. Ignored files
|
|
131
|
-
|
|
132
|
-
- Files or directories starting with `_` are ignored by route scanner.
|
|
133
|
-
- Do not place active handlers under `_legacy`, `_draft`, etc.
|
|
134
|
-
|
|
135
|
-
6. Middleware behavior
|
|
136
|
-
|
|
137
|
-
- Middleware files live in `middleware/` and run in filename order.
|
|
138
|
-
- Prefix numerically if order is important (`01.auth.ts`, `02.logger.ts`).
|
|
139
|
-
|
|
140
|
-
7. Concrete mapping examples
|
|
141
|
-
|
|
142
|
-
- `src/worker.ts` handling `GET /api/users/:id` -> `routes/api/users/[id].get.ts`
|
|
143
|
-
- single handler switching on method for `/api/users` -> `routes/api/users.get.ts` and `routes/api/users.post.ts`
|
|
144
|
-
- legacy `GET /health` endpoint -> `routes/health.get.ts`
|
|
145
|
-
|
|
146
|
-
## Verification checklist
|
|
147
|
-
|
|
148
|
-
Run and validate:
|
|
149
|
-
|
|
150
|
-
1. `npm run dev` (or project dev command)
|
|
151
|
-
2. Exercise representative API routes locally.
|
|
152
|
-
3. `npm run build`
|
|
153
|
-
4. `void deploy` and verify live URL responds.
|
|
154
|
-
5. Confirm no deploy-critical scripts still depend on `wrangler`.
|
|
155
|
-
|
|
156
|
-
In the Void deploy output, verify:
|
|
157
|
-
|
|
158
|
-
- worker modules uploaded
|
|
159
|
-
- static assets uploaded
|
|
160
|
-
- migrations applied (if present)
|
|
161
|
-
|
|
162
|
-
## Common migration pitfalls
|
|
163
|
-
|
|
164
|
-
- Importing from the main `void` runtime in worker route files when a lighter handler import is expected by tooling.
|
|
165
|
-
- Forgetting to split method-specific handlers (`GET`/`POST`) into filename suffixes.
|
|
166
|
-
- Keeping old custom worker entry wiring that conflicts with generated route runtime.
|
|
167
|
-
- Binding names changed to lowercase (`db`) instead of expected uppercase (`DB`), breaking inference/provisioning.
|
|
36
|
+
Keep GET and POST for the same URL in the same file. Middleware lives in
|
|
37
|
+
`middleware/` and runs in filename order. Preserve existing URLs and behavior;
|
|
38
|
+
framework apps keep their framework's routing conventions.
|
|
168
39
|
|
|
169
|
-
|
|
40
|
+
Preserve configured bindings and resource IDs. Use `void.config.ts` for authored
|
|
41
|
+
settings and `void.lock.json` for provisioned state. Let Void migrate supported
|
|
42
|
+
root Cloudflare configuration rather than deleting it before the handoff.
|
|
43
|
+
Database migrations live in `db/migrations/`; preserve their journal, ordering,
|
|
44
|
+
and deployed history instead of recreating them.
|
|
170
45
|
|
|
171
|
-
|
|
46
|
+
Verify the app's development server, representative routes, and production build.
|
|
47
|
+
When deployment is part of the user's request, follow the existing Worker
|
|
48
|
+
handoff in the Cloudflare guide and verify the reported URL. Keep new resources,
|
|
49
|
+
auth setup, and database or secret changes separate from that first handoff;
|
|
50
|
+
follow its explicit ISR cache choice when needed.
|
|
172
51
|
|
|
173
|
-
|
|
174
|
-
2. A list of moved or newly created route files.
|
|
175
|
-
3. Exact commands to run locally and in CI.
|
|
52
|
+
Summarize the changes and any remaining migration work.
|