devflare 1.0.0-next.4 → 1.0.0-next.40

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 (577) hide show
  1. package/LICENSE +21 -0
  2. package/LLM.md +15966 -2139
  3. package/README.md +393 -605
  4. package/bin/devflare.js +22 -14
  5. package/dist/_chunks/account-BtWcv3X9.js +462 -0
  6. package/dist/_chunks/account-resources-CsmVowJp.js +159 -0
  7. package/dist/_chunks/ai-CBEuLdoP.js +322 -0
  8. package/dist/_chunks/api-TzdliH-6.js +568 -0
  9. package/dist/_chunks/build-3T6O4uIg.js +24 -0
  10. package/dist/_chunks/build-artifacts-8TqBSQkG.js +483 -0
  11. package/dist/_chunks/cli-BTF1X4SG.js +1128 -0
  12. package/dist/_chunks/cloudflare-BaloqI3H.js +157 -0
  13. package/dist/_chunks/colors-DiK6wPJ5.js +13 -0
  14. package/dist/_chunks/command-utils-BsfkmTqh.js +45 -0
  15. package/dist/_chunks/compiler-uoyAQ8zW.js +424 -0
  16. package/dist/_chunks/config-D5u-bEkn.js +78 -0
  17. package/dist/_chunks/config-path-DCPto4XB.js +42 -0
  18. package/dist/_chunks/context-CX50Y2Kb.js +2250 -0
  19. package/dist/_chunks/decorators-QmV57ixr.js +19 -0
  20. package/dist/_chunks/dependencies-C2oxFjU_.js +57 -0
  21. package/dist/_chunks/deploy-DMTr6JeR.js +915 -0
  22. package/dist/_chunks/dev-CvRHmRFZ.js +3456 -0
  23. package/dist/_chunks/doctor-DIG8DoFU.js +219 -0
  24. package/dist/_chunks/durable-object-DMtH0XYX.js +234 -0
  25. package/dist/_chunks/env-S0_nMVz1.js +125 -0
  26. package/dist/_chunks/family-DXC5SdFK.js +143 -0
  27. package/dist/_chunks/generated-artifacts-dMJY4KAt.js +32 -0
  28. package/dist/_chunks/glob-CmQOvunB.js +56 -0
  29. package/dist/_chunks/init-3moXTgpb.js +165 -0
  30. package/dist/_chunks/loader-DLXO60RO.js +1153 -0
  31. package/dist/_chunks/local-dev-vars-CTSa-wvF.js +81 -0
  32. package/dist/_chunks/local-hyperdrive-CJ90j46O.js +119 -0
  33. package/dist/_chunks/local-media-bindings-DsAW4AMF.js +335 -0
  34. package/dist/_chunks/local-secrets-DMmEOygL.js +123 -0
  35. package/dist/_chunks/local-workflow-entrypoints-Wip3o1u8.js +90 -0
  36. package/dist/_chunks/login-BmnDzDlH.js +51 -0
  37. package/dist/_chunks/package-metadata-DAuCkyvK.js +39 -0
  38. package/dist/_chunks/preferences-BKp_7XJx.js +241 -0
  39. package/dist/_chunks/preview-BhqDmq8I.js +456 -0
  40. package/dist/_chunks/preview-registry-ClAbLTHH.js +1186 -0
  41. package/dist/_chunks/preview-resources-DdXj8LMM.js +358 -0
  42. package/dist/_chunks/previews-Dlr13x5M.js +1134 -0
  43. package/dist/_chunks/productions-D3AnOHac.js +411 -0
  44. package/dist/_chunks/ref-CYJNAAe_.js +178 -0
  45. package/dist/_chunks/remote-CZnP-HLJ.js +79 -0
  46. package/dist/_chunks/remote-config-D39BY9ji.js +132 -0
  47. package/dist/_chunks/resolve-package-Y84HB3Nt.js +133 -0
  48. package/dist/_chunks/rolldown-runtime-CvQ6eiug.js +14 -0
  49. package/dist/_chunks/routes-C3FqES2W.js +796 -0
  50. package/dist/_chunks/runtime-FvXvfuZ2.js +550 -0
  51. package/dist/_chunks/schema-normalization-DWVleVxo.js +477 -0
  52. package/dist/_chunks/secrets-70eN0Q6C.js +95 -0
  53. package/dist/_chunks/token-kguIDmej.js +333 -0
  54. package/dist/_chunks/tokens-iVcgNXi-.js +221 -0
  55. package/dist/_chunks/types-OrLbzv4I.js +476 -0
  56. package/dist/_chunks/ui-BUoZApvE.js +103 -0
  57. package/dist/_chunks/usage-BBTGzjon.js +272 -0
  58. package/dist/_chunks/vite-CsI0E-uV.js +1235 -0
  59. package/dist/_chunks/vite-utils-OVLMV605.js +183 -0
  60. package/dist/_chunks/worker-CS1jgNFE.js +410 -0
  61. package/dist/_chunks/worker-bundler-dTTnYU3n.js +458 -0
  62. package/dist/_chunks/worker-entrypoint-CQW77lG8.js +247 -0
  63. package/dist/_chunks/workerName-CFJsLZA-.js +23 -0
  64. package/dist/bridge/client.d.ts +49 -7
  65. package/dist/bridge/client.d.ts.map +1 -1
  66. package/dist/bridge/gateway-runtime.d.ts +8 -0
  67. package/dist/bridge/gateway-runtime.d.ts.map +1 -0
  68. package/dist/bridge/index.d.ts +6 -6
  69. package/dist/bridge/index.d.ts.map +1 -1
  70. package/dist/bridge/log.d.ts +5 -0
  71. package/dist/bridge/log.d.ts.map +1 -0
  72. package/dist/bridge/miniflare.d.ts +75 -2
  73. package/dist/bridge/miniflare.d.ts.map +1 -1
  74. package/dist/bridge/proxy.d.ts +12 -11
  75. package/dist/bridge/proxy.d.ts.map +1 -1
  76. package/dist/bridge/server.d.ts +2 -1
  77. package/dist/bridge/server.d.ts.map +1 -1
  78. package/dist/bridge/v2/body-streams.d.ts +53 -0
  79. package/dist/bridge/v2/body-streams.d.ts.map +1 -0
  80. package/dist/bridge/v2/codec.d.ts +106 -0
  81. package/dist/bridge/v2/codec.d.ts.map +1 -0
  82. package/dist/bridge/v2/control-messages.d.ts +46 -0
  83. package/dist/bridge/v2/control-messages.d.ts.map +1 -0
  84. package/dist/bridge/v2/frames.d.ts +109 -0
  85. package/dist/bridge/v2/frames.d.ts.map +1 -0
  86. package/dist/bridge/v2/index.d.ts +11 -0
  87. package/dist/bridge/v2/index.d.ts.map +1 -0
  88. package/dist/bridge/v2/serialization.d.ts +48 -0
  89. package/dist/bridge/v2/serialization.d.ts.map +1 -0
  90. package/dist/bridge/v2/transport.d.ts +31 -0
  91. package/dist/bridge/v2/transport.d.ts.map +1 -0
  92. package/dist/bridge/v2/value-codec.d.ts +61 -0
  93. package/dist/bridge/v2/value-codec.d.ts.map +1 -0
  94. package/dist/bridge/{serialization.d.ts → v2/value-serialization.d.ts} +40 -18
  95. package/dist/bridge/v2/value-serialization.d.ts.map +1 -0
  96. package/dist/bridge/{protocol.d.ts → v2/wire.d.ts} +32 -8
  97. package/dist/bridge/v2/wire.d.ts.map +1 -0
  98. package/dist/bridge/v2/ws-relay.d.ts +53 -0
  99. package/dist/bridge/v2/ws-relay.d.ts.map +1 -0
  100. package/dist/browser-shim/handler.d.ts +2 -2
  101. package/dist/browser-shim/handler.d.ts.map +1 -1
  102. package/dist/browser-shim/index.d.ts +2 -2
  103. package/dist/browser-shim/server.d.ts +63 -0
  104. package/dist/browser-shim/server.d.ts.map +1 -1
  105. package/dist/browser.d.ts +4621 -0
  106. package/dist/browser.d.ts.map +1 -0
  107. package/dist/browser.js +80 -0
  108. package/dist/bundler/defaults.d.ts +23 -0
  109. package/dist/bundler/defaults.d.ts.map +1 -0
  110. package/dist/bundler/do-bundler.d.ts +7 -0
  111. package/dist/bundler/do-bundler.d.ts.map +1 -1
  112. package/dist/bundler/index.d.ts +3 -1
  113. package/dist/bundler/index.d.ts.map +1 -1
  114. package/dist/bundler/rolldown-shared.d.ts +53 -0
  115. package/dist/bundler/rolldown-shared.d.ts.map +1 -0
  116. package/dist/bundler/worker-bundler.d.ts +13 -0
  117. package/dist/bundler/worker-bundler.d.ts.map +1 -0
  118. package/dist/bundler/worker-compat.d.ts +4 -0
  119. package/dist/bundler/worker-compat.d.ts.map +1 -0
  120. package/dist/cli/build-manifest.d.ts +66 -0
  121. package/dist/cli/build-manifest.d.ts.map +1 -0
  122. package/dist/cli/command-utils.d.ts +18 -0
  123. package/dist/cli/command-utils.d.ts.map +1 -0
  124. package/dist/cli/commands/account.d.ts +2 -2
  125. package/dist/cli/commands/account.d.ts.map +1 -1
  126. package/dist/cli/commands/ai.d.ts +1 -1
  127. package/dist/cli/commands/ai.d.ts.map +1 -1
  128. package/dist/cli/commands/build-artifacts.d.ts +40 -0
  129. package/dist/cli/commands/build-artifacts.d.ts.map +1 -0
  130. package/dist/cli/commands/build.d.ts +2 -2
  131. package/dist/cli/commands/build.d.ts.map +1 -1
  132. package/dist/cli/commands/config.d.ts +4 -0
  133. package/dist/cli/commands/config.d.ts.map +1 -0
  134. package/dist/cli/commands/deploy/metadata.d.ts +18 -0
  135. package/dist/cli/commands/deploy/metadata.d.ts.map +1 -0
  136. package/dist/cli/commands/deploy/prepare.d.ts +23 -0
  137. package/dist/cli/commands/deploy/prepare.d.ts.map +1 -0
  138. package/dist/cli/commands/deploy/runtime.d.ts +4 -0
  139. package/dist/cli/commands/deploy/runtime.d.ts.map +1 -0
  140. package/dist/cli/commands/deploy/verification.d.ts +36 -0
  141. package/dist/cli/commands/deploy/verification.d.ts.map +1 -0
  142. package/dist/cli/commands/deploy.d.ts +2 -2
  143. package/dist/cli/commands/deploy.d.ts.map +1 -1
  144. package/dist/cli/commands/dev.d.ts +9 -1
  145. package/dist/cli/commands/dev.d.ts.map +1 -1
  146. package/dist/cli/commands/doctor.d.ts +2 -2
  147. package/dist/cli/commands/doctor.d.ts.map +1 -1
  148. package/dist/cli/commands/init.d.ts +2 -2
  149. package/dist/cli/commands/init.d.ts.map +1 -1
  150. package/dist/cli/commands/login.d.ts +4 -0
  151. package/dist/cli/commands/login.d.ts.map +1 -0
  152. package/dist/cli/commands/previews-support/cleanup.d.ts +9 -0
  153. package/dist/cli/commands/previews-support/cleanup.d.ts.map +1 -0
  154. package/dist/cli/commands/previews-support/family.d.ts +10 -0
  155. package/dist/cli/commands/previews-support/family.d.ts.map +1 -0
  156. package/dist/cli/commands/previews-support/render.d.ts +8 -0
  157. package/dist/cli/commands/previews-support/render.d.ts.map +1 -0
  158. package/dist/cli/commands/previews-support/theme.d.ts +10 -0
  159. package/dist/cli/commands/previews-support/theme.d.ts.map +1 -0
  160. package/dist/cli/commands/previews-support/types.d.ts +70 -0
  161. package/dist/cli/commands/previews-support/types.d.ts.map +1 -0
  162. package/dist/cli/commands/previews.d.ts +4 -0
  163. package/dist/cli/commands/previews.d.ts.map +1 -0
  164. package/dist/cli/commands/productions.d.ts +4 -0
  165. package/dist/cli/commands/productions.d.ts.map +1 -0
  166. package/dist/cli/commands/remote.d.ts +1 -1
  167. package/dist/cli/commands/remote.d.ts.map +1 -1
  168. package/dist/cli/commands/secrets.d.ts +4 -0
  169. package/dist/cli/commands/secrets.d.ts.map +1 -0
  170. package/dist/cli/commands/token.d.ts +4 -0
  171. package/dist/cli/commands/token.d.ts.map +1 -0
  172. package/dist/cli/commands/type-generation/discovery.d.ts +7 -0
  173. package/dist/cli/commands/type-generation/discovery.d.ts.map +1 -0
  174. package/dist/cli/commands/type-generation/generator.d.ts +112 -0
  175. package/dist/cli/commands/type-generation/generator.d.ts.map +1 -0
  176. package/dist/cli/commands/type-generation/models.d.ts +27 -0
  177. package/dist/cli/commands/type-generation/models.d.ts.map +1 -0
  178. package/dist/cli/commands/types.d.ts +2 -2
  179. package/dist/cli/commands/types.d.ts.map +1 -1
  180. package/dist/cli/commands/worker.d.ts +4 -0
  181. package/dist/cli/commands/worker.d.ts.map +1 -0
  182. package/dist/cli/config-path.d.ts +6 -0
  183. package/dist/cli/config-path.d.ts.map +1 -0
  184. package/dist/cli/dependencies.d.ts +2 -1
  185. package/dist/cli/dependencies.d.ts.map +1 -1
  186. package/dist/cli/deploy-strategy.d.ts +17 -0
  187. package/dist/cli/deploy-strategy.d.ts.map +1 -0
  188. package/dist/cli/deploy-target.d.ts +17 -0
  189. package/dist/cli/deploy-target.d.ts.map +1 -0
  190. package/dist/cli/generated-artifacts.d.ts +12 -0
  191. package/dist/cli/generated-artifacts.d.ts.map +1 -0
  192. package/dist/cli/help-pages/pages/account.d.ts +3 -0
  193. package/dist/cli/help-pages/pages/account.d.ts.map +1 -0
  194. package/dist/cli/help-pages/pages/core.d.ts +4 -0
  195. package/dist/cli/help-pages/pages/core.d.ts.map +1 -0
  196. package/dist/cli/help-pages/pages/index.d.ts +3 -0
  197. package/dist/cli/help-pages/pages/index.d.ts.map +1 -0
  198. package/dist/cli/help-pages/pages/misc.d.ts +3 -0
  199. package/dist/cli/help-pages/pages/misc.d.ts.map +1 -0
  200. package/dist/cli/help-pages/pages/previews.d.ts +3 -0
  201. package/dist/cli/help-pages/pages/previews.d.ts.map +1 -0
  202. package/dist/cli/help-pages/pages/productions.d.ts +3 -0
  203. package/dist/cli/help-pages/pages/productions.d.ts.map +1 -0
  204. package/dist/cli/help-pages/render.d.ts +12 -0
  205. package/dist/cli/help-pages/render.d.ts.map +1 -0
  206. package/dist/cli/help-pages/shared.d.ts +15 -0
  207. package/dist/cli/help-pages/shared.d.ts.map +1 -0
  208. package/dist/cli/help-pages/types.d.ts +23 -0
  209. package/dist/cli/help-pages/types.d.ts.map +1 -0
  210. package/dist/cli/help.d.ts +6 -0
  211. package/dist/cli/help.d.ts.map +1 -0
  212. package/dist/cli/index.d.ts +1 -0
  213. package/dist/cli/index.d.ts.map +1 -1
  214. package/dist/cli/index.js +2 -0
  215. package/dist/cli/package-metadata.d.ts +16 -0
  216. package/dist/cli/package-metadata.d.ts.map +1 -0
  217. package/dist/cli/preview-bindings.d.ts +49 -0
  218. package/dist/cli/preview-bindings.d.ts.map +1 -0
  219. package/dist/cli/preview.d.ts +10 -0
  220. package/dist/cli/preview.d.ts.map +1 -0
  221. package/dist/cli/ui.d.ts +37 -0
  222. package/dist/cli/ui.d.ts.map +1 -0
  223. package/dist/cli/workspace-build-guard.d.ts +14 -0
  224. package/dist/cli/workspace-build-guard.d.ts.map +1 -0
  225. package/dist/cli/wrangler-auth.d.ts +1 -1
  226. package/dist/cloudflare/account-core.d.ts +6 -0
  227. package/dist/cloudflare/account-core.d.ts.map +1 -0
  228. package/dist/cloudflare/account-resources.d.ts +40 -0
  229. package/dist/cloudflare/account-resources.d.ts.map +1 -0
  230. package/dist/cloudflare/account-status.d.ts +11 -0
  231. package/dist/cloudflare/account-status.d.ts.map +1 -0
  232. package/dist/cloudflare/account-workers.d.ts +14 -0
  233. package/dist/cloudflare/account-workers.d.ts.map +1 -0
  234. package/dist/cloudflare/account.d.ts +7 -64
  235. package/dist/cloudflare/account.d.ts.map +1 -1
  236. package/dist/cloudflare/api.d.ts +71 -3
  237. package/dist/cloudflare/api.d.ts.map +1 -1
  238. package/dist/cloudflare/auth.d.ts +1 -1
  239. package/dist/cloudflare/auth.d.ts.map +1 -1
  240. package/dist/cloudflare/index.d.ts +61 -6
  241. package/dist/cloudflare/index.d.ts.map +1 -1
  242. package/dist/cloudflare/index.js +4 -13
  243. package/dist/cloudflare/known-permission-group-ids.generated.d.ts +10 -0
  244. package/dist/cloudflare/known-permission-group-ids.generated.d.ts.map +1 -0
  245. package/dist/cloudflare/kv-namespace.d.ts +4 -0
  246. package/dist/cloudflare/kv-namespace.d.ts.map +1 -0
  247. package/dist/cloudflare/preferences.d.ts +7 -0
  248. package/dist/cloudflare/preferences.d.ts.map +1 -1
  249. package/dist/cloudflare/preview-registry-cache.d.ts +6 -0
  250. package/dist/cloudflare/preview-registry-cache.d.ts.map +1 -0
  251. package/dist/cloudflare/preview-registry-inference.d.ts +14 -0
  252. package/dist/cloudflare/preview-registry-inference.d.ts.map +1 -0
  253. package/dist/cloudflare/preview-registry-records.d.ts +4 -0
  254. package/dist/cloudflare/preview-registry-records.d.ts.map +1 -0
  255. package/dist/cloudflare/preview-registry-shape.d.ts +47 -0
  256. package/dist/cloudflare/preview-registry-shape.d.ts.map +1 -0
  257. package/dist/cloudflare/preview-registry-store.d.ts +14 -0
  258. package/dist/cloudflare/preview-registry-store.d.ts.map +1 -0
  259. package/dist/cloudflare/preview-registry-transport.d.ts +4 -0
  260. package/dist/cloudflare/preview-registry-transport.d.ts.map +1 -0
  261. package/dist/cloudflare/preview-registry-types.d.ts +103 -0
  262. package/dist/cloudflare/preview-registry-types.d.ts.map +1 -0
  263. package/dist/cloudflare/preview-registry.d.ts +42 -0
  264. package/dist/cloudflare/preview-registry.d.ts.map +1 -0
  265. package/dist/cloudflare/preview-urls.d.ts +3 -0
  266. package/dist/cloudflare/preview-urls.d.ts.map +1 -0
  267. package/dist/cloudflare/registry-schema.d.ts +253 -0
  268. package/dist/cloudflare/registry-schema.d.ts.map +1 -0
  269. package/dist/cloudflare/remote-config.d.ts.map +1 -1
  270. package/dist/cloudflare/tokens.d.ts +44 -0
  271. package/dist/cloudflare/tokens.d.ts.map +1 -0
  272. package/dist/cloudflare/types.d.ts +124 -7
  273. package/dist/cloudflare/types.d.ts.map +1 -1
  274. package/dist/cloudflare/usage.d.ts +31 -3
  275. package/dist/cloudflare/usage.d.ts.map +1 -1
  276. package/dist/config/binding-resolution-helpers.d.ts +41 -0
  277. package/dist/config/binding-resolution-helpers.d.ts.map +1 -0
  278. package/dist/config/compatibility.d.ts +3 -0
  279. package/dist/config/compatibility.d.ts.map +1 -0
  280. package/dist/config/compiler/bindings.d.ts +14 -0
  281. package/dist/config/compiler/bindings.d.ts.map +1 -0
  282. package/dist/config/compiler/core-helpers.d.ts +6 -0
  283. package/dist/config/compiler/core-helpers.d.ts.map +1 -0
  284. package/dist/config/compiler/do-workers.d.ts +34 -0
  285. package/dist/config/compiler/do-workers.d.ts.map +1 -0
  286. package/dist/config/compiler/paths.d.ts +18 -0
  287. package/dist/config/compiler/paths.d.ts.map +1 -0
  288. package/dist/config/compiler/types.d.ts +270 -0
  289. package/dist/config/compiler/types.d.ts.map +1 -0
  290. package/dist/config/compiler.d.ts +22 -134
  291. package/dist/config/compiler.d.ts.map +1 -1
  292. package/dist/config/define.d.ts +8 -5
  293. package/dist/config/define.d.ts.map +1 -1
  294. package/dist/config/deploy-resources.d.ts +58 -0
  295. package/dist/config/deploy-resources.d.ts.map +1 -0
  296. package/dist/config/env-vars.d.ts +309 -0
  297. package/dist/config/env-vars.d.ts.map +1 -0
  298. package/dist/config/framework-providers.d.ts +9 -0
  299. package/dist/config/framework-providers.d.ts.map +1 -0
  300. package/dist/config/index.d.ts +12 -5
  301. package/dist/config/index.d.ts.map +1 -1
  302. package/dist/config/loader.d.ts +2 -1
  303. package/dist/config/loader.d.ts.map +1 -1
  304. package/dist/config/local-dev-vars.d.ts +15 -0
  305. package/dist/config/local-dev-vars.d.ts.map +1 -0
  306. package/dist/config/preview-resources.d.ts +83 -0
  307. package/dist/config/preview-resources.d.ts.map +1 -0
  308. package/dist/config/preview.d.ts +29 -0
  309. package/dist/config/preview.d.ts.map +1 -0
  310. package/dist/config/ref.d.ts +16 -25
  311. package/dist/config/ref.d.ts.map +1 -1
  312. package/dist/config/resolve-phased.d.ts +72 -0
  313. package/dist/config/resolve-phased.d.ts.map +1 -0
  314. package/dist/config/resolve.d.ts +11 -0
  315. package/dist/config/resolve.d.ts.map +1 -0
  316. package/dist/config/resource-resolution.d.ts +80 -0
  317. package/dist/config/resource-resolution.d.ts.map +1 -0
  318. package/dist/config/schema-bindings.d.ts +1495 -0
  319. package/dist/config/schema-bindings.d.ts.map +1 -0
  320. package/dist/config/schema-build.d.ts +67 -0
  321. package/dist/config/schema-build.d.ts.map +1 -0
  322. package/dist/config/schema-env.d.ts +3023 -0
  323. package/dist/config/schema-env.d.ts.map +1 -0
  324. package/dist/config/schema-normalization.d.ts +184 -0
  325. package/dist/config/schema-normalization.d.ts.map +1 -0
  326. package/dist/config/schema-runtime.d.ts +500 -0
  327. package/dist/config/schema-runtime.d.ts.map +1 -0
  328. package/dist/config/schema-types-bindings-platform.d.ts +378 -0
  329. package/dist/config/schema-types-bindings-platform.d.ts.map +1 -0
  330. package/dist/config/schema-types-bindings-resources.d.ts +550 -0
  331. package/dist/config/schema-types-bindings-resources.d.ts.map +1 -0
  332. package/dist/config/schema-types-bindings.d.ts +254 -0
  333. package/dist/config/schema-types-bindings.d.ts.map +1 -0
  334. package/dist/config/schema-types-build.d.ts +86 -0
  335. package/dist/config/schema-types-build.d.ts.map +1 -0
  336. package/dist/config/schema-types-runtime.d.ts +917 -0
  337. package/dist/config/schema-types-runtime.d.ts.map +1 -0
  338. package/dist/config/schema-types.d.ts +424 -0
  339. package/dist/config/schema-types.d.ts.map +1 -0
  340. package/dist/config/schema.d.ts +4537 -2214
  341. package/dist/config/schema.d.ts.map +1 -1
  342. package/dist/config/service-bindings-validation.d.ts +36 -0
  343. package/dist/config/service-bindings-validation.d.ts.map +1 -0
  344. package/dist/config-entry.d.ts +7 -0
  345. package/dist/config-entry.d.ts.map +1 -0
  346. package/dist/config-entry.js +3 -0
  347. package/dist/decorators/durable-object.d.ts.map +1 -1
  348. package/dist/decorators/index.d.ts +2 -2
  349. package/dist/decorators/index.js +2 -9
  350. package/dist/dev-server/d1-migrations.d.ts +36 -0
  351. package/dist/dev-server/d1-migrations.d.ts.map +1 -0
  352. package/dist/dev-server/dev-server-state.d.ts +59 -0
  353. package/dist/dev-server/dev-server-state.d.ts.map +1 -0
  354. package/dist/dev-server/gateway-script.d.ts +21 -0
  355. package/dist/dev-server/gateway-script.d.ts.map +1 -0
  356. package/dist/dev-server/index.d.ts +1 -1
  357. package/dist/dev-server/miniflare-bindings.d.ts +59 -0
  358. package/dist/dev-server/miniflare-bindings.d.ts.map +1 -0
  359. package/dist/dev-server/miniflare-dev-config.d.ts +36 -0
  360. package/dist/dev-server/miniflare-dev-config.d.ts.map +1 -0
  361. package/dist/dev-server/miniflare-log.d.ts +20 -0
  362. package/dist/dev-server/miniflare-log.d.ts.map +1 -0
  363. package/dist/dev-server/miniflare-worker-config.d.ts +74 -0
  364. package/dist/dev-server/miniflare-worker-config.d.ts.map +1 -0
  365. package/dist/dev-server/reload-queue.d.ts +13 -0
  366. package/dist/dev-server/reload-queue.d.ts.map +1 -0
  367. package/dist/dev-server/runtime-stdio.d.ts +8 -0
  368. package/dist/dev-server/runtime-stdio.d.ts.map +1 -0
  369. package/dist/dev-server/server-startup-helpers.d.ts +84 -0
  370. package/dist/dev-server/server-startup-helpers.d.ts.map +1 -0
  371. package/dist/dev-server/server.d.ts +2 -0
  372. package/dist/dev-server/server.d.ts.map +1 -1
  373. package/dist/dev-server/vite-process.d.ts +15 -0
  374. package/dist/dev-server/vite-process.d.ts.map +1 -0
  375. package/dist/dev-server/vite-utils.d.ts +19 -1
  376. package/dist/dev-server/vite-utils.d.ts.map +1 -1
  377. package/dist/dev-server/worker-source-watcher.d.ts +17 -0
  378. package/dist/dev-server/worker-source-watcher.d.ts.map +1 -0
  379. package/dist/dev-server/worker-surface-paths.d.ts +6 -0
  380. package/dist/dev-server/worker-surface-paths.d.ts.map +1 -0
  381. package/dist/env.d.ts +10 -0
  382. package/dist/env.d.ts.map +1 -1
  383. package/dist/index.d.ts +8 -12
  384. package/dist/index.d.ts.map +1 -1
  385. package/dist/index.js +9 -298
  386. package/dist/runtime/context-events.d.ts +13 -0
  387. package/dist/runtime/context-events.d.ts.map +1 -0
  388. package/dist/runtime/context-types.d.ts +82 -0
  389. package/dist/runtime/context-types.d.ts.map +1 -0
  390. package/dist/runtime/context.d.ts +20 -44
  391. package/dist/runtime/context.d.ts.map +1 -1
  392. package/dist/runtime/exports.d.ts +70 -55
  393. package/dist/runtime/exports.d.ts.map +1 -1
  394. package/dist/runtime/index.d.ts +10 -3
  395. package/dist/runtime/index.d.ts.map +1 -1
  396. package/dist/runtime/index.js +5 -111
  397. package/dist/runtime/middleware.d.ts +102 -60
  398. package/dist/runtime/middleware.d.ts.map +1 -1
  399. package/dist/runtime/router/index.d.ts +7 -0
  400. package/dist/runtime/router/index.d.ts.map +1 -0
  401. package/dist/runtime/router/types.d.ts +24 -0
  402. package/dist/runtime/router/types.d.ts.map +1 -0
  403. package/dist/runtime/validation.d.ts +18 -4
  404. package/dist/runtime/validation.d.ts.map +1 -1
  405. package/dist/secrets/local-secrets.d.ts +46 -0
  406. package/dist/secrets/local-secrets.d.ts.map +1 -0
  407. package/dist/shims/local-hyperdrive.d.ts +12 -0
  408. package/dist/shims/local-hyperdrive.d.ts.map +1 -0
  409. package/dist/shims/local-media-bindings.d.ts +19 -0
  410. package/dist/shims/local-media-bindings.d.ts.map +1 -0
  411. package/dist/shims/local-worker-loader.d.ts +3 -0
  412. package/dist/shims/local-worker-loader.d.ts.map +1 -0
  413. package/dist/sveltekit/index.d.ts +1 -1
  414. package/dist/sveltekit/index.d.ts.map +1 -1
  415. package/dist/sveltekit/index.js +313 -167
  416. package/dist/sveltekit/local-bindings.d.ts +4 -0
  417. package/dist/sveltekit/local-bindings.d.ts.map +1 -0
  418. package/dist/sveltekit/platform.d.ts +20 -2
  419. package/dist/sveltekit/platform.d.ts.map +1 -1
  420. package/dist/test/ai-search.d.ts +39 -0
  421. package/dist/test/ai-search.d.ts.map +1 -0
  422. package/dist/test/binding-hints.d.ts +10 -0
  423. package/dist/test/binding-hints.d.ts.map +1 -0
  424. package/dist/test/cf.d.ts +49 -35
  425. package/dist/test/cf.d.ts.map +1 -1
  426. package/dist/test/containers.d.ts +87 -0
  427. package/dist/test/containers.d.ts.map +1 -0
  428. package/dist/test/email.d.ts +16 -7
  429. package/dist/test/email.d.ts.map +1 -1
  430. package/dist/test/index.d.ts +18 -21
  431. package/dist/test/index.d.ts.map +1 -1
  432. package/dist/test/index.js +4495 -70
  433. package/dist/test/offline-bindings.d.ts +81 -0
  434. package/dist/test/offline-bindings.d.ts.map +1 -0
  435. package/dist/test/queue.d.ts.map +1 -1
  436. package/dist/test/remote-ai.d.ts.map +1 -1
  437. package/dist/test/remote-cloudflare.d.ts +13 -0
  438. package/dist/test/remote-cloudflare.d.ts.map +1 -0
  439. package/dist/test/remote-vectorize.d.ts.map +1 -1
  440. package/dist/test/resolve-service-bindings.d.ts +64 -4
  441. package/dist/test/resolve-service-bindings.d.ts.map +1 -1
  442. package/dist/test/scheduled.d.ts.map +1 -1
  443. package/dist/test/should-skip.d.ts +14 -18
  444. package/dist/test/should-skip.d.ts.map +1 -1
  445. package/dist/test/simple-context-bindings.d.ts +13 -0
  446. package/dist/test/simple-context-bindings.d.ts.map +1 -0
  447. package/dist/test/simple-context-durable-objects.d.ts +6 -0
  448. package/dist/test/simple-context-durable-objects.d.ts.map +1 -0
  449. package/dist/test/simple-context-env.d.ts +35 -0
  450. package/dist/test/simple-context-env.d.ts.map +1 -0
  451. package/dist/test/simple-context-gateway-script.d.ts +2 -0
  452. package/dist/test/simple-context-gateway-script.d.ts.map +1 -0
  453. package/dist/test/simple-context-handlers.d.ts +12 -0
  454. package/dist/test/simple-context-handlers.d.ts.map +1 -0
  455. package/dist/test/simple-context-lifecycle.d.ts +32 -0
  456. package/dist/test/simple-context-lifecycle.d.ts.map +1 -0
  457. package/dist/test/simple-context-mfconfig.d.ts +10 -0
  458. package/dist/test/simple-context-mfconfig.d.ts.map +1 -0
  459. package/dist/test/simple-context-multi-worker.d.ts +16 -0
  460. package/dist/test/simple-context-multi-worker.d.ts.map +1 -0
  461. package/dist/test/simple-context-paths.d.ts +40 -0
  462. package/dist/test/simple-context-paths.d.ts.map +1 -0
  463. package/dist/test/simple-context-runtime.d.ts +19 -0
  464. package/dist/test/simple-context-runtime.d.ts.map +1 -0
  465. package/dist/test/simple-context-startup.d.ts +11 -0
  466. package/dist/test/simple-context-startup.d.ts.map +1 -0
  467. package/dist/test/simple-context-transport.d.ts +14 -0
  468. package/dist/test/simple-context-transport.d.ts.map +1 -0
  469. package/dist/test/simple-context.d.ts +8 -27
  470. package/dist/test/simple-context.d.ts.map +1 -1
  471. package/dist/test/tail.d.ts +3 -2
  472. package/dist/test/tail.d.ts.map +1 -1
  473. package/dist/test/utilities/artifacts.d.ts +11 -0
  474. package/dist/test/utilities/artifacts.d.ts.map +1 -0
  475. package/dist/test/utilities/context.d.ts +39 -0
  476. package/dist/test/utilities/context.d.ts.map +1 -0
  477. package/dist/test/utilities/d1.d.ts +21 -0
  478. package/dist/test/utilities/d1.d.ts.map +1 -0
  479. package/dist/test/utilities/env.d.ts +40 -0
  480. package/dist/test/utilities/env.d.ts.map +1 -0
  481. package/dist/test/utilities/kv.d.ts +11 -0
  482. package/dist/test/utilities/kv.d.ts.map +1 -0
  483. package/dist/test/utilities/media.d.ts +16 -0
  484. package/dist/test/utilities/media.d.ts.map +1 -0
  485. package/dist/test/utilities/platform.d.ts +41 -0
  486. package/dist/test/utilities/platform.d.ts.map +1 -0
  487. package/dist/test/utilities/queue.d.ts +5 -0
  488. package/dist/test/utilities/queue.d.ts.map +1 -0
  489. package/dist/test/utilities/r2.d.ts +2 -0
  490. package/dist/test/utilities/r2.d.ts.map +1 -0
  491. package/dist/test/utilities/workflows.d.ts +26 -0
  492. package/dist/test/utilities/workflows.d.ts.map +1 -0
  493. package/dist/test/utilities.d.ts +10 -98
  494. package/dist/test/utilities.d.ts.map +1 -1
  495. package/dist/test/worker.d.ts +6 -0
  496. package/dist/test/worker.d.ts.map +1 -1
  497. package/dist/transform/durable-object.d.ts.map +1 -1
  498. package/dist/transform/index.d.ts +2 -2
  499. package/dist/transform/worker-entrypoint.d.ts +5 -0
  500. package/dist/transform/worker-entrypoint.d.ts.map +1 -1
  501. package/dist/utils/entrypoint-discovery.d.ts +6 -3
  502. package/dist/utils/entrypoint-discovery.d.ts.map +1 -1
  503. package/dist/utils/glob.d.ts.map +1 -1
  504. package/dist/utils/resolve-package.d.ts.map +1 -1
  505. package/dist/utils/send-email.d.ts +15 -0
  506. package/dist/utils/send-email.d.ts.map +1 -0
  507. package/dist/utils/send-email.js +163 -0
  508. package/dist/vite/config-file.d.ts +25 -0
  509. package/dist/vite/config-file.d.ts.map +1 -0
  510. package/dist/vite/index.d.ts +3 -2
  511. package/dist/vite/index.d.ts.map +1 -1
  512. package/dist/vite/index.js +2 -339
  513. package/dist/vite/plugin-config-hook.d.ts +28 -0
  514. package/dist/vite/plugin-config-hook.d.ts.map +1 -0
  515. package/dist/vite/plugin-context.d.ts +27 -0
  516. package/dist/vite/plugin-context.d.ts.map +1 -0
  517. package/dist/vite/plugin-durable-objects.d.ts +18 -0
  518. package/dist/vite/plugin-durable-objects.d.ts.map +1 -0
  519. package/dist/vite/plugin-programmatic.d.ts +44 -0
  520. package/dist/vite/plugin-programmatic.d.ts.map +1 -0
  521. package/dist/vite/plugin-service-bindings.d.ts +13 -0
  522. package/dist/vite/plugin-service-bindings.d.ts.map +1 -0
  523. package/dist/vite/plugin-transform.d.ts +41 -0
  524. package/dist/vite/plugin-transform.d.ts.map +1 -0
  525. package/dist/vite/plugin.d.ts +10 -41
  526. package/dist/vite/plugin.d.ts.map +1 -1
  527. package/dist/worker-entry/composed-worker.d.ts +7 -0
  528. package/dist/worker-entry/composed-worker.d.ts.map +1 -0
  529. package/dist/worker-entry/durable-object-discovery.d.ts +20 -0
  530. package/dist/worker-entry/durable-object-discovery.d.ts.map +1 -0
  531. package/dist/worker-entry/extensions.d.ts +5 -0
  532. package/dist/worker-entry/extensions.d.ts.map +1 -0
  533. package/dist/worker-entry/routes.d.ts +22 -0
  534. package/dist/worker-entry/routes.d.ts.map +1 -0
  535. package/dist/worker-entry/surface-paths.d.ts +26 -0
  536. package/dist/worker-entry/surface-paths.d.ts.map +1 -0
  537. package/dist/workflows/local-workflow-entrypoints.d.ts +7 -0
  538. package/dist/workflows/local-workflow-entrypoints.d.ts.map +1 -0
  539. package/package.json +159 -116
  540. package/R2.md +0 -170
  541. package/dist/account-rvrj687w.js +0 -397
  542. package/dist/ai-dx4fr9jh.js +0 -107
  543. package/dist/bridge/protocol.d.ts.map +0 -1
  544. package/dist/bridge/serialization.d.ts.map +0 -1
  545. package/dist/browser-shim/worker.d.ts +0 -14
  546. package/dist/browser-shim/worker.d.ts.map +0 -1
  547. package/dist/build-mnf6v8gd.js +0 -53
  548. package/dist/deploy-nhceck39.js +0 -70
  549. package/dist/dev-pa8dhm20.js +0 -2162
  550. package/dist/doctor-fmgb3d28.js +0 -190
  551. package/dist/durable-object-t4kbb0yt.js +0 -13
  552. package/dist/index-07q6yxyc.js +0 -168
  553. package/dist/index-18hvb6gb.js +0 -194
  554. package/dist/index-1xpj0m4r.js +0 -57
  555. package/dist/index-37x76zdn.js +0 -4
  556. package/dist/index-3t6rypgc.js +0 -13
  557. package/dist/index-67qcae0f.js +0 -183
  558. package/dist/index-a855bdsx.js +0 -18
  559. package/dist/index-d8bdkx2h.js +0 -109
  560. package/dist/index-ep3445yc.js +0 -2225
  561. package/dist/index-gz1gndna.js +0 -307
  562. package/dist/index-hcex3rgh.js +0 -266
  563. package/dist/index-m2q41jwa.js +0 -462
  564. package/dist/index-n7rs26ft.js +0 -77
  565. package/dist/index-pf5s73n9.js +0 -1413
  566. package/dist/index-rbht7m9r.js +0 -36
  567. package/dist/index-tfyxa77h.js +0 -850
  568. package/dist/index-tk6ej9dj.js +0 -94
  569. package/dist/index-z14anrqp.js +0 -226
  570. package/dist/init-f9mgmew3.js +0 -186
  571. package/dist/remote-q59qk463.js +0 -97
  572. package/dist/test/bridge-context.d.ts +0 -76
  573. package/dist/test/bridge-context.d.ts.map +0 -1
  574. package/dist/test/multi-worker-context.d.ts +0 -114
  575. package/dist/test/multi-worker-context.d.ts.map +0 -1
  576. package/dist/types-5nyrz1sz.js +0 -454
  577. package/dist/worker-entrypoint-m9th0rg0.js +0 -13
@@ -0,0 +1,915 @@
1
+ import { a as resolvePreviewIdentifier, d as resolveConfigEnvVars } from "./preview-BhqDmq8I.js";
2
+ import { c as prepareConfigResourcesForDeploy, r as loadConfig, u as resolveConfigForEnvironment } from "./loader-DLXO60RO.js";
3
+ import { a as readWranglerConfig, c as writeWranglerConfig, n as compileConfig, o as rebaseWranglerConfigPaths, s as stringifyConfig, t as compileBuildConfig } from "./compiler-uoyAQ8zW.js";
4
+ import { d as getPrimaryAccount, n as getEffectiveAccountId } from "./preferences-BKp_7XJx.js";
5
+ import { D as listWorkerVersions, E as listWorkerDeployments, O as listWorkers, T as getWorkersSubdomain, c as reconcilePreviewRegistry, w as getWorkerVersionDetail, x as formatWorkersDevUrl } from "./preview-registry-ClAbLTHH.js";
6
+ import { _ as yellowBold, d as green, f as logLine, g as yellow, o as dim, r as createCliTheme } from "./ui-BUoZApvE.js";
7
+ import { n as getPackageVersion } from "./package-metadata-DAuCkyvK.js";
8
+ import { t as resolvePackageSpecifier } from "./resolve-package-Y84HB3Nt.js";
9
+ import { t as asOptionalString } from "./command-utils-BsfkmTqh.js";
10
+ import { a as createBuildManifest, i as compareManifests, n as applyDeploymentStrategy, o as formatDriftWarning, r as describeDeploymentStrategy, s as readBuildManifest, t as prepareBuildArtifacts } from "./build-artifacts-8TqBSQkG.js";
11
+ import { t as getDependencies } from "./dependencies-C2oxFjU_.js";
12
+ import { n as preparePreviewScopedResourcesForDeploy } from "./preview-resources-DdXj8LMM.js";
13
+ import { mkdir, open, readFile, rm, writeFile } from "node:fs/promises";
14
+ import { basename, dirname, isAbsolute, join, resolve } from "pathe";
15
+ //#region src/config/service-bindings-validation.ts
16
+ var ServiceBindingValidationError = class extends Error {
17
+ code = "SERVICE_BINDING_VALIDATION_ERROR";
18
+ missing;
19
+ constructor(missing, accountId) {
20
+ super(`Service binding(s) reference worker(s) that do not exist in Cloudflare account ${accountId}: ` + missing.join(", ") + `. Check the 'services' map in devflare.config.ts for typos or deploy the target worker(s) first.`);
21
+ this.name = "ServiceBindingValidationError";
22
+ this.missing = missing;
23
+ }
24
+ };
25
+ /**
26
+ * Collect every `service` target referenced by the config's `bindings.services`
27
+ * map, deduplicated. Returns `[]` when no service bindings are configured.
28
+ */
29
+ function collectReferencedServiceNames(config) {
30
+ const services = config.bindings?.services;
31
+ if (!services) return [];
32
+ const names = /* @__PURE__ */ new Set();
33
+ for (const binding of Object.values(services)) if (binding && typeof binding === "object" && typeof binding.service === "string") {
34
+ const name = binding.service.trim();
35
+ if (name.length > 0) names.add(name);
36
+ }
37
+ return [...names];
38
+ }
39
+ /**
40
+ * Validate that every service binding target exists in the Cloudflare account.
41
+ *
42
+ * Throws `ServiceBindingValidationError` with the full list of missing
43
+ * targets if any are unreachable. A missing self-reference is tolerated
44
+ * when `selfWorkerName` matches, so first deploys don't fail against
45
+ * themselves.
46
+ */
47
+ async function validateServiceBindings(config, accountId, options) {
48
+ const referenced = collectReferencedServiceNames(config);
49
+ if (referenced.length === 0) return;
50
+ const selfName = options.selfWorkerName?.trim();
51
+ const toValidate = selfName ? referenced.filter((name) => name !== selfName) : referenced;
52
+ if (toValidate.length === 0) return;
53
+ const workers = await options.listWorkers(accountId);
54
+ const workerNames = new Set(workers.map((worker) => worker.name));
55
+ const missing = toValidate.filter((name) => !workerNames.has(name));
56
+ if (missing.length > 0) throw new ServiceBindingValidationError(missing, accountId);
57
+ }
58
+ //#endregion
59
+ //#region src/cli/deploy-target.ts
60
+ function resolveDeployTarget(parsed, options = {}) {
61
+ const wantsProduction = parsed.options.prod === true || parsed.options.production === true;
62
+ const previewOption = parsed.options.preview;
63
+ const previewScopeRaw = asOptionalString(previewOption);
64
+ const wantsPreview = previewOption === true || Boolean(previewScopeRaw);
65
+ if (!wantsProduction && !wantsPreview) {
66
+ if (options.requireExplicitTarget === true) throw new Error("Deploy needs an explicit target. Use --prod / --production for live traffic, or --preview <name> (or bare --preview) for preview deploys.");
67
+ return {
68
+ mode: "implicit",
69
+ envOverrides: {}
70
+ };
71
+ }
72
+ if (wantsProduction && wantsPreview) throw new Error("Choose either --prod / --production or --preview <name>, not both.");
73
+ const explicitEnvironment = asOptionalString(parsed.options.env);
74
+ if (wantsProduction) {
75
+ if (explicitEnvironment && explicitEnvironment !== "production") throw new Error("Production deploys always target the production environment. Remove --env or use --env production.");
76
+ if (parsed.options["branch-name"] !== void 0) throw new Error("Production deploys do not accept --branch-name.");
77
+ return {
78
+ mode: "production",
79
+ environment: "production",
80
+ targetFlag: parsed.options.production === true ? "--production" : "--prod",
81
+ envOverrides: {
82
+ DEVFLARE_PREVIEW_BRANCH: void 0,
83
+ DEVFLARE_PREVIEW_IDENTIFIER: void 0,
84
+ DEVFLARE_PREVIEW_PR: void 0
85
+ }
86
+ };
87
+ }
88
+ if (explicitEnvironment && explicitEnvironment !== "preview") throw new Error("Preview deploys always target the preview environment. Remove --env or use --env preview.");
89
+ if (previewScopeRaw) {
90
+ const branchName = asOptionalString(parsed.options["branch-name"]);
91
+ if (branchName && branchName !== previewScopeRaw) throw new Error("Named preview deploys use the --preview value as the preview scope. Omit --branch-name or pass the same value to both flags.");
92
+ const previewScope = resolvePreviewIdentifier({ identifier: previewScopeRaw }).identifier ?? "preview";
93
+ return {
94
+ mode: "preview-scope",
95
+ environment: "preview",
96
+ targetFlag: "--preview",
97
+ previewScope,
98
+ previewScopeRaw,
99
+ envOverrides: {
100
+ DEVFLARE_PREVIEW_BRANCH: previewScopeRaw,
101
+ DEVFLARE_PREVIEW_IDENTIFIER: previewScope,
102
+ DEVFLARE_PREVIEW_PR: void 0
103
+ }
104
+ };
105
+ }
106
+ return {
107
+ mode: "preview-upload",
108
+ environment: "preview",
109
+ targetFlag: "--preview",
110
+ envOverrides: {
111
+ DEVFLARE_PREVIEW_BRANCH: void 0,
112
+ DEVFLARE_PREVIEW_IDENTIFIER: void 0,
113
+ DEVFLARE_PREVIEW_PR: void 0
114
+ }
115
+ };
116
+ }
117
+ function applyResolvedDeployTarget(parsed, target) {
118
+ if (!target.environment) return parsed;
119
+ return {
120
+ ...parsed,
121
+ options: {
122
+ ...parsed.options,
123
+ env: target.environment
124
+ }
125
+ };
126
+ }
127
+ async function withTemporaryEnvironment(overrides, operation) {
128
+ const previousValues = /* @__PURE__ */ new Map();
129
+ for (const [key, value] of Object.entries(overrides)) {
130
+ previousValues.set(key, process.env[key]);
131
+ if (typeof value === "string") {
132
+ process.env[key] = value;
133
+ continue;
134
+ }
135
+ delete process.env[key];
136
+ }
137
+ try {
138
+ return await operation();
139
+ } finally {
140
+ for (const [key, value] of previousValues) {
141
+ if (typeof value === "string") {
142
+ process.env[key] = value;
143
+ continue;
144
+ }
145
+ delete process.env[key];
146
+ }
147
+ }
148
+ }
149
+ //#endregion
150
+ //#region src/cli/preview.ts
151
+ function matchNamedValue(output, patterns) {
152
+ for (const pattern of patterns) {
153
+ const match = output.match(pattern);
154
+ if (match?.[1]) return match[1];
155
+ }
156
+ }
157
+ function appendUniqueUrls(target, value) {
158
+ if (typeof value === "string") {
159
+ if (value.startsWith("http://") || value.startsWith("https://")) target.push(value);
160
+ return;
161
+ }
162
+ if (!Array.isArray(value)) return;
163
+ for (const item of value) appendUniqueUrls(target, item);
164
+ }
165
+ function parseWranglerStructuredOutput(output) {
166
+ const records = output.replace(/\r/g, "").split("\n").map((line) => line.trim()).filter(Boolean).map((line) => {
167
+ try {
168
+ return JSON.parse(line);
169
+ } catch {
170
+ return null;
171
+ }
172
+ }).filter((record) => record !== null);
173
+ const urls = [];
174
+ let versionId;
175
+ let previewUrl;
176
+ for (const record of records) {
177
+ if (!versionId && typeof record.version_id === "string" && record.version_id.trim()) versionId = record.version_id.trim();
178
+ appendUniqueUrls(urls, record.targets);
179
+ appendUniqueUrls(urls, record.preview_urls);
180
+ appendUniqueUrls(urls, record.urls);
181
+ appendUniqueUrls(urls, record.url);
182
+ if (!previewUrl && typeof record.preview_url === "string" && record.preview_url.trim()) previewUrl = record.preview_url.trim();
183
+ }
184
+ const uniqueUrls = [...new Set(urls)];
185
+ if (!previewUrl) previewUrl = uniqueUrls.find((url) => url.includes("workers.dev"));
186
+ return {
187
+ versionId,
188
+ previewUrl,
189
+ urls: uniqueUrls
190
+ };
191
+ }
192
+ function mergeParsedWranglerDeployOutputs(...outputs) {
193
+ const urls = [...new Set(outputs.flatMap((output) => output.urls))];
194
+ return {
195
+ versionId: outputs.map((output) => output.versionId).find((value) => Boolean(value)),
196
+ previewUrl: outputs.map((output) => output.previewUrl).find((value) => Boolean(value)) ?? urls.find((url) => url.includes("workers.dev")),
197
+ urls
198
+ };
199
+ }
200
+ function parseWranglerDeployOutput(output) {
201
+ const normalizedOutput = output.replace(/\r/g, "");
202
+ const urls = [...new Set(normalizedOutput.match(/https?:\/\/[^\s'"`]+/g) ?? [])];
203
+ const previewUrl = matchNamedValue(normalizedOutput, [/Preview URL:\s*(https?:\/\/\S+)/i, /Version Preview URL:\s*(https?:\/\/\S+)/i]) ?? urls.find((url) => url.includes("workers.dev"));
204
+ return {
205
+ versionId: matchNamedValue(normalizedOutput, [
206
+ /Worker Version ID:\s*([A-Za-z0-9_-]+)/i,
207
+ /Version ID:\s*([A-Za-z0-9_-]+)/i,
208
+ /version(?:_id| id)?\s*[:=]\s*([A-Za-z0-9_-]+)/i,
209
+ /"id"\s*:\s*"([A-Za-z0-9_-]+)"/i
210
+ ]),
211
+ previewUrl,
212
+ urls
213
+ };
214
+ }
215
+ //#endregion
216
+ //#region src/cli/commands/deploy/metadata.ts
217
+ function inferRecordSource() {
218
+ return process.env.GITHUB_ACTIONS === "true" ? "github-action" : "cli";
219
+ }
220
+ async function writeDeployResultMetadata(metadata) {
221
+ const metadataPath = process.env.DEVFLARE_DEPLOY_METADATA_PATH?.trim();
222
+ if (!metadataPath) return;
223
+ await mkdir(dirname(metadataPath), { recursive: true });
224
+ await writeFile(metadataPath, JSON.stringify(metadata, null, " "), "utf8");
225
+ }
226
+ //#endregion
227
+ //#region src/cli/commands/deploy/prepare.ts
228
+ function summarizeDeployResourceNames(resources) {
229
+ const segments = [
230
+ resources.kv.length > 0 ? `KV ${resources.kv.length}` : null,
231
+ resources.d1.length > 0 ? `D1 ${resources.d1.length}` : null,
232
+ resources.r2.length > 0 ? `R2 ${resources.r2.length}` : null,
233
+ resources.queues.length > 0 ? `Queues ${resources.queues.length}` : null,
234
+ resources.vectorize.length > 0 ? `Vectorize ${resources.vectorize.length}` : null,
235
+ resources.hyperdrive.length > 0 ? `Hyperdrive ${resources.hyperdrive.length}` : null
236
+ ].filter((segment) => segment !== null);
237
+ return segments.length > 0 ? segments.join(" · ") : null;
238
+ }
239
+ async function readDeployRedirectPath(filePath) {
240
+ const fs = await import("node:fs/promises");
241
+ try {
242
+ const rawConfig = await fs.readFile(filePath, "utf-8");
243
+ const parsed = JSON.parse(rawConfig);
244
+ if (typeof parsed.configPath !== "string" || parsed.configPath.length === 0) return null;
245
+ return resolve(dirname(filePath), parsed.configPath);
246
+ } catch {
247
+ return null;
248
+ }
249
+ }
250
+ async function resolveBuildArtifactConfigPath(buildPath, cwd) {
251
+ const fs = await import("node:fs/promises");
252
+ const absoluteBuildPath = isAbsolute(buildPath) ? buildPath : resolve(cwd, buildPath);
253
+ let stat;
254
+ try {
255
+ stat = await fs.stat(absoluteBuildPath);
256
+ } catch {
257
+ throw new Error(`Could not find build artifact path: ${absoluteBuildPath}`);
258
+ }
259
+ if (stat.isFile()) {
260
+ if (basename(absoluteBuildPath) === "config.json") {
261
+ const redirectedConfigPath = await readDeployRedirectPath(absoluteBuildPath);
262
+ if (!redirectedConfigPath) throw new Error(`Build redirect ${absoluteBuildPath} did not contain a valid configPath.`);
263
+ return redirectedConfigPath;
264
+ }
265
+ return absoluteBuildPath;
266
+ }
267
+ const candidates = [
268
+ resolve(absoluteBuildPath, "wrangler.jsonc"),
269
+ resolve(absoluteBuildPath, ".wrangler", "deploy", "config.json"),
270
+ resolve(absoluteBuildPath, "config.json"),
271
+ resolve(absoluteBuildPath, ".devflare", "build", "wrangler.jsonc")
272
+ ];
273
+ for (const candidatePath of candidates) try {
274
+ if (!(await fs.stat(candidatePath)).isFile()) continue;
275
+ if (basename(candidatePath) === "config.json") {
276
+ const redirectedConfigPath = await readDeployRedirectPath(candidatePath);
277
+ if (redirectedConfigPath) return redirectedConfigPath;
278
+ continue;
279
+ }
280
+ return candidatePath;
281
+ } catch {}
282
+ throw new Error(`Could not resolve a Wrangler build config from ${absoluteBuildPath}. Pass a .devflare/build directory, a generated wrangler.jsonc, or a .wrangler/deploy/config.json redirect.`);
283
+ }
284
+ function withBuildArtifactPaths(compiledConfig, buildConfig) {
285
+ return {
286
+ ...compiledConfig,
287
+ ...buildConfig.main ? { main: buildConfig.main } : {},
288
+ ...buildConfig.assets ? { assets: buildConfig.assets } : {}
289
+ };
290
+ }
291
+ async function prepareDeployConfig(options) {
292
+ const rawConfig = await resolveConfigEnvVars(await loadConfig({
293
+ cwd: options.cwd,
294
+ configFile: options.configPath
295
+ }), {
296
+ cwd: options.cwd,
297
+ configPath: options.configPath,
298
+ mode: "build"
299
+ });
300
+ const manifest = await readBuildManifest(dirname(options.buildConfigPath));
301
+ if (manifest) {
302
+ const warning = formatDriftWarning(compareManifests(manifest, createBuildManifest(rawConfig, {
303
+ devflareVersion: await getPackageVersion(),
304
+ intendedTarget: {
305
+ environment: options.environment,
306
+ preview: options.preview,
307
+ branchName: options.branchName
308
+ }
309
+ })));
310
+ if (warning && options.logger) if (options.force) {
311
+ logLine(options.logger, warning);
312
+ logLine(options.logger, "Continuing because --force was passed.");
313
+ } else logLine(options.logger, warning);
314
+ }
315
+ const previewScopedResources = options.environment === "preview" ? await preparePreviewScopedResourcesForDeploy(rawConfig, { environment: options.environment }) : null;
316
+ const deployResources = await prepareConfigResourcesForDeploy(previewScopedResources?.config ?? rawConfig, {
317
+ environment: options.environment,
318
+ accountId: previewScopedResources?.accountId,
319
+ cloudflare: previewScopedResources?.resourceResolutionCloudflare
320
+ });
321
+ const deploymentStrategy = applyDeploymentStrategy(deployResources.config, {
322
+ environment: options.environment,
323
+ preview: options.preview,
324
+ branchName: options.branchName,
325
+ previewBranch: process.env.DEVFLARE_PREVIEW_BRANCH
326
+ });
327
+ const validationAccountId = previewScopedResources?.accountId ?? deploymentStrategy.config.accountId ?? process.env.CLOUDFLARE_ACCOUNT_ID;
328
+ if (validationAccountId) try {
329
+ await validateServiceBindings(deploymentStrategy.config, validationAccountId, {
330
+ listWorkers: (accountId) => listWorkers(accountId),
331
+ selfWorkerName: deploymentStrategy.config.name
332
+ });
333
+ } catch (error) {
334
+ if (error instanceof ServiceBindingValidationError) throw error;
335
+ }
336
+ const buildWranglerConfig = await readWranglerConfig(options.buildConfigPath);
337
+ const compiledWranglerConfig = compileConfig(deploymentStrategy.config);
338
+ const buildDir = dirname(options.buildConfigPath);
339
+ const deployArtefactDir = resolve(buildDir, "..", "deploy");
340
+ await mkdir(deployArtefactDir, { recursive: true });
341
+ const deployArtefactPath = resolve(deployArtefactDir, "wrangler.jsonc");
342
+ const wranglerConfig = withBuildArtifactPaths(rebaseWranglerConfigPaths(options.cwd, deployArtefactDir, compiledWranglerConfig), rebaseWranglerConfigPaths(buildDir, deployArtefactDir, buildWranglerConfig));
343
+ const lockPath = resolve(deployArtefactDir, ".lock");
344
+ const lockHandle = await acquireDeployArtefactLock(lockPath);
345
+ try {
346
+ await writeWranglerConfig(deployArtefactDir, wranglerConfig, "wrangler.jsonc");
347
+ } finally {
348
+ await releaseDeployArtefactLock(lockHandle, lockPath);
349
+ }
350
+ return {
351
+ config: deploymentStrategy.config,
352
+ deployConfigPath: deployArtefactPath,
353
+ previewScopedResources,
354
+ deployResources,
355
+ wranglerConfig
356
+ };
357
+ }
358
+ /**
359
+ * C10 — bounded-wait exclusive lock around the deploy artefact directory.
360
+ *
361
+ * Uses `open(path, 'wx')` (O_EXCL) which atomically fails when the file
362
+ * already exists, so the only way to acquire the lock is to be the process
363
+ * that successfully created it. Stale locks (older than 60s) are forcibly
364
+ * cleared so a crashed deploy cannot wedge subsequent runs.
365
+ */
366
+ async function acquireDeployArtefactLock(lockPath, options = {}) {
367
+ const maxWaitMs = options.maxWaitMs ?? 3e4;
368
+ const staleAfterMs = options.staleAfterMs ?? 6e4;
369
+ const pollMs = 100;
370
+ const start = Date.now();
371
+ while (true) try {
372
+ const handle = await open(lockPath, "wx");
373
+ await handle.writeFile(`${process.pid}\n${Date.now()}`);
374
+ return handle;
375
+ } catch (err) {
376
+ if (err.code !== "EEXIST") throw err;
377
+ try {
378
+ const existing = await readFile(lockPath, "utf-8");
379
+ const ts = Number.parseInt(existing.split("\n")[1] ?? "0", 10);
380
+ if (Number.isFinite(ts) && Date.now() - ts > staleAfterMs) {
381
+ await rm(lockPath, { force: true });
382
+ continue;
383
+ }
384
+ } catch {
385
+ continue;
386
+ }
387
+ if (Date.now() - start > maxWaitMs) throw new Error(`Timed out waiting for deploy artefact lock at ${lockPath}. Another \`devflare deploy\` may be running against the same artefact directory.`);
388
+ await new Promise((r) => setTimeout(r, pollMs));
389
+ }
390
+ }
391
+ async function releaseDeployArtefactLock(handle, lockPath) {
392
+ try {
393
+ await handle.close();
394
+ } catch {}
395
+ await rm(lockPath, { force: true });
396
+ }
397
+ //#endregion
398
+ //#region src/cli/commands/deploy/runtime.ts
399
+ async function resolveLocalWranglerExecutable(cwd, fs) {
400
+ const wranglerExecutablePath = resolvePackageSpecifier("wrangler/bin/wrangler.js", cwd);
401
+ try {
402
+ await fs.access(wranglerExecutablePath);
403
+ return wranglerExecutablePath;
404
+ } catch {
405
+ return null;
406
+ }
407
+ }
408
+ //#endregion
409
+ //#region src/cli/commands/deploy/verification.ts
410
+ function shouldVerifyDeployControlPlane() {
411
+ const configured = process.env.DEVFLARE_VERIFY_DEPLOYMENT?.trim().toLowerCase();
412
+ if (!configured) return false;
413
+ return ![
414
+ "0",
415
+ "false",
416
+ "no",
417
+ "off"
418
+ ].includes(configured);
419
+ }
420
+ function shouldRequireFreshProductionDeployment() {
421
+ const configured = process.env.DEVFLARE_REQUIRE_FRESH_PRODUCTION_DEPLOYMENT?.trim().toLowerCase();
422
+ if (!configured) return false;
423
+ return ![
424
+ "0",
425
+ "false",
426
+ "no",
427
+ "off"
428
+ ].includes(configured);
429
+ }
430
+ function getDeployVerificationSettings() {
431
+ const attempts = Number.parseInt(process.env.DEVFLARE_VERIFY_DEPLOYMENT_ATTEMPTS ?? "", 10);
432
+ const delayMs = Number.parseInt(process.env.DEVFLARE_VERIFY_DEPLOYMENT_DELAY_MS ?? "", 10);
433
+ return {
434
+ attempts: Number.isFinite(attempts) && attempts > 0 ? attempts : 5,
435
+ delayMs: Number.isFinite(delayMs) && delayMs >= 0 ? delayMs : 1500
436
+ };
437
+ }
438
+ const DEPLOYMENT_LOOKBACK_TOLERANCE_MS = 120 * 1e3;
439
+ function normalizeCloudflareAccountId(value) {
440
+ const trimmed = value?.trim();
441
+ if (!trimmed) return;
442
+ return /^[a-f0-9]{32}$/i.test(trimmed) ? trimmed : void 0;
443
+ }
444
+ async function waitForDeployVerification(delayMs) {
445
+ if (delayMs <= 0) return;
446
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
447
+ }
448
+ async function retryDeployVerification(description, operation) {
449
+ const { attempts, delayMs } = getDeployVerificationSettings();
450
+ let lastError;
451
+ for (let attempt = 1; attempt <= attempts; attempt++) try {
452
+ return await operation();
453
+ } catch (error) {
454
+ lastError = error;
455
+ if (attempt < attempts) await waitForDeployVerification(delayMs);
456
+ }
457
+ const message = lastError instanceof Error ? lastError.message : String(lastError);
458
+ throw new Error(`Cloudflare could not verify ${description} after ${attempts} attempt${attempts === 1 ? "" : "s"}: ${message}`);
459
+ }
460
+ async function resolveDeployAccountId(preferredAccountId) {
461
+ if (preferredAccountId !== void 0) return normalizeCloudflareAccountId(preferredAccountId);
462
+ const apiToken = process.env.CLOUDFLARE_API_TOKEN?.trim();
463
+ const apiKey = process.env.CLOUDFLARE_API_KEY?.trim();
464
+ const apiEmail = process.env.CLOUDFLARE_EMAIL?.trim();
465
+ if (!apiToken && !(apiKey && apiEmail)) return;
466
+ try {
467
+ const primaryAccount = await getPrimaryAccount();
468
+ if (!primaryAccount) return;
469
+ return normalizeCloudflareAccountId((await getEffectiveAccountId(primaryAccount.id)).accountId);
470
+ } catch {
471
+ return;
472
+ }
473
+ }
474
+ function selectDeploymentVersionId(deployment) {
475
+ return deployment.versions.find((version) => version.percentage === 100)?.versionId ?? deployment.versions[0]?.versionId;
476
+ }
477
+ function getWorkerVersionTimestamp(version) {
478
+ return version.metadata.modifiedOn ?? version.metadata.createdOn;
479
+ }
480
+ async function resolveVersionIdFromLatestDeployment(options) {
481
+ return retryDeployVerification(options.verificationDescription, async () => {
482
+ const latestDeployment = [...await listWorkerDeployments(options.accountId, options.workerName)].sort((a, b) => b.createdOn.getTime() - a.createdOn.getTime())[0];
483
+ if (!latestDeployment) throw new Error(`No deployments were found for Worker "${options.workerName}".`);
484
+ if (options.deployedAfter && latestDeployment.createdOn.getTime() < options.deployedAfter.getTime() - DEPLOYMENT_LOOKBACK_TOLERANCE_MS) throw new Error(`${options.deploymentLabel} ${latestDeployment.id} was created before this deploy started.`);
485
+ const versionId = selectDeploymentVersionId(latestDeployment);
486
+ if (!versionId) throw new Error(`${options.deploymentLabel} ${latestDeployment.id} does not reference any version ids.`);
487
+ return {
488
+ deploymentId: latestDeployment.id,
489
+ versionId
490
+ };
491
+ });
492
+ }
493
+ async function resolveVersionIdFromLatestWorkerVersion(options) {
494
+ return retryDeployVerification(`the latest ${options.preview ? "preview " : ""}version for Worker "${options.workerName}"`, async () => {
495
+ const latestVersion = [...await listWorkerVersions(options.accountId, options.workerName)].filter((version) => version.id).filter((version) => version.metadata.hasPreview === options.preview).sort((a, b) => {
496
+ const left = getWorkerVersionTimestamp(a)?.getTime() ?? 0;
497
+ return (getWorkerVersionTimestamp(b)?.getTime() ?? 0) - left;
498
+ })[0];
499
+ if (!latestVersion) throw new Error(`No ${options.preview ? "preview " : ""}versions were found for Worker "${options.workerName}".`);
500
+ const latestVersionTimestamp = getWorkerVersionTimestamp(latestVersion);
501
+ if (!latestVersionTimestamp) throw new Error(`Latest version ${latestVersion.id} did not include a creation timestamp.`);
502
+ if (latestVersionTimestamp.getTime() < options.deployedAfter.getTime() - DEPLOYMENT_LOOKBACK_TOLERANCE_MS) throw new Error(`Latest version ${latestVersion.id} was created before this deploy started.`);
503
+ return latestVersion.id;
504
+ });
505
+ }
506
+ async function resolveVersionIdFromLatestProductionDeployment(options) {
507
+ return resolveVersionIdFromLatestDeployment({
508
+ accountId: options.accountId,
509
+ workerName: options.workerName,
510
+ verificationDescription: `the latest deployment for Worker "${options.workerName}"`,
511
+ deploymentLabel: "Latest deployment",
512
+ deployedAfter: options.deployedAfter
513
+ });
514
+ }
515
+ async function resolveVersionIdFromCurrentProductionDeployment(options) {
516
+ return resolveVersionIdFromLatestDeployment({
517
+ accountId: options.accountId,
518
+ workerName: options.workerName,
519
+ verificationDescription: `the current active deployment for Worker "${options.workerName}"`,
520
+ deploymentLabel: "Current deployment"
521
+ });
522
+ }
523
+ async function verifyDeployControlPlane(options) {
524
+ logLine(options.logger, dim("Verifying Cloudflare control-plane state…", options.theme));
525
+ await retryDeployVerification(`Worker version ${options.versionId}`, async () => {
526
+ const version = await getWorkerVersionDetail(options.accountId, options.workerName, options.versionId);
527
+ if (!version.id) throw new Error(`Cloudflare returned an empty version record for ${options.versionId}.`);
528
+ return version;
529
+ });
530
+ if (options.preview) {
531
+ options.logger.success(`Verified preview upload in Cloudflare control plane for version ${options.versionId}`);
532
+ return;
533
+ }
534
+ const deployment = await retryDeployVerification(`a deployment that references version ${options.versionId}`, async () => {
535
+ const match = (await listWorkerDeployments(options.accountId, options.workerName)).find((item) => item.versions.some((version) => version.versionId === options.versionId));
536
+ if (!match) throw new Error(`No deployment for Worker "${options.workerName}" references version ${options.versionId} yet.`);
537
+ return match;
538
+ });
539
+ options.logger.success(`Verified Cloudflare deployment ${deployment.id} for version ${options.versionId}`);
540
+ }
541
+ //#endregion
542
+ //#region src/cli/commands/deploy.ts
543
+ async function runDeployCommand(parsed, logger, options) {
544
+ let deployTarget = {
545
+ mode: "implicit",
546
+ envOverrides: {}
547
+ };
548
+ let resolvedParsed = parsed;
549
+ const cwd = options.cwd || process.cwd();
550
+ let configPath;
551
+ let environment;
552
+ let dryRun = false;
553
+ let preview = false;
554
+ let branchName;
555
+ let deployMessage;
556
+ let deployTag;
557
+ let previewScopeName;
558
+ let requireFreshProductionDeployment = false;
559
+ let resolvedPreviewScopeName = process.env.DEVFLARE_PREVIEW_BRANCH?.trim() || void 0;
560
+ const theme = createCliTheme(parsed.options);
561
+ logLine(logger);
562
+ logLine(logger, `${yellowBold("deploy", theme)} ${dim("Shipping to Cloudflare", theme)}`);
563
+ try {
564
+ deployTarget = resolveDeployTarget(parsed, { requireExplicitTarget: options.requireExplicitDeployTarget === true });
565
+ resolvedParsed = applyResolvedDeployTarget(parsed, deployTarget);
566
+ configPath = resolvedParsed.options.config;
567
+ environment = resolvedParsed.options.env;
568
+ dryRun = resolvedParsed.options["dry-run"] === true;
569
+ preview = deployTarget.mode === "preview-upload";
570
+ branchName = resolvedParsed.options["branch-name"];
571
+ deployMessage = resolvedParsed.options.message;
572
+ deployTag = resolvedParsed.options.tag;
573
+ previewScopeName = branchName?.trim() || deployTarget.previewScopeRaw || void 0;
574
+ resolvedPreviewScopeName = previewScopeName || process.env.DEVFLARE_PREVIEW_BRANCH?.trim() || void 0;
575
+ requireFreshProductionDeployment = !preview && shouldRequireFreshProductionDeployment();
576
+ return await withTemporaryEnvironment(deployTarget.envOverrides, async () => {
577
+ resolvedPreviewScopeName = previewScopeName || process.env.DEVFLARE_PREVIEW_BRANCH?.trim() || void 0;
578
+ if (dryRun) {
579
+ const deploymentStrategy = applyDeploymentStrategy(await resolveConfigEnvVars(resolveConfigForEnvironment(await loadConfig({
580
+ cwd,
581
+ configFile: configPath
582
+ }), environment), {
583
+ cwd,
584
+ configPath,
585
+ mode: "build"
586
+ }), {
587
+ environment,
588
+ preview,
589
+ branchName,
590
+ previewBranch: process.env.DEVFLARE_PREVIEW_BRANCH
591
+ });
592
+ const wranglerConfig = compileBuildConfig(deploymentStrategy.config, void 0, { alreadyResolved: true });
593
+ logLine(logger, `${yellow("dry run", theme)} ${dim("Skipping actual deployment", theme)}`);
594
+ const deploymentStrategyMessage = describeDeploymentStrategy(deploymentStrategy);
595
+ if (deploymentStrategyMessage) logLine(logger, dim(deploymentStrategyMessage, theme));
596
+ logLine(logger, dim("Would deploy with wrangler config:", theme));
597
+ logLine(logger, stringifyConfig(wranglerConfig));
598
+ try {
599
+ const describeResult = await prepareConfigResourcesForDeploy(deploymentStrategy.config, {
600
+ environment,
601
+ describeOnly: true
602
+ });
603
+ const resolvedWranglerConfig = compileConfig(describeResult.config);
604
+ logLine(logger, dim("Resolved view (would-create placeholders for missing resources):", theme));
605
+ logLine(logger, stringifyConfig(resolvedWranglerConfig));
606
+ const wouldCreate = [
607
+ ...describeResult.created.kv.map((n) => `KV: ${n}`),
608
+ ...describeResult.created.d1.map((n) => `D1: ${n}`),
609
+ ...describeResult.created.r2.map((n) => `R2: ${n}`),
610
+ ...describeResult.created.queues.map((n) => `Queue: ${n}`)
611
+ ];
612
+ if (wouldCreate.length > 0) logLine(logger, dim(`Would create:\n - ${wouldCreate.join("\n - ")}`, theme));
613
+ } catch (describeErr) {
614
+ logLine(logger, dim(`(resolved view unavailable: ${describeErr.message})`, theme));
615
+ }
616
+ return { exitCode: 0 };
617
+ }
618
+ const deps = await getDependencies();
619
+ const requestedBuildPath = resolvedParsed.options.build;
620
+ const buildConfigPath = requestedBuildPath ? await resolveBuildArtifactConfigPath(requestedBuildPath, cwd) : (await prepareBuildArtifacts(resolvedParsed, logger, options)).deployConfigPath;
621
+ const prepared = await prepareDeployConfig({
622
+ cwd,
623
+ configPath,
624
+ environment,
625
+ buildConfigPath,
626
+ preview,
627
+ branchName,
628
+ logger,
629
+ force: resolvedParsed.options.force === true
630
+ });
631
+ const createdPreviewResourcesSummary = prepared.previewScopedResources ? summarizeDeployResourceNames(prepared.previewScopedResources.created) : null;
632
+ if (createdPreviewResourcesSummary) logLine(logger, `Provisioned preview-scoped resources: ${createdPreviewResourcesSummary}`);
633
+ const existingPreviewResourcesSummary = prepared.previewScopedResources ? summarizeDeployResourceNames(prepared.previewScopedResources.existing) : null;
634
+ if (existingPreviewResourcesSummary) logLine(logger, `Reused preview-scoped resources: ${existingPreviewResourcesSummary}`);
635
+ const createdDeployResourcesSummary = summarizeDeployResourceNames(prepared.deployResources.created);
636
+ if (createdDeployResourcesSummary) logLine(logger, `Provisioned deploy resources: ${createdDeployResourcesSummary}`);
637
+ const existingDeployResourcesSummary = summarizeDeployResourceNames(prepared.deployResources.existing);
638
+ if (existingDeployResourcesSummary) logLine(logger, `Reused deploy resources: ${existingDeployResourcesSummary}`);
639
+ for (const warning of prepared.previewScopedResources?.warnings ?? []) logger.warn(warning);
640
+ for (const warning of prepared.deployResources.warnings) logger.warn(warning);
641
+ if (requestedBuildPath) logLine(logger, `${dim("build", theme)} ${green(buildConfigPath, theme)}`);
642
+ logLine(logger, `${dim("worker", theme)} ${green(prepared.config.name, theme)}`);
643
+ const localWranglerExecutable = await resolveLocalWranglerExecutable(cwd, deps.fs);
644
+ const isBranchScopedPreviewDeployment = !preview && environment === "preview" && typeof resolvedPreviewScopeName === "string" && resolvedPreviewScopeName.length > 0;
645
+ if (preview) {
646
+ logger.warn("Cloudflare preview uploads cannot be the first upload for a brand-new Worker.");
647
+ if (prepared.config.bindings?.durableObjects && Object.keys(prepared.config.bindings.durableObjects).length > 0) logger.warn("Cloudflare does not currently generate preview URLs for Workers that implement Durable Objects.");
648
+ if (prepared.config.migrations && prepared.config.migrations.length > 0) logger.warn("Cloudflare versions upload does not currently support Durable Object migrations.");
649
+ }
650
+ logLine(logger, dim(preview ? "Uploading preview version with Wrangler…" : "Deploying with Wrangler…", theme));
651
+ const deployStartedAt = /* @__PURE__ */ new Date();
652
+ const wranglerOutputDirectory = join(cwd, ".devflare");
653
+ const wranglerOutputFilePath = join(wranglerOutputDirectory, `wrangler-output-${Date.now()}-${process.pid}.ndjson`);
654
+ await deps.fs.mkdir(wranglerOutputDirectory, { recursive: true });
655
+ const wranglerCommand = localWranglerExecutable ? "node" : "bunx";
656
+ const wranglerArgs = preview ? localWranglerExecutable ? [
657
+ localWranglerExecutable,
658
+ "versions",
659
+ "upload"
660
+ ] : [
661
+ "wrangler",
662
+ "versions",
663
+ "upload"
664
+ ] : localWranglerExecutable ? [localWranglerExecutable, "deploy"] : ["wrangler", "deploy"];
665
+ wranglerArgs.push("--config", prepared.deployConfigPath);
666
+ if (deployMessage?.trim()) wranglerArgs.push("--message", deployMessage.trim());
667
+ if (deployTag?.trim()) wranglerArgs.push("--tag", deployTag.trim());
668
+ const deployProc = await deps.exec.exec(wranglerCommand, wranglerArgs, {
669
+ cwd,
670
+ stdio: "inherit",
671
+ env: {
672
+ ...process.env,
673
+ WRANGLER_OUTPUT_FILE_PATH: wranglerOutputFilePath,
674
+ FORCE_COLOR: process.env.FORCE_COLOR ?? "0"
675
+ }
676
+ });
677
+ let structuredOutput = "";
678
+ try {
679
+ structuredOutput = await deps.fs.readFile(wranglerOutputFilePath, "utf8");
680
+ } catch {
681
+ structuredOutput = "";
682
+ } finally {
683
+ try {
684
+ await deps.fs.unlink(wranglerOutputFilePath);
685
+ } catch {}
686
+ }
687
+ const parsedOutput = mergeParsedWranglerDeployOutputs(parseWranglerDeployOutput([deployProc.stdout, deployProc.stderr].filter((value) => typeof value === "string" && value.length > 0).join("\n")), structuredOutput ? parseWranglerStructuredOutput(structuredOutput) : {
688
+ urls: [],
689
+ versionId: void 0,
690
+ previewUrl: void 0
691
+ });
692
+ const workersDevUrl = parsedOutput.urls.find((url) => url.includes("workers.dev"));
693
+ let resolvedAccountId = normalizeCloudflareAccountId(prepared.config.accountId) ?? normalizeCloudflareAccountId(process.env.CLOUDFLARE_ACCOUNT_ID);
694
+ let didAttemptAccountResolution = false;
695
+ const versionRecoveryDiagnostics = [];
696
+ const ensureResolvedAccountId = async () => {
697
+ if (resolvedAccountId || didAttemptAccountResolution) return resolvedAccountId;
698
+ didAttemptAccountResolution = true;
699
+ resolvedAccountId = await resolveDeployAccountId(void 0);
700
+ return resolvedAccountId;
701
+ };
702
+ let resolvedVersionId = parsedOutput.versionId;
703
+ let resolvedPreviewUrl = parsedOutput.previewUrl;
704
+ let loggedVersionId = false;
705
+ let verificationNote;
706
+ const persistDeployMetadata = async (input) => {
707
+ await writeDeployResultMetadata({
708
+ status: input.status,
709
+ exitCode: input.exitCode,
710
+ workerName: prepared.config.name,
711
+ preview,
712
+ branchScopedPreview: isBranchScopedPreviewDeployment,
713
+ previewScope: resolvedPreviewScopeName,
714
+ versionId: resolvedVersionId,
715
+ previewUrl: resolvedPreviewUrl,
716
+ workersDevUrl,
717
+ verificationNote,
718
+ outputUrls: parsedOutput.urls,
719
+ structuredOutput,
720
+ ...input.error ? { error: input.error } : {}
721
+ });
722
+ };
723
+ if (deployProc.exitCode !== 0) {
724
+ await persistDeployMetadata({
725
+ status: "failure",
726
+ exitCode: 1,
727
+ error: deployProc.stderr || deployProc.stdout || "Wrangler deploy failed"
728
+ });
729
+ logger.error("Deployment failed");
730
+ return {
731
+ exitCode: 1,
732
+ output: structuredOutput
733
+ };
734
+ }
735
+ if (!preview && !resolvedVersionId && !isBranchScopedPreviewDeployment) resolvedAccountId = await ensureResolvedAccountId();
736
+ if (isBranchScopedPreviewDeployment && !resolvedPreviewUrl) resolvedAccountId = await ensureResolvedAccountId();
737
+ if (isBranchScopedPreviewDeployment && !resolvedPreviewUrl && resolvedAccountId) {
738
+ const workersSubdomain = await getWorkersSubdomain(resolvedAccountId);
739
+ if (workersSubdomain) resolvedPreviewUrl = formatWorkersDevUrl(prepared.config.name, workersSubdomain);
740
+ }
741
+ if (!resolvedVersionId && resolvedAccountId) try {
742
+ resolvedVersionId = await resolveVersionIdFromLatestWorkerVersion({
743
+ accountId: resolvedAccountId,
744
+ workerName: prepared.config.name,
745
+ preview: preview || isBranchScopedPreviewDeployment,
746
+ deployedAfter: deployStartedAt
747
+ });
748
+ logger.success(`Version ID: ${resolvedVersionId}`);
749
+ loggedVersionId = true;
750
+ logLine(logger, dim("Resolved version id from Cloudflare version metadata", theme));
751
+ } catch (error) {
752
+ const message = error instanceof Error ? error.message : String(error);
753
+ versionRecoveryDiagnostics.push(`version lookup: ${message}`);
754
+ }
755
+ if (isBranchScopedPreviewDeployment && !resolvedVersionId && resolvedAccountId) try {
756
+ const fallbackDeployment = await resolveVersionIdFromLatestProductionDeployment({
757
+ accountId: resolvedAccountId,
758
+ workerName: prepared.config.name,
759
+ deployedAfter: deployStartedAt
760
+ });
761
+ resolvedVersionId = fallbackDeployment.versionId;
762
+ logger.success(`Version ID: ${resolvedVersionId}`);
763
+ loggedVersionId = true;
764
+ logLine(logger, dim(`Resolved version id from Cloudflare deployment ${fallbackDeployment.deploymentId}`, theme));
765
+ } catch (error) {
766
+ const message = error instanceof Error ? error.message : String(error);
767
+ versionRecoveryDiagnostics.push(`deployment lookup: ${message}`);
768
+ }
769
+ if (!preview && !isBranchScopedPreviewDeployment && !resolvedVersionId && resolvedAccountId) try {
770
+ const fallbackDeployment = await resolveVersionIdFromLatestProductionDeployment({
771
+ accountId: resolvedAccountId,
772
+ workerName: prepared.config.name,
773
+ deployedAfter: deployStartedAt
774
+ });
775
+ resolvedVersionId = fallbackDeployment.versionId;
776
+ logger.success(`Version ID: ${resolvedVersionId}`);
777
+ loggedVersionId = true;
778
+ logLine(logger, dim(`Resolved version id from Cloudflare deployment ${fallbackDeployment.deploymentId}`, theme));
779
+ } catch (error) {
780
+ const message = error instanceof Error ? error.message : String(error);
781
+ versionRecoveryDiagnostics.push(`deployment lookup: ${message}`);
782
+ }
783
+ if (!preview && !isBranchScopedPreviewDeployment && !resolvedVersionId && resolvedAccountId) try {
784
+ const currentDeployment = await resolveVersionIdFromCurrentProductionDeployment({
785
+ accountId: resolvedAccountId,
786
+ workerName: prepared.config.name
787
+ });
788
+ resolvedVersionId = currentDeployment.versionId;
789
+ logger.success(`Version ID: ${resolvedVersionId}`);
790
+ loggedVersionId = true;
791
+ const reuseMessage = `Cloudflare did not expose a fresh deployment or version after verification retries, and the current active deployment ${currentDeployment.deploymentId} still points at version ${resolvedVersionId}. This usually means the built Worker code and configuration were unchanged, so Cloudflare kept the existing live version.`;
792
+ verificationNote = reuseMessage;
793
+ if (requireFreshProductionDeployment) {
794
+ await persistDeployMetadata({
795
+ status: "failure",
796
+ exitCode: 1,
797
+ error: reuseMessage
798
+ });
799
+ logger.error(`Deployment verification failed: ${reuseMessage} This run requires a fresh production deployment, so Devflare is treating the reused live version as a failure.`);
800
+ return {
801
+ exitCode: 1,
802
+ output: structuredOutput
803
+ };
804
+ }
805
+ logger.warn(`Deployment verification note: ${reuseMessage}`);
806
+ } catch (error) {
807
+ const message = error instanceof Error ? error.message : String(error);
808
+ versionRecoveryDiagnostics.push(`current production deployment: ${message}`);
809
+ }
810
+ if (resolvedVersionId && !loggedVersionId) logger.success(`Version ID: ${resolvedVersionId}`);
811
+ if (isBranchScopedPreviewDeployment && !resolvedPreviewUrl && resolvedAccountId) {
812
+ const workersSubdomain = await getWorkersSubdomain(resolvedAccountId);
813
+ if (workersSubdomain) resolvedPreviewUrl = formatWorkersDevUrl(prepared.config.name, workersSubdomain);
814
+ }
815
+ if ((preview || isBranchScopedPreviewDeployment) && resolvedPreviewUrl) logLine(logger, `Preview URL: ${resolvedPreviewUrl}`);
816
+ if (shouldVerifyDeployControlPlane()) {
817
+ if (!resolvedVersionId) {
818
+ const recoveryDetails = versionRecoveryDiagnostics.length > 0 ? ` Cloudflare fallback checks also failed: ${versionRecoveryDiagnostics.join(" | ")}` : "";
819
+ await persistDeployMetadata({
820
+ status: "failure",
821
+ exitCode: 1,
822
+ error: `Wrangler did not return a Worker version id, so Devflare could not prove which version Cloudflare accepted.${recoveryDetails}`
823
+ });
824
+ logger.error(`Deployment verification failed: Wrangler did not return a Worker version id, so Devflare could not prove which version Cloudflare accepted.${recoveryDetails}`);
825
+ return {
826
+ exitCode: 1,
827
+ output: structuredOutput
828
+ };
829
+ }
830
+ resolvedAccountId = await ensureResolvedAccountId();
831
+ if (!resolvedAccountId) {
832
+ await persistDeployMetadata({
833
+ status: "failure",
834
+ exitCode: 1,
835
+ error: "Devflare could not resolve a Cloudflare account id."
836
+ });
837
+ logger.error("Deployment verification failed: Devflare could not resolve a Cloudflare account id. Pass cloudflare-account-id to the action or set accountId in devflare.config.ts.");
838
+ return {
839
+ exitCode: 1,
840
+ output: structuredOutput
841
+ };
842
+ }
843
+ try {
844
+ await verifyDeployControlPlane({
845
+ accountId: resolvedAccountId,
846
+ workerName: prepared.config.name,
847
+ versionId: resolvedVersionId,
848
+ preview,
849
+ logger,
850
+ theme
851
+ });
852
+ } catch (error) {
853
+ const message = error instanceof Error ? error.message : String(error);
854
+ await persistDeployMetadata({
855
+ status: "failure",
856
+ exitCode: 1,
857
+ error: message
858
+ });
859
+ logger.error(`Deployment verification failed: ${message}`);
860
+ return {
861
+ exitCode: 1,
862
+ output: structuredOutput
863
+ };
864
+ }
865
+ }
866
+ if (resolvedAccountId) {
867
+ const previewRegistryScope = isBranchScopedPreviewDeployment ? deployTarget.previewScope : void 0;
868
+ const previewRegistryUrl = preview || isBranchScopedPreviewDeployment ? resolvedPreviewUrl : void 0;
869
+ try {
870
+ await reconcilePreviewRegistry({
871
+ accountId: resolvedAccountId,
872
+ workerName: prepared.config.name,
873
+ versionId: resolvedVersionId,
874
+ previewScope: previewRegistryScope,
875
+ previewUrl: previewRegistryUrl,
876
+ branchName: resolvedPreviewScopeName,
877
+ commitSha: process.env.GITHUB_SHA,
878
+ source: inferRecordSource(),
879
+ deploymentMessage: process.env.GITHUB_EVENT_NAME,
880
+ logger
881
+ });
882
+ } catch (error) {
883
+ const message = error instanceof Error ? error.message : String(error);
884
+ logger.warn(`Devflare preview registry sync failed: ${message}`);
885
+ }
886
+ }
887
+ await persistDeployMetadata({
888
+ status: "success",
889
+ exitCode: 0
890
+ });
891
+ logger.success("Deployed successfully!");
892
+ return {
893
+ exitCode: 0,
894
+ output: structuredOutput
895
+ };
896
+ });
897
+ } catch (error) {
898
+ await writeDeployResultMetadata({
899
+ status: "failure",
900
+ exitCode: 1,
901
+ preview,
902
+ branchScopedPreview: !preview && environment === "preview" && Boolean(resolvedPreviewScopeName),
903
+ previewScope: resolvedPreviewScopeName,
904
+ outputUrls: [],
905
+ ...error instanceof Error ? { error: error.message } : { error: String(error) }
906
+ });
907
+ if (error instanceof Error) {
908
+ logger.error("Deployment failed:", error.message);
909
+ if (resolvedParsed.options.debug) logger.error(error.stack);
910
+ }
911
+ return { exitCode: 1 };
912
+ }
913
+ }
914
+ //#endregion
915
+ export { runDeployCommand };