alchemy 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/README.md +7 -0
  2. package/lib/ai/astro-file.d.ts.map +1 -1
  3. package/lib/ai/astro-file.js +2 -1
  4. package/lib/ai/astro-file.js.map +1 -1
  5. package/lib/ai/client.d.ts.map +1 -1
  6. package/lib/ai/client.js +3 -2
  7. package/lib/ai/client.js.map +1 -1
  8. package/lib/alchemy.d.ts +7 -0
  9. package/lib/alchemy.d.ts.map +1 -1
  10. package/lib/alchemy.js +19 -3
  11. package/lib/alchemy.js.map +1 -1
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +63 -5
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/control/client.js +4 -3
  16. package/lib/aws/control/client.js.map +1 -1
  17. package/lib/aws/control/properties.d.ts +6 -0
  18. package/lib/aws/control/properties.d.ts.map +1 -1
  19. package/lib/aws/control/properties.js +48 -0
  20. package/lib/aws/control/properties.js.map +1 -1
  21. package/lib/aws/control/resource.d.ts.map +1 -1
  22. package/lib/aws/control/resource.js +3 -2
  23. package/lib/aws/control/resource.js.map +1 -1
  24. package/lib/aws/control/types.d.ts +3969 -4862
  25. package/lib/aws/control/types.d.ts.map +1 -1
  26. package/lib/aws/control/types.js.map +1 -1
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +9 -8
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/oidc/oidc-provider.d.ts.map +1 -1
  31. package/lib/aws/oidc/oidc-provider.js +3 -2
  32. package/lib/aws/oidc/oidc-provider.js.map +1 -1
  33. package/lib/aws/queue.d.ts.map +1 -1
  34. package/lib/aws/queue.js +3 -2
  35. package/lib/aws/queue.js.map +1 -1
  36. package/lib/aws/role.d.ts.map +1 -1
  37. package/lib/aws/role.js +3 -1
  38. package/lib/aws/role.js.map +1 -1
  39. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  40. package/lib/aws/ssm-parameter.js +2 -1
  41. package/lib/aws/ssm-parameter.js.map +1 -1
  42. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  43. package/lib/cloudflare/account-api-token.js +3 -2
  44. package/lib/cloudflare/account-api-token.js.map +1 -1
  45. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  46. package/lib/cloudflare/ai-gateway.js +4 -3
  47. package/lib/cloudflare/ai-gateway.js.map +1 -1
  48. package/lib/cloudflare/api-error.d.ts +0 -9
  49. package/lib/cloudflare/api-error.d.ts.map +1 -1
  50. package/lib/cloudflare/api-error.js +24 -0
  51. package/lib/cloudflare/api-error.js.map +1 -1
  52. package/lib/cloudflare/api.d.ts.map +1 -1
  53. package/lib/cloudflare/api.js +5 -4
  54. package/lib/cloudflare/api.js.map +1 -1
  55. package/lib/cloudflare/assets.d.ts.map +1 -1
  56. package/lib/cloudflare/assets.js +26 -6
  57. package/lib/cloudflare/assets.js.map +1 -1
  58. package/lib/cloudflare/astro.d.ts +63 -0
  59. package/lib/cloudflare/astro.d.ts.map +1 -0
  60. package/lib/cloudflare/astro.js +133 -0
  61. package/lib/cloudflare/astro.js.map +1 -0
  62. package/lib/cloudflare/auth.d.ts.map +1 -1
  63. package/lib/cloudflare/auth.js +3 -2
  64. package/lib/cloudflare/auth.js.map +1 -1
  65. package/lib/cloudflare/bindings.d.ts +23 -2
  66. package/lib/cloudflare/bindings.d.ts.map +1 -1
  67. package/lib/cloudflare/bindings.js.map +1 -1
  68. package/lib/cloudflare/bound.d.ts +7 -1
  69. package/lib/cloudflare/bound.d.ts.map +1 -1
  70. package/lib/cloudflare/bucket.d.ts.map +1 -1
  71. package/lib/cloudflare/bucket.js +12 -8
  72. package/lib/cloudflare/bucket.js.map +1 -1
  73. package/lib/cloudflare/bundle/bundle-worker.d.ts.map +1 -1
  74. package/lib/cloudflare/bundle/bundle-worker.js +2 -1
  75. package/lib/cloudflare/bundle/bundle-worker.js.map +1 -1
  76. package/lib/cloudflare/bundle/nodejs-compat-mode.d.ts.map +1 -1
  77. package/lib/cloudflare/bundle/nodejs-compat-mode.js +2 -1
  78. package/lib/cloudflare/bundle/nodejs-compat-mode.js.map +1 -1
  79. package/lib/cloudflare/custom-domain.d.ts.map +1 -1
  80. package/lib/cloudflare/custom-domain.js +10 -9
  81. package/lib/cloudflare/custom-domain.js.map +1 -1
  82. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  83. package/lib/cloudflare/d1-database.js +11 -10
  84. package/lib/cloudflare/d1-database.js.map +1 -1
  85. package/lib/cloudflare/d1-export.d.ts.map +1 -1
  86. package/lib/cloudflare/d1-export.js +2 -1
  87. package/lib/cloudflare/d1-export.js.map +1 -1
  88. package/lib/cloudflare/d1-import.d.ts.map +1 -1
  89. package/lib/cloudflare/d1-import.js +2 -1
  90. package/lib/cloudflare/d1-import.js.map +1 -1
  91. package/lib/cloudflare/d1-migrations.d.ts.map +1 -1
  92. package/lib/cloudflare/d1-migrations.js +2 -1
  93. package/lib/cloudflare/d1-migrations.js.map +1 -1
  94. package/lib/cloudflare/dns-records.d.ts.map +1 -1
  95. package/lib/cloudflare/dns-records.js +5 -4
  96. package/lib/cloudflare/dns-records.js.map +1 -1
  97. package/lib/cloudflare/do-state-store/worker.d.ts.map +1 -1
  98. package/lib/cloudflare/do-state-store/worker.js +4 -0
  99. package/lib/cloudflare/do-state-store/worker.js.map +1 -1
  100. package/lib/cloudflare/email-address.d.ts +79 -0
  101. package/lib/cloudflare/email-address.d.ts.map +1 -0
  102. package/lib/cloudflare/email-address.js +112 -0
  103. package/lib/cloudflare/email-address.js.map +1 -0
  104. package/lib/cloudflare/email-catch-all.d.ts +123 -0
  105. package/lib/cloudflare/email-catch-all.d.ts.map +1 -0
  106. package/lib/cloudflare/email-catch-all.js +124 -0
  107. package/lib/cloudflare/email-catch-all.js.map +1 -0
  108. package/lib/cloudflare/email-routing.d.ts +89 -0
  109. package/lib/cloudflare/email-routing.d.ts.map +1 -0
  110. package/lib/cloudflare/email-routing.js +120 -0
  111. package/lib/cloudflare/email-routing.js.map +1 -0
  112. package/lib/cloudflare/email-rule.d.ts +196 -0
  113. package/lib/cloudflare/email-rule.d.ts.map +1 -0
  114. package/lib/cloudflare/email-rule.js +153 -0
  115. package/lib/cloudflare/email-rule.js.map +1 -0
  116. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  117. package/lib/cloudflare/hyperdrive.js +5 -4
  118. package/lib/cloudflare/hyperdrive.js.map +1 -1
  119. package/lib/cloudflare/images.d.ts +60 -0
  120. package/lib/cloudflare/images.d.ts.map +1 -0
  121. package/lib/cloudflare/images.js +60 -0
  122. package/lib/cloudflare/images.js.map +1 -0
  123. package/lib/cloudflare/index.d.ts +9 -0
  124. package/lib/cloudflare/index.d.ts.map +1 -1
  125. package/lib/cloudflare/index.js +9 -0
  126. package/lib/cloudflare/index.js.map +1 -1
  127. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  128. package/lib/cloudflare/kv-namespace.js +2 -1
  129. package/lib/cloudflare/kv-namespace.js.map +1 -1
  130. package/lib/cloudflare/pipeline.d.ts +7 -0
  131. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  132. package/lib/cloudflare/pipeline.js +28 -2
  133. package/lib/cloudflare/pipeline.js.map +1 -1
  134. package/lib/cloudflare/queue-consumer.d.ts.map +1 -1
  135. package/lib/cloudflare/queue-consumer.js +2 -1
  136. package/lib/cloudflare/queue-consumer.js.map +1 -1
  137. package/lib/cloudflare/queue.d.ts.map +1 -1
  138. package/lib/cloudflare/queue.js +0 -8
  139. package/lib/cloudflare/queue.js.map +1 -1
  140. package/lib/cloudflare/route.d.ts +26 -1
  141. package/lib/cloudflare/route.d.ts.map +1 -1
  142. package/lib/cloudflare/route.js +84 -16
  143. package/lib/cloudflare/route.js.map +1 -1
  144. package/lib/cloudflare/secret.d.ts +137 -0
  145. package/lib/cloudflare/secret.d.ts.map +1 -0
  146. package/lib/cloudflare/secret.js +122 -0
  147. package/lib/cloudflare/secret.js.map +1 -0
  148. package/lib/cloudflare/secrets-store.d.ts +145 -0
  149. package/lib/cloudflare/secrets-store.d.ts.map +1 -0
  150. package/lib/cloudflare/secrets-store.js +213 -0
  151. package/lib/cloudflare/secrets-store.js.map +1 -0
  152. package/lib/cloudflare/sveltekit.d.ts +49 -0
  153. package/lib/cloudflare/sveltekit.d.ts.map +1 -0
  154. package/lib/cloudflare/sveltekit.js +56 -0
  155. package/lib/cloudflare/sveltekit.js.map +1 -0
  156. package/lib/cloudflare/user.d.ts.map +1 -1
  157. package/lib/cloudflare/user.js +2 -1
  158. package/lib/cloudflare/user.js.map +1 -1
  159. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  160. package/lib/cloudflare/vectorize-index.js +6 -5
  161. package/lib/cloudflare/vectorize-index.js.map +1 -1
  162. package/lib/cloudflare/vectorize-metadata-index.d.ts.map +1 -1
  163. package/lib/cloudflare/vectorize-metadata-index.js +2 -1
  164. package/lib/cloudflare/vectorize-metadata-index.js.map +1 -1
  165. package/lib/cloudflare/website.d.ts.map +1 -1
  166. package/lib/cloudflare/website.js +7 -2
  167. package/lib/cloudflare/website.js.map +1 -1
  168. package/lib/cloudflare/worker-assets.d.ts +18 -0
  169. package/lib/cloudflare/worker-assets.d.ts.map +1 -1
  170. package/lib/cloudflare/worker-assets.js +61 -67
  171. package/lib/cloudflare/worker-assets.js.map +1 -1
  172. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  173. package/lib/cloudflare/worker-metadata.js +16 -1
  174. package/lib/cloudflare/worker-metadata.js.map +1 -1
  175. package/lib/cloudflare/worker.d.ts +31 -1
  176. package/lib/cloudflare/worker.d.ts.map +1 -1
  177. package/lib/cloudflare/worker.js +34 -8
  178. package/lib/cloudflare/worker.js.map +1 -1
  179. package/lib/cloudflare/wrangler.json.d.ts +14 -0
  180. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  181. package/lib/cloudflare/wrangler.json.js +23 -0
  182. package/lib/cloudflare/wrangler.json.js.map +1 -1
  183. package/lib/cloudflare/zone.d.ts.map +1 -1
  184. package/lib/cloudflare/zone.js +4 -3
  185. package/lib/cloudflare/zone.js.map +1 -1
  186. package/lib/destroy.d.ts.map +1 -1
  187. package/lib/destroy.js +30 -13
  188. package/lib/destroy.js.map +1 -1
  189. package/lib/dns/godaddy.d.ts.map +1 -1
  190. package/lib/dns/godaddy.js +3 -2
  191. package/lib/dns/godaddy.js.map +1 -1
  192. package/lib/dns/import-dns.d.ts.map +1 -1
  193. package/lib/dns/import-dns.js +2 -1
  194. package/lib/dns/import-dns.js.map +1 -1
  195. package/lib/esbuild/bundle.d.ts +1 -1
  196. package/lib/esbuild/bundle.d.ts.map +1 -1
  197. package/lib/esbuild/bundle.js +2 -1
  198. package/lib/esbuild/bundle.js.map +1 -1
  199. package/lib/fs/copy-file.d.ts.map +1 -1
  200. package/lib/fs/copy-file.js +2 -1
  201. package/lib/fs/copy-file.js.map +1 -1
  202. package/lib/fs/file.d.ts.map +1 -1
  203. package/lib/fs/file.js +2 -1
  204. package/lib/fs/file.js.map +1 -1
  205. package/lib/github/client.d.ts.map +1 -1
  206. package/lib/github/client.js +11 -10
  207. package/lib/github/client.js.map +1 -1
  208. package/lib/github/repository-environment.d.ts.map +1 -1
  209. package/lib/github/repository-environment.js +5 -4
  210. package/lib/github/repository-environment.js.map +1 -1
  211. package/lib/github/secret.d.ts.map +1 -1
  212. package/lib/github/secret.js +7 -6
  213. package/lib/github/secret.js.map +1 -1
  214. package/lib/index.d.ts +2 -1
  215. package/lib/index.d.ts.map +1 -1
  216. package/lib/index.js +1 -0
  217. package/lib/index.js.map +1 -1
  218. package/lib/neon/project.d.ts.map +1 -1
  219. package/lib/neon/project.js +3 -2
  220. package/lib/neon/project.js.map +1 -1
  221. package/lib/planetscale/api.d.ts +53 -0
  222. package/lib/planetscale/api.d.ts.map +1 -0
  223. package/lib/planetscale/api.js +84 -0
  224. package/lib/planetscale/api.js.map +1 -0
  225. package/lib/planetscale/branch.d.ts +129 -0
  226. package/lib/planetscale/branch.d.ts.map +1 -0
  227. package/lib/planetscale/branch.js +161 -0
  228. package/lib/planetscale/branch.js.map +1 -0
  229. package/lib/planetscale/database.d.ts +143 -0
  230. package/lib/planetscale/database.d.ts.map +1 -0
  231. package/lib/planetscale/database.js +184 -0
  232. package/lib/planetscale/database.js.map +1 -0
  233. package/lib/planetscale/index.d.ts +5 -0
  234. package/lib/planetscale/index.d.ts.map +1 -0
  235. package/lib/planetscale/index.js +5 -0
  236. package/lib/planetscale/index.js.map +1 -0
  237. package/lib/planetscale/utils.d.ts +15 -0
  238. package/lib/planetscale/utils.d.ts.map +1 -0
  239. package/lib/planetscale/utils.js +95 -0
  240. package/lib/planetscale/utils.js.map +1 -0
  241. package/lib/resource.js +7 -1
  242. package/lib/resource.js.map +1 -1
  243. package/lib/runtime/plugin.d.ts.map +1 -1
  244. package/lib/runtime/plugin.js +2 -1
  245. package/lib/runtime/plugin.js.map +1 -1
  246. package/lib/scope.d.ts +13 -2
  247. package/lib/scope.d.ts.map +1 -1
  248. package/lib/scope.js +53 -10
  249. package/lib/scope.js.map +1 -1
  250. package/lib/sentry/client-key.d.ts.map +1 -1
  251. package/lib/sentry/client-key.js +5 -4
  252. package/lib/sentry/client-key.js.map +1 -1
  253. package/lib/sentry/project.d.ts.map +1 -1
  254. package/lib/sentry/project.js +5 -4
  255. package/lib/sentry/project.js.map +1 -1
  256. package/lib/sentry/team.d.ts.map +1 -1
  257. package/lib/sentry/team.js +5 -4
  258. package/lib/sentry/team.js.map +1 -1
  259. package/lib/stripe/card.d.ts.map +1 -1
  260. package/lib/stripe/card.js +2 -1
  261. package/lib/stripe/card.js.map +1 -1
  262. package/lib/stripe/client.d.ts.map +1 -1
  263. package/lib/stripe/client.js +3 -2
  264. package/lib/stripe/client.js.map +1 -1
  265. package/lib/stripe/coupon.d.ts.map +1 -1
  266. package/lib/stripe/coupon.js +2 -1
  267. package/lib/stripe/coupon.js.map +1 -1
  268. package/lib/stripe/customer.d.ts.map +1 -1
  269. package/lib/stripe/customer.js +2 -1
  270. package/lib/stripe/customer.js.map +1 -1
  271. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  272. package/lib/stripe/entitlements-feature.js +2 -1
  273. package/lib/stripe/entitlements-feature.js.map +1 -1
  274. package/lib/stripe/file.d.ts.map +1 -1
  275. package/lib/stripe/file.js +2 -1
  276. package/lib/stripe/file.js.map +1 -1
  277. package/lib/stripe/meter.d.ts.map +1 -1
  278. package/lib/stripe/meter.js +4 -2
  279. package/lib/stripe/meter.js.map +1 -1
  280. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  281. package/lib/stripe/portal-configuration.js +2 -1
  282. package/lib/stripe/portal-configuration.js.map +1 -1
  283. package/lib/stripe/price.d.ts.map +1 -1
  284. package/lib/stripe/price.js +2 -1
  285. package/lib/stripe/price.js.map +1 -1
  286. package/lib/stripe/product-feature.d.ts.map +1 -1
  287. package/lib/stripe/product-feature.js +2 -1
  288. package/lib/stripe/product-feature.js.map +1 -1
  289. package/lib/stripe/product.d.ts.map +1 -1
  290. package/lib/stripe/product.js +2 -1
  291. package/lib/stripe/product.js.map +1 -1
  292. package/lib/stripe/promotion-code.d.ts.map +1 -1
  293. package/lib/stripe/promotion-code.js +2 -1
  294. package/lib/stripe/promotion-code.js.map +1 -1
  295. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  296. package/lib/stripe/shipping-rate.js +2 -1
  297. package/lib/stripe/shipping-rate.js.map +1 -1
  298. package/lib/stripe/tax-rate.d.ts.map +1 -1
  299. package/lib/stripe/tax-rate.js +2 -1
  300. package/lib/stripe/tax-rate.js.map +1 -1
  301. package/lib/stripe/webhook.d.ts.map +1 -1
  302. package/lib/stripe/webhook.js +3 -2
  303. package/lib/stripe/webhook.js.map +1 -1
  304. package/lib/test/bun.d.ts.map +1 -1
  305. package/lib/test/bun.js +6 -1
  306. package/lib/test/bun.js.map +1 -1
  307. package/lib/test/prune.js +7 -1
  308. package/lib/test/prune.js.map +1 -1
  309. package/lib/test/vitest.d.ts.map +1 -1
  310. package/lib/test/vitest.js +2 -0
  311. package/lib/test/vitest.js.map +1 -1
  312. package/lib/upstash/redis.d.ts.map +1 -1
  313. package/lib/upstash/redis.js +2 -1
  314. package/lib/upstash/redis.js.map +1 -1
  315. package/lib/util/async-queue.d.ts +35 -0
  316. package/lib/util/async-queue.d.ts.map +1 -0
  317. package/lib/util/async-queue.js +87 -0
  318. package/lib/util/async-queue.js.map +1 -0
  319. package/lib/util/cli.d.ts +37 -0
  320. package/lib/util/cli.d.ts.map +1 -0
  321. package/lib/util/cli.js +90 -0
  322. package/lib/util/cli.js.map +1 -0
  323. package/lib/util/ignore-matcher.d.ts +94 -0
  324. package/lib/util/ignore-matcher.d.ts.map +1 -0
  325. package/lib/util/ignore-matcher.js +616 -0
  326. package/lib/util/ignore-matcher.js.map +1 -0
  327. package/lib/util/logger.d.ts +3 -0
  328. package/lib/util/logger.d.ts.map +1 -0
  329. package/lib/util/logger.js +15 -0
  330. package/lib/util/logger.js.map +1 -0
  331. package/lib/util/retry.d.ts.map +1 -1
  332. package/lib/util/retry.js +0 -1
  333. package/lib/util/retry.js.map +1 -1
  334. package/lib/util/safe-fetch.d.ts.map +1 -1
  335. package/lib/util/safe-fetch.js +2 -1
  336. package/lib/util/safe-fetch.js.map +1 -1
  337. package/lib/util/telemetry/client.d.ts +32 -0
  338. package/lib/util/telemetry/client.d.ts.map +1 -0
  339. package/lib/util/telemetry/client.js +94 -0
  340. package/lib/util/telemetry/client.js.map +1 -0
  341. package/lib/util/telemetry/constants.d.ts +4 -0
  342. package/lib/util/telemetry/constants.d.ts.map +1 -0
  343. package/lib/util/telemetry/constants.js +8 -0
  344. package/lib/util/telemetry/constants.js.map +1 -0
  345. package/lib/util/telemetry/context.d.ts +15 -0
  346. package/lib/util/telemetry/context.d.ts.map +1 -0
  347. package/lib/util/telemetry/context.js +128 -0
  348. package/lib/util/telemetry/context.js.map +1 -0
  349. package/lib/util/telemetry/index.d.ts +3 -0
  350. package/lib/util/telemetry/index.d.ts.map +1 -0
  351. package/lib/util/telemetry/index.js +3 -0
  352. package/lib/util/telemetry/index.js.map +1 -0
  353. package/lib/util/telemetry/types.d.ts +59 -0
  354. package/lib/util/telemetry/types.d.ts.map +1 -0
  355. package/lib/util/telemetry/types.js +1 -0
  356. package/lib/util/telemetry/types.js.map +1 -0
  357. package/lib/util/xdg-paths.d.ts +9 -0
  358. package/lib/util/xdg-paths.d.ts.map +1 -0
  359. package/lib/util/xdg-paths.js +41 -0
  360. package/lib/util/xdg-paths.js.map +1 -0
  361. package/lib/vercel/project.d.ts.map +1 -1
  362. package/lib/vercel/project.js +2 -1
  363. package/lib/vercel/project.js.map +1 -1
  364. package/lib/web/astro.d.ts.map +1 -1
  365. package/lib/web/astro.js +2 -1
  366. package/lib/web/astro.js.map +1 -1
  367. package/lib/web/shadcn.d.ts.map +1 -1
  368. package/lib/web/shadcn.js +2 -1
  369. package/lib/web/shadcn.js.map +1 -1
  370. package/lib/web/vite.d.ts.map +1 -1
  371. package/lib/web/vite.js +3 -2
  372. package/lib/web/vite.js.map +1 -1
  373. package/lib/web/vitepress/dependencies.d.ts.map +1 -1
  374. package/lib/web/vitepress/dependencies.js +2 -1
  375. package/lib/web/vitepress/dependencies.js.map +1 -1
  376. package/lib/web/vitepress/vitepress.d.ts.map +1 -1
  377. package/lib/web/vitepress/vitepress.js +2 -1
  378. package/lib/web/vitepress/vitepress.js.map +1 -1
  379. package/package.json +6 -4
  380. package/src/ai/astro-file.ts +2 -1
  381. package/src/ai/client.ts +3 -2
  382. package/src/alchemy.ts +28 -3
  383. package/src/apply.ts +66 -5
  384. package/src/aws/control/client.ts +4 -4
  385. package/src/aws/control/properties.ts +48 -0
  386. package/src/aws/control/resource.ts +3 -2
  387. package/src/aws/control/types.ts +3988 -6301
  388. package/src/aws/function.ts +9 -8
  389. package/src/aws/oidc/oidc-provider.ts +3 -2
  390. package/src/aws/queue.ts +3 -2
  391. package/src/aws/role.ts +3 -1
  392. package/src/aws/ssm-parameter.ts +2 -1
  393. package/src/cloudflare/account-api-token.ts +3 -2
  394. package/src/cloudflare/ai-gateway.ts +4 -3
  395. package/src/cloudflare/api-error.ts +36 -0
  396. package/src/cloudflare/api.ts +9 -4
  397. package/src/cloudflare/assets.ts +30 -6
  398. package/src/cloudflare/astro.ts +176 -0
  399. package/src/cloudflare/auth.ts +3 -2
  400. package/src/cloudflare/bindings.ts +27 -0
  401. package/src/cloudflare/bound.ts +31 -17
  402. package/src/cloudflare/bucket.ts +15 -8
  403. package/src/cloudflare/bundle/bundle-worker.ts +2 -1
  404. package/src/cloudflare/bundle/nodejs-compat-mode.ts +2 -1
  405. package/src/cloudflare/custom-domain.ts +10 -9
  406. package/src/cloudflare/d1-database.ts +11 -10
  407. package/src/cloudflare/d1-export.ts +2 -1
  408. package/src/cloudflare/d1-import.ts +2 -1
  409. package/src/cloudflare/d1-migrations.ts +2 -1
  410. package/src/cloudflare/dns-records.ts +5 -4
  411. package/src/cloudflare/do-state-store/worker.ts +4 -0
  412. package/src/cloudflare/email-address.ts +203 -0
  413. package/src/cloudflare/email-catch-all.ts +248 -0
  414. package/src/cloudflare/email-routing.ts +230 -0
  415. package/src/cloudflare/email-rule.ts +322 -0
  416. package/src/cloudflare/hyperdrive.ts +5 -4
  417. package/src/cloudflare/images.ts +59 -0
  418. package/src/cloudflare/index.ts +9 -0
  419. package/src/cloudflare/kv-namespace.ts +2 -1
  420. package/src/cloudflare/pipeline.ts +38 -2
  421. package/src/cloudflare/queue-consumer.ts +2 -1
  422. package/src/cloudflare/queue.ts +0 -12
  423. package/src/cloudflare/route.ts +118 -18
  424. package/src/cloudflare/secret.ts +253 -0
  425. package/src/cloudflare/secrets-store.ts +420 -0
  426. package/src/cloudflare/sveltekit.ts +72 -0
  427. package/src/cloudflare/user.ts +2 -1
  428. package/src/cloudflare/vectorize-index.ts +6 -5
  429. package/src/cloudflare/vectorize-metadata-index.ts +2 -1
  430. package/src/cloudflare/website.ts +76 -66
  431. package/src/cloudflare/worker-assets.ts +95 -89
  432. package/src/cloudflare/worker-metadata.ts +14 -1
  433. package/src/cloudflare/worker.ts +76 -9
  434. package/src/cloudflare/wrangler.json.ts +42 -0
  435. package/src/cloudflare/zone.ts +4 -3
  436. package/src/destroy.ts +35 -17
  437. package/src/dns/godaddy.ts +3 -2
  438. package/src/dns/import-dns.ts +2 -1
  439. package/src/esbuild/bundle.ts +2 -1
  440. package/src/fs/copy-file.ts +2 -1
  441. package/src/fs/file.ts +3 -1
  442. package/src/github/client.ts +11 -10
  443. package/src/github/repository-environment.ts +5 -4
  444. package/src/github/secret.ts +7 -6
  445. package/src/index.ts +2 -1
  446. package/src/neon/project.ts +3 -2
  447. package/src/planetscale/api.ts +115 -0
  448. package/src/planetscale/branch.ts +352 -0
  449. package/src/planetscale/database.ts +394 -0
  450. package/src/planetscale/index.ts +4 -0
  451. package/src/planetscale/utils.ts +189 -0
  452. package/src/resource.ts +7 -1
  453. package/src/runtime/plugin.ts +2 -1
  454. package/src/scope.ts +64 -13
  455. package/src/sentry/client-key.ts +5 -4
  456. package/src/sentry/project.ts +5 -4
  457. package/src/sentry/team.ts +5 -4
  458. package/src/stripe/card.ts +2 -1
  459. package/src/stripe/client.ts +3 -2
  460. package/src/stripe/coupon.ts +2 -1
  461. package/src/stripe/customer.ts +2 -1
  462. package/src/stripe/entitlements-feature.ts +2 -1
  463. package/src/stripe/file.ts +2 -1
  464. package/src/stripe/meter.ts +4 -2
  465. package/src/stripe/portal-configuration.ts +2 -1
  466. package/src/stripe/price.ts +2 -1
  467. package/src/stripe/product-feature.ts +2 -1
  468. package/src/stripe/product.ts +2 -1
  469. package/src/stripe/promotion-code.ts +2 -1
  470. package/src/stripe/shipping-rate.ts +2 -1
  471. package/src/stripe/tax-rate.ts +2 -1
  472. package/src/stripe/webhook.ts +3 -2
  473. package/src/test/bun.ts +6 -1
  474. package/src/test/prune.ts +7 -1
  475. package/src/test/vitest.ts +2 -0
  476. package/src/upstash/redis.ts +2 -1
  477. package/src/util/async-queue.ts +97 -0
  478. package/src/util/cli.tsx +221 -0
  479. package/src/util/ignore-matcher.ts +873 -0
  480. package/src/util/logger.ts +17 -0
  481. package/src/util/retry.ts +0 -1
  482. package/src/util/safe-fetch.ts +2 -1
  483. package/src/util/telemetry/client.ts +127 -0
  484. package/src/util/telemetry/constants.ts +13 -0
  485. package/src/util/telemetry/context.ts +154 -0
  486. package/src/util/telemetry/index.ts +2 -0
  487. package/src/util/telemetry/types.ts +83 -0
  488. package/src/util/xdg-paths.ts +48 -0
  489. package/src/vercel/project.ts +2 -1
  490. package/src/web/astro.ts +2 -1
  491. package/src/web/shadcn.ts +2 -1
  492. package/src/web/vite.ts +3 -2
  493. package/src/web/vitepress/dependencies.ts +2 -1
  494. package/src/web/vitepress/vitepress.ts +2 -1
@@ -0,0 +1,161 @@
1
+ import { Resource } from "../resource.js";
2
+ import { PlanetScaleApi } from "./api.js";
3
+ import { fixClusterSize, waitForDatabaseReady, } from "./utils.js";
4
+ /**
5
+ * Create or manage a PlanetScale database branch
6
+ *
7
+ * @example
8
+ * // Create a branch from 'main'
9
+ * const branch = await Branch("feature-123", {
10
+ * name: "feature-123",
11
+ * organizationId: "my-org",
12
+ * databaseName: "my-database",
13
+ * parentBranch: "main"
14
+ * });
15
+ *
16
+ * @example
17
+ * // Create a branch from another branch object
18
+ * const parentBranch = await Branch("staging", {
19
+ * name: "staging",
20
+ * organizationId: "my-org",
21
+ * databaseName: "my-database",
22
+ * parentBranch: "main"
23
+ * });
24
+ *
25
+ * const featureBranch = await Branch("feature-456", {
26
+ * name: "feature-456",
27
+ * organizationId: "my-org",
28
+ * databaseName: "my-database",
29
+ * parentBranch: parentBranch // Using Branch object instead of string
30
+ * });
31
+ *
32
+ * @example
33
+ * // Create a branch from a backup
34
+ * const branch = await Branch("restored-branch", {
35
+ * name: "restored-branch",
36
+ * organizationId: "my-org",
37
+ * databaseName: "my-database",
38
+ * parentBranch: "main",
39
+ * backupId: "backup-123",
40
+ * clusterSize: "PS_10"
41
+ * });
42
+ */
43
+ export const Branch = Resource("planetscale::Branch", async function (_id, props) {
44
+ const apiKey = props.apiKey?.unencrypted || process.env.PLANETSCALE_API_TOKEN;
45
+ if (!apiKey) {
46
+ throw new Error("PLANETSCALE_API_TOKEN environment variable is required");
47
+ }
48
+ const api = new PlanetScaleApi({ apiKey });
49
+ if (this.phase === "delete") {
50
+ try {
51
+ if (this.output?.name) {
52
+ const response = await api.delete(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${this.output.name}`);
53
+ if (!response.ok && response.status !== 404) {
54
+ throw new Error(`Failed to delete branch: ${response.statusText} ${await response.text()}`);
55
+ }
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error("Error deleting branch:", error);
60
+ throw error;
61
+ }
62
+ return this.destroy();
63
+ }
64
+ try {
65
+ const parentBranchName = !props.parentBranch
66
+ ? "main"
67
+ : typeof props.parentBranch === "string"
68
+ ? props.parentBranch
69
+ : props.parentBranch.name;
70
+ if (typeof props.parentBranch !== "string" && props.parentBranch) {
71
+ await waitForDatabaseReady(api, props.organizationId, props.databaseName, props.parentBranch.name);
72
+ }
73
+ // Check if branch exists
74
+ const getResponse = await api.get(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}`);
75
+ if (!getResponse.ok && getResponse.status !== 404) {
76
+ // Error getting branch
77
+ throw new Error(`Failed to get branch: ${getResponse.statusText} ${await getResponse.text()}`);
78
+ }
79
+ if (getResponse.ok) {
80
+ // Branch exists
81
+ if (!props.adopt) {
82
+ throw new Error(`Branch ${props.name} already exists and adopt is false`);
83
+ }
84
+ const data = await getResponse.json();
85
+ const currentParentBranch = data.parent_branch || "main";
86
+ // Check immutable properties
87
+ if (props.parentBranch && parentBranchName !== currentParentBranch) {
88
+ throw new Error(`Cannot change parent branch from ${currentParentBranch} to ${parentBranchName}`);
89
+ }
90
+ if (this.output?.backupId) {
91
+ console.warn("BackupID is set, but branch already exists, so it will be ignored");
92
+ }
93
+ if (this.output?.seedData) {
94
+ console.warn("SeedData is set, but branch already exists, so it will be ignored");
95
+ }
96
+ // Update mutable properties if they've changed
97
+ if (props.safeMigrations !== undefined) {
98
+ const safeMigrationsResponse = await api[props.safeMigrations ? "post" : "delete"](`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/safe-migrations`);
99
+ if (!safeMigrationsResponse.ok) {
100
+ throw new Error(`Failed to ${props.safeMigrations ? "enable" : "disable"} safe migrations: ${safeMigrationsResponse.statusText}`);
101
+ }
102
+ }
103
+ if (props.clusterSize && data.cluster_size !== props.clusterSize) {
104
+ const clusterResponse = await api.patch(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/cluster`, {
105
+ cluster_size: props.clusterSize,
106
+ });
107
+ if (!clusterResponse.ok) {
108
+ throw new Error(`Failed to update cluster size: ${clusterResponse.statusText}`);
109
+ }
110
+ }
111
+ return this({
112
+ ...props,
113
+ name: props.name,
114
+ parentBranch: currentParentBranch,
115
+ createdAt: data.created_at,
116
+ updatedAt: data.updated_at,
117
+ htmlUrl: data.html_url,
118
+ });
119
+ }
120
+ await waitForDatabaseReady(api, props.organizationId, props.databaseName);
121
+ // Branch doesn't exist, create it
122
+ const createResponse = await api.post(`/organizations/${props.organizationId}/databases/${props.databaseName}/branches`, {
123
+ name: props.name,
124
+ parent_branch: parentBranchName,
125
+ backup_id: props.backupId,
126
+ seed_data: props.seedData,
127
+ cluster_size: props.clusterSize,
128
+ });
129
+ if (!createResponse.ok) {
130
+ throw new Error(`Failed to create branch: ${createResponse.statusText} ${await createResponse.text()}`);
131
+ }
132
+ const data = await createResponse.json();
133
+ // Handle safe migrations if specified
134
+ if (props.safeMigrations !== undefined) {
135
+ // We can't change the migrations mode if the database is not ready
136
+ await waitForDatabaseReady(api, props.organizationId, props.databaseName, props.name);
137
+ const safeMigrationsResponse = await api[props.safeMigrations ? "post" : "delete"](`/organizations/${props.organizationId}/databases/${props.databaseName}/branches/${props.name}/safe-migrations`);
138
+ if (!safeMigrationsResponse.ok) {
139
+ throw new Error(`Failed to ${props.safeMigrations ? "enable" : "disable"} safe migrations: ${safeMigrationsResponse.statusText} : ${await safeMigrationsResponse.text()}`);
140
+ }
141
+ }
142
+ // Handle cluster size update if specified
143
+ if (props.clusterSize) {
144
+ // Wait for database to be ready before modifying cluster size
145
+ await fixClusterSize(api, props.organizationId, props.databaseName, props.name, props.clusterSize, true);
146
+ }
147
+ return this({
148
+ ...props,
149
+ name: props.name,
150
+ parentBranch: data.parent_branch,
151
+ createdAt: data.created_at,
152
+ updatedAt: data.updated_at,
153
+ htmlUrl: data.html_url,
154
+ });
155
+ }
156
+ catch (error) {
157
+ console.error("Error managing branch:", error);
158
+ throw error;
159
+ }
160
+ });
161
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/planetscale/branch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ import type { Secret } from "../secret.ts";
4
+ import { type PlanetScaleClusterSize } from "./utils.ts";
5
+ /**
6
+ * Properties for creating or updating a PlanetScale Database
7
+ */
8
+ export interface DatabaseProps {
9
+ /**
10
+ * The name of the database
11
+ */
12
+ name: string;
13
+ /**
14
+ * The organization ID where the database will be created
15
+ */
16
+ organizationId: string;
17
+ /**
18
+ * PlanetScale API token (overrides environment variable)
19
+ */
20
+ apiKey?: Secret;
21
+ /**
22
+ * Whether to adopt the database if it already exists in Planetscale
23
+ */
24
+ adopt?: boolean;
25
+ /**
26
+ * The region where the database will be created (create only)
27
+ */
28
+ region?: {
29
+ /**
30
+ * The slug identifier of the region
31
+ */
32
+ slug: string;
33
+ };
34
+ /**
35
+ * Whether to require approval for deployments
36
+ */
37
+ requireApprovalForDeploy?: boolean;
38
+ /**
39
+ * Whether to allow data branching
40
+ */
41
+ allowDataBranching?: boolean;
42
+ /**
43
+ * Whether to enable automatic migrations
44
+ */
45
+ automaticMigrations?: boolean;
46
+ /**
47
+ * Whether to restrict branch creation to the same region as database
48
+ */
49
+ restrictBranchRegion?: boolean;
50
+ /**
51
+ * Whether to collect full queries from the database
52
+ */
53
+ insightsRawQueries?: boolean;
54
+ /**
55
+ * Whether web console can be used on production branch
56
+ */
57
+ productionBranchWebConsole?: boolean;
58
+ /**
59
+ * The default branch of the database
60
+ */
61
+ defaultBranch?: string;
62
+ /**
63
+ * Migration framework to use on the database
64
+ */
65
+ migrationFramework?: string;
66
+ /**
67
+ * Name of table to use as migration table
68
+ */
69
+ migrationTableName?: string;
70
+ /**
71
+ * The database cluster size (required)
72
+ */
73
+ clusterSize: PlanetScaleClusterSize;
74
+ }
75
+ /**
76
+ * Represents a PlanetScale Database
77
+ */
78
+ export interface Database extends Resource<"planetscale::Database">, DatabaseProps {
79
+ /**
80
+ * The unique identifier of the database
81
+ */
82
+ id: string;
83
+ /**
84
+ * The current state of the database
85
+ */
86
+ state: string;
87
+ /**
88
+ * The default branch name
89
+ */
90
+ defaultBranch: string;
91
+ /**
92
+ * The plan type
93
+ */
94
+ plan: string;
95
+ /**
96
+ * Time at which the database was created
97
+ */
98
+ createdAt: string;
99
+ /**
100
+ * Time at which the database was last updated
101
+ */
102
+ updatedAt: string;
103
+ /**
104
+ * HTML URL to access the database
105
+ */
106
+ htmlUrl: string;
107
+ }
108
+ /**
109
+ * Create, manage and delete PlanetScale databases
110
+ *
111
+ * @example
112
+ * // Create a basic database in a specific organization
113
+ * const db = await Database("my-app-db", {
114
+ * name: "my-app-db",
115
+ * organizationId: "my-org",
116
+ * clusterSize: "PS_10"
117
+ * });
118
+ *
119
+ * @example
120
+ * // Create a database with specific region and settings
121
+ * const db = await Database("my-app-db", {
122
+ * name: "my-app-db",
123
+ * organizationId: "my-org",
124
+ * region: {
125
+ * slug: "us-east"
126
+ * },
127
+ * clusterSize: "PS_10",
128
+ * requireApprovalForDeploy: true,
129
+ * allowDataBranching: true,
130
+ * automaticMigrations: true
131
+ * });
132
+ *
133
+ * @example
134
+ * // Create a database with custom API key
135
+ * const db = await Database("my-app-db", {
136
+ * name: "my-app-db",
137
+ * organizationId: "my-org",
138
+ * apiKey: alchemy.secret(process.env.CUSTOM_PLANETSCALE_TOKEN),
139
+ * clusterSize: "PS_10"
140
+ * });
141
+ */
142
+ export declare const Database: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Database>, _id: string, props: DatabaseProps) => Promise<Database>);
143
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAEF;;OAEG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,QACf,SAAQ,QAAQ,CAAC,uBAAuB,CAAC,EACvC,aAAa;IACf;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,QAAQ,yFAGX,OAAO,CAAC,QAAQ,CAAC,OAClB,MAAM,SACJ,aAAa,KACnB,OAAO,CAAC,QAAQ,CAAC,CAwNrB,CAAC"}
@@ -0,0 +1,184 @@
1
+ import { Resource } from "../resource.js";
2
+ import { PlanetScaleApi } from "./api.js";
3
+ import { fixClusterSize, waitForDatabaseReady, } from "./utils.js";
4
+ /**
5
+ * Create, manage and delete PlanetScale databases
6
+ *
7
+ * @example
8
+ * // Create a basic database in a specific organization
9
+ * const db = await Database("my-app-db", {
10
+ * name: "my-app-db",
11
+ * organizationId: "my-org",
12
+ * clusterSize: "PS_10"
13
+ * });
14
+ *
15
+ * @example
16
+ * // Create a database with specific region and settings
17
+ * const db = await Database("my-app-db", {
18
+ * name: "my-app-db",
19
+ * organizationId: "my-org",
20
+ * region: {
21
+ * slug: "us-east"
22
+ * },
23
+ * clusterSize: "PS_10",
24
+ * requireApprovalForDeploy: true,
25
+ * allowDataBranching: true,
26
+ * automaticMigrations: true
27
+ * });
28
+ *
29
+ * @example
30
+ * // Create a database with custom API key
31
+ * const db = await Database("my-app-db", {
32
+ * name: "my-app-db",
33
+ * organizationId: "my-org",
34
+ * apiKey: alchemy.secret(process.env.CUSTOM_PLANETSCALE_TOKEN),
35
+ * clusterSize: "PS_10"
36
+ * });
37
+ */
38
+ export const Database = Resource("planetscale::Database", async function (_id, props) {
39
+ const apiKey = props.apiKey?.unencrypted || process.env.PLANETSCALE_API_TOKEN;
40
+ if (!apiKey) {
41
+ throw new Error("PLANETSCALE_API_TOKEN environment variable is required");
42
+ }
43
+ const api = new PlanetScaleApi({ apiKey });
44
+ if (this.phase === "delete") {
45
+ try {
46
+ if (this.output?.name) {
47
+ const response = await api.delete(`/organizations/${props.organizationId}/databases/${this.output.name}`);
48
+ if (!response.ok && response.status !== 404) {
49
+ throw new Error(`Failed to delete database: ${response.statusText} ${await response.text()}`);
50
+ }
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.error("Error deleting database:", error);
55
+ throw error;
56
+ }
57
+ return this.destroy();
58
+ }
59
+ try {
60
+ // Check if database exists
61
+ const getResponse = await api.get(`/organizations/${props.organizationId}/databases/${props.name}`);
62
+ const getData = await getResponse.json();
63
+ if (this.phase === "update" || (props.adopt && getResponse.ok)) {
64
+ if (!getResponse.ok) {
65
+ throw new Error(`Database ${props.name} not found`);
66
+ }
67
+ // Update database settings
68
+ // If updating to a non-'main' default branch, create it first
69
+ if (props.defaultBranch && props.defaultBranch !== "main") {
70
+ const branchResponse = await api.get(`/organizations/${props.organizationId}/databases/${props.name}/branches/${props.defaultBranch}`);
71
+ if (!getData.ready) {
72
+ await waitForDatabaseReady(api, props.organizationId, props.name);
73
+ }
74
+ if (!branchResponse.ok && branchResponse.status === 404) {
75
+ // Create the branch
76
+ const createBranchResponse = await api.post(`/organizations/${props.organizationId}/databases/${props.name}/branches`, {
77
+ name: props.defaultBranch,
78
+ parent_branch: "main",
79
+ });
80
+ if (!createBranchResponse.ok) {
81
+ throw new Error(`Failed to create default branch: ${createBranchResponse.statusText} ${await createBranchResponse.text()}`);
82
+ }
83
+ }
84
+ }
85
+ const updateResponse = await api.patch(`/organizations/${props.organizationId}/databases/${props.name}`, {
86
+ automatic_migrations: props.automaticMigrations,
87
+ migration_framework: props.migrationFramework,
88
+ migration_table_name: props.migrationTableName,
89
+ require_approval_for_deploy: props.requireApprovalForDeploy,
90
+ restrict_branch_region: props.restrictBranchRegion,
91
+ allow_data_branching: props.allowDataBranching,
92
+ insights_raw_queries: props.insightsRawQueries,
93
+ production_branch_web_console: props.productionBranchWebConsole,
94
+ default_branch: props.defaultBranch,
95
+ });
96
+ if (!updateResponse.ok) {
97
+ throw new Error(`Failed to update database: ${updateResponse.statusText} ${await updateResponse.text()}`);
98
+ }
99
+ await fixClusterSize(api, props.organizationId, props.name, props.defaultBranch || "main", props.clusterSize, getData.ready);
100
+ const data = await updateResponse.json();
101
+ return this({
102
+ ...props,
103
+ id: data.id,
104
+ state: data.state,
105
+ defaultBranch: data.default_branch,
106
+ plan: data.plan,
107
+ createdAt: data.created_at,
108
+ updatedAt: data.updated_at,
109
+ htmlUrl: data.html_url,
110
+ });
111
+ }
112
+ if (getResponse.ok) {
113
+ throw new Error(`Database with name ${props.name} already exists`);
114
+ }
115
+ // Create new database
116
+ const createResponse = await api.post(`/organizations/${props.organizationId}/databases`, {
117
+ name: props.name,
118
+ region_slug: props.region?.slug,
119
+ require_approval_for_deploy: props.requireApprovalForDeploy,
120
+ allow_data_branching: props.allowDataBranching,
121
+ automatic_migrations: props.automaticMigrations,
122
+ restrict_branch_region: props.restrictBranchRegion,
123
+ insights_raw_queries: props.insightsRawQueries,
124
+ production_branch_web_console: props.productionBranchWebConsole,
125
+ migration_framework: props.migrationFramework,
126
+ migration_table_name: props.migrationTableName,
127
+ cluster_size: props.clusterSize,
128
+ });
129
+ if (!createResponse.ok) {
130
+ throw new Error(`Failed to create database: ${createResponse.statusText} ${await createResponse.text()}`);
131
+ }
132
+ const data = await createResponse.json();
133
+ // If a non-'main' default branch is specified, create it
134
+ if (props.defaultBranch && props.defaultBranch !== "main") {
135
+ await waitForDatabaseReady(api, props.organizationId, props.name);
136
+ // Check if branch exists
137
+ const branchResponse = await api.get(`/organizations/${props.organizationId}/databases/${props.name}/branches/${props.defaultBranch}`);
138
+ if (!branchResponse.ok && branchResponse.status === 404) {
139
+ // Create the branch
140
+ const createBranchResponse = await api.post(`/organizations/${props.organizationId}/databases/${props.name}/branches`, {
141
+ name: props.defaultBranch,
142
+ parent_branch: "main",
143
+ });
144
+ if (!createBranchResponse.ok) {
145
+ throw new Error(`Failed to create default branch: ${createBranchResponse.statusText} ${await createBranchResponse.text()}`);
146
+ }
147
+ await fixClusterSize(api, props.organizationId, props.name, props.defaultBranch || "main", props.clusterSize, false);
148
+ // Update database to use new branch as default
149
+ const updateResponse = await api.patch(`/organizations/${props.organizationId}/databases/${props.name}`, {
150
+ default_branch: props.defaultBranch,
151
+ });
152
+ if (!updateResponse.ok) {
153
+ throw new Error(`Failed to set default branch: ${updateResponse.statusText} ${await updateResponse.text()}`);
154
+ }
155
+ const updatedData = await updateResponse.json();
156
+ return this({
157
+ ...props,
158
+ id: data.id,
159
+ state: updatedData.state,
160
+ defaultBranch: updatedData.default_branch,
161
+ plan: updatedData.plan,
162
+ createdAt: updatedData.created_at,
163
+ updatedAt: updatedData.updated_at,
164
+ htmlUrl: updatedData.html_url,
165
+ });
166
+ }
167
+ }
168
+ return this({
169
+ ...props,
170
+ id: data.id,
171
+ state: data.state,
172
+ defaultBranch: data.default_branch || "main",
173
+ plan: data.plan,
174
+ createdAt: data.created_at,
175
+ updatedAt: data.updated_at,
176
+ htmlUrl: data.html_url,
177
+ });
178
+ }
179
+ catch (error) {
180
+ console.error("Error managing database:", error);
181
+ throw error;
182
+ }
183
+ });
184
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/planetscale/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,cAAc,EAEd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAiIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAC9B,uBAAuB,EACvB,KAAK,WAEH,GAAW,EACX,KAAoB;IAEpB,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAC/B,kBAAkB,KAAK,CAAC,cAAc,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CACvE,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5C,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,CAAC,UAAU,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAC7E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,CAC/B,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,EAAE,CACjE,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAO,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC;YACtD,CAAC;YACD,2BAA2B;YAC3B,8DAA8D;YAC9D,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;gBAC1D,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,CAClC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,aAAa,EAAE,CACjG,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACnB,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxD,oBAAoB;oBACpB,MAAM,oBAAoB,GAAG,MAAM,GAAG,CAAC,IAAI,CACzC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,WAAW,EACzE;wBACE,IAAI,EAAE,KAAK,CAAC,aAAa;wBACzB,aAAa,EAAE,MAAM;qBACtB,CACF,CAAC;oBAEF,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC;wBAC7B,MAAM,IAAI,KAAK,CACb,oCAAoC,oBAAoB,CAAC,UAAU,IAAI,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAC3G,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,KAAK,CACpC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,EAAE,EAChE;gBACE,oBAAoB,EAAE,KAAK,CAAC,mBAAmB;gBAC/C,mBAAmB,EAAE,KAAK,CAAC,kBAAkB;gBAC7C,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;gBAC9C,2BAA2B,EAAE,KAAK,CAAC,wBAAwB;gBAC3D,sBAAsB,EAAE,KAAK,CAAC,oBAAoB;gBAClD,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;gBAC9C,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;gBAC9C,6BAA6B,EAAE,KAAK,CAAC,0BAA0B;gBAC/D,cAAc,EAAE,KAAK,CAAC,aAAa;aACpC,CACF,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,cAAc,CAAC,UAAU,IAAI,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;YACJ,CAAC;YAED,MAAM,cAAc,CAClB,GAAG,EACH,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,aAAa,IAAI,MAAM,EAC7B,KAAK,CAAC,WAAW,EACjB,OAAO,CAAC,KAAK,CACd,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAO,CAAC;YAC9C,OAAO,IAAI,CAAC;gBACV,GAAG,KAAK;gBACR,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,IAAI,CAAC,cAAc;gBAClC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC;QACrE,CAAC;QAED,sBAAsB;QACtB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,IAAI,CACnC,kBAAkB,KAAK,CAAC,cAAc,YAAY,EAClD;YACE,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI;YAC/B,2BAA2B,EAAE,KAAK,CAAC,wBAAwB;YAC3D,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;YAC9C,oBAAoB,EAAE,KAAK,CAAC,mBAAmB;YAC/C,sBAAsB,EAAE,KAAK,CAAC,oBAAoB;YAClD,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;YAC9C,6BAA6B,EAAE,KAAK,CAAC,0BAA0B;YAC/D,mBAAmB,EAAE,KAAK,CAAC,kBAAkB;YAC7C,oBAAoB,EAAE,KAAK,CAAC,kBAAkB;YAC9C,YAAY,EAAE,KAAK,CAAC,WAAW;SAChC,CACF,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,8BAA8B,cAAc,CAAC,UAAU,IAAI,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAO,CAAC;QAE9C,yDAAyD;QACzD,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAElE,yBAAyB;YACzB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,CAClC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,aAAa,EAAE,CACjG,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACxD,oBAAoB;gBACpB,MAAM,oBAAoB,GAAG,MAAM,GAAG,CAAC,IAAI,CACzC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,WAAW,EACzE;oBACE,IAAI,EAAE,KAAK,CAAC,aAAa;oBACzB,aAAa,EAAE,MAAM;iBACtB,CACF,CAAC;gBAEF,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,oCAAoC,oBAAoB,CAAC,UAAU,IAAI,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAC3G,CAAC;gBACJ,CAAC;gBAED,MAAM,cAAc,CAClB,GAAG,EACH,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,aAAa,IAAI,MAAM,EAC7B,KAAK,CAAC,WAAW,EACjB,KAAK,CACN,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,KAAK,CACpC,kBAAkB,KAAK,CAAC,cAAc,cAAc,KAAK,CAAC,IAAI,EAAE,EAChE;oBACE,cAAc,EAAE,KAAK,CAAC,aAAa;iBACpC,CACF,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,iCAAiC,cAAc,CAAC,UAAU,IAAI,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,CAC5F,CAAC;gBACJ,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,EAAO,CAAC;gBACrD,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,KAAK,EAAE,WAAW,CAAC,KAAK;oBACxB,aAAa,EAAE,WAAW,CAAC,cAAc;oBACzC,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,SAAS,EAAE,WAAW,CAAC,UAAU;oBACjC,SAAS,EAAE,WAAW,CAAC,UAAU;oBACjC,OAAO,EAAE,WAAW,CAAC,QAAQ;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;YACV,GAAG,KAAK;YACR,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,cAAc,IAAI,MAAM;YAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./api.ts";
2
+ export * from "./utils.ts";
3
+ export * from "./database.ts";
4
+ export * from "./branch.ts";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planetscale/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./api.js";
2
+ export * from "./utils.js";
3
+ export * from "./database.js";
4
+ export * from "./branch.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planetscale/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PlanetScaleApi } from "./api.ts";
2
+ export type PlanetScaleClusterSize = "PS_DEV" | "PS_10" | "PS_20" | "PS_40" | "PS_80" | "PS_160" | "PS_320" | "PS_400" | "PS_640" | "PS_700" | "PS_900" | "PS_1280" | "PS_1400" | "PS_1800" | "PS_2100" | "PS_2560" | "PS_2700" | "PS_2800" | (string & {});
3
+ /**
4
+ * Wait for a database to be ready with exponential backoff
5
+ */
6
+ export declare function waitForDatabaseReady(api: PlanetScaleApi, organizationId: string, databaseName: string, branchName?: string): Promise<void>;
7
+ /**
8
+ * Wait for a keyspace to be ready
9
+ */
10
+ export declare function waitForKeyspaceReady(api: PlanetScaleApi, org: string, db: string, branch: string, keyspace: string): Promise<void>;
11
+ /**
12
+ * Fix cluster size for a branch
13
+ */
14
+ export declare function fixClusterSize(api: PlanetScaleApi, organizationId: string, databaseName: string, branchName: string, expectedClusterSize: PlanetScaleClusterSize, isDBReady: boolean): Promise<void>;
15
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/planetscale/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,sBAAsB,EAC3C,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Wait for a database to be ready with exponential backoff
3
+ */
4
+ export async function waitForDatabaseReady(api, organizationId, databaseName, branchName) {
5
+ const startTime = Date.now();
6
+ let waitMs = 100;
7
+ const branchSuffix = branchName ? `/branches/${branchName}` : "";
8
+ while (true) {
9
+ const response = await api.get(`/organizations/${organizationId}/databases/${databaseName}${branchSuffix}`);
10
+ if (!response.ok) {
11
+ throw new Error(`Failed to check database state: ${response.statusText}`);
12
+ }
13
+ const data = await response.json();
14
+ if (data.ready === true) {
15
+ return;
16
+ }
17
+ if (Date.now() - startTime >= 60000) {
18
+ throw new Error(`Timeout waiting for database ${databaseName} to be ready`);
19
+ }
20
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
21
+ waitMs = Math.min(waitMs * 2, 1000); // Cap at 1s intervals
22
+ }
23
+ }
24
+ /**
25
+ * Wait for a keyspace to be ready
26
+ */
27
+ export async function waitForKeyspaceReady(api, org, db, branch, keyspace) {
28
+ const start = Date.now();
29
+ let delay = 100;
30
+ while (true) {
31
+ const res = await api.get(`/organizations/${org}/databases/${db}/branches/${branch}/keyspaces/${keyspace}/resizes`);
32
+ if (!res.ok) {
33
+ throw new Error(`Error fetching keyspace "${keyspace}": ${res.statusText}`);
34
+ }
35
+ const ks = await res.json();
36
+ // once it's fully ready, we can proceed
37
+ if (ks.data.every((item) => item.state !== "resizing")) {
38
+ return;
39
+ }
40
+ if (Date.now() - start > 600_000) {
41
+ throw new Error(`Timeout waiting for keyspace "${keyspace}" to be ready`);
42
+ }
43
+ await new Promise((r) => setTimeout(r, delay));
44
+ delay = Math.min(delay * 2, 1_000);
45
+ }
46
+ }
47
+ /**
48
+ * Fix cluster size for a branch
49
+ */
50
+ export async function fixClusterSize(api, organizationId, databaseName, branchName, expectedClusterSize, isDBReady) {
51
+ if (!isDBReady) {
52
+ await waitForDatabaseReady(api, organizationId, databaseName);
53
+ }
54
+ // 1. Ensure branch is production
55
+ let branchRes = await api.get(`/organizations/${organizationId}/databases/${databaseName}/branches/${branchName}`);
56
+ if (!branchRes.ok) {
57
+ throw new Error(`Unable to get branch data: ${branchRes.statusText}`);
58
+ }
59
+ let branchData = await branchRes.json();
60
+ if (!branchData.production) {
61
+ if (!branchData.ready) {
62
+ await waitForDatabaseReady(api, organizationId, databaseName, branchName);
63
+ }
64
+ const promoteRes = await api.post(`/organizations/${organizationId}/databases/${databaseName}/branches/${branchName}/promote`);
65
+ if (!promoteRes.ok) {
66
+ throw new Error(`Unable to promote branch: ${promoteRes.statusText}`);
67
+ }
68
+ }
69
+ // 2. Load default keyspace
70
+ const ksListRes = await api.get(`/organizations/${organizationId}/databases/${databaseName}/branches/${branchName}/keyspaces`);
71
+ if (!ksListRes.ok) {
72
+ throw new Error(`Failed to list keyspaces: ${ksListRes.statusText}`);
73
+ }
74
+ const ksList = (await ksListRes.json()).data;
75
+ const defaultKsData = ksList.find((x) => x.name === databaseName); // Default keypsace is always the same name as the database
76
+ if (ksList.length === 0 || !defaultKsData) {
77
+ throw new Error(`No default keyspace found for branch ${branchName}`);
78
+ }
79
+ const defaultKs = defaultKsData.name;
80
+ let currentSize = defaultKsData.cluster_name;
81
+ // 3. Wait until any in-flight resize is done
82
+ await waitForKeyspaceReady(api, organizationId, databaseName, branchName, defaultKs);
83
+ // 4. If size mismatch, trigger resize and wait again
84
+ // Ideally this would use the undocumented Keyspaces API, but there seems to be a missing oauth scope that we cannot add via the console yet
85
+ if (currentSize !== expectedClusterSize) {
86
+ const resizeRes = await api.patch(`/organizations/${organizationId}/databases/${databaseName}/branches/${branchName}/cluster`, { cluster_size: expectedClusterSize });
87
+ if (!resizeRes.ok) {
88
+ const text = await resizeRes.text();
89
+ throw new Error(`Failed to start resize: ${resizeRes.statusText} ${text}`);
90
+ }
91
+ // Poll until the resize completes
92
+ await waitForKeyspaceReady(api, organizationId, databaseName, branchName, defaultKs);
93
+ }
94
+ }
95
+ //# sourceMappingURL=utils.js.map