void 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/{account-cmd-B4i71m7k.mjs → account-cmd-HP8bixYo.mjs} +3 -3
  2. package/dist/{application-analysis-DYdVoMAY.mjs → application-analysis-DDOQwiXk.mjs} +11 -7
  3. package/dist/{application-routing-C8EqRDfv.mjs → application-routing-4719u_kf.mjs} +1 -1
  4. package/dist/auth-g2TQbDLD.d.mts +70 -0
  5. package/dist/{auth-link-BKwHPbdv.mjs → auth-link-CedYpDCy.mjs} +3 -3
  6. package/dist/{auth-router-DqLx8E0F.mjs → auth-router-vafo7x8w.mjs} +11 -6
  7. package/dist/{better-auth-shared-DVk2DkTW.d.mts → better-auth-shared-BHB8kiTE.d.mts} +1 -1
  8. package/dist/{build-cmd-Dy4psnt1.mjs → build-cmd-9vUAQ1_V.mjs} +1 -1
  9. package/dist/{cache-DV37S6dl.mjs → cache-jvwLNb0h.mjs} +1 -1
  10. package/dist/{cancel-deploy-DMPyu1Vt.mjs → cancel-deploy-Dw0UmWKO.mjs} +1 -1
  11. package/dist/{cf-build-output-Bapzc_8Z.mjs → cf-build-output-XpNR9zoh.mjs} +20 -4
  12. package/dist/cf-build-output-bd8Uwv1P.mjs +1 -0
  13. package/dist/{cf-worker-settings-BECvvTVd.mjs → cf-worker-settings-Dg27RzyT.mjs} +11 -5
  14. package/dist/cli/cli.mjs +25 -25
  15. package/dist/cli/cloudflare-operation-process.mjs +9 -3
  16. package/dist/cli/env-schema-probe.mjs +2 -2
  17. package/dist/{client-BEMtySaV.mjs → client-B3LnB_bE.mjs} +1 -1
  18. package/dist/client-BZb9j66F.mjs +1 -0
  19. package/dist/{cloudflare-auth-Byo_0_N9.mjs → cloudflare-auth-DyD_kVFr.mjs} +1 -1
  20. package/dist/{cloudflare-cmd-BaqIigwI.mjs → cloudflare-cmd-D-b_u3T4.mjs} +2 -2
  21. package/dist/{cloudflare-config-DchHxPTo.mjs → cloudflare-config-CH1AylZT.mjs} +14 -3
  22. package/dist/{cloudflare-connect-pNLQmr_e.mjs → cloudflare-connect-zTJh8UnN.mjs} +2 -2
  23. package/dist/{cloudflare-operations-vP3b5CQf.mjs → cloudflare-operations-Bc-7fN44.mjs} +4 -4
  24. package/dist/{cloudflare-operations-PCM4wucv.mjs → cloudflare-operations-BtulCNOg.mjs} +1 -1
  25. package/dist/{config-BU6hMu1W.mjs → config-BV2ASlpn.mjs} +1 -1
  26. package/dist/{config-Du88-7Y8.d.mts → config-CAdZVTLN.d.mts} +2 -0
  27. package/dist/config-D-6q7EBH.mjs +87 -0
  28. package/dist/{config-DHgSEWT7.mjs → config-OFOAimzt.mjs} +5 -3
  29. package/dist/config-entry.d.mts +1 -1
  30. package/dist/{config-BIaXIkkv.mjs → config-tqMM6DwY.mjs} +1 -1
  31. package/dist/{connect-DwVsBvVh.mjs → connect-BOM6zvFX.mjs} +4 -4
  32. package/dist/{create-project-CjzbBlTv.mjs → create-project-Bxd02EHN.mjs} +1 -1
  33. package/dist/{create-project-CgrnvzyA.mjs → create-project-C2K0DN2O.mjs} +1 -1
  34. package/dist/{db-rvo64snS.mjs → db-Cdvr3zwG.mjs} +16 -16
  35. package/dist/{db-types-NGxPwnlt.mjs → db-types-0eCiqYb1.mjs} +1 -1
  36. package/dist/{delete-DWX6dP4M.mjs → delete-lETE6Tpt.mjs} +1 -1
  37. package/dist/deploy-CX94CmKa.mjs +2 -0
  38. package/dist/{deploy-hRPvw8ci.mjs → deploy-CdM-LAxX.mjs} +260 -95
  39. package/dist/{deploy-managed-static-CDYA2p3L.mjs → deploy-managed-static-DjeBFG2c.mjs} +24 -17
  40. package/dist/{deploy-transport-JCxw7QDi.mjs → deploy-transport-DIq_gFTP.mjs} +13 -12
  41. package/dist/deploy.d.mts +2 -0
  42. package/dist/deploy.mjs +7 -5
  43. package/dist/{dispatch-OVLeWW8K.mjs → dispatch-CLa2LThw.mjs} +5 -5
  44. package/dist/{domain-CH5iBD9Y.mjs → domain-DyhNtdYf.mjs} +2 -2
  45. package/dist/{email-CbTO1l78.mjs → email-DM2wDcBN.mjs} +6 -6
  46. package/dist/{email-cloudflare-B8-pq_-W.mjs → email-cloudflare-PMbAev9Q.mjs} +20 -7
  47. package/dist/{env-BBdw236G.mjs → env-78hbN-oI.mjs} +3 -3
  48. package/dist/{env-validation-XcukUlFM.mjs → env-validation-B3VobvXm.mjs} +1 -0
  49. package/dist/{env-validation-BfBVvBNe.mjs → env-validation-BUfFZ6bt.mjs} +1 -1
  50. package/dist/error-pages-CLIJ7aYq.mjs +37 -0
  51. package/dist/gen-BhWBT4iu.mjs +1 -0
  52. package/dist/{gen-CCx3t2Ju.mjs → gen-CFmsUsW1.mjs} +3 -3
  53. package/dist/{github-cmd-BzkRLkbg.mjs → github-cmd-De-_IWbM.mjs} +1 -1
  54. package/dist/{handler-CQv5YDS0.d.mts → handler-BHktmuTL.d.mts} +3 -1
  55. package/dist/{headers-D522zd0A.mjs → headers--vaK_chu.mjs} +1 -1
  56. package/dist/index.d.mts +2 -2
  57. package/dist/index.mjs +68 -33
  58. package/dist/{info-oBm8yK8J.mjs → info-Yg0-V5Rs.mjs} +3 -3
  59. package/dist/{init-CBp_uMve.mjs → init-CDiJQycf.mjs} +31 -16
  60. package/dist/{link-Dt_QXmM4.mjs → link-Dllip08S.mjs} +2 -2
  61. package/dist/{list-DF6asTdt.mjs → list-BYRP6am0.mjs} +2 -2
  62. package/dist/{live-CXJ9yC98.d.mts → live-BllfDuzA.d.mts} +2 -2
  63. package/dist/{local-d1-CUhH3qtj.mjs → local-d1-CAwAs9GH.mjs} +1 -1
  64. package/dist/login-BAPmYnb7.mjs +1 -0
  65. package/dist/{login-BjSyhXlT.mjs → login-PcFy5mlC.mjs} +2 -2
  66. package/dist/{logs-DmvBl6xA.mjs → logs-DmJTBhed.mjs} +2 -2
  67. package/dist/{migrate-BXRHpYwR.mjs → migrate-B8S2xTcb.mjs} +5 -66
  68. package/dist/migrate-BIYTPQE6.mjs +1 -0
  69. package/dist/nitro.mjs +4 -4
  70. package/dist/{node-DtD7ZiPf.mjs → node-CDOPrGSl.mjs} +3 -3
  71. package/dist/operator-cmd-CjazwOyb.mjs +1 -0
  72. package/dist/{operator-cmd-DjZKGGgN.mjs → operator-cmd-DmkmS2wL.mjs} +2 -2
  73. package/dist/pages/client.d.mts +17 -2
  74. package/dist/pages/client.mjs +26 -1
  75. package/dist/pages/index.d.mts +17 -1
  76. package/dist/pages/index.mjs +95 -4
  77. package/dist/pages/protocol.d.mts +2 -2
  78. package/dist/{platform-auth-config-BgnuMbml.mjs → platform-auth-config-CImnfohz.mjs} +3 -3
  79. package/dist/{platform-auth-protection-NjRejttU.mjs → platform-auth-protection-BogLhtHi.mjs} +2 -2
  80. package/dist/{platform-auth-recovery-Ug12d9W5.mjs → platform-auth-recovery-B-mEaWEi.mjs} +2 -2
  81. package/dist/{platform-cmd-BYKLMPCn.mjs → platform-cmd-CV8NxIIn.mjs} +1 -1
  82. package/dist/{platform-cmd-HByuZAO7.mjs → platform-cmd-DZK2ixMl.mjs} +3 -3
  83. package/dist/{platform-domain-DLSQ8GF8.mjs → platform-domain-CRvelPGE.mjs} +2 -2
  84. package/dist/{platform-lifecycle-3dwFJmnq.mjs → platform-lifecycle-CPYY7E9B.mjs} +8 -8
  85. package/dist/{platform-lifecycle-BRqcxerG.mjs → platform-lifecycle-DwXq7kZt.mjs} +1 -1
  86. package/dist/{platform-management-ZZ6bQM5j.mjs → platform-management-BOnGbMSM.mjs} +1 -1
  87. package/dist/{platform-management-ZK6XcbCo.mjs → platform-management-lXdgGgAM.mjs} +1 -1
  88. package/dist/{platform-recovery-8vNE5dNN.mjs → platform-recovery-noaALXnE.mjs} +2 -2
  89. package/dist/{prepare-5BR7Splm.mjs → prepare-BuOS18AM.mjs} +1 -1
  90. package/dist/{prepare-Dseww74N.mjs → prepare-D604Yiyr.mjs} +11 -7
  91. package/dist/prepare-DU-tOpS5.mjs +1 -0
  92. package/dist/{project-cmd-CjLNNxwe.mjs → project-cmd-DBYqAIbe.mjs} +13 -13
  93. package/dist/{project-team-DE5drjcl.mjs → project-team-BjCLgTRC.mjs} +1 -1
  94. package/dist/{project-token-XEYEXfiJ.mjs → project-token-BB6PwaA9.mjs} +1 -1
  95. package/dist/{project-tsconfig-Itv1f4WC.mjs → project-tsconfig-CVvk6Z_e.mjs} +24 -2
  96. package/dist/{project-zero-trust-6VPU8zmV.mjs → project-zero-trust-CWDh1P_t.mjs} +1 -1
  97. package/dist/{protocol-BekmFxCI.d.mts → protocol-D5XDySYu.d.mts} +1 -1
  98. package/dist/{provision-Chq0NRAV.mjs → provision-DfxLCg-d.mjs} +1 -1
  99. package/dist/{provision-B7UFrBH7.mjs → provision-DztLJ97X.mjs} +24 -8
  100. package/dist/{requests-CG-Pj8ze.mjs → requests-D_pbzDyz.mjs} +1 -1
  101. package/dist/{rollback-CIrm2txZ.mjs → rollback-CjfIYsJx.mjs} +2 -2
  102. package/dist/{route-types--PAOzHlH.mjs → route-types-DvEGmPif.mjs} +61 -3
  103. package/dist/runtime/auth.d.mts +2 -2
  104. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  105. package/dist/runtime/better-auth-pg.d.mts +1 -1
  106. package/dist/runtime/better-auth.d.mts +1 -1
  107. package/dist/runtime/client-react.d.mts +1 -1
  108. package/dist/runtime/client-solid.d.mts +1 -1
  109. package/dist/runtime/client-svelte.d.mts +1 -1
  110. package/dist/runtime/client-vue.d.mts +1 -1
  111. package/dist/runtime/client.d.mts +1 -1
  112. package/dist/runtime/handler.d.mts +1 -1
  113. package/dist/runtime/live-client.d.mts +1 -1
  114. package/dist/runtime/live.d.mts +1 -1
  115. package/dist/runtime/routing.d.mts +5 -4
  116. package/dist/runtime/routing.mjs +10 -70
  117. package/dist/runtime/validator.d.mts +1 -1
  118. package/dist/runtime/ws-server.d.mts +3 -3
  119. package/dist/runtime/ws.d.mts +1 -1
  120. package/dist/runtime/ws.mjs +4 -2
  121. package/dist/{secret-BL6g7mF5.mjs → secret-3X0PxmuX.mjs} +9 -12
  122. package/dist/{version-metadata-DmaZNTYW.mjs → version-metadata-D2vfMQzv.mjs} +2 -1
  123. package/dist/{wrangler-CDiEBCdS.mjs → wrangler-I-scB_1t.mjs} +80 -12
  124. package/dist/wrangler-UnwdISay.mjs +1 -0
  125. package/dist/{wrapper-CEiDeCqD.mjs → wrapper-BBl1rC32.mjs} +3 -3
  126. package/dist/{ws-D1zWiB_P.d.mts → ws-B3ClMVDh.d.mts} +3 -2
  127. package/docs/guide/auth.md +1 -1
  128. package/docs/guide/edge/redirects.md +22 -0
  129. package/docs/guide/pages-routing/actions-and-forms.md +24 -0
  130. package/docs/guide/platform/installation/maintenance.md +3 -1
  131. package/docs/guide/server-routing.md +2 -0
  132. package/docs/guide/ssg.md +8 -0
  133. package/docs/integrations/cloudflare.md +16 -7
  134. package/docs/reference/api/auth.md +6 -2
  135. package/docs/reference/api/deploy.md +9 -5
  136. package/docs/reference/api/pages.md +2 -0
  137. package/docs/reference/cli/deploy.md +10 -9
  138. package/docs/reference/config.md +11 -1
  139. package/package.json +8 -7
  140. package/schema.json +4 -0
  141. package/skills/void/SKILL.md +1 -1
  142. package/dist/auth-DkcFflXV.d.mts +0 -42
  143. package/dist/cf-build-output-DlBkWdNU.mjs +0 -1
  144. package/dist/client-DyxPQnF_.mjs +0 -1
  145. package/dist/config-BTu1o3Dc.mjs +0 -49
  146. package/dist/deploy-CtHE2A3R.mjs +0 -2
  147. package/dist/gen-TgXy93Rr.mjs +0 -1
  148. package/dist/login-Cdo8Aco1.mjs +0 -1
  149. package/dist/migrate-COPncCGx.mjs +0 -1
  150. package/dist/operator-cmd-DDiX7Y3f.mjs +0 -1
  151. package/dist/prepare-B3VrSF1Z.mjs +0 -1
  152. package/dist/wrangler-DOPr4jyI.mjs +0 -1
@@ -1,29 +1,29 @@
1
1
  import { a as join, c as resolve, n as dirname, r as extname, s as relative } from "./dist-ipQi0Q8y.mjs";
2
2
  import { h as needsApplicationDatabase } from "./plugin-inference-CeiB6BG5.mjs";
3
3
  import { n as readProjectPaths } from "./project-paths-DGu_QZ_Q.mjs";
4
- import { u as isNodeTarget } from "./config-DHgSEWT7.mjs";
4
+ import { t as discoverSchema } from "./discover-LaV0tbIu.mjs";
5
+ import { u as isNodeTarget } from "./config-OFOAimzt.mjs";
5
6
  import { t as collectMigrations } from "./collect-Dew86qce.mjs";
6
7
  import { i as collectFiles, t as collectPages } from "./isr-config-fZaJJ8t7.mjs";
7
- import { n as mergeRoutingRules, t as lintRoutingPhases } from "./headers-D522zd0A.mjs";
8
+ import { n as mergeRoutingRules, t as lintRoutingPhases } from "./headers--vaK_chu.mjs";
8
9
  import { s as shouldLinkDeployProject, t as attachSelectedPlatform, u as writeProjectConfig } from "./project-rqDnVsJN.mjs";
9
- import { E as resolveLiveBindingConfig, O as syncWranglerBindings, a as LIVE_MIGRATION_TAG, g as normalizeWranglerCompatibilityFlags, u as ensureWranglerCompat, v as readExistingLiveBindingConfig } from "./wrangler-CDiEBCdS.mjs";
10
+ import { E as resolveLiveBindingConfig, O as syncWranglerBindings, a as LIVE_MIGRATION_TAG, g as normalizeWranglerCompatibilityFlags, u as ensureWranglerCompat, v as readExistingLiveBindingConfig } from "./wrangler-I-scB_1t.mjs";
10
11
  import { n as buildMigrationPlanBundle } from "./plan-BhLO2p4w.mjs";
11
12
  import { l as getTokenSource } from "./auth-B6iOCjKI.mjs";
12
- import { t as discoverSchema } from "./discover-LaV0tbIu.mjs";
13
13
  import { t as findEnvFile } from "./env-types-BicfKBhV.mjs";
14
- import { a as buildEnv } from "./version-metadata-DmaZNTYW.mjs";
15
- import { r as writeDrizzleConfig, t as PLACEHOLDER_DB_URL } from "./config-BIaXIkkv.mjs";
14
+ import { a as buildEnv } from "./version-metadata-D2vfMQzv.mjs";
15
+ import { r as writeDrizzleConfig, t as PLACEHOLDER_DB_URL } from "./config-tqMM6DwY.mjs";
16
16
  import { i as validateMigrations, r as listDrizzleArtifacts, t as assertJournalCoherence } from "./validate-CnZPMq4q.mjs";
17
17
  import { L as log$1, N as intro, X as text, tt as isCancel } from "./dist-Cor9XGoz.mjs";
18
18
  import { t as formatCloudflareUserMessage } from "./cloudflare-user-output-Q-k0QoNQ.mjs";
19
- import { c as platformErrorMessage, i as isCliOutdatedError, n as PlatformApiError, o as isHeadersTimeoutError, s as parsePlatformErrorBody } from "./client-BEMtySaV.mjs";
19
+ import { c as platformErrorMessage, i as isCliOutdatedError, n as PlatformApiError, o as isHeadersTimeoutError, s as parsePlatformErrorBody } from "./client-B3LnB_bE.mjs";
20
20
  import { f as import_picocolors, h as sanitizeTerminalText, m as printSuccess, o as formatCount, p as note, r as createSpinner, u as getErrorMessage } from "./output-BpgYODYx.mjs";
21
- import { a as promptProjectSelection, i as reportProjectCreationWarnings, o as promptProjectSetupAction, r as promptAndCreateProject } from "./create-project-CjzbBlTv.mjs";
21
+ import { a as promptProjectSelection, i as reportProjectCreationWarnings, o as promptProjectSetupAction, r as promptAndCreateProject } from "./create-project-Bxd02EHN.mjs";
22
22
  import { o as detectPreset, s as formatProjectCommand, u as resolveProjectCommand } from "./cloudflare-process-8jEYIeim.mjs";
23
- import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-XcukUlFM.mjs";
24
- import { a as needsWrapper, i as generateWrapper } from "./wrapper-CEiDeCqD.mjs";
23
+ import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-B3VobvXm.mjs";
24
+ import { a as needsWrapper, i as generateWrapper } from "./wrapper-BBl1rC32.mjs";
25
25
  import { n as drizzleKitBin } from "./yarn-pnp-DLbEFMT0.mjs";
26
- import { t as MANAGED_DEPLOY_BUILD_ENV } from "./deploy-transport-JCxw7QDi.mjs";
26
+ import { t as MANAGED_DEPLOY_BUILD_ENV } from "./deploy-transport-DIq_gFTP.mjs";
27
27
  import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync } from "node:fs";
28
28
  import { createDeployArtifact, createDeployUploadPayload } from "@void/deploy-core";
29
29
  import { createHash } from "node:crypto";
@@ -336,7 +336,9 @@ function toManifestSchedulesAndQueues(jobs, queues) {
336
336
  name: q.name,
337
337
  bindingName: q.bindingName,
338
338
  ...q.maxBatchSize != null && { maxBatchSize: q.maxBatchSize },
339
- ...q.maxBatchTimeout != null && { maxBatchTimeout: q.maxBatchTimeout }
339
+ ...q.maxBatchTimeout != null && { maxBatchTimeout: q.maxBatchTimeout },
340
+ ...q.maxRetries != null && { maxRetries: q.maxRetries },
341
+ ...q.retryDelay != null && { retryDelay: q.retryDelay }
340
342
  }))
341
343
  };
342
344
  }
@@ -1382,6 +1384,7 @@ function buildVoidManifest(opts) {
1382
1384
  assetManifestVersion: 2,
1383
1385
  bindings: {}
1384
1386
  };
1387
+ if (opts.alwaysUseHttps !== void 0) manifest.alwaysUseHttps = opts.alwaysUseHttps;
1385
1388
  if (opts.durableObjects?.length) {
1386
1389
  manifest.version = 4;
1387
1390
  manifest.durableObjects = { bindings: opts.durableObjects.map(({ bindingName, className }) => ({
@@ -1478,15 +1481,17 @@ function readWranglerHtmlHandling(rootConfig) {
1478
1481
  function buildStaticManifest(opts) {
1479
1482
  const { appType, hashedAssetsPrefix, headerRules, redirectRules, fallbackRules, notFound, html_handling } = opts;
1480
1483
  const { assetConfig, fallbackRules: resolvedFallbackRules } = resolveSpaFallbackChain(appType, fallbackRules, notFound);
1484
+ const resolvedAssetConfig = html_handling === void 0 ? assetConfig : {
1485
+ ...assetConfig,
1486
+ html_handling
1487
+ };
1481
1488
  const manifest = {
1482
1489
  version: 3,
1483
1490
  assetManifestVersion: 2,
1484
1491
  bindings: {},
1485
1492
  type: appType,
1486
- assetConfig: html_handling === void 0 ? assetConfig : {
1487
- ...assetConfig,
1488
- html_handling
1489
- }
1493
+ ...opts.alwaysUseHttps !== void 0 ? { alwaysUseHttps: opts.alwaysUseHttps } : {},
1494
+ assetConfig: resolvedAssetConfig
1490
1495
  };
1491
1496
  if (hashedAssetsPrefix) manifest.hashedAssetsPrefix = hashedAssetsPrefix;
1492
1497
  if (headerRules && headerRules.length > 0) manifest.headerRules = headerRules;
@@ -1505,6 +1510,7 @@ function buildFrameworkManifest(opts) {
1505
1510
  assetManifestVersion: 2,
1506
1511
  bindings: {}
1507
1512
  };
1513
+ if (opts.alwaysUseHttps !== void 0) manifest.alwaysUseHttps = opts.alwaysUseHttps;
1508
1514
  applyResourceBindings(manifest, opts.bindings, opts.migrations?.length ?? 0, dialect, po?.bindingNames);
1509
1515
  if (opts.migrations && opts.migrations.length > 0) manifest.migrations = toMigrationsManifest(opts.migrations, dialect);
1510
1516
  if (opts.schedules && opts.schedules.length > 0) manifest.schedules = opts.schedules;
@@ -1577,7 +1583,7 @@ function assembleVoidManifest(pageScan, isFrameworkMode, opts, revalidateConfig,
1577
1583
  pathRevalidate: !isrEnabled || isFrameworkMode || revalidateConfig == null || typeof revalidateConfig !== "object" ? void 0 : revalidateConfig
1578
1584
  });
1579
1585
  }
1580
- async function runStaticDeploy(root, config, client, preset, skipBuild, gitMetadata, hashedAssetsPrefix, headerRules, redirectRules, fallbackRules, routing, cliLog, notFound) {
1586
+ async function runStaticDeploy(root, config, client, preset, skipBuild, gitMetadata, hashedAssetsPrefix, headerRules, redirectRules, fallbackRules, routing, cliLog, notFound, alwaysUseHttps) {
1581
1587
  const typeLabel = preset.appType === "spa" ? "Static SPA" : "Static Site";
1582
1588
  log.info(`${typeLabel} deploy`);
1583
1589
  cliLog?.info("deploy_mode", {
@@ -1623,6 +1629,7 @@ async function runStaticDeploy(root, config, client, preset, skipBuild, gitMetad
1623
1629
  const packageStartedAt = Date.now();
1624
1630
  const manifest = buildStaticManifest({
1625
1631
  appType: preset.appType,
1632
+ alwaysUseHttps: alwaysUseHttps ?? routing?.alwaysUseHttps,
1626
1633
  hashedAssetsPrefix: hashedAssetsPrefix ?? "assets",
1627
1634
  headerRules,
1628
1635
  redirectRules,
@@ -1,8 +1,8 @@
1
1
  import { a as join } from "./dist-ipQi0Q8y.mjs";
2
2
  import { n as scanWranglerDotenvKeys } from "./dotenv-CNazY3-w.mjs";
3
3
  import { t as CLOUDFLARE_DEPLOY_BUILD_ENV } from "./env-BaMz0j7H.mjs";
4
- import { i as WRANGLER_AUTH_CREDENTIAL_ENV_VARS, t as CLOUDFLARE_PRESERVE_BINDINGS_BUILD_ENV } from "./version-metadata-DmaZNTYW.mjs";
5
- import { _ as provisionEnv, r as assertNoTransportRedirectInProjectDotenv, s as deleteEnvVarCaseAware, v as resolvePinnedApiBaseUrl } from "./provision-B7UFrBH7.mjs";
4
+ import { i as WRANGLER_AUTH_CREDENTIAL_ENV_VARS, t as CLOUDFLARE_PRESERVE_BINDINGS_BUILD_ENV } from "./version-metadata-D2vfMQzv.mjs";
5
+ import { _ as provisionEnv, r as assertNoTransportRedirectInProjectDotenv, s as deleteEnvVarCaseAware, v as resolvePinnedApiBaseUrl } from "./provision-DztLJ97X.mjs";
6
6
  import { readWranglerTopLevelString } from "@void/deploy-cloudflare";
7
7
  //#region src/cli/deploy-transport.ts
8
8
  /**
@@ -36,20 +36,21 @@ function scrubManagedDeployBuildMarkers(env) {
36
36
  * top-level config this flow provisions + preflights. Scrubbed from every child env
37
37
  * and fenced in the project dotenv (see below), on top of the provisioner's transport
38
38
  * scrub/fence which owns the endpoint-redirect + `CLOUDFLARE_ENV` vars:
39
- * - `WRANGLER_CI_OVERRIDE_NAME` — wrangler 4.131 applies it AFTER config load
40
- * (`mergeSharedConfigArgs` → `getCIOverrideName()`), REPLACING the upload name, so a
41
- * bare `wrangler deploy` uploads a worker whose name the generated-config check never
42
- * validated.
39
+ * - `WRANGLER_CI_OVERRIDE_NAME` — the Cloudflare tooling (wrangler and the `cf` CLI)
40
+ * applies it AFTER config load (`getCIOverrideName()`), REPLACING the upload name, so a
41
+ * bare deploy uploads a worker whose name the generated-config check never validated.
43
42
  * - `CLOUDFLARE_VITE_WRANGLER_CONFIG_PATH` — the CF Vite plugin points the build at an
44
43
  * ALTERNATE wrangler config, flattening a different binding set into
45
44
  * `dist/ssr/wrangler.json`.
46
45
  */
47
46
  const DEPLOY_CONFIG_OVERRIDE_ENV_VARS = ["WRANGLER_CI_OVERRIDE_NAME", "CLOUDFLARE_VITE_WRANGLER_CONFIG_PATH"];
48
47
  /**
49
- * The dotenv files wrangler 4.131 reloads into `process.env` (`override: true`) for
50
- * the orchestrator's `--env=` calls (`getDefaultEnvFiles("")`), so a repo dotenv here
51
- * would resurrect `WRANGLER_CI_OVERRIDE_NAME` at the DEPLOY step after the child-env
52
- * scrub removed it.
48
+ * The dotenv files wrangler loads into `process.env` (`override: true`) when no
49
+ * `--env` is named (`getDefaultEnvFiles("")`). Void runs its deploy steps through the
50
+ * `cf` CLI, not wrangler, but this set is kept for a user who runs `wrangler deploy` on
51
+ * the same config. It also covers the `.env` / `.env.local` files `cf` reads. A repo
52
+ * dotenv here would bring back `WRANGLER_CI_OVERRIDE_NAME` after the child-env scrub
53
+ * removed it.
53
54
  */
54
55
  const DEPLOY_WRANGLER_DOTENV_FILES = [
55
56
  ".env",
@@ -61,7 +62,7 @@ const DEPLOY_WRANGLER_DOTENV_FILES = [
61
62
  * The dotenv files Vite's `loadEnv(mode, …)` reads for a production `vite build`
62
63
  * (`.env`, `.env.local`, `.env.production`, `.env.production.local`), where the CF Vite
63
64
  * plugin picks up `CLOUDFLARE_ENV` / `CLOUDFLARE_VITE_WRANGLER_CONFIG_PATH` — a set
64
- * DISJOINT from wrangler's `--env=` files, so it is fenced separately for the build.
65
+ * that differs from the wrangler dotenv files above, so it is fenced separately for the build.
65
66
  */
66
67
  const DEPLOY_VITE_DOTENV_FILES = [
67
68
  ".env",
@@ -100,7 +101,7 @@ function findWranglerCiOverrideDotenvFile(root, platform = process.platform) {
100
101
  * FAIL CLOSED when the project's dotenv files declare a deploy-time config-override
101
102
  * selector. wrangler / Vite reload dotenv on every command, so a repo dotenv would
102
103
  * reintroduce a scrubbed var AFTER the child-env scrub — reselecting the upload worker
103
- * name (wrangler `--env=` files) or the build's wrangler config (Vite production files).
104
+ * name (the wrangler dotenv files) or the build's wrangler config (Vite production files).
104
105
  * The provisioner's transport fence ({@link assertNoTransportRedirectInProjectDotenv})
105
106
  * owns `CLOUDFLARE_ENV` + the endpoint-redirect vars; this closes the deploy-specific
106
107
  * name/config-path selectors it does not cover, across BOTH consumers' file sets.
package/dist/deploy.d.mts CHANGED
@@ -11,6 +11,8 @@ export type CfBuildOutput = {
11
11
  dispose(): Promise<void>;
12
12
  };
13
13
  export type PrepareCfBuildOutputOptions = {
14
+ /** The app's package root. Defaults to the input directory. */
15
+ projectRoot?: string;
14
16
  /** The Cloudflare account the build must target. */
15
17
  accountId?: string;
16
18
  /** The Vite build mode. Native output must match it; legacy output defaults to production. */
package/dist/deploy.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  import { a as join, c as resolve } from "./dist-ipQi0Q8y.mjs";
2
- import { p as readConfig, u as isNodeTarget } from "./config-DHgSEWT7.mjs";
2
+ import { p as readConfig, u as isNodeTarget } from "./config-OFOAimzt.mjs";
3
3
  import { o as validateSsrEntry } from "./entry-BEM8ZuGP.mjs";
4
4
  import { r as hasEmailHandlers } from "./email-B9ayYQEG.mjs";
5
5
  import { a as resolveDistDir, c as hasDocumentRoutes, l as resolveAssetConfig, n as collectRevalidate, o as resolveWorkerDirName, s as hasApiRoutes } from "./isr-config-fZaJJ8t7.mjs";
6
- import { t as analyzeApplication } from "./application-routing-C8EqRDfv.mjs";
7
- import { t as prepareCfBuildOutput$1 } from "./cf-build-output-Bapzc_8Z.mjs";
6
+ import { t as analyzeApplication } from "./application-routing-4719u_kf.mjs";
7
+ import { t as prepareCfBuildOutput$1 } from "./cf-build-output-XpNR9zoh.mjs";
8
8
  import { o as detectPreset } from "./cloudflare-process-8jEYIeim.mjs";
9
- import { I as resolveStaticDeployPreset, L as toManifestSchedulesAndQueues, M as resolveDeployWorkerMain, N as resolveDeployWranglerCompat, R as validateDeployMigrations, a as collectAndHashAssets, f as mergeAndLintRoutingRules, g as assertDeploySchemaDriftFree, i as buildStaticManifest, o as collectWorkerFiles, t as assembleVoidManifest, x as assertWorkerMainUploaded } from "./deploy-managed-static-CDYA2p3L.mjs";
9
+ import { I as resolveStaticDeployPreset, L as toManifestSchedulesAndQueues, M as resolveDeployWorkerMain, N as resolveDeployWranglerCompat, R as validateDeployMigrations, a as collectAndHashAssets, f as mergeAndLintRoutingRules, g as assertDeploySchemaDriftFree, i as buildStaticManifest, o as collectWorkerFiles, t as assembleVoidManifest, x as assertWorkerMainUploaded } from "./deploy-managed-static-DjeBFG2c.mjs";
10
10
  import { existsSync } from "node:fs";
11
11
  import { createDeployArtifact } from "@void/deploy-core";
12
12
  //#region src/deploy.ts
@@ -15,7 +15,7 @@ import { createDeployArtifact } from "@void/deploy-core";
15
15
  * Experimental. Returns null for an unsupported build or a conflicting account or mode.
16
16
  */
17
17
  async function prepareCfBuildOutput(directory, options = {}) {
18
- const prepared = await prepareCfBuildOutput$1(directory, options.accountId, options.mode);
18
+ const prepared = await prepareCfBuildOutput$1(directory, options.accountId, options.mode, options.projectRoot);
19
19
  return prepared && {
20
20
  directory: prepared.directory,
21
21
  ...prepared.assetsDirectory ? { assetsDirectory: prepared.assetsDirectory } : {},
@@ -45,6 +45,7 @@ async function prepareDeployArtifact(root = process.cwd()) {
45
45
  artifact: createDeployArtifact({
46
46
  manifest: buildStaticManifest({
47
47
  appType: preset.appType,
48
+ alwaysUseHttps: config.routing?.alwaysUseHttps,
48
49
  hashedAssetsPrefix: "assets",
49
50
  notFound: config.routing?.notFound,
50
51
  ...rules
@@ -80,6 +81,7 @@ async function prepareDeployArtifact(root = process.cwd()) {
80
81
  const rules = mergeAndLintRoutingRules(clientDir, config.routing);
81
82
  const manifest = assembleVoidManifest(pages ? scan.pages : null, false, {
82
83
  bindings,
84
+ alwaysUseHttps: config.routing?.alwaysUseHttps,
83
85
  vars: config.worker?.vars,
84
86
  hasEmailHandlers: scan.email !== void 0 && hasEmailHandlers(scan.email),
85
87
  migrations,
@@ -1,15 +1,15 @@
1
1
  import { a as join, i as isAbsolute, n as dirname, s as relative } from "./dist-ipQi0Q8y.mjs";
2
2
  import { i as resolveProjectPaths, n as readProjectPaths } from "./project-paths-DGu_QZ_Q.mjs";
3
- import { c as getDatabaseCasing, l as getDatabaseDialect, m as resolveBindingNames, p as readConfig } from "./config-DHgSEWT7.mjs";
4
- import { i as voidWarn } from "./log-BMwmN5Ae.mjs";
5
- import { n as ensureProjectTsconfig } from "./project-tsconfig-Itv1f4WC.mjs";
6
- import { n as generateDbDts, t as DRIZZLE_OPERATORS } from "./db-types-NGxPwnlt.mjs";
7
3
  import { t as discoverSchema } from "./discover-LaV0tbIu.mjs";
4
+ import { c as getDatabaseCasing, l as getDatabaseDialect, m as resolveBindingNames, p as readConfig } from "./config-OFOAimzt.mjs";
5
+ import { i as voidWarn } from "./log-BMwmN5Ae.mjs";
6
+ import { n as ensureProjectTsconfig } from "./project-tsconfig-CVvk6Z_e.mjs";
7
+ import { n as generateDbDts, t as DRIZZLE_OPERATORS } from "./db-types-0eCiqYb1.mjs";
8
8
  import { n as CLOUDFLARE_QUEUE_NAMES_BUILD_ENV } from "./env-BaMz0j7H.mjs";
9
9
  import { createRequire } from "node:module";
10
10
  import { existsSync, readFileSync, readdirSync } from "node:fs";
11
- import { fileURLToPath } from "node:url";
12
11
  import { normalizePath } from "vite";
12
+ import { fileURLToPath } from "node:url";
13
13
  //#region src/plugin-drizzle.ts
14
14
  const drizzleD1Resolved = fileURLToPath(import.meta.resolve("drizzle-orm/d1"));
15
15
  const drizzleOrmResolved = fileURLToPath(import.meta.resolve("drizzle-orm"));
@@ -1,7 +1,7 @@
1
1
  import { n as readDeploymentPlatform } from "./project-rqDnVsJN.mjs";
2
2
  import { c as getToken } from "./auth-B6iOCjKI.mjs";
3
3
  import { L as log } from "./dist-Cor9XGoz.mjs";
4
- import { r as PlatformClient } from "./client-BEMtySaV.mjs";
4
+ import { r as PlatformClient } from "./client-B3LnB_bE.mjs";
5
5
  import { f as import_picocolors, m as printSuccess, p as note } from "./output-BpgYODYx.mjs";
6
6
  import { i as resolveCommandProjectId } from "./resolve-project-Xoi6eTWY.mjs";
7
7
  //#region src/cli/domain.ts
@@ -25,7 +25,7 @@ async function runDomainCommand(root, args) {
25
25
  }
26
26
  async function runCloudflareDomainCommand(root, args) {
27
27
  if (args.projectSlug) throw new Error("domain: --project selects a Void platform project and is not used for direct Cloudflare apps.");
28
- const { changeCloudflareDomain, listCloudflareDomains } = await import("./cloudflare-operations-PCM4wucv.mjs");
28
+ const { changeCloudflareDomain, listCloudflareDomains } = await import("./cloudflare-operations-BtulCNOg.mjs");
29
29
  if (args.subcommand === "add") {
30
30
  const result = await changeCloudflareDomain(root, args.hostname, "add");
31
31
  note("Cloudflare Custom Domains manages the DNS record and TLS certificate in the zone on your account.", "Cloudflare Domain");
@@ -1,16 +1,16 @@
1
1
  import { a as join } from "./dist-ipQi0Q8y.mjs";
2
2
  import { n as readProjectPaths } from "./project-paths-DGu_QZ_Q.mjs";
3
- import { p as readConfig } from "./config-DHgSEWT7.mjs";
3
+ import { p as readConfig } from "./config-OFOAimzt.mjs";
4
4
  import { i as scanEmailHandlersSync } from "./email-B9ayYQEG.mjs";
5
- import { M as writeProvisionedWranglerConfig } from "./wrangler-CDiEBCdS.mjs";
5
+ import { M as writeProvisionedWranglerConfig } from "./wrangler-I-scB_1t.mjs";
6
6
  import { c as getToken, u as openBrowser } from "./auth-B6iOCjKI.mjs";
7
- import { a as emailConfigInputs, c as renderAddressMap, i as createNodeEmailDns, l as renderEmailChecklist, o as preflightEmail, r as applyEmailSetup, s as probeMx } from "./email-cloudflare-B8-pq_-W.mjs";
7
+ import { a as emailConfigInputs, c as renderAddressMap, i as createNodeEmailDns, l as renderEmailChecklist, o as preflightEmail, r as applyEmailSetup, s as probeMx } from "./email-cloudflare-PMbAev9Q.mjs";
8
8
  import { A as confirm, L as log, U as password, tt as isCancel } from "./dist-Cor9XGoz.mjs";
9
- import { n as PlatformApiError, r as PlatformClient } from "./client-BEMtySaV.mjs";
9
+ import { n as PlatformApiError, r as PlatformClient } from "./client-B3LnB_bE.mjs";
10
10
  import { f as import_picocolors, l as formatUrl, m as printSuccess, p as note, r as createSpinner } from "./output-BpgYODYx.mjs";
11
11
  import { i as resolveCommandProjectId } from "./resolve-project-Xoi6eTWY.mjs";
12
- import { o as resolveDeployTransport } from "./deploy-transport-JCxw7QDi.mjs";
13
- import { a as discoverRootWranglerConfig, c as runWranglerAuthToken, l as deriveWorkerName, o as createDeployWranglerRunner, s as isWranglerNonInteractiveOrCI } from "./deploy-hRPvw8ci.mjs";
12
+ import { o as resolveDeployTransport } from "./deploy-transport-DIq_gFTP.mjs";
13
+ import { a as discoverRootWranglerConfig, c as runWranglerAuthToken, l as deriveWorkerName, o as createDeployWranglerRunner, s as isWranglerNonInteractiveOrCI } from "./deploy-CdM-LAxX.mjs";
14
14
  import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
15
15
  import { tmpdir } from "node:os";
16
16
  import { execSync } from "node:child_process";
@@ -1,17 +1,18 @@
1
1
  import { n as __toESM } from "./rolldown-runtime-3h0WiCiA.mjs";
2
2
  import { a as join, n as dirname, s as relative } from "./dist-ipQi0Q8y.mjs";
3
3
  import { t as require_picocolors } from "./picocolors-BsDfhxIw.mjs";
4
- import { p as readConfig } from "./config-DHgSEWT7.mjs";
4
+ import { p as readConfig } from "./config-OFOAimzt.mjs";
5
5
  import { i as voidWarn, r as voidLog } from "./log-BMwmN5Ae.mjs";
6
6
  import { i as collectFiles } from "./isr-config-fZaJJ8t7.mjs";
7
7
  import { i as readProjectIdField } from "./project-rqDnVsJN.mjs";
8
- import { p as findBindingNameOwner, u as ensureWranglerCompat } from "./wrangler-CDiEBCdS.mjs";
8
+ import { p as findBindingNameOwner, u as ensureWranglerCompat } from "./wrangler-I-scB_1t.mjs";
9
9
  import { n as scopedAccessCredentials } from "./cf-access-BM9G0lhO.mjs";
10
10
  import { n as ensurePlatformProxyAccess } from "./cf-access-CWP4avfP.mjs";
11
11
  import { a as getApiUrl, c as getToken, o as getProxyUrl } from "./auth-B6iOCjKI.mjs";
12
12
  import { u as stripInternalEnvKeys } from "./env-BaMz0j7H.mjs";
13
13
  import { i as renderPrerenderPaths, n as outputFileForPath, r as readPrerenderPathsResponse } from "./prerender-render-CaShbHJ3.mjs";
14
- import { a as buildEnv } from "./version-metadata-DmaZNTYW.mjs";
14
+ import { t as renderDefaultErrorPage } from "./error-pages-CLIJ7aYq.mjs";
15
+ import { a as buildEnv } from "./version-metadata-D2vfMQzv.mjs";
15
16
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
16
17
  import { isRecord } from "@void/deploy-core";
17
18
  import { execFile } from "node:child_process";
@@ -162,6 +163,12 @@ async function collectPrerenderPaths(options) {
162
163
  await runner.close();
163
164
  }
164
165
  }
166
+ function ensureStatic404(clientDir) {
167
+ const file = join(clientDir, "404.html");
168
+ if (existsSync(file)) return;
169
+ mkdirSync(clientDir, { recursive: true });
170
+ writeFileSync(file, renderDefaultErrorPage(404));
171
+ }
165
172
  /**
166
173
  * Prerender pages by spinning up Miniflare with the built worker.
167
174
  * Collects paths through the built worker's internal endpoint and then
@@ -176,12 +183,14 @@ async function prerenderPages(options) {
176
183
  rendered: [],
177
184
  failed: []
178
185
  };
186
+ const result = await renderPrerenderPaths(paths, options.clientDir, (path) => runner.fetchPath(path), (path) => runner.fetchPageData(path), (path, outputFile, error) => {
187
+ if (error !== void 0) voidWarn(`prerender ${path} failed: ${error}`);
188
+ else voidLog(`prerender ${import_picocolors.default.blue(outputFile)}`);
189
+ });
190
+ ensureStatic404(options.clientDir);
179
191
  return {
180
192
  paths,
181
- ...await renderPrerenderPaths(paths, options.clientDir, (path) => runner.fetchPath(path), (path) => runner.fetchPageData(path), (path, outputFile, error) => {
182
- if (error !== void 0) voidWarn(`prerender ${path} failed: ${error}`);
183
- else voidLog(`prerender ${import_picocolors.default.blue(outputFile)}`);
184
- })
193
+ ...result
185
194
  };
186
195
  } finally {
187
196
  await runner.close();
@@ -281,6 +290,8 @@ async function prerenderPagesNode(options) {
281
290
  ssrDir: options.ssrDir,
282
291
  clientDir: options.clientDir
283
292
  });
293
+ if (result.paths.length === 0) return result;
294
+ ensureStatic404(options.clientDir);
284
295
  for (const path of result.rendered) voidLog(`prerender ${import_picocolors.default.blue(outputFileForPath(path))}`);
285
296
  for (const { path, error } of result.failed) voidWarn(`prerender ${path} failed: ${error}`);
286
297
  return result;
@@ -297,6 +308,8 @@ async function prerenderPagesNode(options) {
297
308
  * request matching a negative rule never reaches the Worker, even when the
298
309
  * file is missing. Misses and other paths in the folder keep the Worker's
299
310
  * not-found, SPA and page handling.
311
+ * `routing.alwaysUseHttps` alone does not count as an edge rule: hashed files
312
+ * are only linked from pages the Worker has already moved to HTTPS.
300
313
  *
301
314
  * The asset layer does not know which files are fingerprinted, so a generated
302
315
  * `_headers` file gives every bypassed chunk the immutable policy the Worker
@@ -3,9 +3,9 @@ import { n as readDeploymentPlatform, r as readProjectConfig } from "./project-r
3
3
  import { c as getToken } from "./auth-B6iOCjKI.mjs";
4
4
  import { r as generateEnvTypes, t as findEnvFile } from "./env-types-BicfKBhV.mjs";
5
5
  import { H as outro, L as log } from "./dist-Cor9XGoz.mjs";
6
- import { r as PlatformClient } from "./client-BEMtySaV.mjs";
6
+ import { r as PlatformClient } from "./client-B3LnB_bE.mjs";
7
7
  import { m as printSuccess, p as note } from "./output-BpgYODYx.mjs";
8
- import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-XcukUlFM.mjs";
8
+ import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-B3VobvXm.mjs";
9
9
  import { mkdirSync, writeFileSync } from "node:fs";
10
10
  //#region src/cli/env.ts
11
11
  async function runEnvCommand(root, args) {
@@ -25,7 +25,7 @@ async function runCheck(root, useRemoteSecrets) {
25
25
  const platform = readDeploymentPlatform(root);
26
26
  if (platform === "none") throw new Error("env: Deployment is disabled. Run `void init` to choose a platform.");
27
27
  if (platform === "cloudflare") {
28
- const { listCloudflareSecrets, resolveCloudflareOperationContext } = await import("./cloudflare-operations-PCM4wucv.mjs");
28
+ const { listCloudflareSecrets, resolveCloudflareOperationContext } = await import("./cloudflare-operations-BtulCNOg.mjs");
29
29
  remoteSecrets = await listCloudflareSecrets(resolveCloudflareOperationContext(root));
30
30
  } else {
31
31
  const token = getToken(root);
@@ -476,6 +476,7 @@ function secretListEnv(accountId, platform) {
476
476
  scrub("CF_ACCESS_CLIENT_SECRET");
477
477
  scrub("VOID_ACCESS_CREDENTIALS");
478
478
  scrub("VOID_ACCESS_ORIGIN");
479
+ scrub("CF_ACCESS_READINESS_ORIGIN");
479
480
  scrub("WRANGLER_LOG_SANITIZE");
480
481
  env.WRANGLER_LOG_SANITIZE = "true";
481
482
  if (accountId) {
@@ -1 +1 @@
1
- export { r as SelfHostSchemaError, a as computeInvalidEmittedKeys, c as deriveSelfHostSchemaFacts, p as readEmittedWorkerVars } from "./env-validation-XcukUlFM.mjs";
1
+ export { r as SelfHostSchemaError, a as computeInvalidEmittedKeys, c as deriveSelfHostSchemaFacts, p as readEmittedWorkerVars } from "./env-validation-B3VobvXm.mjs";
@@ -0,0 +1,37 @@
1
+ //#region src/runtime/error-pages/404.html?raw
2
+ var _404_default = "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>404: Not Found</title>\n <!-- inject:css -->\n <!--\n Do not add code here. At runtime, the file referenced by the tag below is\n inlined, replacing this entire block (including this comment).\n The tag is kept so you can preview this HTML file by opening it directly in a browser.\n -->\n <link rel=\"stylesheet\" href=\"./style.css\" />\n <!-- endinject -->\n <!-- inject:js -->\n <!--\n Do not add code here. At runtime, the file referenced by the tag below is\n inlined, replacing this entire block (including this comment).\n The tag is kept so you can preview this HTML file by opening it directly in a browser.\n -->\n <script src=\"./script.js\"><\/script>\n <!-- endinject -->\n </head>\n <body>\n <div class=\"error-page\">\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <main class=\"error-content\">\n <span class=\"grid-tick top left\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick top right\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick bottom left\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick bottom right\" aria-hidden=\"true\"></span>\n <h1>\n <span class=\"error-code\">404</span><span class=\"error-title\">Lost in the void</span>\n </h1>\n <p class=\"error-description\">This page doesn't exist</p>\n <button class=\"error-action\" type=\"button\" id=\"void-error-back\" hidden>\n <span class=\"error-arrow\" aria-hidden=\"true\">←</span>Go back\n </button>\n </main>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <canvas class=\"error-texture\" aria-hidden=\"true\"></canvas>\n </div>\n </body>\n</html>\n";
3
+ //#endregion
4
+ //#region src/runtime/error-pages/500.html?raw
5
+ var _500_default = "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>500: Internal Server Error</title>\n <!-- inject:css -->\n <!--\n Do not add code here. At runtime, the file referenced by the tag below is\n inlined, replacing this entire block (including this comment).\n The tag is kept so you can preview this HTML file by opening it directly in a browser.\n -->\n <link rel=\"stylesheet\" href=\"./style.css\" />\n <!-- endinject -->\n <!-- inject:js -->\n <!--\n Do not add code here. At runtime, the file referenced by the tag below is\n inlined, replacing this entire block (including this comment).\n The tag is kept so you can preview this HTML file by opening it directly in a browser.\n -->\n <script src=\"./script.js\"><\/script>\n <!-- endinject -->\n </head>\n <body>\n <div class=\"error-page\">\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <main class=\"error-content\">\n <span class=\"grid-tick top left\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick top right\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick bottom left\" aria-hidden=\"true\"></span>\n <span class=\"grid-tick bottom right\" aria-hidden=\"true\"></span>\n <h1>\n <span class=\"error-code\">500</span><span class=\"error-title\">Something went wrong</span>\n </h1>\n <p class=\"error-description\">Please try again in a moment</p>\n <a class=\"error-action\" href=\"\"\n ><span class=\"error-arrow\" aria-hidden=\"true\">↻</span>Reload page</a\n >\n </main>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <div class=\"grid-cell\" aria-hidden=\"true\"></div>\n <canvas class=\"error-texture\" aria-hidden=\"true\"></canvas>\n </div>\n </body>\n</html>\n";
6
+ //#endregion
7
+ //#region src/runtime/error-pages/inline.ts
8
+ const closing = "<!-- endinject -->";
9
+ function replaceAssetBlock(html, name, content) {
10
+ const opening = `<!-- inject:${name} -->`;
11
+ const start = html.indexOf(opening);
12
+ const end = html.indexOf(closing, start + opening.length);
13
+ if (start === -1 || end === -1 || html.lastIndexOf(opening) !== start) throw new Error(`Expected one complete ${name} block in the default error page.`);
14
+ return html.slice(0, start) + content + html.slice(end + 18);
15
+ }
16
+ function inlineErrorPageAssets(html, stylesheet, script) {
17
+ if (html.split(closing).length !== 3) throw new Error("Expected two endinject markers in the default error page.");
18
+ for (const [name, content] of [["css", `<style>\n${stylesheet}</style>`], ["js", `<script>\n${script}<\/script>`]]) html = replaceAssetBlock(html, name, content);
19
+ return html;
20
+ }
21
+ //#endregion
22
+ //#region src/runtime/error-pages/script.js?raw
23
+ var script_default = "(() => {\n const designs = ['signal', 'grid', 'fold'];\n document.documentElement.dataset.design = designs[Math.floor(Math.random() * designs.length)];\n\n function setup() {\n const back = document.getElementById('void-error-back');\n const canGoBack = window.navigation ? window.navigation.canGoBack : window.history.length > 1;\n if (back && canGoBack) {\n back.hidden = false;\n back.addEventListener('click', () => window.history.back());\n }\n\n if (document.documentElement.dataset.design !== 'signal') {\n return;\n }\n const canvas = document.querySelector('.error-texture');\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n function draw() {\n const { width, height } = canvas.getBoundingClientRect();\n const ratio = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = Math.round(width * ratio);\n canvas.height = Math.round(height * ratio);\n ctx.setTransform(ratio, 0, 0, ratio, 0, 0);\n const colors = getComputedStyle(canvas);\n const chars = ['·', '/', '0', '1', '+', '[', ']', '—'];\n ctx.font = '8px ui-monospace, monospace';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = colors.color;\n\n for (let y = 8, row = 0; y < height; y += 12, row++) {\n for (let x = 8, col = 0; x < width; x += 9, col++) {\n const distance = Math.hypot(\n (x - width / 2) / (width * 0.47),\n (y - height * 0.48) / (height * 0.55),\n );\n const seed = (Math.imul(row + 11, 61) ^ Math.imul(col + 7, 137)) >>> 0;\n const core = Math.max(0, Math.min(1, (distance - 0.28) / 0.55));\n const opacity = core * (0.15 + (seed % 7) * 0.025) * 0.75;\n if (seed % 17 === 0 || opacity < 0.015) {\n continue;\n }\n ctx.globalAlpha = opacity;\n ctx.fillText(chars[(seed >>> 3) % chars.length], x, y);\n }\n }\n\n ctx.globalAlpha = 1;\n ctx.strokeStyle = colors.borderTopColor;\n for (const [x, y] of [\n [28, 28],\n [width - 28, 28],\n [28, height - 28],\n [width - 28, height - 28],\n ]) {\n ctx.beginPath();\n ctx.moveTo(x - 4, y);\n ctx.lineTo(x + 4, y);\n ctx.moveTo(x, y - 4);\n ctx.lineTo(x, y + 4);\n ctx.stroke();\n }\n }\n\n new ResizeObserver(draw).observe(canvas);\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', draw);\n draw();\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', setup, { once: true });\n } else {\n setup();\n }\n})();\n";
24
+ //#endregion
25
+ //#region src/runtime/error-pages/style.css?raw
26
+ var style_default = ":root {\n color-scheme: light dark;\n --background: light-dark(#fff, #16171d);\n --foreground: light-dark(#16171d, #f6f5f8);\n --muted: light-dark(#6e6874, #a8a2ae);\n --line: light-dark(#e5e4e7, #36323c);\n --ink: light-dark(#4e4856, #c3bdcd);\n --corner: light-dark(#e5e4e7, #3b3440);\n background: var(--background);\n color: var(--foreground);\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n\n* {\n box-sizing: border-box;\n}\n\nbody {\n margin: 0;\n}\n\n.error-page {\n position: relative;\n isolation: isolate;\n display: flex;\n align-items: center;\n justify-content: center;\n min-block-size: 100svh;\n overflow: hidden;\n}\n\n.error-content {\n min-inline-size: 0;\n padding: 32px 24px;\n text-align: center;\n}\n\n.error-content h1 {\n display: flex;\n flex-direction: column;\n gap: 18px;\n margin: 0;\n font-weight: 500;\n}\n\n.error-code {\n font-size: 64px;\n line-height: 1;\n letter-spacing: -0.045em;\n}\n\n.error-title {\n font-size: 15px;\n line-height: 1.4;\n letter-spacing: -0.02em;\n text-wrap: balance;\n}\n\n.error-description {\n margin: 6px 0 0;\n color: var(--muted);\n font-size: 12px;\n line-height: 1.5;\n letter-spacing: -0.01em;\n}\n\n.error-action {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n min-block-size: 32px;\n margin-block-start: 20px;\n padding: 6px 12px;\n border: 1px solid var(--line);\n border-radius: 6px;\n background: var(--background);\n color: var(--foreground);\n font:\n 500 12px/18px system-ui,\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n sans-serif;\n letter-spacing: -0.01em;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.error-action::after {\n position: absolute;\n inset: -6px -3px;\n content: '';\n}\n\n.error-action:hover {\n border-color: var(--foreground);\n background: var(--foreground);\n color: var(--background);\n}\n\n.error-action:focus-visible {\n outline: 2px solid var(--foreground);\n outline-offset: 4px;\n}\n\n.error-action[hidden] {\n visibility: hidden;\n}\n\n.error-arrow {\n font-size: 15px;\n line-height: 14px;\n}\n\n.error-texture {\n position: absolute;\n z-index: -1;\n inset: 0;\n display: block;\n inline-size: 100%;\n block-size: 100%;\n border-color: var(--line);\n color: var(--ink);\n}\n\n.grid-cell,\n.grid-tick {\n display: none;\n}\n\n.grid-tick {\n position: absolute;\n z-index: 1;\n inline-size: 0;\n block-size: 0;\n border: 5px solid transparent;\n pointer-events: none;\n}\n\n:root[data-design='grid'] .error-page {\n display: grid;\n grid-template-columns: minmax(24px, 1fr) minmax(0, 456px) minmax(24px, 1fr);\n grid-template-rows: minmax(24px, 1fr) minmax(272px, auto) minmax(24px, 1fr);\n align-items: stretch;\n}\n\n:root[data-design='grid'] .grid-cell,\n:root[data-design='grid'] .error-content {\n min-inline-size: 0;\n border-inline-end: 1px solid var(--line);\n border-block-end: 1px solid var(--line);\n}\n\n:root[data-design='grid'] .grid-cell {\n display: block;\n}\n\n:root[data-design='grid'] .grid-cell:nth-child(3n) {\n border-inline-end: 0;\n}\n\n:root[data-design='grid'] .grid-cell:nth-child(n + 7) {\n border-block-end: 0;\n}\n\n:root[data-design='grid'] .error-content {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n}\n\n:root[data-design='grid'] .grid-tick {\n display: block;\n}\n\n.grid-tick.left {\n left: -1px;\n border-left-color: var(--corner);\n}\n\n.grid-tick.right {\n right: 0;\n border-right-color: var(--corner);\n}\n\n.grid-tick.top {\n top: -5px;\n}\n\n.grid-tick.bottom {\n bottom: -5px;\n}\n\n:root[data-design='grid'] .error-texture,\n:root[data-design='fold'] .error-texture {\n display: none;\n}\n\n:root[data-design='fold'] .error-page {\n padding: 40px 42px;\n}\n\n:root[data-design='fold'] .error-content {\n flex: 0 1 560px;\n margin-inline-end: auto;\n padding: 0;\n text-align: start;\n}\n\n:root[data-design='fold'] h1 {\n flex-direction: row;\n align-items: baseline;\n gap: 14px;\n}\n\n:root[data-design='fold'] .error-code,\n:root[data-design='fold'] .error-title {\n font-size: 26px;\n line-height: 1.2;\n letter-spacing: -0.025em;\n}\n\n:root[data-design='fold'] .error-code {\n flex: none;\n color: var(--muted);\n font-family: ui-monospace, 'SFMono-Regular', Consolas, monospace;\n font-weight: 400;\n letter-spacing: -0.045em;\n}\n\n:root[data-design='fold'] .error-description {\n margin-block-start: 12px;\n font-size: 14px;\n line-height: 1.6;\n text-wrap: pretty;\n}\n\n:root[data-design='fold'] .error-action {\n margin-block-start: 24px;\n}\n\n@supports (corner-shape: squircle) {\n .error-action {\n border-radius: 12px;\n corner-shape: squircle;\n }\n}\n\n@media (pointer: coarse) {\n .error-action {\n min-block-size: 40px;\n }\n}\n\n@media (max-width: 620px) {\n :root[data-design='fold'] .error-page {\n padding: 36px 30px;\n }\n\n :root[data-design='fold'] .error-code,\n :root[data-design='fold'] .error-title {\n font-size: 24px;\n }\n}\n\n@media (max-width: 440px) {\n .error-code {\n font-size: 56px;\n }\n\n :root[data-design='grid'] .error-page {\n grid-template-columns: 24px minmax(0, 1fr) 24px;\n }\n\n :root[data-design='grid'] .error-content {\n padding: 24px;\n }\n\n :root[data-design='fold'] .error-code {\n display: none;\n }\n\n :root[data-design='fold'] .error-action {\n margin-block-start: 20px;\n }\n}\n";
27
+ //#endregion
28
+ //#region src/runtime/error-pages/index.ts
29
+ const pages = {
30
+ 404: inlineErrorPageAssets(_404_default, style_default, script_default),
31
+ 500: inlineErrorPageAssets(_500_default, style_default, script_default)
32
+ };
33
+ function renderDefaultErrorPage(status) {
34
+ return pages[status];
35
+ }
36
+ //#endregion
37
+ export { renderDefaultErrorPage as t };
@@ -0,0 +1 @@
1
+ export { r as runGenCommand } from "./gen-CFmsUsW1.mjs";
@@ -1,8 +1,8 @@
1
1
  import { a as join, n as dirname, s as relative } from "./dist-ipQi0Q8y.mjs";
2
2
  import { n as readProjectPaths } from "./project-paths-DGu_QZ_Q.mjs";
3
- import { l as getDatabaseDialect, p as readConfig } from "./config-DHgSEWT7.mjs";
3
+ import { l as getDatabaseDialect, p as readConfig } from "./config-OFOAimzt.mjs";
4
4
  import { n as readJournal, t as collectMigrations } from "./collect-Dew86qce.mjs";
5
- import { r as writeDrizzleConfig, t as PLACEHOLDER_DB_URL } from "./config-BIaXIkkv.mjs";
5
+ import { r as writeDrizzleConfig, t as PLACEHOLDER_DB_URL } from "./config-tqMM6DwY.mjs";
6
6
  import { t as assertJournalCoherence } from "./validate-CnZPMq4q.mjs";
7
7
  import { K as select, L as log, O as cancel, tt as isCancel } from "./dist-Cor9XGoz.mjs";
8
8
  import { m as printSuccess } from "./output-BpgYODYx.mjs";
@@ -329,7 +329,7 @@ async function runModel(root, name, columns) {
329
329
  const existing = readFileSync(barrelPath, "utf-8");
330
330
  if (!existing.includes(exportLine)) writeFileSync(barrelPath, existing.trimEnd() + "\n" + exportLine + "\n");
331
331
  } else writeFileSync(barrelPath, exportLine + "\n");
332
- const { prepareProject } = await import("./prepare-B3VrSF1Z.mjs");
332
+ const { prepareProject } = await import("./prepare-DU-tOpS5.mjs");
333
333
  await prepareProject(root);
334
334
  log.step(`Created ${relative(root, modelPath)}`);
335
335
  log.step(`Updated ${relative(root, barrelPath)}`);
@@ -1,7 +1,7 @@
1
1
  import { r as readProjectConfig } from "./project-rqDnVsJN.mjs";
2
2
  import { c as getToken, n as createCodeChallenge, r as createCodeVerifier, t as awaitBrowserCallback, u as openBrowser } from "./auth-B6iOCjKI.mjs";
3
3
  import { A as confirm, K as select, L as log, O as cancel, X as text, tt as isCancel } from "./dist-Cor9XGoz.mjs";
4
- import { c as platformErrorMessage, n as PlatformApiError, r as PlatformClient, s as parsePlatformErrorBody } from "./client-BEMtySaV.mjs";
4
+ import { c as platformErrorMessage, n as PlatformApiError, r as PlatformClient, s as parsePlatformErrorBody } from "./client-B3LnB_bE.mjs";
5
5
  import { f as import_picocolors, l as formatUrl, m as printSuccess } from "./output-BpgYODYx.mjs";
6
6
  import { a as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-Xoi6eTWY.mjs";
7
7
  import { t as collectGitDeployMetadata } from "./git-metadata-D-gurjzG.mjs";
@@ -1,7 +1,7 @@
1
1
  import { l as VoidPlatformSandbox } from "./sandbox-q3waMc2T.mjs";
2
2
  import { t as StandardSchemaV1 } from "./standard-schema-Fo_vCAZh.mjs";
3
3
  import { n as HeadDescriptor } from "./head-C8K_iGe6.mjs";
4
- import { r as AuthUser, t as AuthSession } from "./auth-DkcFflXV.mjs";
4
+ import { r as AuthUser, t as AuthSession } from "./auth-g2TQbDLD.mjs";
5
5
  import { t as DevCssAsset } from "./types-w72dljaA.mjs";
6
6
  import { Context, Env, ExecutionContext as ExecutionContext$1, MiddlewareHandler } from "hono";
7
7
  import { RewriteDestination } from "void/routes";
@@ -64,6 +64,8 @@ type WorkerFetchOptions = {
64
64
  withRuntimeEnv: (env: RuntimeEnvironment, fn: () => Promise<Response>) => Promise<Response>;
65
65
  filterBindings: (env: RuntimeEnvironment) => RuntimeEnvironment;
66
66
  validateEnv?: (env: RuntimeEnvironment) => Promise<void>;
67
+ /** Native Cloudflare production builds redirect public HTTP requests to HTTPS. */
68
+ alwaysUseHttps?: boolean;
67
69
  /** Authored/generated version metadata binding used to prove the served native version. */
68
70
  versionMetadataBinding?: string;
69
71
  remoteEnv?: (env: RuntimeEnvironment) => RuntimeEnvironment;
@@ -1,5 +1,5 @@
1
1
  import { a as join } from "./dist-ipQi0Q8y.mjs";
2
- import { a as convertRewritesConfig, d as isProtocolRelative, f as parseHostPrefixedSource, i as convertRedirectsConfig, n as convertFallbacksConfig, o as countSplats, r as convertHeadersConfig, t as VALID_REDIRECT_STATUSES } from "./config-DHgSEWT7.mjs";
2
+ import { a as convertRewritesConfig, d as isProtocolRelative, f as parseHostPrefixedSource, i as convertRedirectsConfig, n as convertFallbacksConfig, o as countSplats, r as convertHeadersConfig, t as VALID_REDIRECT_STATUSES } from "./config-OFOAimzt.mjs";
3
3
  import { i as voidWarn } from "./log-BMwmN5Ae.mjs";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  //#region src/cli/headers.ts
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as HeadDescriptor } from "./head-C8K_iGe6.mjs";
2
- import { r as AuthUser } from "./auth-DkcFflXV.mjs";
2
+ import { r as AuthUser } from "./auth-g2TQbDLD.mjs";
3
3
  import { s as RouteEnvironment } from "./types-w72dljaA.mjs";
4
- import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, x as DeferredState, y as defineScheduled } from "./handler-CQv5YDS0.mjs";
4
+ import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, x as DeferredState, y as defineScheduled } from "./handler-BHktmuTL.mjs";
5
5
  import { t as QueueMap } from "./queues-BWKt1Xo4.mjs";
6
6
  import { PluginConfig } from "@cloudflare/vite-plugin";
7
7
  import { Plugin } from "vite";