devflare 1.0.0-next.14 → 1.0.0-next.16

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 (380) hide show
  1. package/LLM.md +9360 -1784
  2. package/README.md +391 -32
  3. package/bin/devflare.js +17 -7
  4. package/dist/account-0w8wdzjv.js +475 -0
  5. package/dist/account-eygq6qx7.js +475 -0
  6. package/dist/account-fw8nafav.js +475 -0
  7. package/dist/account-pzq69nys.js +475 -0
  8. package/dist/account-s66jb15j.js +475 -0
  9. package/dist/api-d6ekexs5.js +25 -0
  10. package/dist/bridge/index.d.ts +1 -1
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/miniflare.d.ts.map +1 -1
  13. package/dist/bridge/protocol.d.ts +1 -1
  14. package/dist/bridge/protocol.d.ts.map +1 -1
  15. package/dist/bridge/proxy.d.ts +0 -4
  16. package/dist/bridge/proxy.d.ts.map +1 -1
  17. package/dist/bridge/serialization.d.ts.map +1 -1
  18. package/dist/bridge/server.d.ts +1 -1
  19. package/dist/bridge/server.d.ts.map +1 -1
  20. package/dist/browser-shim/handler.d.ts +1 -1
  21. package/dist/browser-shim/handler.d.ts.map +1 -1
  22. package/dist/browser.d.ts +1651 -34
  23. package/dist/browser.d.ts.map +1 -1
  24. package/dist/build-1kmkwqgh.js +53 -0
  25. package/dist/build-506kjhcm.js +53 -0
  26. package/dist/build-66866ahs.js +53 -0
  27. package/dist/build-g1adm3ww.js +53 -0
  28. package/dist/build-p3r3117t.js +53 -0
  29. package/dist/bundler/do-bundler.d.ts.map +1 -1
  30. package/dist/bundler/rolldown-shared.d.ts +24 -0
  31. package/dist/bundler/rolldown-shared.d.ts.map +1 -0
  32. package/dist/bundler/worker-bundler.d.ts +0 -1
  33. package/dist/bundler/worker-bundler.d.ts.map +1 -1
  34. package/dist/cli/command-utils.d.ts +18 -0
  35. package/dist/cli/command-utils.d.ts.map +1 -0
  36. package/dist/cli/commands/account.d.ts +1 -1
  37. package/dist/cli/commands/account.d.ts.map +1 -1
  38. package/dist/cli/commands/build-artifacts.d.ts +27 -0
  39. package/dist/cli/commands/build-artifacts.d.ts.map +1 -0
  40. package/dist/cli/commands/build.d.ts.map +1 -1
  41. package/dist/cli/commands/config.d.ts +4 -0
  42. package/dist/cli/commands/config.d.ts.map +1 -0
  43. package/dist/cli/commands/deploy.d.ts.map +1 -1
  44. package/dist/cli/commands/dev.d.ts.map +1 -1
  45. package/dist/cli/commands/doctor.d.ts.map +1 -1
  46. package/dist/cli/commands/init.d.ts.map +1 -1
  47. package/dist/cli/commands/login.d.ts +4 -0
  48. package/dist/cli/commands/login.d.ts.map +1 -0
  49. package/dist/cli/commands/previews-support/cleanup.d.ts +9 -0
  50. package/dist/cli/commands/previews-support/cleanup.d.ts.map +1 -0
  51. package/dist/cli/commands/previews-support/family.d.ts +10 -0
  52. package/dist/cli/commands/previews-support/family.d.ts.map +1 -0
  53. package/dist/cli/commands/previews-support/render.d.ts +8 -0
  54. package/dist/cli/commands/previews-support/render.d.ts.map +1 -0
  55. package/dist/cli/commands/previews-support/theme.d.ts +10 -0
  56. package/dist/cli/commands/previews-support/theme.d.ts.map +1 -0
  57. package/dist/cli/commands/previews-support/types.d.ts +70 -0
  58. package/dist/cli/commands/previews-support/types.d.ts.map +1 -0
  59. package/dist/cli/commands/previews.d.ts +4 -0
  60. package/dist/cli/commands/previews.d.ts.map +1 -0
  61. package/dist/cli/commands/productions.d.ts +4 -0
  62. package/dist/cli/commands/productions.d.ts.map +1 -0
  63. package/dist/cli/commands/token.d.ts +4 -0
  64. package/dist/cli/commands/token.d.ts.map +1 -0
  65. package/dist/cli/commands/type-generation/discovery.d.ts +7 -0
  66. package/dist/cli/commands/type-generation/discovery.d.ts.map +1 -0
  67. package/dist/cli/commands/type-generation/generator.d.ts +44 -0
  68. package/dist/cli/commands/type-generation/generator.d.ts.map +1 -0
  69. package/dist/cli/commands/type-generation/models.d.ts +27 -0
  70. package/dist/cli/commands/type-generation/models.d.ts.map +1 -0
  71. package/dist/cli/commands/types.d.ts.map +1 -1
  72. package/dist/cli/commands/worker.d.ts +4 -0
  73. package/dist/cli/commands/worker.d.ts.map +1 -0
  74. package/dist/cli/config-path.d.ts +2 -1
  75. package/dist/cli/config-path.d.ts.map +1 -1
  76. package/dist/cli/deploy-strategy.d.ts +17 -0
  77. package/dist/cli/deploy-strategy.d.ts.map +1 -0
  78. package/dist/cli/deploy-target.d.ts +17 -0
  79. package/dist/cli/deploy-target.d.ts.map +1 -0
  80. package/dist/cli/generated-artifacts.d.ts +12 -0
  81. package/dist/cli/generated-artifacts.d.ts.map +1 -0
  82. package/dist/cli/help-pages/pages/account.d.ts +3 -0
  83. package/dist/cli/help-pages/pages/account.d.ts.map +1 -0
  84. package/dist/cli/help-pages/pages/core.d.ts +4 -0
  85. package/dist/cli/help-pages/pages/core.d.ts.map +1 -0
  86. package/dist/cli/help-pages/pages/index.d.ts +3 -0
  87. package/dist/cli/help-pages/pages/index.d.ts.map +1 -0
  88. package/dist/cli/help-pages/pages/misc.d.ts +3 -0
  89. package/dist/cli/help-pages/pages/misc.d.ts.map +1 -0
  90. package/dist/cli/help-pages/pages/previews.d.ts +3 -0
  91. package/dist/cli/help-pages/pages/previews.d.ts.map +1 -0
  92. package/dist/cli/help-pages/pages/productions.d.ts +3 -0
  93. package/dist/cli/help-pages/pages/productions.d.ts.map +1 -0
  94. package/dist/cli/help-pages/render.d.ts +12 -0
  95. package/dist/cli/help-pages/render.d.ts.map +1 -0
  96. package/dist/cli/help-pages/shared.d.ts +15 -0
  97. package/dist/cli/help-pages/shared.d.ts.map +1 -0
  98. package/dist/cli/help-pages/types.d.ts +23 -0
  99. package/dist/cli/help-pages/types.d.ts.map +1 -0
  100. package/dist/cli/help.d.ts +6 -0
  101. package/dist/cli/help.d.ts.map +1 -0
  102. package/dist/cli/index.d.ts +1 -0
  103. package/dist/cli/index.d.ts.map +1 -1
  104. package/dist/cli/preview-bindings.d.ts +42 -0
  105. package/dist/cli/preview-bindings.d.ts.map +1 -0
  106. package/dist/cli/preview.d.ts +11 -0
  107. package/dist/cli/preview.d.ts.map +1 -0
  108. package/dist/cli/ui.d.ts +37 -0
  109. package/dist/cli/ui.d.ts.map +1 -0
  110. package/dist/cli/workspace-build-guard.d.ts +14 -0
  111. package/dist/cli/workspace-build-guard.d.ts.map +1 -0
  112. package/dist/cloudflare/account-core.d.ts +6 -0
  113. package/dist/cloudflare/account-core.d.ts.map +1 -0
  114. package/dist/cloudflare/account-resources.d.ts +40 -0
  115. package/dist/cloudflare/account-resources.d.ts.map +1 -0
  116. package/dist/cloudflare/account-status.d.ts +11 -0
  117. package/dist/cloudflare/account-status.d.ts.map +1 -0
  118. package/dist/cloudflare/account-workers.d.ts +14 -0
  119. package/dist/cloudflare/account-workers.d.ts.map +1 -0
  120. package/dist/cloudflare/account.d.ts +7 -64
  121. package/dist/cloudflare/account.d.ts.map +1 -1
  122. package/dist/cloudflare/api.d.ts +4 -0
  123. package/dist/cloudflare/api.d.ts.map +1 -1
  124. package/dist/cloudflare/index.d.ts +57 -2
  125. package/dist/cloudflare/index.d.ts.map +1 -1
  126. package/dist/cloudflare/kv-namespace.d.ts +3 -0
  127. package/dist/cloudflare/kv-namespace.d.ts.map +1 -0
  128. package/dist/cloudflare/preferences.d.ts.map +1 -1
  129. package/dist/cloudflare/preview-registry-cache.d.ts +6 -0
  130. package/dist/cloudflare/preview-registry-cache.d.ts.map +1 -0
  131. package/dist/cloudflare/preview-registry-records.d.ts +61 -0
  132. package/dist/cloudflare/preview-registry-records.d.ts.map +1 -0
  133. package/dist/cloudflare/preview-registry-store.d.ts +14 -0
  134. package/dist/cloudflare/preview-registry-store.d.ts.map +1 -0
  135. package/dist/cloudflare/preview-registry-types.d.ts +103 -0
  136. package/dist/cloudflare/preview-registry-types.d.ts.map +1 -0
  137. package/dist/cloudflare/preview-registry.d.ts +42 -0
  138. package/dist/cloudflare/preview-registry.d.ts.map +1 -0
  139. package/dist/cloudflare/registry-schema.d.ts +253 -0
  140. package/dist/cloudflare/registry-schema.d.ts.map +1 -0
  141. package/dist/cloudflare/tokens.d.ts +18 -0
  142. package/dist/cloudflare/tokens.d.ts.map +1 -0
  143. package/dist/cloudflare/types.d.ts +122 -5
  144. package/dist/cloudflare/types.d.ts.map +1 -1
  145. package/dist/cloudflare/usage.d.ts.map +1 -1
  146. package/dist/config/compiler.d.ts +4 -0
  147. package/dist/config/compiler.d.ts.map +1 -1
  148. package/dist/config/framework-providers.d.ts +9 -0
  149. package/dist/config/framework-providers.d.ts.map +1 -0
  150. package/dist/config/index.d.ts +5 -3
  151. package/dist/config/index.d.ts.map +1 -1
  152. package/dist/config/loader.d.ts +1 -0
  153. package/dist/config/loader.d.ts.map +1 -1
  154. package/dist/config/preview-resources.d.ts +77 -0
  155. package/dist/config/preview-resources.d.ts.map +1 -0
  156. package/dist/config/preview.d.ts +31 -0
  157. package/dist/config/preview.d.ts.map +1 -0
  158. package/dist/config/ref.d.ts +0 -22
  159. package/dist/config/ref.d.ts.map +1 -1
  160. package/dist/config/resolve.d.ts +1 -0
  161. package/dist/config/resolve.d.ts.map +1 -1
  162. package/dist/config/resource-resolution.d.ts +60 -0
  163. package/dist/config/resource-resolution.d.ts.map +1 -0
  164. package/dist/config/schema-bindings.d.ts +693 -0
  165. package/dist/config/schema-bindings.d.ts.map +1 -0
  166. package/dist/config/schema-build.d.ts +67 -0
  167. package/dist/config/schema-build.d.ts.map +1 -0
  168. package/dist/config/schema-env.d.ts +1341 -0
  169. package/dist/config/schema-env.d.ts.map +1 -0
  170. package/dist/config/schema-normalization.d.ts +64 -0
  171. package/dist/config/schema-normalization.d.ts.map +1 -0
  172. package/dist/config/schema-runtime.d.ts +230 -0
  173. package/dist/config/schema-runtime.d.ts.map +1 -0
  174. package/dist/config/schema.d.ts +640 -3669
  175. package/dist/config/schema.d.ts.map +1 -1
  176. package/dist/config-entry.d.ts +5 -0
  177. package/dist/config-entry.d.ts.map +1 -0
  178. package/dist/config-fjwke42y.js +59 -0
  179. package/dist/config-hwdqjse7.js +59 -0
  180. package/dist/config-pxvewrhv.js +59 -0
  181. package/dist/config-q0g5qdga.js +59 -0
  182. package/dist/decorators/durable-object.d.ts.map +1 -1
  183. package/dist/deploy-7nmzc9r8.js +609 -0
  184. package/dist/deploy-csfhdr64.js +691 -0
  185. package/dist/deploy-ex4g5avz.js +621 -0
  186. package/dist/deploy-jnb0bhka.js +609 -0
  187. package/dist/deploy-tp0g6qdp.js +609 -0
  188. package/dist/deploy-ykpcjkc2.js +690 -0
  189. package/dist/{dev-c1xc1gq9.js → dev-2pd33m28.js} +392 -348
  190. package/dist/dev-7ef5e2j1.js +2409 -0
  191. package/dist/dev-8nssqatr.js +2409 -0
  192. package/dist/dev-grznx8fn.js +2409 -0
  193. package/dist/dev-server/d1-migrations.d.ts +14 -0
  194. package/dist/dev-server/d1-migrations.d.ts.map +1 -0
  195. package/dist/dev-server/gateway-script.d.ts +8 -0
  196. package/dist/dev-server/gateway-script.d.ts.map +1 -0
  197. package/dist/dev-server/runtime-stdio.d.ts.map +1 -1
  198. package/dist/dev-server/server.d.ts.map +1 -1
  199. package/dist/dev-server/vite-process.d.ts +14 -0
  200. package/dist/dev-server/vite-process.d.ts.map +1 -0
  201. package/dist/dev-server/vite-utils.d.ts +1 -1
  202. package/dist/dev-server/vite-utils.d.ts.map +1 -1
  203. package/dist/dev-server/worker-source-watcher.d.ts +11 -0
  204. package/dist/dev-server/worker-source-watcher.d.ts.map +1 -0
  205. package/dist/dev-server/worker-surface-paths.d.ts +6 -0
  206. package/dist/dev-server/worker-surface-paths.d.ts.map +1 -0
  207. package/dist/{doctor-z4ffybce.js → doctor-04ammrrh.js} +67 -31
  208. package/dist/doctor-fmjj65mc.js +245 -0
  209. package/dist/doctor-fzkznce1.js +245 -0
  210. package/dist/doctor-sa5xv1bz.js +245 -0
  211. package/dist/index-091sh1ma.js +1229 -0
  212. package/dist/index-0apbm26n.js +788 -0
  213. package/dist/index-0eqksag4.js +418 -0
  214. package/dist/{index-dr6sbp8d.js → index-0kfzdywd.js} +15 -2
  215. package/dist/index-0w826dsr.js +379 -0
  216. package/dist/{index-rfhx0yd5.js → index-11m5a8wd.js} +110 -32
  217. package/dist/{index-xxwbb2nt.js → index-1sp39f2f.js} +114 -58
  218. package/dist/index-2jnrqbny.js +1301 -0
  219. package/dist/index-2pb7b9mw.js +378 -0
  220. package/dist/{index-0kzg8wed.js → index-2x53aqjm.js} +1071 -890
  221. package/dist/index-3ke5d2vn.js +1229 -0
  222. package/dist/index-43dq8yx8.js +788 -0
  223. package/dist/index-4rrttqj5.js +378 -0
  224. package/dist/index-4v9bc2pc.js +1367 -0
  225. package/dist/index-61jsjnsv.js +280 -0
  226. package/dist/index-6jef5emv.js +176 -0
  227. package/dist/index-6psz1h4c.js +788 -0
  228. package/dist/index-72mve6vh.js +168 -0
  229. package/dist/{index-zbvmtcn2.js → index-74198nxd.js} +179 -77
  230. package/dist/index-7g8zyws4.js +192 -0
  231. package/dist/index-7kcxjhta.js +456 -0
  232. package/dist/index-7v583xan.js +418 -0
  233. package/dist/index-7x0ybbtx.js +133 -0
  234. package/dist/index-816krz9p.js +52 -0
  235. package/dist/index-82f1z98k.js +41 -0
  236. package/dist/index-8t5nb4qx.js +133 -0
  237. package/dist/index-9az6s7ad.js +52 -0
  238. package/dist/{index-59df49vn.js → index-9ba1etyz.js} +29 -51
  239. package/dist/{index-001mw014.js → index-9fbtk7gv.js} +134 -248
  240. package/dist/index-9n6djthj.js +490 -0
  241. package/dist/index-aabgympv.js +39 -0
  242. package/dist/index-b8m6883k.js +74 -0
  243. package/dist/{index-5yxg30va.js → index-cgbvmse6.js} +15 -6
  244. package/dist/index-d8etnfef.js +1229 -0
  245. package/dist/index-e9yw4d6y.js +133 -0
  246. package/dist/index-epw1jxz5.js +1204 -0
  247. package/dist/index-f85s8gj3.js +2649 -0
  248. package/dist/index-fe2ngvh7.js +1229 -0
  249. package/dist/index-fvsadj32.js +192 -0
  250. package/dist/index-gs4y9gdf.js +456 -0
  251. package/dist/{index-fef08w43.js → index-h18pxvzs.js} +7 -6
  252. package/dist/index-hfj1a2c4.js +2649 -0
  253. package/dist/{index-8gtqgb3q.js → index-hjy8ctpc.js} +14 -92
  254. package/dist/index-htzf0py1.js +1204 -0
  255. package/dist/index-j185x270.js +897 -0
  256. package/dist/index-jb75kwa4.js +519 -0
  257. package/dist/index-jwd8pcb2.js +897 -0
  258. package/dist/index-k29yjhv0.js +52 -0
  259. package/dist/index-k6vq6kkt.js +456 -0
  260. package/dist/{index-vky23txa.js → index-m3fmw6mx.js} +2 -2
  261. package/dist/index-maxpsfk8.js +402 -0
  262. package/dist/index-mbdmrner.js +402 -0
  263. package/dist/index-mea5bc45.js +418 -0
  264. package/dist/index-mqekt778.js +185 -0
  265. package/dist/index-na3mnm1k.js +74 -0
  266. package/dist/index-p03n4qet.js +1367 -0
  267. package/dist/index-p296ban8.js +191 -0
  268. package/dist/index-pnbs1b8k.js +280 -0
  269. package/dist/index-q4kaz181.js +1207 -0
  270. package/dist/index-ry131z23.js +378 -0
  271. package/dist/index-sgb7c8nm.js +402 -0
  272. package/dist/index-sqrksgb2.js +133 -0
  273. package/dist/index-stgn34cr.js +148 -0
  274. package/dist/{index-v8vvsn9x.js → index-t08te69w.js} +1 -18
  275. package/dist/index-thna1tkd.js +280 -0
  276. package/dist/index-v5nmqthy.js +74 -0
  277. package/dist/{index-n932ytmq.js → index-vt4yxkmf.js} +2 -2
  278. package/dist/index-wyq6c6yj.js +402 -0
  279. package/dist/index-wztc9stx.js +418 -0
  280. package/dist/index-x9cwdxw5.js +456 -0
  281. package/dist/index-xk9djfjp.js +519 -0
  282. package/dist/index-yc0gcchc.js +418 -0
  283. package/dist/index-yqbxjysa.js +897 -0
  284. package/dist/index-yzddwp02.js +788 -0
  285. package/dist/index-zfhq6s96.js +74 -0
  286. package/dist/index-zt22fe2j.js +54 -0
  287. package/dist/index-zyt5byt6.js +2649 -0
  288. package/dist/index.d.ts +2 -2
  289. package/dist/index.d.ts.map +1 -1
  290. package/dist/{init-na2atvz2.js → init-r4hnxan3.js} +24 -17
  291. package/dist/login-2hnz4m4n.js +77 -0
  292. package/dist/login-5bsxxpvc.js +77 -0
  293. package/dist/login-6tzvczw2.js +77 -0
  294. package/dist/login-bhaw72zc.js +77 -0
  295. package/dist/login-x8tgckqm.js +77 -0
  296. package/dist/previews-3rn8mz2c.js +1168 -0
  297. package/dist/previews-d487qde5.js +1200 -0
  298. package/dist/previews-gm3z0syj.js +1168 -0
  299. package/dist/previews-j9ymq4ys.js +1169 -0
  300. package/dist/previews-q031mx34.js +1168 -0
  301. package/dist/productions-120xg0aq.js +505 -0
  302. package/dist/productions-5ev5qweg.js +505 -0
  303. package/dist/productions-me3tdvr9.js +505 -0
  304. package/dist/productions-p5rbgp2f.js +505 -0
  305. package/dist/productions-x9p0pym1.js +505 -0
  306. package/dist/runtime/context-events.d.ts +13 -0
  307. package/dist/runtime/context-events.d.ts.map +1 -0
  308. package/dist/runtime/context-types.d.ts +82 -0
  309. package/dist/runtime/context-types.d.ts.map +1 -0
  310. package/dist/runtime/context.d.ts +6 -267
  311. package/dist/runtime/context.d.ts.map +1 -1
  312. package/dist/runtime/exports.d.ts +3 -3
  313. package/dist/runtime/index.d.ts +1 -1
  314. package/dist/runtime/index.d.ts.map +1 -1
  315. package/dist/runtime/middleware.d.ts +8 -38
  316. package/dist/runtime/middleware.d.ts.map +1 -1
  317. package/dist/src/browser.js +23 -14
  318. package/dist/src/cli/index.js +3 -1
  319. package/dist/src/cloudflare/index.js +49 -2
  320. package/dist/src/config-entry.js +14 -0
  321. package/dist/src/index.js +33 -20
  322. package/dist/src/runtime/index.js +3 -9
  323. package/dist/src/sveltekit/index.js +10 -7
  324. package/dist/src/test/index.js +16 -18
  325. package/dist/src/vite/index.js +7 -4
  326. package/dist/sveltekit/platform.d.ts +1 -1
  327. package/dist/sveltekit/platform.d.ts.map +1 -1
  328. package/dist/test/cf.d.ts +10 -10
  329. package/dist/test/email.d.ts.map +1 -1
  330. package/dist/test/index.d.ts +1 -6
  331. package/dist/test/index.d.ts.map +1 -1
  332. package/dist/test/queue.d.ts.map +1 -1
  333. package/dist/test/remote-ai.d.ts.map +1 -1
  334. package/dist/test/remote-cloudflare.d.ts +13 -0
  335. package/dist/test/remote-cloudflare.d.ts.map +1 -0
  336. package/dist/test/remote-vectorize.d.ts.map +1 -1
  337. package/dist/test/resolve-service-bindings.d.ts.map +1 -1
  338. package/dist/test/scheduled.d.ts.map +1 -1
  339. package/dist/test/should-skip.d.ts +0 -18
  340. package/dist/test/should-skip.d.ts.map +1 -1
  341. package/dist/test/simple-context-durable-objects.d.ts +6 -0
  342. package/dist/test/simple-context-durable-objects.d.ts.map +1 -0
  343. package/dist/test/simple-context-gateway-script.d.ts +2 -0
  344. package/dist/test/simple-context-gateway-script.d.ts.map +1 -0
  345. package/dist/test/simple-context-paths.d.ts +40 -0
  346. package/dist/test/simple-context-paths.d.ts.map +1 -0
  347. package/dist/test/simple-context.d.ts +1 -23
  348. package/dist/test/simple-context.d.ts.map +1 -1
  349. package/dist/test/tail.d.ts.map +1 -1
  350. package/dist/test/worker.d.ts.map +1 -1
  351. package/dist/token-kedhcret.js +419 -0
  352. package/dist/token-m8jmnjwk.js +419 -0
  353. package/dist/{types-sffr9681.js → types-0sqwkp7x.js} +244 -139
  354. package/dist/types-1gwr2ex6.js +572 -0
  355. package/dist/types-6e5yx6km.js +572 -0
  356. package/dist/types-p0gckpn6.js +572 -0
  357. package/dist/utils/send-email.d.ts.map +1 -1
  358. package/dist/vite/config-file.d.ts.map +1 -1
  359. package/dist/vite/plugin.d.ts.map +1 -1
  360. package/dist/worker-0srh2jfr.js +513 -0
  361. package/dist/worker-4xrfd10a.js +513 -0
  362. package/dist/worker-entry/composed-worker.d.ts +0 -7
  363. package/dist/worker-entry/composed-worker.d.ts.map +1 -1
  364. package/dist/worker-entry/surface-paths.d.ts +15 -0
  365. package/dist/worker-entry/surface-paths.d.ts.map +1 -0
  366. package/dist/worker-qtam8grz.js +513 -0
  367. package/dist/worker-qzm0b7br.js +513 -0
  368. package/dist/worker-y9ha6g44.js +513 -0
  369. package/package.json +17 -10
  370. package/R2.md +0 -200
  371. package/dist/account-8psavtg6.js +0 -420
  372. package/dist/build-n639efmn.js +0 -101
  373. package/dist/deploy-zvnq6xh7.js +0 -117
  374. package/dist/index-2q3pmzrx.js +0 -90
  375. package/dist/index-f4q0jbnj.js +0 -195
  376. package/dist/index-n7rs26ft.js +0 -77
  377. package/dist/index-tfyxa77h.js +0 -850
  378. package/dist/index-wyf3s77s.js +0 -343
  379. package/dist/test/multi-worker-context.d.ts +0 -114
  380. package/dist/test/multi-worker-context.d.ts.map +0 -1
@@ -0,0 +1,1204 @@
1
+ import {
2
+ createD1Database,
3
+ getWorkerVersionDetail,
4
+ getWorkersSubdomain,
5
+ listD1Databases,
6
+ listWorkerDeployments,
7
+ listWorkerVersions,
8
+ queryD1Database
9
+ } from "./index-jb75kwa4.js";
10
+ import {
11
+ CloudflareAPIError
12
+ } from "./index-0w826dsr.js";
13
+
14
+ // src/cli/preview.ts
15
+ function normalizeWorkersSubdomain(accountSubdomain) {
16
+ return accountSubdomain.trim().replace(/^https?:\/\//i, "").replace(/\.workers\.dev\/?$/i, "");
17
+ }
18
+ function formatWorkersDevUrl(workerName, accountSubdomain) {
19
+ const normalizedSubdomain = normalizeWorkersSubdomain(accountSubdomain);
20
+ return `https://${workerName}.${normalizedSubdomain}.workers.dev`;
21
+ }
22
+ function formatVersionPreviewUrl(versionId, workerName, accountSubdomain) {
23
+ const normalizedSubdomain = normalizeWorkersSubdomain(accountSubdomain);
24
+ const versionPrefix = versionId.split("-")[0] || versionId;
25
+ return `https://${versionPrefix}-${workerName}.${normalizedSubdomain}.workers.dev`;
26
+ }
27
+ function matchNamedValue(output, patterns) {
28
+ for (const pattern of patterns) {
29
+ const match = output.match(pattern);
30
+ if (match?.[1]) {
31
+ return match[1];
32
+ }
33
+ }
34
+ return;
35
+ }
36
+ function appendUniqueUrls(target, value) {
37
+ if (typeof value === "string") {
38
+ if (value.startsWith("http://") || value.startsWith("https://")) {
39
+ target.push(value);
40
+ }
41
+ return;
42
+ }
43
+ if (!Array.isArray(value)) {
44
+ return;
45
+ }
46
+ for (const item of value) {
47
+ appendUniqueUrls(target, item);
48
+ }
49
+ }
50
+ function parseWranglerStructuredOutput(output) {
51
+ const records = output.replace(/\r/g, "").split(`
52
+ `).map((line) => line.trim()).filter(Boolean).map((line) => {
53
+ try {
54
+ return JSON.parse(line);
55
+ } catch {
56
+ return null;
57
+ }
58
+ }).filter((record) => record !== null);
59
+ const urls = [];
60
+ let versionId;
61
+ let previewUrl;
62
+ for (const record of records) {
63
+ if (!versionId && typeof record.version_id === "string" && record.version_id.trim()) {
64
+ versionId = record.version_id.trim();
65
+ }
66
+ appendUniqueUrls(urls, record.targets);
67
+ appendUniqueUrls(urls, record.preview_urls);
68
+ appendUniqueUrls(urls, record.urls);
69
+ appendUniqueUrls(urls, record.url);
70
+ if (!previewUrl && typeof record.preview_url === "string" && record.preview_url.trim()) {
71
+ previewUrl = record.preview_url.trim();
72
+ }
73
+ }
74
+ const uniqueUrls = [...new Set(urls)];
75
+ if (!previewUrl) {
76
+ previewUrl = uniqueUrls.find((url) => url.includes("workers.dev"));
77
+ }
78
+ return {
79
+ versionId,
80
+ previewUrl,
81
+ urls: uniqueUrls
82
+ };
83
+ }
84
+ function mergeParsedWranglerDeployOutputs(...outputs) {
85
+ const urls = [...new Set(outputs.flatMap((output) => output.urls))];
86
+ return {
87
+ versionId: outputs.map((output) => output.versionId).find((value) => Boolean(value)),
88
+ previewUrl: outputs.map((output) => output.previewUrl).find((value) => Boolean(value)) ?? urls.find((url) => url.includes("workers.dev")),
89
+ urls
90
+ };
91
+ }
92
+ function parseWranglerDeployOutput(output) {
93
+ const normalizedOutput = output.replace(/\r/g, "");
94
+ const urls = [...new Set(normalizedOutput.match(/https?:\/\/[^\s'"`]+/g) ?? [])];
95
+ const previewUrl = matchNamedValue(normalizedOutput, [
96
+ /Preview URL:\s*(https?:\/\/\S+)/i,
97
+ /Version Preview URL:\s*(https?:\/\/\S+)/i
98
+ ]) ?? urls.find((url) => url.includes("workers.dev"));
99
+ const versionId = matchNamedValue(normalizedOutput, [
100
+ /Worker Version ID:\s*([A-Za-z0-9_-]+)/i,
101
+ /Version ID:\s*([A-Za-z0-9_-]+)/i,
102
+ /version(?:_id| id)?\s*[:=]\s*([A-Za-z0-9_-]+)/i,
103
+ /"id"\s*:\s*"([A-Za-z0-9_-]+)"/i
104
+ ]);
105
+ return {
106
+ versionId,
107
+ previewUrl,
108
+ urls
109
+ };
110
+ }
111
+
112
+ // src/cloudflare/preview-registry-types.ts
113
+ var DEVFLARE_PREVIEW_REGISTRY_DATABASE = "devflare-registry";
114
+
115
+ // src/cloudflare/registry-schema.ts
116
+ import { z } from "zod/v4";
117
+ var recordIdSchema = z.string().min(1);
118
+ var cloudflareAccountIdSchema = z.string().min(1);
119
+ var cloudflareVersionIdSchema = z.string().uuid();
120
+ var workerNameSchema = z.string().min(1);
121
+ var timestampSchema = z.coerce.date();
122
+ var urlSchema = z.string().url();
123
+ var branchNameSchema = z.string().min(1);
124
+ var commitShaSchema = z.string().regex(/^[a-f0-9]{7,40}$/i, {
125
+ message: "Commit SHA must be 7 to 40 hexadecimal characters"
126
+ });
127
+ var previewScopeSchema = z.string().regex(/^[a-z][a-z0-9-]*$/, {
128
+ message: "Preview names must start with a lowercase letter and contain only lowercase letters, numbers, and dashes"
129
+ });
130
+ var cloudflareUserIdSchema = z.union([
131
+ z.string().min(1),
132
+ z.number().int().nonnegative().transform((value) => String(value))
133
+ ]);
134
+ var devflareAccountRecordSchema = z.object({
135
+ id: recordIdSchema,
136
+ ver: z.number().int().min(1),
137
+ createdAt: timestampSchema,
138
+ updatedAt: timestampSchema.optional(),
139
+ deletedAt: timestampSchema.optional(),
140
+ createdBy: cloudflareUserIdSchema
141
+ }).strict();
142
+ function createDevflareAccountRecordSchema(shape) {
143
+ return devflareAccountRecordSchema.extend(shape);
144
+ }
145
+ var devflareRecordSourceSchema = z.enum([
146
+ "cli",
147
+ "github-action",
148
+ "workers-builds",
149
+ "dashboard",
150
+ "unknown"
151
+ ]);
152
+ var devflarePreviewStatusSchema = z.enum([
153
+ "active",
154
+ "superseded",
155
+ "orphaned",
156
+ "deleted"
157
+ ]);
158
+ var devflarePreviewScopeStatusSchema = z.enum([
159
+ "active",
160
+ "reassigned",
161
+ "deleted"
162
+ ]);
163
+ var devflareDeploymentChannelSchema = z.enum([
164
+ "production",
165
+ "preview"
166
+ ]);
167
+ var devflareDeploymentStatusSchema = z.enum([
168
+ "active",
169
+ "superseded",
170
+ "rolled_back",
171
+ "deleted"
172
+ ]);
173
+ var devflarePreviewRecordSchema = createDevflareAccountRecordSchema({
174
+ kind: z.literal("preview"),
175
+ accountId: cloudflareAccountIdSchema,
176
+ workerName: workerNameSchema,
177
+ versionId: cloudflareVersionIdSchema,
178
+ previewUrl: urlSchema,
179
+ scope: previewScopeSchema.optional(),
180
+ scopeUrl: urlSchema.optional(),
181
+ branchName: branchNameSchema.optional(),
182
+ commitSha: commitShaSchema.optional(),
183
+ deploymentId: recordIdSchema.optional(),
184
+ source: devflareRecordSourceSchema.default("unknown"),
185
+ status: devflarePreviewStatusSchema.default("active")
186
+ }).superRefine((record, ctx) => {
187
+ if (record.scopeUrl && !record.scope) {
188
+ ctx.addIssue({
189
+ code: "custom",
190
+ path: ["scopeUrl"],
191
+ message: "scopeUrl requires scope to be set"
192
+ });
193
+ }
194
+ });
195
+ var devflarePreviewScopeRecordSchema = createDevflareAccountRecordSchema({
196
+ kind: z.literal("previewScope"),
197
+ accountId: cloudflareAccountIdSchema,
198
+ workerName: workerNameSchema,
199
+ scope: previewScopeSchema,
200
+ scopeUrl: urlSchema,
201
+ versionId: cloudflareVersionIdSchema,
202
+ previewId: recordIdSchema.optional(),
203
+ branchName: branchNameSchema.optional(),
204
+ commitSha: commitShaSchema.optional(),
205
+ source: devflareRecordSourceSchema.default("unknown"),
206
+ status: devflarePreviewScopeStatusSchema.default("active")
207
+ });
208
+ var devflareDeploymentRecordSchema = createDevflareAccountRecordSchema({
209
+ kind: z.literal("deployment"),
210
+ accountId: cloudflareAccountIdSchema,
211
+ workerName: workerNameSchema,
212
+ deploymentId: recordIdSchema,
213
+ channel: devflareDeploymentChannelSchema,
214
+ status: devflareDeploymentStatusSchema.default("active"),
215
+ versionId: cloudflareVersionIdSchema,
216
+ previewId: recordIdSchema.optional(),
217
+ environment: z.string().min(1).optional(),
218
+ url: urlSchema.optional(),
219
+ message: z.string().min(1).optional(),
220
+ commitSha: commitShaSchema.optional(),
221
+ source: devflareRecordSourceSchema.default("unknown")
222
+ }).superRefine((record, ctx) => {
223
+ if (record.channel === "preview" && !record.previewId) {
224
+ ctx.addIssue({
225
+ code: "custom",
226
+ path: ["previewId"],
227
+ message: "Preview deployments must reference the preview record they materialize"
228
+ });
229
+ }
230
+ if (record.channel === "production" && record.previewId) {
231
+ ctx.addIssue({
232
+ code: "custom",
233
+ path: ["previewId"],
234
+ message: "Production deployments should not reference previewId"
235
+ });
236
+ }
237
+ });
238
+ var devflareAccountLayerRecordSchema = z.discriminatedUnion("kind", [
239
+ devflarePreviewRecordSchema,
240
+ devflarePreviewScopeRecordSchema,
241
+ devflareDeploymentRecordSchema
242
+ ]);
243
+
244
+ // src/cloudflare/preview-registry-cache.ts
245
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
246
+ import { homedir } from "node:os";
247
+ import { join } from "node:path";
248
+ var DEVFLARE_CACHE_DIR = ".devflare";
249
+ var PREVIEW_REGISTRY_CACHE_FILE = "preview-registry.json";
250
+ function getDevflareCacheDir() {
251
+ const override = process.env.DEVFLARE_CACHE_DIR?.trim();
252
+ if (override) {
253
+ return override;
254
+ }
255
+ return join(homedir(), DEVFLARE_CACHE_DIR);
256
+ }
257
+ function getPreviewRegistryCachePath() {
258
+ return join(getDevflareCacheDir(), PREVIEW_REGISTRY_CACHE_FILE);
259
+ }
260
+ function getPreviewRegistryCacheKey(accountId, databaseName) {
261
+ return `${accountId}:${databaseName}`;
262
+ }
263
+ function readPreviewRegistryCache() {
264
+ const cachePath = getPreviewRegistryCachePath();
265
+ if (!existsSync(cachePath)) {
266
+ return {};
267
+ }
268
+ try {
269
+ const content = readFileSync(cachePath, "utf-8");
270
+ return JSON.parse(content);
271
+ } catch {
272
+ return {};
273
+ }
274
+ }
275
+ function writePreviewRegistryCache(cache) {
276
+ try {
277
+ const cacheDir = getDevflareCacheDir();
278
+ if (!existsSync(cacheDir)) {
279
+ mkdirSync(cacheDir, { recursive: true });
280
+ }
281
+ writeFileSync(getPreviewRegistryCachePath(), JSON.stringify(cache, null, "\t"), "utf-8");
282
+ } catch {}
283
+ }
284
+ function getRegistryDatabaseName(databaseName) {
285
+ return databaseName?.trim() || DEVFLARE_PREVIEW_REGISTRY_DATABASE;
286
+ }
287
+ function getCachedPreviewRegistryContext(accountId, databaseName) {
288
+ const entry = readPreviewRegistryCache().registries?.[getPreviewRegistryCacheKey(accountId, databaseName)];
289
+ if (!entry?.databaseId) {
290
+ return null;
291
+ }
292
+ return {
293
+ accountId: entry.accountId,
294
+ databaseId: entry.databaseId,
295
+ databaseName: entry.databaseName,
296
+ created: false
297
+ };
298
+ }
299
+ function cachePreviewRegistryContext(registry) {
300
+ const cache = readPreviewRegistryCache();
301
+ const registries = cache.registries ?? {};
302
+ registries[getPreviewRegistryCacheKey(registry.accountId, registry.databaseName)] = {
303
+ accountId: registry.accountId,
304
+ databaseId: registry.databaseId,
305
+ databaseName: registry.databaseName,
306
+ updatedAt: new Date().toISOString()
307
+ };
308
+ writePreviewRegistryCache({
309
+ ...cache,
310
+ registries
311
+ });
312
+ }
313
+ function clearCachedPreviewRegistryContext(accountId, databaseName) {
314
+ const cache = readPreviewRegistryCache();
315
+ if (!cache.registries) {
316
+ return;
317
+ }
318
+ delete cache.registries[getPreviewRegistryCacheKey(accountId, databaseName)];
319
+ writePreviewRegistryCache(cache);
320
+ }
321
+
322
+ // src/cloudflare/preview-registry-records.ts
323
+ function toIsoString(date) {
324
+ return date ? date.toISOString() : null;
325
+ }
326
+ function inferRecordSource(explicitSource, fallbackSource) {
327
+ if (explicitSource) {
328
+ return explicitSource;
329
+ }
330
+ if (fallbackSource === "dashboard") {
331
+ return "dashboard";
332
+ }
333
+ if (fallbackSource === "workers-builds") {
334
+ return "workers-builds";
335
+ }
336
+ if (fallbackSource === "wrangler") {
337
+ return process.env.GITHUB_ACTIONS === "true" ? "github-action" : "cli";
338
+ }
339
+ return "unknown";
340
+ }
341
+ function getPreviewRecordId(workerName, versionId) {
342
+ return `preview:${workerName}:${versionId}`;
343
+ }
344
+ function getPreviewScopeRecordId(workerName, scope) {
345
+ return `previewScope:${workerName}:${scope}`;
346
+ }
347
+ function getPreviewDeploymentId(workerName, versionId) {
348
+ return `preview:${workerName}:${versionId}`;
349
+ }
350
+ function getDeploymentRecordId(workerName, deploymentId) {
351
+ return `deployment:${workerName}:${deploymentId}`;
352
+ }
353
+ function hasRetireSelector(options) {
354
+ return Boolean(options.branchName || options.previewScope || options.versionId || options.commitSha);
355
+ }
356
+ function matchesRetireSelector(options, candidate) {
357
+ return options.branchName !== undefined && candidate.branchName === options.branchName || options.previewScope !== undefined && candidate.previewScope === options.previewScope || options.versionId !== undefined && candidate.versionId === options.versionId || options.commitSha !== undefined && candidate.commitSha === options.commitSha;
358
+ }
359
+ function getPreviewRetireCandidate(record) {
360
+ return {
361
+ branchName: record.branchName,
362
+ previewScope: record.scope,
363
+ versionId: record.versionId,
364
+ commitSha: record.commitSha
365
+ };
366
+ }
367
+ function matchesPreviewRetireTarget(record, options) {
368
+ return matchesRetireSelector(options, getPreviewRetireCandidate(record));
369
+ }
370
+ function matchesPreviewScopeRetireTarget(record, options) {
371
+ return matchesRetireSelector(options, getPreviewRetireCandidate(record));
372
+ }
373
+ function matchesPreviewDeploymentRetireTarget(record, options) {
374
+ return record.channel === "preview" && matchesRetireSelector(options, {
375
+ versionId: record.versionId,
376
+ commitSha: record.commitSha
377
+ });
378
+ }
379
+ function markRecordDeleted(record, now, parser) {
380
+ return parser.parse({
381
+ ...record,
382
+ updatedAt: now,
383
+ deletedAt: now,
384
+ status: "deleted"
385
+ });
386
+ }
387
+ function getVersionAuthorId(version, existingCreatedBy) {
388
+ return version?.metadata.authorId || existingCreatedBy || "unknown";
389
+ }
390
+ function createPreviewLinkedRecordBase(options) {
391
+ return {
392
+ createdAt: options.existingCreatedAt ?? options.previewRecord.createdAt,
393
+ updatedAt: options.now,
394
+ deletedAt: undefined,
395
+ createdBy: options.previewRecord.createdBy,
396
+ accountId: options.accountId,
397
+ workerName: options.workerName,
398
+ versionId: options.previewRecord.versionId,
399
+ previewId: options.previewRecord.id,
400
+ commitSha: options.previewRecord.commitSha,
401
+ source: options.previewRecord.source,
402
+ status: "active"
403
+ };
404
+ }
405
+ function buildPreviewRecord(options) {
406
+ const scope = options.previewScope ?? options.existing?.scope;
407
+ const previewUrl = options.previewUrl ?? options.existing?.previewUrl ?? (options.workersSubdomain ? formatVersionPreviewUrl(options.version.id, options.workerName, options.workersSubdomain) : undefined);
408
+ const scopeChanged = options.previewScope !== undefined && options.previewScope !== options.existing?.scope;
409
+ const scopeUrl = options.previewScopeUrl ?? (options.previewScope !== undefined ? options.previewUrl : undefined) ?? (!scopeChanged ? options.existing?.scopeUrl : undefined);
410
+ if (!previewUrl) {
411
+ return null;
412
+ }
413
+ return devflarePreviewRecordSchema.parse({
414
+ id: getPreviewRecordId(options.workerName, options.version.id),
415
+ kind: "preview",
416
+ ver: 1,
417
+ createdAt: options.existing?.createdAt ?? options.version.metadata.createdOn ?? options.now,
418
+ updatedAt: options.now,
419
+ deletedAt: undefined,
420
+ createdBy: getVersionAuthorId(options.version, options.existing?.createdBy),
421
+ accountId: options.accountId,
422
+ workerName: options.workerName,
423
+ versionId: options.version.id,
424
+ previewUrl,
425
+ scope,
426
+ scopeUrl,
427
+ branchName: options.branchName ?? options.existing?.branchName,
428
+ commitSha: options.commitSha ?? options.existing?.commitSha,
429
+ deploymentId: options.existing?.deploymentId,
430
+ source: inferRecordSource(options.source, options.version.metadata.source),
431
+ status: "active"
432
+ });
433
+ }
434
+ function buildPreviewScopeRecord(options) {
435
+ if (!options.previewRecord.scope || !options.previewRecord.scopeUrl) {
436
+ return null;
437
+ }
438
+ return devflarePreviewScopeRecordSchema.parse({
439
+ id: getPreviewScopeRecordId(options.workerName, options.previewRecord.scope),
440
+ kind: "previewScope",
441
+ ver: 1,
442
+ ...createPreviewLinkedRecordBase({
443
+ accountId: options.accountId,
444
+ workerName: options.workerName,
445
+ previewRecord: options.previewRecord,
446
+ existingCreatedAt: options.existing?.createdAt,
447
+ now: options.now
448
+ }),
449
+ scope: options.previewRecord.scope,
450
+ scopeUrl: options.previewRecord.scopeUrl,
451
+ branchName: options.previewRecord.branchName
452
+ });
453
+ }
454
+ function buildPreviewDeploymentRecord(options) {
455
+ const deploymentId = getPreviewDeploymentId(options.workerName, options.previewRecord.versionId);
456
+ return devflareDeploymentRecordSchema.parse({
457
+ id: getDeploymentRecordId(options.workerName, deploymentId),
458
+ kind: "deployment",
459
+ ver: 1,
460
+ ...createPreviewLinkedRecordBase({
461
+ accountId: options.accountId,
462
+ workerName: options.workerName,
463
+ previewRecord: options.previewRecord,
464
+ existingCreatedAt: options.existing?.createdAt,
465
+ now: options.now
466
+ }),
467
+ deploymentId,
468
+ channel: "preview",
469
+ environment: "preview",
470
+ url: options.previewRecord.scopeUrl ?? options.previewRecord.previewUrl,
471
+ message: options.existing?.message
472
+ });
473
+ }
474
+ function buildProductionDeploymentRecord(options) {
475
+ const versionId = options.deployment.versions[0]?.versionId;
476
+ if (!versionId) {
477
+ return null;
478
+ }
479
+ const productionUrl = options.workersSubdomain ? `https://${options.workerName}.${options.workersSubdomain}.workers.dev` : options.existing?.url;
480
+ return devflareDeploymentRecordSchema.parse({
481
+ id: getDeploymentRecordId(options.workerName, options.deployment.id),
482
+ kind: "deployment",
483
+ ver: 1,
484
+ createdAt: options.existing?.createdAt ?? options.deployment.createdOn,
485
+ updatedAt: options.now,
486
+ deletedAt: undefined,
487
+ createdBy: getVersionAuthorId(options.version, options.existing?.createdBy),
488
+ accountId: options.accountId,
489
+ workerName: options.workerName,
490
+ deploymentId: options.deployment.id,
491
+ channel: "production",
492
+ status: options.status,
493
+ versionId,
494
+ environment: "production",
495
+ url: productionUrl,
496
+ message: options.deploymentMessage ?? options.deployment.message ?? options.existing?.message,
497
+ commitSha: options.commitSha ?? options.existing?.commitSha,
498
+ source: inferRecordSource(options.source, options.version?.metadata.source ?? options.deployment.source)
499
+ });
500
+ }
501
+ async function getVersionInfoById(accountId, workerName, versionId, versionMap, apiOptions) {
502
+ const existing = versionMap.get(versionId);
503
+ if (existing) {
504
+ return existing;
505
+ }
506
+ try {
507
+ const version = await getWorkerVersionDetail(accountId, workerName, versionId, apiOptions);
508
+ versionMap.set(versionId, version);
509
+ return version;
510
+ } catch {
511
+ return;
512
+ }
513
+ }
514
+ function markPreviewRecordDeleted(record, now) {
515
+ return markRecordDeleted(record, now, devflarePreviewRecordSchema);
516
+ }
517
+ function markPreviewScopeRecordDeleted(record, now) {
518
+ return markRecordDeleted(record, now, devflarePreviewScopeRecordSchema);
519
+ }
520
+ function markDeploymentRecordDeleted(record, now) {
521
+ return markRecordDeleted(record, now, devflareDeploymentRecordSchema);
522
+ }
523
+ function getExplicitPreviewSyncOverrides(options, versionId) {
524
+ if (versionId !== options.versionId) {
525
+ return {};
526
+ }
527
+ return {
528
+ previewScope: options.previewScope,
529
+ previewUrl: options.previewUrl,
530
+ previewScopeUrl: options.previewScopeUrl,
531
+ branchName: options.branchName,
532
+ commitSha: options.commitSha
533
+ };
534
+ }
535
+
536
+ // src/cloudflare/preview-registry-store.ts
537
+ var REGISTRY_SCHEMA_STATEMENTS = [
538
+ `CREATE TABLE IF NOT EXISTS devflare_preview_records (
539
+ id TEXT PRIMARY KEY,
540
+ ver INTEGER NOT NULL,
541
+ account_id TEXT NOT NULL,
542
+ worker_name TEXT NOT NULL,
543
+ version_id TEXT NOT NULL UNIQUE,
544
+ preview_url TEXT NOT NULL,
545
+ scope TEXT,
546
+ scope_url TEXT,
547
+ branch_name TEXT,
548
+ commit_sha TEXT,
549
+ deployment_id TEXT,
550
+ source TEXT NOT NULL,
551
+ status TEXT NOT NULL,
552
+ created_by TEXT NOT NULL,
553
+ created_at TEXT NOT NULL,
554
+ updated_at TEXT,
555
+ deleted_at TEXT,
556
+ payload_json TEXT NOT NULL
557
+ )`,
558
+ "CREATE INDEX IF NOT EXISTS idx_devflare_preview_records_account_worker ON devflare_preview_records(account_id, worker_name)",
559
+ "CREATE INDEX IF NOT EXISTS idx_devflare_preview_records_status ON devflare_preview_records(status)",
560
+ `CREATE TABLE IF NOT EXISTS devflare_preview_scope_records (
561
+ id TEXT PRIMARY KEY,
562
+ ver INTEGER NOT NULL,
563
+ account_id TEXT NOT NULL,
564
+ worker_name TEXT NOT NULL,
565
+ scope TEXT NOT NULL,
566
+ scope_url TEXT NOT NULL,
567
+ version_id TEXT NOT NULL,
568
+ preview_id TEXT,
569
+ branch_name TEXT,
570
+ commit_sha TEXT,
571
+ source TEXT NOT NULL,
572
+ status TEXT NOT NULL,
573
+ created_by TEXT NOT NULL,
574
+ created_at TEXT NOT NULL,
575
+ updated_at TEXT,
576
+ deleted_at TEXT,
577
+ payload_json TEXT NOT NULL
578
+ )`,
579
+ "CREATE INDEX IF NOT EXISTS idx_devflare_preview_scope_records_account_worker ON devflare_preview_scope_records(account_id, worker_name)",
580
+ "CREATE INDEX IF NOT EXISTS idx_devflare_preview_scope_records_scope ON devflare_preview_scope_records(scope)",
581
+ `CREATE TABLE IF NOT EXISTS devflare_deployment_records (
582
+ id TEXT PRIMARY KEY,
583
+ ver INTEGER NOT NULL,
584
+ account_id TEXT NOT NULL,
585
+ worker_name TEXT NOT NULL,
586
+ deployment_id TEXT NOT NULL UNIQUE,
587
+ channel TEXT NOT NULL,
588
+ status TEXT NOT NULL,
589
+ version_id TEXT NOT NULL,
590
+ preview_id TEXT,
591
+ environment TEXT,
592
+ url TEXT,
593
+ message TEXT,
594
+ commit_sha TEXT,
595
+ source TEXT NOT NULL,
596
+ created_by TEXT NOT NULL,
597
+ created_at TEXT NOT NULL,
598
+ updated_at TEXT,
599
+ deleted_at TEXT,
600
+ payload_json TEXT NOT NULL
601
+ )`,
602
+ "CREATE INDEX IF NOT EXISTS idx_devflare_deployment_records_account_worker ON devflare_deployment_records(account_id, worker_name)",
603
+ "CREATE INDEX IF NOT EXISTS idx_devflare_deployment_records_channel_status ON devflare_deployment_records(channel, status)"
604
+ ];
605
+ var schemaEnsuredRegistryIds = new Set;
606
+ async function runQuery(registry, sql, params = [], apiOptions) {
607
+ const results = await queryD1Database(registry.accountId, registry.databaseId, {
608
+ sql,
609
+ params
610
+ }, apiOptions);
611
+ return results[0]?.results ?? [];
612
+ }
613
+ async function runStatement(registry, sql, params = [], apiOptions) {
614
+ await queryD1Database(registry.accountId, registry.databaseId, {
615
+ sql,
616
+ params
617
+ }, apiOptions);
618
+ }
619
+ async function ensurePreviewRegistrySchema(registry, apiOptions) {
620
+ if (schemaEnsuredRegistryIds.has(registry.databaseId)) {
621
+ return;
622
+ }
623
+ for (const statement of REGISTRY_SCHEMA_STATEMENTS) {
624
+ await runStatement(registry, statement, [], apiOptions);
625
+ }
626
+ schemaEnsuredRegistryIds.add(registry.databaseId);
627
+ }
628
+ function clearPreviewRegistrySchemaCache(databaseId) {
629
+ schemaEnsuredRegistryIds.delete(databaseId);
630
+ }
631
+ function isMissingRegistrySchemaError(error) {
632
+ if (error instanceof CloudflareAPIError) {
633
+ const message = error.message.toLowerCase();
634
+ return message.includes("no such table") || message.includes("no such column");
635
+ }
636
+ if (error instanceof Error) {
637
+ const message = error.message.toLowerCase();
638
+ return message.includes("no such table") || message.includes("no such column");
639
+ }
640
+ return false;
641
+ }
642
+ function isUnavailableRegistryContextError(error) {
643
+ if (error instanceof CloudflareAPIError) {
644
+ const message = error.message.toLowerCase();
645
+ return error.code === 404 || (message.includes("database") || message.includes("d1")) && (message.includes("not found") || message.includes("does not exist") || message.includes("unknown"));
646
+ }
647
+ if (error instanceof Error) {
648
+ const message = error.message.toLowerCase();
649
+ return (message.includes("database") || message.includes("d1")) && (message.includes("not found") || message.includes("does not exist"));
650
+ }
651
+ return false;
652
+ }
653
+ function parseStoredPreviewRecord(row) {
654
+ return devflarePreviewRecordSchema.parse(JSON.parse(row.payload_json));
655
+ }
656
+ function parseStoredPreviewScopeRecord(row) {
657
+ return devflarePreviewScopeRecordSchema.parse(JSON.parse(row.payload_json));
658
+ }
659
+ function parseStoredDeploymentRecord(row) {
660
+ return devflareDeploymentRecordSchema.parse(JSON.parse(row.payload_json));
661
+ }
662
+ async function readPreviewRows(registry, workerName, apiOptions) {
663
+ const sql = workerName ? "SELECT payload_json FROM devflare_preview_records WHERE account_id = ? AND worker_name = ? ORDER BY created_at DESC" : "SELECT payload_json FROM devflare_preview_records WHERE account_id = ? ORDER BY created_at DESC";
664
+ const params = workerName ? [registry.accountId, workerName] : [registry.accountId];
665
+ const rows = await runQuery(registry, sql, params, apiOptions);
666
+ return rows.map((row) => parseStoredPreviewRecord(row));
667
+ }
668
+ async function readPreviewScopeRows(registry, workerName, apiOptions) {
669
+ const sql = workerName ? "SELECT payload_json FROM devflare_preview_scope_records WHERE account_id = ? AND worker_name = ? ORDER BY created_at DESC" : "SELECT payload_json FROM devflare_preview_scope_records WHERE account_id = ? ORDER BY created_at DESC";
670
+ const params = workerName ? [registry.accountId, workerName] : [registry.accountId];
671
+ const rows = await runQuery(registry, sql, params, apiOptions);
672
+ return rows.map((row) => parseStoredPreviewScopeRecord(row));
673
+ }
674
+ async function readDeploymentRows(registry, workerName, apiOptions) {
675
+ const sql = workerName ? "SELECT payload_json FROM devflare_deployment_records WHERE account_id = ? AND worker_name = ? ORDER BY created_at DESC" : "SELECT payload_json FROM devflare_deployment_records WHERE account_id = ? ORDER BY created_at DESC";
676
+ const params = workerName ? [registry.accountId, workerName] : [registry.accountId];
677
+ const rows = await runQuery(registry, sql, params, apiOptions);
678
+ return rows.map((row) => parseStoredDeploymentRecord(row));
679
+ }
680
+ async function upsertPreviewRecord(registry, record, apiOptions) {
681
+ const normalizedRecord = devflarePreviewRecordSchema.parse(record);
682
+ await runStatement(registry, `INSERT INTO devflare_preview_records (
683
+ id,
684
+ ver,
685
+ account_id,
686
+ worker_name,
687
+ version_id,
688
+ preview_url,
689
+ scope,
690
+ scope_url,
691
+ branch_name,
692
+ commit_sha,
693
+ deployment_id,
694
+ source,
695
+ status,
696
+ created_by,
697
+ created_at,
698
+ updated_at,
699
+ deleted_at,
700
+ payload_json
701
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
702
+ ON CONFLICT(id) DO UPDATE SET
703
+ ver = excluded.ver,
704
+ account_id = excluded.account_id,
705
+ worker_name = excluded.worker_name,
706
+ version_id = excluded.version_id,
707
+ preview_url = excluded.preview_url,
708
+ scope = excluded.scope,
709
+ scope_url = excluded.scope_url,
710
+ branch_name = excluded.branch_name,
711
+ commit_sha = excluded.commit_sha,
712
+ deployment_id = excluded.deployment_id,
713
+ source = excluded.source,
714
+ status = excluded.status,
715
+ created_by = excluded.created_by,
716
+ created_at = excluded.created_at,
717
+ updated_at = excluded.updated_at,
718
+ deleted_at = excluded.deleted_at,
719
+ payload_json = excluded.payload_json`, [
720
+ normalizedRecord.id,
721
+ normalizedRecord.ver,
722
+ normalizedRecord.accountId,
723
+ normalizedRecord.workerName,
724
+ normalizedRecord.versionId,
725
+ normalizedRecord.previewUrl,
726
+ normalizedRecord.scope ?? null,
727
+ normalizedRecord.scopeUrl ?? null,
728
+ normalizedRecord.branchName ?? null,
729
+ normalizedRecord.commitSha ?? null,
730
+ normalizedRecord.deploymentId ?? null,
731
+ normalizedRecord.source,
732
+ normalizedRecord.status,
733
+ normalizedRecord.createdBy,
734
+ normalizedRecord.createdAt.toISOString(),
735
+ toIsoString(normalizedRecord.updatedAt),
736
+ toIsoString(normalizedRecord.deletedAt),
737
+ JSON.stringify(normalizedRecord)
738
+ ], apiOptions);
739
+ }
740
+ async function upsertPreviewScopeRecord(registry, record, apiOptions) {
741
+ const normalizedRecord = devflarePreviewScopeRecordSchema.parse(record);
742
+ await runStatement(registry, `INSERT INTO devflare_preview_scope_records (
743
+ id,
744
+ ver,
745
+ account_id,
746
+ worker_name,
747
+ scope,
748
+ scope_url,
749
+ version_id,
750
+ preview_id,
751
+ branch_name,
752
+ commit_sha,
753
+ source,
754
+ status,
755
+ created_by,
756
+ created_at,
757
+ updated_at,
758
+ deleted_at,
759
+ payload_json
760
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
761
+ ON CONFLICT(id) DO UPDATE SET
762
+ ver = excluded.ver,
763
+ account_id = excluded.account_id,
764
+ worker_name = excluded.worker_name,
765
+ scope = excluded.scope,
766
+ scope_url = excluded.scope_url,
767
+ version_id = excluded.version_id,
768
+ preview_id = excluded.preview_id,
769
+ branch_name = excluded.branch_name,
770
+ commit_sha = excluded.commit_sha,
771
+ source = excluded.source,
772
+ status = excluded.status,
773
+ created_by = excluded.created_by,
774
+ created_at = excluded.created_at,
775
+ updated_at = excluded.updated_at,
776
+ deleted_at = excluded.deleted_at,
777
+ payload_json = excluded.payload_json`, [
778
+ normalizedRecord.id,
779
+ normalizedRecord.ver,
780
+ normalizedRecord.accountId,
781
+ normalizedRecord.workerName,
782
+ normalizedRecord.scope,
783
+ normalizedRecord.scopeUrl,
784
+ normalizedRecord.versionId,
785
+ normalizedRecord.previewId ?? null,
786
+ normalizedRecord.branchName ?? null,
787
+ normalizedRecord.commitSha ?? null,
788
+ normalizedRecord.source,
789
+ normalizedRecord.status,
790
+ normalizedRecord.createdBy,
791
+ normalizedRecord.createdAt.toISOString(),
792
+ toIsoString(normalizedRecord.updatedAt),
793
+ toIsoString(normalizedRecord.deletedAt),
794
+ JSON.stringify(normalizedRecord)
795
+ ], apiOptions);
796
+ }
797
+ async function upsertDeploymentRecord(registry, record, apiOptions) {
798
+ const normalizedRecord = devflareDeploymentRecordSchema.parse(record);
799
+ await runStatement(registry, `INSERT INTO devflare_deployment_records (
800
+ id,
801
+ ver,
802
+ account_id,
803
+ worker_name,
804
+ deployment_id,
805
+ channel,
806
+ status,
807
+ version_id,
808
+ preview_id,
809
+ environment,
810
+ url,
811
+ message,
812
+ commit_sha,
813
+ source,
814
+ created_by,
815
+ created_at,
816
+ updated_at,
817
+ deleted_at,
818
+ payload_json
819
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
820
+ ON CONFLICT(id) DO UPDATE SET
821
+ ver = excluded.ver,
822
+ account_id = excluded.account_id,
823
+ worker_name = excluded.worker_name,
824
+ deployment_id = excluded.deployment_id,
825
+ channel = excluded.channel,
826
+ status = excluded.status,
827
+ version_id = excluded.version_id,
828
+ preview_id = excluded.preview_id,
829
+ environment = excluded.environment,
830
+ url = excluded.url,
831
+ message = excluded.message,
832
+ commit_sha = excluded.commit_sha,
833
+ source = excluded.source,
834
+ created_by = excluded.created_by,
835
+ created_at = excluded.created_at,
836
+ updated_at = excluded.updated_at,
837
+ deleted_at = excluded.deleted_at,
838
+ payload_json = excluded.payload_json`, [
839
+ normalizedRecord.id,
840
+ normalizedRecord.ver,
841
+ normalizedRecord.accountId,
842
+ normalizedRecord.workerName,
843
+ normalizedRecord.deploymentId,
844
+ normalizedRecord.channel,
845
+ normalizedRecord.status,
846
+ normalizedRecord.versionId,
847
+ normalizedRecord.previewId ?? null,
848
+ normalizedRecord.environment ?? null,
849
+ normalizedRecord.url ?? null,
850
+ normalizedRecord.message ?? null,
851
+ normalizedRecord.commitSha ?? null,
852
+ normalizedRecord.source,
853
+ normalizedRecord.createdBy,
854
+ normalizedRecord.createdAt.toISOString(),
855
+ toIsoString(normalizedRecord.updatedAt),
856
+ toIsoString(normalizedRecord.deletedAt),
857
+ JSON.stringify(normalizedRecord)
858
+ ], apiOptions);
859
+ }
860
+
861
+ // src/cloudflare/preview-registry.ts
862
+ async function withRegistryReadRecovery(registry, apiOptions, operation) {
863
+ try {
864
+ return {
865
+ registry,
866
+ result: await operation(registry)
867
+ };
868
+ } catch (error) {
869
+ if (isMissingRegistrySchemaError(error)) {
870
+ clearPreviewRegistrySchemaCache(registry.databaseId);
871
+ await ensurePreviewRegistrySchema(registry, apiOptions);
872
+ return {
873
+ registry,
874
+ result: await operation(registry)
875
+ };
876
+ }
877
+ if (!isUnavailableRegistryContextError(error)) {
878
+ throw error;
879
+ }
880
+ clearCachedPreviewRegistryContext(registry.accountId, registry.databaseName);
881
+ const refreshedRegistry = await ensurePreviewRegistry({
882
+ accountId: registry.accountId,
883
+ databaseName: registry.databaseName,
884
+ apiOptions,
885
+ skipContextCache: true
886
+ });
887
+ return {
888
+ registry: refreshedRegistry,
889
+ result: await operation(refreshedRegistry)
890
+ };
891
+ }
892
+ }
893
+ async function loadTrackedRegistryRows(registry, workerName, apiOptions) {
894
+ const [previews, scopes, deployments] = await Promise.all([
895
+ readPreviewRows(registry, workerName, apiOptions),
896
+ readPreviewScopeRows(registry, workerName, apiOptions),
897
+ readDeploymentRows(registry, workerName, apiOptions)
898
+ ]);
899
+ return {
900
+ previews,
901
+ scopes,
902
+ deployments
903
+ };
904
+ }
905
+ async function applyDeletedRecords(registry, options) {
906
+ for (const preview of options.previews) {
907
+ await upsertPreviewRecord(registry, markPreviewRecordDeleted(preview, options.now), options.apiOptions);
908
+ }
909
+ for (const scope of options.scopes) {
910
+ await upsertPreviewScopeRecord(registry, markPreviewScopeRecordDeleted(scope, options.now), options.apiOptions);
911
+ }
912
+ for (const deployment of options.deployments) {
913
+ await upsertDeploymentRecord(registry, markDeploymentRecordDeleted(deployment, options.now), options.apiOptions);
914
+ }
915
+ }
916
+ async function getPreviewRegistryContext(options) {
917
+ const databaseName = getRegistryDatabaseName(options.databaseName);
918
+ if (options.skipContextCache !== true) {
919
+ const cached = getCachedPreviewRegistryContext(options.accountId, databaseName);
920
+ if (cached) {
921
+ return cached;
922
+ }
923
+ }
924
+ const databases = await listD1Databases(options.accountId, options.apiOptions);
925
+ const existing = databases.find((database) => database.name === databaseName);
926
+ if (!existing) {
927
+ return null;
928
+ }
929
+ const registry = {
930
+ accountId: options.accountId,
931
+ databaseId: existing.id,
932
+ databaseName,
933
+ created: false
934
+ };
935
+ cachePreviewRegistryContext(registry);
936
+ return registry;
937
+ }
938
+ async function ensurePreviewRegistry(options) {
939
+ const existingContext = await getPreviewRegistryContext(options);
940
+ let registry = existingContext;
941
+ if (!registry) {
942
+ const created = await createD1Database(options.accountId, getRegistryDatabaseName(options.databaseName), options.apiOptions);
943
+ registry = {
944
+ accountId: options.accountId,
945
+ databaseId: created.id,
946
+ databaseName: created.name,
947
+ created: true
948
+ };
949
+ cachePreviewRegistryContext(registry);
950
+ options.logger?.info?.(`Created Devflare preview registry D1 database: ${registry.databaseName}`);
951
+ }
952
+ if (registry.created || options.skipSchemaIfExisting !== true) {
953
+ await ensurePreviewRegistrySchema(registry, options.apiOptions);
954
+ }
955
+ return registry;
956
+ }
957
+ async function listTrackedRegistryState(options) {
958
+ const { result } = await withRegistryReadRecovery(options.registry, options.apiOptions, async (registry) => {
959
+ return loadTrackedRegistryRows(registry, options.workerName, options.apiOptions);
960
+ });
961
+ return result;
962
+ }
963
+ async function listTrackedPreviewRecords(options) {
964
+ const registry = await ensurePreviewRegistry({
965
+ accountId: options.accountId,
966
+ databaseName: options.databaseName,
967
+ apiOptions: options.apiOptions,
968
+ skipSchemaIfExisting: true
969
+ });
970
+ const { registry: resolvedRegistry, result } = await withRegistryReadRecovery(registry, options.apiOptions, (activeRegistry) => readPreviewRows(activeRegistry, options.workerName, options.apiOptions));
971
+ return {
972
+ registry: resolvedRegistry,
973
+ records: result
974
+ };
975
+ }
976
+ async function listTrackedPreviewScopeRecords(options) {
977
+ const registry = await ensurePreviewRegistry({
978
+ accountId: options.accountId,
979
+ databaseName: options.databaseName,
980
+ apiOptions: options.apiOptions,
981
+ skipSchemaIfExisting: true
982
+ });
983
+ const { registry: resolvedRegistry, result } = await withRegistryReadRecovery(registry, options.apiOptions, (activeRegistry) => readPreviewScopeRows(activeRegistry, options.workerName, options.apiOptions));
984
+ return {
985
+ registry: resolvedRegistry,
986
+ records: result
987
+ };
988
+ }
989
+ async function listTrackedDeploymentRecords(options) {
990
+ const registry = await ensurePreviewRegistry({
991
+ accountId: options.accountId,
992
+ databaseName: options.databaseName,
993
+ apiOptions: options.apiOptions,
994
+ skipSchemaIfExisting: true
995
+ });
996
+ const { registry: resolvedRegistry, result } = await withRegistryReadRecovery(registry, options.apiOptions, (activeRegistry) => readDeploymentRows(activeRegistry, options.workerName, options.apiOptions));
997
+ return {
998
+ registry: resolvedRegistry,
999
+ records: result
1000
+ };
1001
+ }
1002
+ async function reconcilePreviewRegistry(options) {
1003
+ const now = options.now ?? new Date;
1004
+ const registry = await ensurePreviewRegistry({
1005
+ accountId: options.accountId,
1006
+ databaseName: options.databaseName,
1007
+ apiOptions: options.apiOptions,
1008
+ logger: options.logger
1009
+ });
1010
+ const workersSubdomain = await getWorkersSubdomain(options.accountId, options.apiOptions);
1011
+ const liveVersions = await listWorkerVersions(options.accountId, options.workerName, options.apiOptions);
1012
+ const liveDeployments = await listWorkerDeployments(options.accountId, options.workerName, options.apiOptions);
1013
+ const { previews: previewRecords, scopes: scopeRecords, deployments: deploymentRecords } = await loadTrackedRegistryRows(registry, options.workerName, options.apiOptions);
1014
+ const previewRecordByVersionId = new Map(previewRecords.map((record) => [record.versionId, record]));
1015
+ const previewScopeRecordByScope = new Map(scopeRecords.map((record) => [record.scope, record]));
1016
+ const deploymentRecordById = new Map(deploymentRecords.map((record) => [record.deploymentId, record]));
1017
+ const syncedPreviews = [];
1018
+ const syncedScopes = [];
1019
+ const syncedDeployments = [];
1020
+ const versionMetadataMap = new Map(liveVersions.map((version) => [version.id, version]));
1021
+ const previewVersions = [...liveVersions.filter((candidate) => candidate.metadata.hasPreview)];
1022
+ if (options.versionId && (options.previewUrl || options.previewScopeUrl || options.previewScope) && !previewVersions.some((version) => version.id === options.versionId)) {
1023
+ const explicitPreviewVersion = await getVersionInfoById(options.accountId, options.workerName, options.versionId, versionMetadataMap, options.apiOptions);
1024
+ if (explicitPreviewVersion) {
1025
+ previewVersions.unshift({
1026
+ ...explicitPreviewVersion,
1027
+ metadata: {
1028
+ ...explicitPreviewVersion.metadata,
1029
+ hasPreview: true
1030
+ }
1031
+ });
1032
+ }
1033
+ }
1034
+ for (const version of previewVersions) {
1035
+ const previewRecord = buildPreviewRecord({
1036
+ accountId: options.accountId,
1037
+ workerName: options.workerName,
1038
+ version,
1039
+ existing: previewRecordByVersionId.get(version.id),
1040
+ workersSubdomain,
1041
+ ...getExplicitPreviewSyncOverrides(options, version.id),
1042
+ source: options.source,
1043
+ now
1044
+ });
1045
+ if (!previewRecord) {
1046
+ options.logger?.warn?.(`Skipping preview registry sync for ${version.id} because no preview URL could be determined.`);
1047
+ continue;
1048
+ }
1049
+ await upsertPreviewRecord(registry, previewRecord, options.apiOptions);
1050
+ syncedPreviews.push(previewRecord);
1051
+ const scopeRecord = buildPreviewScopeRecord({
1052
+ accountId: options.accountId,
1053
+ workerName: options.workerName,
1054
+ previewRecord,
1055
+ existing: previewRecord.scope ? previewScopeRecordByScope.get(previewRecord.scope) : undefined,
1056
+ now
1057
+ });
1058
+ if (scopeRecord) {
1059
+ await upsertPreviewScopeRecord(registry, scopeRecord, options.apiOptions);
1060
+ syncedScopes.push(scopeRecord);
1061
+ }
1062
+ const previewDeploymentRecord = buildPreviewDeploymentRecord({
1063
+ accountId: options.accountId,
1064
+ workerName: options.workerName,
1065
+ previewRecord,
1066
+ existing: deploymentRecordById.get(getPreviewDeploymentId(options.workerName, previewRecord.versionId)),
1067
+ now
1068
+ });
1069
+ await upsertDeploymentRecord(registry, previewDeploymentRecord, options.apiOptions);
1070
+ syncedDeployments.push(previewDeploymentRecord);
1071
+ }
1072
+ for (const [index, deployment] of liveDeployments.entries()) {
1073
+ const versionId = deployment.versions[0]?.versionId;
1074
+ const version = versionId ? await getVersionInfoById(options.accountId, options.workerName, versionId, versionMetadataMap, options.apiOptions) : undefined;
1075
+ const deploymentRecord = buildProductionDeploymentRecord({
1076
+ accountId: options.accountId,
1077
+ workerName: options.workerName,
1078
+ deployment,
1079
+ version,
1080
+ existing: deploymentRecordById.get(deployment.id),
1081
+ workersSubdomain,
1082
+ source: options.source,
1083
+ commitSha: versionId === options.versionId ? options.commitSha : undefined,
1084
+ deploymentMessage: index === 0 ? options.deploymentMessage : undefined,
1085
+ status: index === 0 ? "active" : "superseded",
1086
+ now
1087
+ });
1088
+ if (!deploymentRecord) {
1089
+ continue;
1090
+ }
1091
+ await upsertDeploymentRecord(registry, deploymentRecord, options.apiOptions);
1092
+ syncedDeployments.push(deploymentRecord);
1093
+ }
1094
+ return {
1095
+ registry,
1096
+ previews: syncedPreviews,
1097
+ previewScopes: syncedScopes,
1098
+ deployments: syncedDeployments
1099
+ };
1100
+ }
1101
+ async function cleanupPreviewRegistry(options) {
1102
+ const now = options.now ?? new Date;
1103
+ const registry = await ensurePreviewRegistry({
1104
+ accountId: options.accountId,
1105
+ databaseName: options.databaseName,
1106
+ apiOptions: options.apiOptions,
1107
+ logger: options.logger
1108
+ });
1109
+ const { previews, scopes, deployments } = await loadTrackedRegistryRows(registry, options.workerName, options.apiOptions);
1110
+ const cutoff = new Date(now.getTime() - Math.max(options.days ?? 7, 0) * 24 * 60 * 60 * 1000);
1111
+ const previewCandidates = previews.filter((record) => !record.deletedAt && record.createdAt <= cutoff && record.status !== "active");
1112
+ const scopeCandidates = scopes.filter((record) => !record.deletedAt && record.createdAt <= cutoff && record.status !== "active");
1113
+ const deploymentCandidates = deployments.filter((record) => !record.deletedAt && record.createdAt <= cutoff && record.status !== "active");
1114
+ if (options.apply) {
1115
+ await applyDeletedRecords(registry, {
1116
+ previews: previewCandidates,
1117
+ scopes: scopeCandidates,
1118
+ deployments: deploymentCandidates,
1119
+ now,
1120
+ apiOptions: options.apiOptions
1121
+ });
1122
+ }
1123
+ return {
1124
+ registry,
1125
+ previews,
1126
+ scopes,
1127
+ deployments,
1128
+ candidates: {
1129
+ previews: previewCandidates,
1130
+ scopes: scopeCandidates,
1131
+ deployments: deploymentCandidates
1132
+ },
1133
+ applied: options.apply === true
1134
+ };
1135
+ }
1136
+ async function retirePreviewRegistry(options) {
1137
+ if (!hasRetireSelector(options)) {
1138
+ throw new Error("Retiring preview registry records requires at least one selector: branchName, previewScope, versionId, or commitSha.");
1139
+ }
1140
+ const now = options.now ?? new Date;
1141
+ const registry = await ensurePreviewRegistry({
1142
+ accountId: options.accountId,
1143
+ databaseName: options.databaseName,
1144
+ apiOptions: options.apiOptions,
1145
+ logger: options.logger
1146
+ });
1147
+ const { previews, scopes, deployments } = await loadTrackedRegistryRows(registry, options.workerName, options.apiOptions);
1148
+ const directlyMatchedPreviews = previews.filter((record) => !record.deletedAt && matchesPreviewRetireTarget(record, options));
1149
+ const directlyMatchedScopes = scopes.filter((record) => !record.deletedAt && matchesPreviewScopeRetireTarget(record, options));
1150
+ const directlyMatchedDeployments = deployments.filter((record) => !record.deletedAt && matchesPreviewDeploymentRetireTarget(record, options));
1151
+ const candidatePreviewIds = new Set([
1152
+ ...directlyMatchedPreviews.map((record) => record.id),
1153
+ ...directlyMatchedScopes.flatMap((record) => record.previewId ? [record.previewId] : [])
1154
+ ]);
1155
+ const candidateVersionIds = new Set([
1156
+ ...directlyMatchedPreviews.map((record) => record.versionId),
1157
+ ...directlyMatchedScopes.map((record) => record.versionId),
1158
+ ...directlyMatchedDeployments.map((record) => record.versionId),
1159
+ ...options.versionId ? [options.versionId] : []
1160
+ ]);
1161
+ const previewCandidates = previews.filter((record) => {
1162
+ return !record.deletedAt && (matchesPreviewRetireTarget(record, options) || candidatePreviewIds.has(record.id) || candidateVersionIds.has(record.versionId));
1163
+ });
1164
+ const resolvedPreviewIds = new Set(previewCandidates.map((record) => record.id));
1165
+ const resolvedVersionIds = new Set([
1166
+ ...candidateVersionIds,
1167
+ ...previewCandidates.map((record) => record.versionId)
1168
+ ]);
1169
+ const scopeCandidates = scopes.filter((record) => {
1170
+ return !record.deletedAt && (matchesPreviewScopeRetireTarget(record, options) || resolvedVersionIds.has(record.versionId) || record.previewId !== undefined && resolvedPreviewIds.has(record.previewId));
1171
+ });
1172
+ for (const record of scopeCandidates) {
1173
+ resolvedVersionIds.add(record.versionId);
1174
+ if (record.previewId) {
1175
+ resolvedPreviewIds.add(record.previewId);
1176
+ }
1177
+ }
1178
+ const deploymentCandidates = deployments.filter((record) => {
1179
+ return !record.deletedAt && record.channel === "preview" && (matchesPreviewDeploymentRetireTarget(record, options) || resolvedVersionIds.has(record.versionId) || record.previewId !== undefined && resolvedPreviewIds.has(record.previewId));
1180
+ });
1181
+ if (options.apply) {
1182
+ await applyDeletedRecords(registry, {
1183
+ previews: previewCandidates,
1184
+ scopes: scopeCandidates,
1185
+ deployments: deploymentCandidates,
1186
+ now,
1187
+ apiOptions: options.apiOptions
1188
+ });
1189
+ }
1190
+ return {
1191
+ registry,
1192
+ previews,
1193
+ scopes,
1194
+ deployments,
1195
+ candidates: {
1196
+ previews: previewCandidates,
1197
+ scopes: scopeCandidates,
1198
+ deployments: deploymentCandidates
1199
+ },
1200
+ applied: options.apply === true
1201
+ };
1202
+ }
1203
+
1204
+ export { formatWorkersDevUrl, parseWranglerStructuredOutput, mergeParsedWranglerDeployOutputs, parseWranglerDeployOutput, DEVFLARE_PREVIEW_REGISTRY_DATABASE, devflareAccountRecordSchema, createDevflareAccountRecordSchema, devflareRecordSourceSchema, devflarePreviewStatusSchema, devflarePreviewScopeStatusSchema, devflareDeploymentChannelSchema, devflareDeploymentStatusSchema, devflarePreviewRecordSchema, devflarePreviewScopeRecordSchema, devflareDeploymentRecordSchema, devflareAccountLayerRecordSchema, getPreviewRegistryContext, ensurePreviewRegistry, listTrackedRegistryState, listTrackedPreviewRecords, listTrackedPreviewScopeRecords, listTrackedDeploymentRecords, reconcilePreviewRegistry, cleanupPreviewRegistry, retirePreviewRegistry };