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